#include "go_asm.h"
#include "textflag.h"
-TEXT ·Compare(SB),NOSPLIT|NOFRAME,$0-56
+TEXT ·Compare<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-56
+#ifdef GOEXPERIMENT_regabiargs
+// incoming:
+// R3 a addr -> R5
+// R4 a len -> R3
+// R5 a cap unused
+// R6 b addr -> R6
+// R7 b len -> R4
+// R8 b cap unused
+ MOVD R3, R5
+ MOVD R4, R3
+ MOVD R7, R4
+#else
MOVD a_base+0(FP), R5
MOVD b_base+24(FP), R6
MOVD a_len+8(FP), R3
- CMP R5,R6,CR7
MOVD b_len+32(FP), R4
MOVD $ret+48(FP), R7
+#endif
+ CMP R5,R6,CR7
CMP R3,R4,CR6
BEQ CR7,equal
-
#ifdef GOARCH_ppc64le
BR cmpbodyLE<>(SB)
#else
BR cmpbodyBE<>(SB)
#endif
-
equal:
BEQ CR6,done
MOVD $1, R8
BGT CR6,greater
NEG R8
-
greater:
+#ifdef GOEXPERIMENT_regabiargs
+ MOVD R8, R3
+#else
MOVD R8, (R7)
+#endif
RET
-
done:
+#ifdef GOEXPERIMENT_regabiargs
+ MOVD $0, R3
+#else
MOVD $0, (R7)
+#endif
RET
-TEXT runtime·cmpstring(SB),NOSPLIT|NOFRAME,$0-40
+TEXT runtime·cmpstring<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-40
+#ifdef GOEXPERIMENT_regabiargs
+// incoming:
+// R3 a addr -> R5
+// R4 a len -> R3
+// R5 b addr -> R6
+// R6 b len -> R4
+ MOVD R6, R7
+ MOVD R5, R6
+ MOVD R3, R5
+ MOVD R4, R3
+ MOVD R7, R4
+#else
MOVD a_base+0(FP), R5
MOVD b_base+16(FP), R6
MOVD a_len+8(FP), R3
- CMP R5,R6,CR7
MOVD b_len+24(FP), R4
MOVD $ret+32(FP), R7
+#endif
+ CMP R5,R6,CR7
CMP R3,R4,CR6
BEQ CR7,equal
-
#ifdef GOARCH_ppc64le
BR cmpbodyLE<>(SB)
#else
BR cmpbodyBE<>(SB)
#endif
-
equal:
BEQ CR6,done
MOVD $1, R8
BGT CR6,greater
NEG R8
-
greater:
+#ifdef GOEXPERIMENT_regabiargs
+ MOVD R8, R3
+#else
MOVD R8, (R7)
+#endif
RET
done:
+#ifdef GOEXPERIMENT_regabiargs
+ MOVD $0, R3
+#else
MOVD $0, (R7)
+#endif
RET
// Do an efficient memcmp for ppc64le
// R4 = b len
// R5 = a addr
// R6 = b addr
-// R7 = addr of return value
+// R7 = addr of return value if not regabi
TEXT cmpbodyLE<>(SB),NOSPLIT|NOFRAME,$0-0
MOVD R3,R8 // set up length
CMP R3,R4,CR2 // unequal?
BGT greater // here only if NE
less:
MOVD $-1,R3
+#ifndef GOEXPERIMENT_regabiargs
MOVD R3,(R7) // return value if A < B
+#endif
RET
equal:
+#ifdef GOEXPERIMENT_regabiargs
+ MOVD $0, R3
+#else
MOVD $0,(R7) // return value if A == B
+#endif
RET
greater:
MOVD $1,R3
+#ifndef GOEXPERIMENT_regabiargs
MOVD R3,(R7) // return value if A > B
+#endif
RET
// Do an efficient memcmp for ppc64 (BE)
BC 12,9,greater // 2nd len > 1st len
less:
MOVD $-1,R3
+#ifndef GOEXPERIMENT_regabiargs
MOVD R3,(R7) // return value if A < B
+#endif
RET
equal:
+#ifdef GOEXPERIMENT_regabiargs
+ MOVD $0, R3
+#else
MOVD $0,(R7) // return value if A == B
+#endif
RET
greater:
MOVD $1,R3
+#ifndef GOEXPERIMENT_regabiargs
MOVD R3,(R7) // return value if A > B
+#endif
RET
#include "textflag.h"
// memequal(a, b unsafe.Pointer, size uintptr) bool
-TEXT runtime·memequal(SB),NOSPLIT|NOFRAME,$0-25
+TEXT runtime·memequal<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-25
+#ifndef GOEXPERIMENT_regabiargs
MOVD a+0(FP), R3
MOVD b+8(FP), R4
MOVD size+16(FP), R5
MOVD $ret+24(FP), R10
-
+#endif
BR memeqbody<>(SB)
// memequal_varlen(a, b unsafe.Pointer) bool
-TEXT runtime·memequal_varlen(SB),NOSPLIT|NOFRAME,$0-17
+TEXT runtime·memequal_varlen<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-17
+#ifndef GOEXPERIMENT_regabiargs
MOVD a+0(FP), R3
MOVD b+8(FP), R4
+ MOVD $ret+16(FP), R10
+#endif
CMP R3, R4
BEQ eq
MOVD 8(R11), R5 // compiler stores size at offset 8 in the closure
- MOVD $ret+16(FP), R10
BR memeqbody<>(SB)
eq:
MOVD $1, R3
+#ifndef GOEXPERIMENT_regabiargs
MOVB R3, ret+16(FP)
+#endif
RET
// Do an efficient memequal for ppc64
// R3 = s1
// R4 = s2
// R5 = len
-// R10 = addr of return value (byte)
+// R10 = addr of return value (byte) when not regabi
TEXT memeqbody<>(SB),NOSPLIT|NOFRAME,$0-0
MOVD R5,CTR
CMP R5,$8 // only optimize >=8
BNE noteq
BR equal
noteq:
+#ifdef GOEXPERIMENT_regabiargs
+ MOVD $0, R3
+#else
MOVB $0, (R10)
+#endif
RET
equal:
MOVD $1, R3
+#ifndef GOEXPERIMENT_regabiargs
MOVB R3, (R10)
+#endif
RET
#include "go_asm.h"
#include "textflag.h"
-TEXT ·IndexByte(SB),NOSPLIT|NOFRAME,$0-40
+TEXT ·IndexByte<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-40
+#ifndef GOEXPERIMENT_regabiargs
MOVD b_base+0(FP), R3 // R3 = byte array pointer
MOVD b_len+8(FP), R4 // R4 = length
MOVBZ c+24(FP), R5 // R5 = byte
MOVD $ret+32(FP), R14 // R14 = &ret
+#else
+ MOVD R6, R5
+#endif
BR indexbytebody<>(SB)
-TEXT ·IndexByteString(SB),NOSPLIT|NOFRAME,$0-32
+TEXT ·IndexByteString<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-32
+#ifndef GOEXPERIMENT_regabiargs
MOVD s_base+0(FP), R3 // R3 = string
MOVD s_len+8(FP), R4 // R4 = length
MOVBZ c+16(FP), R5 // R5 = byte
MOVD $ret+24(FP), R14 // R14 = &ret
+#endif
BR indexbytebody<>(SB)
-
+// R3 = addr of string
+// R4 = len of string
+// R5 = byte to find
+// R14 = addr of return value when not regabi
TEXT indexbytebody<>(SB),NOSPLIT|NOFRAME,$0-0
MOVD R3,R17 // Save base address for calculating the index later.
RLDICR $0,R3,$60,R8 // Align address to doubleword boundary in R8.
notfound:
MOVD $-1,R3
+#ifndef GOEXPERIMENT_regabiargs
MOVD R3,(R14)
+#endif
RET
found:
return:
SUB R17,R3
+#ifndef GOEXPERIMENT_regabiargs
MOVD R3,(R14)
+#endif
RET
found_qw_align: