From 9f252a0462bd8c279beec56d1538e8a6c26c44c5 Mon Sep 17 00:00:00 2001 From: Cherry Mui Date: Fri, 18 Mar 2022 13:04:08 -0400 Subject: [PATCH] all: delete ARM64 non-register ABI fallback path Change-Id: I3996fb31789a1f8559348e059cf371774e548a8d Reviewed-on: https://go-review.googlesource.com/c/go/+/393875 Trust: Cherry Mui Run-TryBot: Cherry Mui TryBot-Result: Gopher Robot Reviewed-by: Michael Knyszek --- src/internal/bytealg/compare_arm64.s | 27 ----- src/internal/bytealg/equal_arm64.s | 33 ------ src/reflect/asm_arm64.s | 10 -- src/runtime/asm_arm64.s | 155 +-------------------------- src/runtime/memclr_arm64.s | 5 - src/runtime/memmove_arm64.s | 5 - src/runtime/race_arm64.s | 22 ---- 7 files changed, 1 insertion(+), 256 deletions(-) diff --git a/src/internal/bytealg/compare_arm64.s b/src/internal/bytealg/compare_arm64.s index 5a80207258..cc02c464e8 100644 --- a/src/internal/bytealg/compare_arm64.s +++ b/src/internal/bytealg/compare_arm64.s @@ -6,7 +6,6 @@ #include "textflag.h" TEXT ·Compare(SB),NOSPLIT|NOFRAME,$0-56 -#ifdef GOEXPERIMENT_regabiargs // R0 = a_base (want in R0) // R1 = a_len (want in R1) // R2 = a_cap (unused) @@ -15,28 +14,13 @@ TEXT ·Compare(SB),NOSPLIT|NOFRAME,$0-56 // R5 = b_cap (unused) MOVD R3, R2 MOVD R4, R3 -#else - MOVD a_base+0(FP), R0 - MOVD a_len+8(FP), R1 - MOVD b_base+24(FP), R2 - MOVD b_len+32(FP), R3 - MOVD $ret+48(FP), R7 -#endif B cmpbody<>(SB) TEXT runtime·cmpstring(SB),NOSPLIT|NOFRAME,$0-40 -#ifdef GOEXPERIMENT_regabiargs // R0 = a_base // R1 = a_len // R2 = b_base // R3 = b_len -#else - MOVD a_base+0(FP), R0 - MOVD a_len+8(FP), R1 - MOVD b_base+16(FP), R2 - MOVD b_len+24(FP), R3 - MOVD $ret+32(FP), R7 -#endif B cmpbody<>(SB) // On entry: @@ -44,14 +28,9 @@ TEXT runtime·cmpstring(SB),NOSPLIT|NOFRAME,$0-40 // R1 is the length of a // R2 points to the start of b // R3 is the length of b -#ifndef GOEXPERIMENT_regabiargs -// R7 points to return value (-1/0/1 will be written here) -#endif // // On exit: -#ifdef GOEXPERIMENT_regabiargs // R0 is the result -#endif // R4, R5, R6, R8, R9 and R10 are clobbered TEXT cmpbody<>(SB),NOSPLIT|NOFRAME,$0-0 CMP R0, R2 @@ -96,9 +75,6 @@ cmp: ret: MOVD $1, R0 CNEG HI, R0, R0 -#ifndef GOEXPERIMENT_regabiargs - MOVD R0, (R7) -#endif RET small: TBZ $3, R6, lt_8 @@ -141,9 +117,6 @@ samebytes: CMP R3, R1 CSET NE, R0 CNEG LO, R0, R0 -#ifndef GOEXPERIMENT_regabiargs - MOVD R0, (R7) -#endif RET cmpnext: REV R8, R4 diff --git a/src/internal/bytealg/equal_arm64.s b/src/internal/bytealg/equal_arm64.s index cf5cf54e59..d3aabba587 100644 --- a/src/internal/bytealg/equal_arm64.s +++ b/src/internal/bytealg/equal_arm64.s @@ -7,55 +7,29 @@ // memequal(a, b unsafe.Pointer, size uintptr) bool TEXT runtime·memequal(SB),NOSPLIT|NOFRAME,$0-25 -#ifndef GOEXPERIMENT_regabiargs - MOVD size+16(FP), R2 -#endif // short path to handle 0-byte case CBZ R2, equal -#ifndef GOEXPERIMENT_regabiargs - MOVD a+0(FP), R0 - MOVD b+8(FP), R1 - MOVD $ret+24(FP), R8 -#endif B memeqbody<>(SB) equal: MOVD $1, R0 -#ifndef GOEXPERIMENT_regabiargs - MOVB R0, ret+24(FP) -#endif RET // memequal_varlen(a, b unsafe.Pointer) bool TEXT runtime·memequal_varlen(SB),NOSPLIT,$0-17 -#ifndef GOEXPERIMENT_regabiargs - MOVD a+0(FP), R0 - MOVD b+8(FP), R1 -#endif CMP R0, R1 BEQ eq MOVD 8(R26), R2 // compiler stores size at offset 8 in the closure CBZ R2, eq -#ifndef GOEXPERIMENT_regabiargs - MOVD $ret+16(FP), R8 -#endif B memeqbody<>(SB) eq: MOVD $1, R0 -#ifndef GOEXPERIMENT_regabiargs - MOVB R0, ret+16(FP) -#endif RET // input: // R0: pointer a // R1: pointer b // R2: data len -#ifdef GOEXPERIMENT_regabiargs // at return: result in R0 -#else -// R8: address to put result -#endif - TEXT memeqbody<>(SB),NOSPLIT,$0 CMP $1, R2 // handle 1-byte special case for better performance @@ -141,14 +115,7 @@ one: BNE not_equal equal: MOVD $1, R0 -#ifndef GOEXPERIMENT_regabiargs - MOVB R0, (R8) -#endif RET not_equal: -#ifdef GOEXPERIMENT_regabiargs MOVB ZR, R0 -#else - MOVB ZR, (R8) -#endif RET diff --git a/src/reflect/asm_arm64.s b/src/reflect/asm_arm64.s index 812b8a02c3..5e91e62aa1 100644 --- a/src/reflect/asm_arm64.s +++ b/src/reflect/asm_arm64.s @@ -33,13 +33,8 @@ TEXT ·makeFuncStub(SB),(NOSPLIT|WRAPPER),$432 ADD $LOCAL_REGARGS, RSP, R20 CALL runtime·spillArgs(SB) MOVD R26, 32(RSP) // outside of moveMakeFuncArgPtrs's arg area -#ifdef GOEXPERIMENT_regabiargs MOVD R26, R0 MOVD R20, R1 -#else - MOVD R26, 8(RSP) - MOVD R20, 16(RSP) -#endif CALL ·moveMakeFuncArgPtrs(SB) MOVD 32(RSP), R26 MOVD R26, 8(RSP) @@ -66,13 +61,8 @@ TEXT ·methodValueCall(SB),(NOSPLIT|WRAPPER),$432 ADD $LOCAL_REGARGS, RSP, R20 CALL runtime·spillArgs(SB) MOVD R26, 32(RSP) // outside of moveMakeFuncArgPtrs's arg area -#ifdef GOEXPERIMENT_regabiargs MOVD R26, R0 MOVD R20, R1 -#else - MOVD R26, 8(RSP) - MOVD R20, 16(RSP) -#endif CALL ·moveMakeFuncArgPtrs(SB) MOVD 32(RSP), R26 MOVD R26, 8(RSP) diff --git a/src/runtime/asm_arm64.s b/src/runtime/asm_arm64.s index 46ffaaa9b3..62deb070aa 100644 --- a/src/runtime/asm_arm64.s +++ b/src/runtime/asm_arm64.s @@ -150,11 +150,7 @@ TEXT gogo<>(SB), NOSPLIT|NOFRAME, $0 // Fn must never return. It should gogo(&g->sched) // to keep running g. TEXT runtime·mcall(SB), NOSPLIT|NOFRAME, $0-8 -#ifdef GOEXPERIMENT_regabiargs MOVD R0, R26 // context -#else - MOVD fn+0(FP), R26 // context -#endif // Save caller state in g->sched MOVD RSP, R0 @@ -175,11 +171,7 @@ TEXT runtime·mcall(SB), NOSPLIT|NOFRAME, $0-8 MOVD (g_sched+gobuf_sp)(g), R0 MOVD R0, RSP // sp = m->g0->sched.sp MOVD (g_sched+gobuf_bp)(g), R29 -#ifdef GOEXPERIMENT_regabiargs MOVD R3, R0 // arg = g -#else - MOVD R3, -8(RSP) // arg = g -#endif MOVD $0, -16(RSP) // dummy LR SUB $16, RSP MOVD 0(R26), R4 // code pointer @@ -317,7 +309,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0 MOVW $0, R26 B runtime·morestack(SB) -#ifdef GOEXPERIMENT_regabiargs // spillArgs stores return values from registers to a *internal/abi.RegArgs in R20. TEXT ·spillArgs(SB),NOSPLIT,$0-0 MOVD R0, (0*8)(R20) @@ -389,13 +380,6 @@ TEXT ·unspillArgs(SB),NOSPLIT,$0-0 FMOVD (30*8)(R20), F14 FMOVD (31*8)(R20), F15 RET -#else -TEXT ·spillArgs(SB),NOSPLIT,$0-0 - RET - -TEXT ·unspillArgs(SB),NOSPLIT,$0-0 - RET -#endif // reflectcall: call a function with the given argument list // func call(stackArgsType *_type, f *FuncVal, stackArgs *byte, stackArgsSize, stackRetOffset, frameSize uint32, regArgs *abi.RegArgs). @@ -536,11 +520,6 @@ CALLFN(·call1073741824, 1073741824) TEXT runtime·memhash32(SB),NOSPLIT|NOFRAME,$0-24 MOVB runtime·useAeshash(SB), R10 CBZ R10, noaes -#ifndef GOEXPERIMENT_regabiargs - MOVD p+0(FP), R0 - MOVD h+8(FP), R1 - MOVD $ret+16(FP), R2 -#endif MOVD $runtime·aeskeysched+0(SB), R3 VEOR V0.B16, V0.B16, V0.B16 @@ -554,11 +533,7 @@ TEXT runtime·memhash32(SB),NOSPLIT|NOFRAME,$0-24 AESMC V0.B16, V0.B16 AESE V2.B16, V0.B16 -#ifdef GOEXPERIMENT_regabiargs VMOV V0.D[0], R0 -#else - VST1 [V0.D1], (R2) -#endif RET noaes: B runtime·memhash32Fallback(SB) @@ -567,11 +542,6 @@ noaes: TEXT runtime·memhash64(SB),NOSPLIT|NOFRAME,$0-24 MOVB runtime·useAeshash(SB), R10 CBZ R10, noaes -#ifndef GOEXPERIMENT_regabiargs - MOVD p+0(FP), R0 - MOVD h+8(FP), R1 - MOVD $ret+16(FP), R2 -#endif MOVD $runtime·aeskeysched+0(SB), R3 VEOR V0.B16, V0.B16, V0.B16 @@ -585,11 +555,7 @@ TEXT runtime·memhash64(SB),NOSPLIT|NOFRAME,$0-24 AESMC V0.B16, V0.B16 AESE V2.B16, V0.B16 -#ifdef GOEXPERIMENT_regabiargs VMOV V0.D[0], R0 -#else - VST1 [V0.D1], (R2) -#endif RET noaes: B runtime·memhash64Fallback(SB) @@ -598,12 +564,6 @@ noaes: TEXT runtime·memhash(SB),NOSPLIT|NOFRAME,$0-32 MOVB runtime·useAeshash(SB), R10 CBZ R10, noaes -#ifndef GOEXPERIMENT_regabiargs - MOVD p+0(FP), R0 - MOVD h+8(FP), R1 - MOVD s+16(FP), R2 - MOVD $ret+24(FP), R8 -#endif B aeshashbody<>(SB) noaes: B runtime·memhashFallback(SB) @@ -612,14 +572,7 @@ noaes: TEXT runtime·strhash(SB),NOSPLIT|NOFRAME,$0-24 MOVB runtime·useAeshash(SB), R10 CBZ R10, noaes -#ifdef GOEXPERIMENT_regabiargs LDP (R0), (R0, R2) // string data / length -#else - MOVD p+0(FP), R10 // string pointer - LDP (R10), (R0, R2) // string data / length - MOVD h+8(FP), R1 - MOVD $ret+16(FP), R8 // return adddress -#endif B aeshashbody<>(SB) noaes: B runtime·strhashFallback(SB) @@ -627,11 +580,7 @@ noaes: // R0: data // R1: seed data // R2: length -#ifdef GOEXPERIMENT_regabiargs // At return, R0 = return value -#else -// R8: address to put return value -#endif TEXT aeshashbody<>(SB),NOSPLIT|NOFRAME,$0 VEOR V30.B16, V30.B16, V30.B16 VMOV R1, V30.D[0] @@ -676,19 +625,11 @@ done: AESMC V2.B16, V2.B16 AESE V0.B16, V2.B16 -#ifdef GOEXPERIMENT_regabiargs VMOV V2.D[0], R0 -#else - VST1 [V2.D1], (R8) -#endif RET aes0: -#ifdef GOEXPERIMENT_regabiargs VMOV V0.D[0], R0 -#else - VST1 [V0.D1], (R8) -#endif RET aes16: @@ -718,11 +659,8 @@ aes17to32: AESE V1.B16, V3.B16 VEOR V3.B16, V2.B16, V2.B16 -#ifdef GOEXPERIMENT_regabiargs + VMOV V2.D[0], R0 -#else - VST1 [V2.D1], (R8) -#endif RET aes33to64: @@ -765,11 +703,7 @@ aes33to64: VEOR V7.B16, V5.B16, V5.B16 VEOR V5.B16, V4.B16, V4.B16 -#ifdef GOEXPERIMENT_regabiargs VMOV V4.D[0], R0 -#else - VST1 [V4.D1], (R8) -#endif RET aes65to128: @@ -844,11 +778,7 @@ aes65to128: VEOR V11.B16, V9.B16, V9.B16 VEOR V9.B16, V8.B16, V8.B16 -#ifdef GOEXPERIMENT_regabiargs VMOV V8.D[0], R0 -#else - VST1 [V8.D1], (R8) -#endif RET aes129plus: @@ -967,11 +897,7 @@ aesloop: VEOR V4.B16, V6.B16, V4.B16 VEOR V4.B16, V0.B16, V0.B16 -#ifdef GOEXPERIMENT_regabiargs VMOV V0.D[0], R0 -#else - VST1 [V0.D1], (R8) -#endif RET TEXT runtime·procyield(SB),NOSPLIT,$0-0 @@ -1383,137 +1309,58 @@ flush: // Defined as ABIInternal since the compiler generates ABIInternal // calls to it directly and it does not use the stack-based Go ABI. TEXT runtime·panicIndex(SB),NOSPLIT,$0-16 -#ifndef GOEXPERIMENT_regabiargs - MOVD R0, x+0(FP) - MOVD R1, y+8(FP) -#endif JMP runtime·goPanicIndex(SB) TEXT runtime·panicIndexU(SB),NOSPLIT,$0-16 -#ifndef GOEXPERIMENT_regabiargs - MOVD R0, x+0(FP) - MOVD R1, y+8(FP) -#endif JMP runtime·goPanicIndexU(SB) TEXT runtime·panicSliceAlen(SB),NOSPLIT,$0-16 -#ifdef GOEXPERIMENT_regabiargs MOVD R1, R0 MOVD R2, R1 -#else - MOVD R1, x+0(FP) - MOVD R2, y+8(FP) -#endif JMP runtime·goPanicSliceAlen(SB) TEXT runtime·panicSliceAlenU(SB),NOSPLIT,$0-16 -#ifdef GOEXPERIMENT_regabiargs MOVD R1, R0 MOVD R2, R1 -#else - MOVD R1, x+0(FP) - MOVD R2, y+8(FP) -#endif JMP runtime·goPanicSliceAlenU(SB) TEXT runtime·panicSliceAcap(SB),NOSPLIT,$0-16 -#ifdef GOEXPERIMENT_regabiargs MOVD R1, R0 MOVD R2, R1 -#else - MOVD R1, x+0(FP) - MOVD R2, y+8(FP) -#endif JMP runtime·goPanicSliceAcap(SB) TEXT runtime·panicSliceAcapU(SB),NOSPLIT,$0-16 -#ifdef GOEXPERIMENT_regabiargs MOVD R1, R0 MOVD R2, R1 -#else - MOVD R1, x+0(FP) - MOVD R2, y+8(FP) -#endif JMP runtime·goPanicSliceAcapU(SB) TEXT runtime·panicSliceB(SB),NOSPLIT,$0-16 -#ifndef GOEXPERIMENT_regabiargs - MOVD R0, x+0(FP) - MOVD R1, y+8(FP) -#endif JMP runtime·goPanicSliceB(SB) TEXT runtime·panicSliceBU(SB),NOSPLIT,$0-16 -#ifndef GOEXPERIMENT_regabiargs - MOVD R0, x+0(FP) - MOVD R1, y+8(FP) -#endif JMP runtime·goPanicSliceBU(SB) TEXT runtime·panicSlice3Alen(SB),NOSPLIT,$0-16 -#ifdef GOEXPERIMENT_regabiargs MOVD R2, R0 MOVD R3, R1 -#else - MOVD R2, x+0(FP) - MOVD R3, y+8(FP) -#endif JMP runtime·goPanicSlice3Alen(SB) TEXT runtime·panicSlice3AlenU(SB),NOSPLIT,$0-16 -#ifdef GOEXPERIMENT_regabiargs MOVD R2, R0 MOVD R3, R1 -#else - MOVD R2, x+0(FP) - MOVD R3, y+8(FP) -#endif JMP runtime·goPanicSlice3AlenU(SB) TEXT runtime·panicSlice3Acap(SB),NOSPLIT,$0-16 -#ifdef GOEXPERIMENT_regabiargs MOVD R2, R0 MOVD R3, R1 -#else - MOVD R2, x+0(FP) - MOVD R3, y+8(FP) -#endif JMP runtime·goPanicSlice3Acap(SB) TEXT runtime·panicSlice3AcapU(SB),NOSPLIT,$0-16 -#ifdef GOEXPERIMENT_regabiargs MOVD R2, R0 MOVD R3, R1 -#else - MOVD R2, x+0(FP) - MOVD R3, y+8(FP) -#endif JMP runtime·goPanicSlice3AcapU(SB) TEXT runtime·panicSlice3B(SB),NOSPLIT,$0-16 -#ifdef GOEXPERIMENT_regabiargs MOVD R1, R0 MOVD R2, R1 -#else - MOVD R1, x+0(FP) - MOVD R2, y+8(FP) -#endif JMP runtime·goPanicSlice3B(SB) TEXT runtime·panicSlice3BU(SB),NOSPLIT,$0-16 -#ifdef GOEXPERIMENT_regabiargs MOVD R1, R0 MOVD R2, R1 -#else - MOVD R1, x+0(FP) - MOVD R2, y+8(FP) -#endif JMP runtime·goPanicSlice3BU(SB) TEXT runtime·panicSlice3C(SB),NOSPLIT,$0-16 -#ifndef GOEXPERIMENT_regabiargs - MOVD R0, x+0(FP) - MOVD R1, y+8(FP) -#endif JMP runtime·goPanicSlice3C(SB) TEXT runtime·panicSlice3CU(SB),NOSPLIT,$0-16 -#ifndef GOEXPERIMENT_regabiargs - MOVD R0, x+0(FP) - MOVD R1, y+8(FP) -#endif JMP runtime·goPanicSlice3CU(SB) TEXT runtime·panicSliceConvert(SB),NOSPLIT,$0-16 -#ifdef GOEXPERIMENT_regabiargs MOVD R2, R0 MOVD R3, R1 -#else - MOVD R2, x+0(FP) - MOVD R3, y+8(FP) -#endif JMP runtime·goPanicSliceConvert(SB) diff --git a/src/runtime/memclr_arm64.s b/src/runtime/memclr_arm64.s index b80cca6a1c..1c35dfe0cf 100644 --- a/src/runtime/memclr_arm64.s +++ b/src/runtime/memclr_arm64.s @@ -9,11 +9,6 @@ // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) // Also called from assembly in sys_windows_arm64.s without g (but using Go stack convention). TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT,$0-16 -#ifndef GOEXPERIMENT_regabiargs - MOVD ptr+0(FP), R0 - MOVD n+8(FP), R1 -#endif - CMP $16, R1 // If n is equal to 16 bytes, use zero_exact_16 to zero BEQ zero_exact_16 diff --git a/src/runtime/memmove_arm64.s b/src/runtime/memmove_arm64.s index bee3b00c47..8ec3ed86b9 100644 --- a/src/runtime/memmove_arm64.s +++ b/src/runtime/memmove_arm64.s @@ -27,11 +27,6 @@ // func memmove(to, from unsafe.Pointer, n uintptr) TEXT runtime·memmove(SB), NOSPLIT|NOFRAME, $0-24 -#ifndef GOEXPERIMENT_regabiargs - MOVD to+0(FP), R0 - MOVD from+8(FP), R1 - MOVD n+16(FP), R2 -#endif CBZ R2, copy0 // Small copies: 1..16 bytes diff --git a/src/runtime/race_arm64.s b/src/runtime/race_arm64.s index 95fec0b9c6..8c0dd25f0b 100644 --- a/src/runtime/race_arm64.s +++ b/src/runtime/race_arm64.s @@ -45,11 +45,7 @@ // Defined as ABIInternal so as to avoid introducing a wrapper, // which would make caller's PC ineffective. TEXT runtime·raceread(SB), NOSPLIT, $0-8 -#ifdef GOEXPERIMENT_regabiargs MOVD R0, R1 // addr -#else - MOVD addr+0(FP), R1 -#endif MOVD LR, R2 // void __tsan_read(ThreadState *thr, void *addr, void *pc); MOVD $__tsan_read(SB), R9 @@ -74,11 +70,7 @@ TEXT runtime·racereadpc(SB), NOSPLIT, $0-24 // Defined as ABIInternal so as to avoid introducing a wrapper, // which would make caller's PC ineffective. TEXT runtime·racewrite(SB), NOSPLIT, $0-8 -#ifdef GOEXPERIMENT_regabiargs MOVD R0, R1 // addr -#else - MOVD addr+0(FP), R1 -#endif MOVD LR, R2 // void __tsan_write(ThreadState *thr, void *addr, void *pc); MOVD $__tsan_write(SB), R9 @@ -103,13 +95,8 @@ TEXT runtime·racewritepc(SB), NOSPLIT, $0-24 // Defined as ABIInternal so as to avoid introducing a wrapper, // which would make caller's PC ineffective. TEXT runtime·racereadrange(SB), NOSPLIT, $0-16 -#ifdef GOEXPERIMENT_regabiargs MOVD R1, R2 // size MOVD R0, R1 // addr -#else - MOVD addr+0(FP), R1 - MOVD size+8(FP), R2 -#endif MOVD LR, R3 // void __tsan_read_range(ThreadState *thr, void *addr, uintptr size, void *pc); MOVD $__tsan_read_range(SB), R9 @@ -135,13 +122,8 @@ TEXT runtime·racereadrangepc1(SB), NOSPLIT, $0-24 // Defined as ABIInternal so as to avoid introducing a wrapper, // which would make caller's PC ineffective. TEXT runtime·racewriterange(SB), NOSPLIT, $0-16 -#ifdef GOEXPERIMENT_regabiargs MOVD R1, R2 // size MOVD R0, R1 // addr -#else - MOVD addr+0(FP), R1 - MOVD size+8(FP), R2 -#endif MOVD LR, R3 // void __tsan_write_range(ThreadState *thr, void *addr, uintptr size, void *pc); MOVD $__tsan_write_range(SB), R9 @@ -189,11 +171,7 @@ ret: // func runtime·racefuncenter(pc uintptr) // Called from instrumented code. TEXT runtime·racefuncenter(SB), NOSPLIT, $0-8 -#ifdef GOEXPERIMENT_regabiargs MOVD R0, R9 // callpc -#else - MOVD callpc+0(FP), R9 -#endif JMP racefuncenter<>(SB) // Common code for racefuncenter -- 2.48.1