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