simd-scan

SIMD scan implementation and benchmark
git clone git://git.rr3.xyz/simd-scan
Log | Files | Refs

whoa.nasm (1498B)


      1 default rel
      2 
      3 section .text
      4 
      5 ; RAX                   RDI     RSI
      6 ; u64 scan_avx1024_whoa(u64 *y, u64 *x);
      7 global scan_avx1024_whoa
      8 scan_avx1024_whoa:
      9 	; 1. Load
     10 	vmovdqu ymm0, [rsi+00]
     11 	vmovdqu ymm1, [rsi+32]
     12 	vmovdqu ymm2, [rsi+64]
     13 	vmovdqu ymm3, [rsi+96]
     14 
     15 	; 2. Transpose
     16 	vpunpcklqdq ymm4, ymm0, ymm1
     17 	vpunpckhqdq ymm5, ymm0, ymm1
     18 	vpunpcklqdq ymm6, ymm2, ymm3
     19 	vpunpckhqdq ymm7, ymm2, ymm3
     20 	vperm2i128 ymm0, ymm4, ymm6, 0x20
     21 	vperm2i128 ymm1, ymm5, ymm7, 0x20
     22 	vperm2i128 ymm2, ymm4, ymm6, 0x31
     23 	vperm2i128 ymm3, ymm5, ymm7, 0x31
     24 
     25 	; 3. Scan blocks
     26 	vpaddq ymm1, ymm1, ymm0
     27 	vpaddq ymm2, ymm2, ymm1
     28 	vpaddq ymm3, ymm3, ymm2
     29 	; ymm3 now contains block sums
     30 
     31 	; 4. Scan sums (intra-register exclusive scan)
     32 	vpslldq ymm4, ymm3, 8
     33 	vpaddq ymm4, ymm3, ymm4
     34 	vpermq ymm5, ymm4, 0x50
     35 	vpxor ymm6, ymm6, ymm6
     36 	vblendpd ymm5, ymm5, ymm6, 3
     37 	vpaddq ymm4, ymm4, ymm5
     38 	vpsubq ymm4, ymm4, ymm3
     39 
     40 	; 5. Add in scanned block sums
     41 	vpaddq ymm0, ymm0, ymm4
     42 	vpaddq ymm1, ymm1, ymm4
     43 	vpaddq ymm2, ymm2, ymm4
     44 	vpaddq ymm3, ymm3, ymm4
     45 
     46 	; 6. Transpose
     47 	vpunpcklqdq ymm4, ymm0, ymm1
     48 	vpunpckhqdq ymm5, ymm0, ymm1
     49 	vpunpcklqdq ymm6, ymm2, ymm3
     50 	vpunpckhqdq ymm7, ymm2, ymm3
     51 	vperm2i128 ymm0, ymm4, ymm6, 0x20
     52 	vperm2i128 ymm1, ymm5, ymm7, 0x20
     53 	vperm2i128 ymm2, ymm4, ymm6, 0x31
     54 	vperm2i128 ymm3, ymm5, ymm7, 0x31
     55 
     56 	; 7. Store
     57 	vmovdqu [rdi+00], ymm0
     58 	vmovdqu [rdi+32], ymm1
     59 	vmovdqu [rdi+64], ymm2
     60 	vmovdqu [rdi+96], ymm3
     61 
     62 	; vextracti128 xmm15, ymm6, 1
     63 	; pextrq rax, xmm15, 1
     64 	mov rax, 7 ; TODO: Output total
     65 	ret