github.com/egonelbre/exp@v0.0.0-20240430123955-ed1d3aa93911/sse/asm_amd64.s (about) 1 #include "textflag.h" 2 3 // func AddU32_ASM(dst, src []uint32) 4 TEXT ·AddU32_ASM(SB),NOSPLIT,$0-48 5 MOVQ dst+8(FP), CX // CX = len(dst) 6 MOVQ src+32(FP), BX // BX = len(src) 7 8 CMPQ CX, BX // 9 CMOVQGT BX, CX // CX = min(BX, CX) 10 11 MOVQ dst+0(FP), AX // AX = &dst[0] 12 MOVQ src+24(FP), BX // BX = &src[0] 13 14 INCQ CX // CX++ 15 next: 16 DECQ CX // CX-- 17 JZ done // jump if CX = 0 18 19 MOVL (BX), DX // 20 ADDL DX, (AX) // [AX] += [BX] 21 22 ADDQ $4, BX // BX += 4 23 ADDQ $4, AX // AX += 4 24 25 JMP next 26 27 done: 28 RET 29 30 // func SubU32_ASM(dst, src []uint32) 31 TEXT ·SubU32_ASM(SB),NOSPLIT,$0 32 MOVQ dst+8(FP), CX // CX = len(dst) 33 MOVQ src+32(FP), BX // BX = len(src) 34 35 CMPQ CX, BX // 36 CMOVQGT BX, CX // CX = min(BX, CX) 37 38 MOVQ dst+0(FP), AX // AX = &dst[0] 39 MOVQ src+24(FP), BX // BX = &src[0] 40 41 INCQ CX // CX++ 42 next: 43 DECQ CX // CX-- 44 JZ done // jump if CX = 0 45 46 MOVL (BX), DX // DX = [BX] 47 SUBL DX, (AX) // [AX] -= DX 48 49 ADDQ $4, BX // BX += 4 50 ADDQ $4, AX // AX += 4 51 52 JMP next 53 54 done: 55 RET 56 57 // func MulU32_ASM(dst, src []uint32) 58 TEXT ·MulU32_ASM(SB),NOSPLIT,$0 59 MOVQ dst+8(FP), CX // CX = len(dst) 60 MOVQ src+32(FP), BX // BX = len(src) 61 62 CMPQ CX, BX // 63 CMOVQGT BX, CX // CX = min(BX, CX) 64 65 MOVQ dst+0(FP), AX // AX = &dst[0] 66 MOVQ src+24(FP), BX // BX = &src[0] 67 68 INCQ CX // CX++ 69 next: 70 DECQ CX // CX-- 71 JZ done // jump if CX = 0 72 73 MOVL (BX), DX // DX = [BX] 74 IMULL (AX), DX // DX *= [AX] 75 MOVL DX, (AX) // [AX] = DX 76 77 ADDQ $4, BX // BX += 4 78 ADDQ $4, AX // AX += 4 79 80 JMP next 81 82 done: 83 RET 84