ref: d159e8c6b102a1c5d9a7625ecc8176f08290c259
dir: /lib/std/memops-impl+plan9-x64.s/
/* std.memblit : (dst : byte#, src : byte#, len : std.size -> void) std.memfill : (dst : byte#, val : byte, len : std.size -> void) */ TEXT std$memblit+0(SB),$0 CMPQ SI,DI JZ .done JG .fwdcpy MOVQ SI,AX SUBQ DI,AX CMPQ CX,AX JG .revcpy .fwdcpy: MOVQ DX,CX SHRQ $3,CX REP; MOVSQ MOVQ DX,CX ANDQ $7,CX REP; MOVSB JMP .done .revcpy: STD MOVQ DX,CX LEAQ -1(DX)(SI*1),SI LEAQ -1(DX)(DI*1),DI REP; MOVSB CLD .done: RET TEXT std$memfill+0(SB),$0 /* generate 8 bytes of fill */ MOVBQZX SI,BX MOVQ $0x101010101010101,AX IMULQ BX,AX /* and fill */ MOVQ DX,CX SHRQ $3,CX REP; STOSQ MOVQ DX,CX ANDQ $7,CX REP; STOSB RET TEXT std$memeq+0(SB),$0 MOVQ DX,R8 ANDQ $~0x7,R8 JZ .dotail .nextquad: MOVQ (DI),R9 MOVQ (SI),R10 XORQ R10,R9 JNZ .unequal ADDQ $8,SI ADDQ $8,DI SUBQ $8,R8 JNZ .nextquad .dotail: ANDQ $0x7,DX TESTQ DX,DX JZ .equal .nextbyte: MOVBLZX (DI),R9 MOVBLZX (SI),R10 XORL R10,R9 JNZ .unequal ADDQ $1,SI ADDQ $1,DI SUBQ $1,DX JNZ .nextbyte .equal: MOVQ $1,AX RET .unequal: MOVQ $0,AX RET