From 07826038c39afb5021134b2c403f773f3f9591aa Mon Sep 17 00:00:00 2001 From: Dave Cheney Date: Mon, 25 Jun 2012 07:59:50 +1000 Subject: [PATCH] runtime: avoid r9/r10 during memset Partially fixes issue 3718. R=golang-dev, rsc, minux.ma CC=golang-dev https://golang.org/cl/6300043 --- src/pkg/runtime/asm_arm.s | 12 +++------ src/pkg/runtime/memset_arm.s | 47 +++++++++++++++++------------------- 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/src/pkg/runtime/asm_arm.s b/src/pkg/runtime/asm_arm.s index 1d98a6841e..9b73f1797b 100644 --- a/src/pkg/runtime/asm_arm.s +++ b/src/pkg/runtime/asm_arm.s @@ -345,17 +345,11 @@ TEXT runtime·cgocallback(SB),7,$16 // Done! RET -TEXT runtime·memclr(SB),7,$20 +TEXT runtime·memclr(SB),7,$0 MOVW 0(FP), R0 - MOVW $0, R1 // c = 0 - MOVW R1, -16(SP) - MOVW 4(FP), R1 // n - MOVW R1, -12(SP) - MOVW m, -8(SP) // Save m and g - MOVW g, -4(SP) + MOVW $0, R1 + MOVW R1, 0(FP) BL runtime·memset(SB) - MOVW -8(SP), m // Restore m and g, memset clobbers them - MOVW -4(SP), g RET TEXT runtime·getcallerpc(SB),7,$-4 diff --git a/src/pkg/runtime/memset_arm.s b/src/pkg/runtime/memset_arm.s index 974b8da7a9..8bc2004022 100644 --- a/src/pkg/runtime/memset_arm.s +++ b/src/pkg/runtime/memset_arm.s @@ -23,17 +23,14 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -TO = 1 -TOE = 2 -N = 3 -TMP = 3 /* N and TMP don't overlap */ - -// TODO(kaib): memset clobbers R9 and R10 (m and g). This makes the -// registers unpredictable if (when) memset SIGSEGV's. Fix it by -// moving the R4-R11 register bank. +TO = 8 +TOE = 11 +N = 12 +TMP = 12 /* N and TMP don't overlap */ + TEXT runtime·memset(SB), $0 MOVW R0, R(TO) - MOVW data+4(FP), R(4) + MOVW data+4(FP), R(0) MOVW n+8(FP), R(N) ADD R(N), R(TO), R(TOE) /* to end pointer */ @@ -41,17 +38,17 @@ TEXT runtime·memset(SB), $0 CMP $4, R(N) /* need at least 4 bytes to copy */ BLT _1tail - AND $0xFF, R(4) /* it's a byte */ - SLL $8, R(4), R(TMP) /* replicate to a word */ - ORR R(TMP), R(4) - SLL $16, R(4), R(TMP) - ORR R(TMP), R(4) + AND $0xFF, R(0) /* it's a byte */ + SLL $8, R(0), R(TMP) /* replicate to a word */ + ORR R(TMP), R(0) + SLL $16, R(0), R(TMP) + ORR R(TMP), R(0) _4align: /* align on 4 */ AND.S $3, R(TO), R(TMP) BEQ _4aligned - MOVBU.P R(4), 1(R(TO)) /* implicit write back */ + MOVBU.P R(0), 1(R(TO)) /* implicit write back */ B _4align _4aligned: @@ -59,19 +56,19 @@ _4aligned: CMP R(TMP), R(TO) BHS _4tail - MOVW R4, R5 /* replicate */ - MOVW R4, R6 - MOVW R4, R7 - MOVW R4, R8 - MOVW R4, R9 - MOVW R4, R10 - MOVW R4, R11 + MOVW R0, R1 /* replicate */ + MOVW R0, R2 + MOVW R0, R3 + MOVW R0, R4 + MOVW R0, R5 + MOVW R0, R6 + MOVW R0, R7 _f32loop: CMP R(TMP), R(TO) BHS _4tail - MOVM.IA.W [R4-R11], (R(TO)) + MOVM.IA.W [R0-R7], (R(TO)) B _f32loop _4tail: @@ -80,14 +77,14 @@ _4loop: CMP R(TMP), R(TO) BHS _1tail - MOVW.P R(4), 4(R(TO)) /* implicit write back */ + MOVW.P R(0), 4(R(TO)) /* implicit write back */ B _4loop _1tail: CMP R(TO), R(TOE) BEQ _return - MOVBU.P R(4), 1(R(TO)) /* implicit write back */ + MOVBU.P R(0), 1(R(TO)) /* implicit write back */ B _1tail _return: -- 2.48.1