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