Commit 07826038 authored by Dave Cheney's avatar Dave Cheney

runtime: avoid r9/r10 during memset

Partially fixes issue 3718.

R=golang-dev, rsc, minux.ma
CC=golang-dev
https://golang.org/cl/6300043
parent c123c6c3
...@@ -345,17 +345,11 @@ TEXT runtime·cgocallback(SB),7,$16 ...@@ -345,17 +345,11 @@ TEXT runtime·cgocallback(SB),7,$16
// Done! // Done!
RET RET
TEXT runtime·memclr(SB),7,$20 TEXT runtime·memclr(SB),7,$0
MOVW 0(FP), R0 MOVW 0(FP), R0
MOVW $0, R1 // c = 0 MOVW $0, R1
MOVW R1, -16(SP) MOVW R1, 0(FP)
MOVW 4(FP), R1 // n
MOVW R1, -12(SP)
MOVW m, -8(SP) // Save m and g
MOVW g, -4(SP)
BL runtime·memset(SB) BL runtime·memset(SB)
MOVW -8(SP), m // Restore m and g, memset clobbers them
MOVW -4(SP), g
RET RET
TEXT runtime·getcallerpc(SB),7,$-4 TEXT runtime·getcallerpc(SB),7,$-4
......
...@@ -23,17 +23,14 @@ ...@@ -23,17 +23,14 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE. // THE SOFTWARE.
TO = 1 TO = 8
TOE = 2 TOE = 11
N = 3 N = 12
TMP = 3 /* N and TMP don't overlap */ TMP = 12 /* 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.
TEXT runtime·memset(SB), $0 TEXT runtime·memset(SB), $0
MOVW R0, R(TO) MOVW R0, R(TO)
MOVW data+4(FP), R(4) MOVW data+4(FP), R(0)
MOVW n+8(FP), R(N) MOVW n+8(FP), R(N)
ADD R(N), R(TO), R(TOE) /* to end pointer */ ADD R(N), R(TO), R(TOE) /* to end pointer */
...@@ -41,17 +38,17 @@ TEXT runtime·memset(SB), $0 ...@@ -41,17 +38,17 @@ TEXT runtime·memset(SB), $0
CMP $4, R(N) /* need at least 4 bytes to copy */ CMP $4, R(N) /* need at least 4 bytes to copy */
BLT _1tail BLT _1tail
AND $0xFF, R(4) /* it's a byte */ AND $0xFF, R(0) /* it's a byte */
SLL $8, R(4), R(TMP) /* replicate to a word */ SLL $8, R(0), R(TMP) /* replicate to a word */
ORR R(TMP), R(4) ORR R(TMP), R(0)
SLL $16, R(4), R(TMP) SLL $16, R(0), R(TMP)
ORR R(TMP), R(4) ORR R(TMP), R(0)
_4align: /* align on 4 */ _4align: /* align on 4 */
AND.S $3, R(TO), R(TMP) AND.S $3, R(TO), R(TMP)
BEQ _4aligned BEQ _4aligned
MOVBU.P R(4), 1(R(TO)) /* implicit write back */ MOVBU.P R(0), 1(R(TO)) /* implicit write back */
B _4align B _4align
_4aligned: _4aligned:
...@@ -59,19 +56,19 @@ _4aligned: ...@@ -59,19 +56,19 @@ _4aligned:
CMP R(TMP), R(TO) CMP R(TMP), R(TO)
BHS _4tail BHS _4tail
MOVW R4, R5 /* replicate */ MOVW R0, R1 /* replicate */
MOVW R4, R6 MOVW R0, R2
MOVW R4, R7 MOVW R0, R3
MOVW R4, R8 MOVW R0, R4
MOVW R4, R9 MOVW R0, R5
MOVW R4, R10 MOVW R0, R6
MOVW R4, R11 MOVW R0, R7
_f32loop: _f32loop:
CMP R(TMP), R(TO) CMP R(TMP), R(TO)
BHS _4tail BHS _4tail
MOVM.IA.W [R4-R11], (R(TO)) MOVM.IA.W [R0-R7], (R(TO))
B _f32loop B _f32loop
_4tail: _4tail:
...@@ -80,14 +77,14 @@ _4loop: ...@@ -80,14 +77,14 @@ _4loop:
CMP R(TMP), R(TO) CMP R(TMP), R(TO)
BHS _1tail BHS _1tail
MOVW.P R(4), 4(R(TO)) /* implicit write back */ MOVW.P R(0), 4(R(TO)) /* implicit write back */
B _4loop B _4loop
_1tail: _1tail:
CMP R(TO), R(TOE) CMP R(TO), R(TOE)
BEQ _return BEQ _return
MOVBU.P R(4), 1(R(TO)) /* implicit write back */ MOVBU.P R(0), 1(R(TO)) /* implicit write back */
B _1tail B _1tail
_return: _return:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment