dotproductclang_amd64.s 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. TEXT ·_dpavx_int32clang(SB),4, $0-32
  2. MOVQ a+0(FP), DI
  3. MOVQ b+8(FP), SI
  4. MOVQ gN+16(FP), DX
  5. MOVQ res+24(FP), CX
  6. MOVQ (DX),R8 // mov r8d, dword [rdx]
  7. CMPQ R8,$0 // test r8d, r8d
  8. JLE LBB0_8 // LBB0_1
  9. CMPQ R8,$15 // cmp r8d, 15
  10. JA LBB0_4
  11. XORQ R9, R9 // xor r9d, r9d
  12. XORQ AX, AX // xor eax, eax
  13. JMP LBB0_8 //LBB0_7
  14. LBB0_1:
  15. XORQ AX, AX // xor eax, eax
  16. JMP LBB0_8
  17. LBB0_4:
  18. MOVQ R8,R9 // mov r9d, r8d
  19. ANDQ $-16,R9 // and r9d, -16
  20. VPXOR X0,X0,X0 // vpxor xmm0, xmm0, xmm0
  21. XORQ AX, AX // xor eax, eax
  22. VPXOR X1, X1, X1 // vpxor xmm1, xmm1, xmm1
  23. VPXOR X2, X2, X2 // vpxor xmm2, xmm2, xmm2
  24. VPXOR X3, X3, X3 // vpxor xmm3, xmm3, xmm3
  25. LBB0_5:
  26. VMOVDQU (SI)(AX*4), X4 // vmovdqu xmm4, oword [rsi + 4*rax]
  27. VMOVDQU 16(SI)(AX*4), X5 // vmovdqu xmm5, oword [rsi + 4*rax + 16]
  28. VMOVDQU 32(SI)(AX*4), X6 // vmovdqu xmm6, oword [rsi + 4*rax + 32]
  29. VMOVDQU 48(SI)(AX*4), X7 // vmovdqu xmm7, oword [rsi + 4*rax + 48]
  30. VPMULLD (DI)(AX*4), X4, X4 // vpmulld xmm4, xmm4, oword [rdi + 4*rax]
  31. VPADDD X0, X4, X0 // vpaddd xmm0, xmm4, xmm0
  32. VPMULLD (DI)(AX*4),X5, X4 // vpmulld xmm4, xmm5, oword [rdi + 4*rax + 16]
  33. VPADDD X1, X4, X1 // vpaddd xmm1, xmm4, xmm1
  34. VPMULLD (DI)(AX*4), X6, X4 // vpmulld xmm4, xmm6, oword [rdi + 4*rax + 32]
  35. VPMULLD (DI)(AX*4), X7, X5 // vpmulld xmm5, xmm7, oword [rdi + 4*rax + 48]
  36. VPADDD X2, X4, X2 // vpaddd xmm2, xmm4, xmm2
  37. VPADDD X3, X5, X3 // vpaddd xmm3, xmm5, xmm3
  38. ADDQ $16,AX // add rax, 16
  39. CMPQ AX,R9 // cmp r9, rax
  40. JNE LBB0_5
  41. VPADDD X0, X1, X0 // vpaddd xmm0, xmm1, xmm0
  42. VPADDD X0, X2, X0 // vpaddd xmm0, xmm2, xmm0
  43. VPADDD X0, X3, X0 // vpaddd xmm0, xmm3, xmm0
  44. VPSHUFD $78 , X0,X1 // vpshufd xmm1, xmm0, 78
  45. VPADDD X1, X0, X0 // vpaddd xmm0, xmm0, xmm1
  46. VPSHUFD $229, X0, X1 // vpshufd xmm1, xmm0, 229
  47. VPADDD X1, X0, X0 // vpaddd xmm0, xmm0, xmm1
  48. VMOVD X0,AX // vmovd eax, xmm0
  49. CMPQ R8,R9 // cmp r9, r8
  50. JE LBB0_8
  51. LBB0_7:
  52. MOVL (SI)(R9*4),DX // mov edx, dword [rsi + 4*r9]
  53. IMULL (DI)(R9*4),DX // imul edx, dword [rdi + 4*r9]
  54. ADDQ DX,AX // add eax, edx
  55. ADDQ $1,R9 // add r9, 1
  56. CMPQ R9,R8 // cmp r8, r9
  57. JNE LBB0_7
  58. LBB0_8:
  59. MOVQ (CX),AX // mov dword [rcx], eax
  60. VZEROUPPER // JMB
  61. RET