diff options
Diffstat (limited to 'src/internal/bytealg/equal_riscv64.s')
-rw-r--r-- | src/internal/bytealg/equal_riscv64.s | 177 |
1 files changed, 97 insertions, 80 deletions
diff --git a/src/internal/bytealg/equal_riscv64.s b/src/internal/bytealg/equal_riscv64.s index 5dd13beb55..77202d6075 100644 --- a/src/internal/bytealg/equal_riscv64.s +++ b/src/internal/bytealg/equal_riscv64.s @@ -8,120 +8,137 @@ #define CTXT S10 // func memequal(a, b unsafe.Pointer, size uintptr) bool -TEXT runtime·memequal(SB),NOSPLIT|NOFRAME,$0-25 - MOV a+0(FP), X5 - MOV b+8(FP), X6 - MOV size+16(FP), X7 - MOV $ret+24(FP), X19 +TEXT runtime·memequal<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-25 +#ifndef GOEXPERIMENT_regabiargs + MOV a+0(FP), X10 + MOV b+8(FP), X11 + MOV size+16(FP), X12 + MOV $ret+24(FP), X13 +#endif + // X10 = a_base + // X11 = b_base + // X12 = size JMP memequal<>(SB) // func memequal_varlen(a, b unsafe.Pointer) bool -TEXT runtime·memequal_varlen(SB),NOSPLIT|NOFRAME,$0-17 - MOV a+0(FP), X5 - MOV b+8(FP), X6 - MOV 8(CTXT), X7 // compiler stores size at offset 8 in the closure - MOV $ret+16(FP), X19 +TEXT runtime·memequal_varlen<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-17 + MOV 8(CTXT), X12 // compiler stores size at offset 8 in the closure +#ifndef GOEXPERIMENT_regabiargs + MOV a+0(FP), X10 + MOV b+8(FP), X11 + MOV $ret+16(FP), X13 +#endif + // X10 = a_base + // X11 = b_base JMP memequal<>(SB) -// On entry X5 and X6 contain pointers, X7 contains length. -// X19 contains address for return value. +// On entry X10 and X11 contain pointers, X12 contains length. +// For non-regabi X13 contains address for return value. +// For regabi return value in X10. TEXT memequal<>(SB),NOSPLIT|NOFRAME,$0 - BEQ X5, X6, eq + BEQ X10, X11, eq - MOV $32, X8 - BLT X7, X8, loop4_check + MOV $32, X23 + BLT X12, X23, loop4_check // Check alignment - if alignment differs we have to do one byte at a time. - AND $3, X5, X9 - AND $3, X6, X10 - BNE X9, X10, loop4_check + AND $3, X10, X9 + AND $3, X11, X19 + BNE X9, X19, loop4_check BEQZ X9, loop32_check // Check one byte at a time until we reach 8 byte alignment. - SUB X9, X7, X7 + SUB X9, X12, X12 align: ADD $-1, X9 - MOVBU 0(X5), X10 - MOVBU 0(X6), X11 - BNE X10, X11, not_eq - ADD $1, X5 - ADD $1, X6 + MOVBU 0(X10), X19 + MOVBU 0(X11), X20 + BNE X19, X20, not_eq + ADD $1, X10 + ADD $1, X11 BNEZ X9, align loop32_check: MOV $32, X9 - BLT X7, X9, loop16_check + BLT X12, X9, loop16_check loop32: - MOV 0(X5), X10 - MOV 0(X6), X11 - MOV 8(X5), X12 - MOV 8(X6), X13 - BNE X10, X11, not_eq - BNE X12, X13, not_eq - MOV 16(X5), X14 - MOV 16(X6), X15 - MOV 24(X5), X16 - MOV 24(X6), X17 + MOV 0(X10), X19 + MOV 0(X11), X20 + MOV 8(X10), X21 + MOV 8(X11), X22 + BNE X19, X20, not_eq + BNE X21, X22, not_eq + MOV 16(X10), X14 + MOV 16(X11), X15 + MOV 24(X10), X16 + MOV 24(X11), X17 BNE X14, X15, not_eq BNE X16, X17, not_eq - ADD $32, X5 - ADD $32, X6 - ADD $-32, X7 - BGE X7, X9, loop32 - BEQZ X7, eq + ADD $32, X10 + ADD $32, X11 + ADD $-32, X12 + BGE X12, X9, loop32 + BEQZ X12, eq loop16_check: - MOV $16, X8 - BLT X7, X8, loop4_check + MOV $16, X23 + BLT X12, X23, loop4_check loop16: - MOV 0(X5), X10 - MOV 0(X6), X11 - MOV 8(X5), X12 - MOV 8(X6), X13 - BNE X10, X11, not_eq - BNE X12, X13, not_eq - ADD $16, X5 - ADD $16, X6 - ADD $-16, X7 - BGE X7, X8, loop16 - BEQZ X7, eq + MOV 0(X10), X19 + MOV 0(X11), X20 + MOV 8(X10), X21 + MOV 8(X11), X22 + BNE X19, X20, not_eq + BNE X21, X22, not_eq + ADD $16, X10 + ADD $16, X11 + ADD $-16, X12 + BGE X12, X23, loop16 + BEQZ X12, eq loop4_check: - MOV $4, X8 - BLT X7, X8, loop1 + MOV $4, X23 + BLT X12, X23, loop1 loop4: - MOVBU 0(X5), X10 - MOVBU 0(X6), X11 - MOVBU 1(X5), X12 - MOVBU 1(X6), X13 - BNE X10, X11, not_eq - BNE X12, X13, not_eq - MOVBU 2(X5), X14 - MOVBU 2(X6), X15 - MOVBU 3(X5), X16 - MOVBU 3(X6), X17 + MOVBU 0(X10), X19 + MOVBU 0(X11), X20 + MOVBU 1(X10), X21 + MOVBU 1(X11), X22 + BNE X19, X20, not_eq + BNE X21, X22, not_eq + MOVBU 2(X10), X14 + MOVBU 2(X11), X15 + MOVBU 3(X10), X16 + MOVBU 3(X11), X17 BNE X14, X15, not_eq BNE X16, X17, not_eq - ADD $4, X5 - ADD $4, X6 - ADD $-4, X7 - BGE X7, X8, loop4 + ADD $4, X10 + ADD $4, X11 + ADD $-4, X12 + BGE X12, X23, loop4 loop1: - BEQZ X7, eq - MOVBU 0(X5), X10 - MOVBU 0(X6), X11 - BNE X10, X11, not_eq - ADD $1, X5 - ADD $1, X6 - ADD $-1, X7 + BEQZ X12, eq + MOVBU 0(X10), X19 + MOVBU 0(X11), X20 + BNE X19, X20, not_eq + ADD $1, X10 + ADD $1, X11 + ADD $-1, X12 JMP loop1 not_eq: - MOV $0, X5 - MOVB X5, (X19) +#ifndef GOEXPERIMENT_regabiargs + MOVB ZERO, (X13) +#else + MOVB ZERO, X10 +#endif RET eq: - MOV $1, X5 - MOVB X5, (X19) +#ifndef GOEXPERIMENT_regabiargs + MOV $1, X10 + MOVB X10, (X13) +#else + MOV $1, X10 +#endif RET |