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