github.com/apache/arrow/go/v7@v7.0.1/parquet/internal/utils/clib_amd64.s (about)

     1  #include "textflag.h"
     2  
     3  // void *memcpy(void *dst, const void *src, size_t n)
     4  // DI = dst, SI = src, DX = size
     5  TEXT clib·_memcpy(SB), $16-0
     6  	PUSHQ R8
     7  	PUSHQ CX
     8  	XORQ  CX, CX // clear register
     9  
    10  MEMCPY_QUAD_LOOP:
    11  	ADDQ $8, CX
    12  	CMPQ CX, DX
    13  	JA   MEMCPY_QUAD_DONE
    14  	MOVQ -8(SI)(CX*1), R8
    15  	MOVQ R8, -8(DI)(CX*1)
    16  	JMP  MEMCPY_QUAD_LOOP
    17  
    18  MEMCPY_QUAD_DONE:
    19  	SUBQ $4, CX
    20  	CMPQ CX, DX
    21  	JA   MEMCPY_LONG_DONE
    22  	MOVL -4(SI)(CX*1), R8
    23  	MOVL R8, -4(DI)(CX*1)
    24  	ADDQ $4, CX
    25  
    26  MEMCPY_LONG_DONE:
    27  	SUBQ $2, CX
    28  	CMPQ CX, DX
    29  	JA   MEMCPY_WORD_DONE
    30  	MOVW -2(SI)(CX*1), R8
    31  	MOVW R8, -2(DI)(CX*1)
    32  	ADDQ $2, CX
    33  
    34  MEMCPY_WORD_DONE:
    35  	SUBQ $1, CX
    36  	CMPQ CX, DX
    37  	JA   MEMCPY_BYTE_DONE
    38  	MOVB -1(SI)(CX*1), R8
    39  	MOVB R8, -1(DI)(CX*1)
    40  
    41  MEMCPY_BYTE_DONE:
    42  	MOVQ DI, AX // set return value
    43  	POPQ CX
    44  	POPQ R8
    45  	RET
    46  
    47  // void *memset(void *str, int c, size_t n)
    48  // DI = str, SI = c, DX = size
    49  TEXT clib·_memset(SB), $16-0
    50  	PUSHQ CX
    51      LONG $0x0101f669; WORD $0x0101 // imul esi, 0x1010101
    52      MOVQ SI, CX
    53      ROLQ $32, CX
    54      ORQ CX, SI
    55  	XORQ CX, CX // clear register
    56  
    57  MEMSET_QUAD_LOOP:
    58  	ADDQ $8, CX
    59  	CMPQ CX, DX
    60  	JA   MEMSET_QUAD_DONE
    61  	MOVQ SI, -8(DI)(CX*1)
    62  	JMP  MEMSET_QUAD_LOOP
    63  
    64  MEMSET_QUAD_DONE:
    65  	SUBQ $4, CX
    66  	CMPQ CX, DX
    67  	JA   MEMSET_LONG_DONE
    68  	MOVL SI, -4(DI)(CX*1)
    69  	ADDQ $4, CX
    70  
    71  MEMSET_LONG_DONE:
    72  	SUBQ $2, CX
    73  	CMPQ CX, DX
    74  	JA   MEMSET_WORD_DONE
    75  	MOVW SI, -2(DI)(CX*1)
    76  	ADDQ $2, CX
    77  
    78  MEMSET_WORD_DONE:
    79  	SUBQ $1, CX
    80  	CMPQ CX, DX
    81  	JA   MEMSET_BYTE_DONE
    82  	MOVB SI, -1(DI)(CX*1)
    83  
    84  MEMSET_BYTE_DONE:
    85  	MOVQ DI, AX // set return value
    86  	POPQ CX
    87  	RET