Advertisement
Guest User

Untitled

a guest
Oct 28th, 2016
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "asm.h"
  2.  
  3. int getSum(int ar[], int n) {
  4.     asm("movl $0, %%eax;\
  5.       movl %[n], %%ecx;\
  6.       movl $0, %%edx;\
  7.       cmp %%eax, %%ecx;\
  8.       jle pexit1;\
  9.       lp:;\
  10.       dec %%ecx;\
  11.       addl (%[ar], %%rcx, 4), %%eax;\
  12.       cmp %%edx, %%ecx;\
  13.       jg lp;\
  14.       pexit1:;"
  15.     :
  16.     : [ar]"r"(ar), [n]"r"(n)
  17.     : "eax", "ecx", "edx"
  18.     );
  19. }
  20.  
  21. int getSumFastSSE(int *ar, int n) {
  22.     asm("movl %[n], %%ecx;\
  23.       xorpd %%xmm0, %%xmm0;\
  24.       movl $0, %%eax;\
  25.       cmp $3, %%ecx;\
  26.       jle pexit31;\
  27.       subq $4, %%rcx;\
  28.       lp3:\
  29.       movdqu (%[ar], %%rcx, 4), %%xmm1;\
  30.       paddd %%xmm1, %%xmm0;\
  31.       subq $4, %%rcx;\
  32.       jge lp3;\
  33.       phaddd %%xmm0, %%xmm0;\
  34.       phaddd %%xmm0, %%xmm0;\
  35.       movq %%xmm0, %%rax;\
  36.       addq $4, %%rcx;\
  37.       pexit31:;\
  38.       cmp $0, %%ecx;\
  39.       jle pexit3;\
  40.       lp4:\
  41.       addl -4(%[ar], %%rcx, 4), %%eax;\
  42.       dec %%rcx;\
  43.       jnz lp4;\
  44.       pexit3:;"
  45.     :
  46.     : [ar]"r"(ar), [n]"r"(n)
  47.     :  "rcx", "xmm0", "rax", "xmm1"
  48.     );
  49. }
  50.  
  51. int getSumFastAVX(int *ar, int n) {
  52.     asm("movl %[n], %%ecx;\
  53.      vxorpd %%ymm0, %%ymm0, %%ymm0;\
  54.      movl $0, %%eax;\
  55.      cmp $7, %%ecx;\
  56.      jle pexit71;\
  57.      subq $8, %%rcx;\
  58.      lp7:;\
  59.      vpaddd (%[ar], %%rcx, 4), %%ymm0, %%ymm0;\
  60.      subq $8, %%rcx;\
  61.      jge lp7;\
  62.      addq $8, %%rcx;\
  63.      pexit71:;\
  64.      cmp $0, %%ecx;\
  65.      jle pexit7;\
  66.      lp71:\
  67.      addl -4(%[ar], %%rcx, 4), %%eax;\
  68.      dec %%rcx;\
  69.      jnz lp71;\
  70.      pexit7:;\
  71.      push %%rbp;\
  72.      mov %%rsp, %%rbp;\
  73.      subq $32, %%rsp;\
  74.      vmovdqu %%ymm0, (%%rsp);\
  75.      movl $8, %%ecx;\
  76.      lp72:\
  77.      addl -4(%%rsp, %%rcx, 4), %%eax;\
  78.      dec %%ecx;\
  79.      jnz lp72;\
  80.      mov %%rbp, %%rsp;\
  81.      pop %%rbp;\
  82.      ret;"
  83.     :
  84.     : [ar]"r"(ar), [n]"r"(n)
  85.     :  "rcx", "xmm0", "rax", "xmm1"
  86.     );
  87. }
  88.  
  89. double getSum(double ar[], int n) {
  90.     asm("movl %[n], %%ecx;\
  91.       xorpd   %%xmm0, %%xmm0;\
  92.       movl $0, %%eax;\
  93.       cmp %%eax, %%ecx;\
  94.       jle pexit2;\
  95.       lp1:\
  96.       addsd -8(%[ar], %%rcx, 8), %%xmm0;\
  97.       loop lp1;\
  98.       movq %%xmm0, %%rax;\
  99.       pexit2:;"
  100.     :
  101.     : [ar]"r"(ar), [n]"r"(n)
  102.     :  "ecx", "xmm0", "rax"
  103.     );
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement