aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/preempt_amd64.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/preempt_amd64.s')
-rw-r--r--src/runtime/preempt_amd64.s82
1 files changed, 48 insertions, 34 deletions
diff --git a/src/runtime/preempt_amd64.s b/src/runtime/preempt_amd64.s
index 8e3ed0d7c5..0a33ce7f3e 100644
--- a/src/runtime/preempt_amd64.s
+++ b/src/runtime/preempt_amd64.s
@@ -1,6 +1,7 @@
// Code generated by mkpreempt.go; DO NOT EDIT.
#include "go_asm.h"
+#include "go_tls.h"
#include "asm_amd64.h"
#include "textflag.h"
@@ -10,9 +11,10 @@ TEXT ·asyncPreempt(SB),NOSPLIT|NOFRAME,$0-0
// Save flags before clobbering them
PUSHFQ
// obj doesn't understand ADD/SUB on SP, but does understand ADJSP
- ADJSP $368
+ ADJSP $112
// But vet doesn't know ADJSP, so suppress vet stack checking
NOP SP
+ // Save GPs
MOVQ AX, 0(SP)
MOVQ CX, 8(SP)
MOVQ DX, 16(SP)
@@ -27,39 +29,51 @@ TEXT ·asyncPreempt(SB),NOSPLIT|NOFRAME,$0-0
MOVQ R13, 88(SP)
MOVQ R14, 96(SP)
MOVQ R15, 104(SP)
- MOVUPS X0, 112(SP)
- MOVUPS X1, 128(SP)
- MOVUPS X2, 144(SP)
- MOVUPS X3, 160(SP)
- MOVUPS X4, 176(SP)
- MOVUPS X5, 192(SP)
- MOVUPS X6, 208(SP)
- MOVUPS X7, 224(SP)
- MOVUPS X8, 240(SP)
- MOVUPS X9, 256(SP)
- MOVUPS X10, 272(SP)
- MOVUPS X11, 288(SP)
- MOVUPS X12, 304(SP)
- MOVUPS X13, 320(SP)
- MOVUPS X14, 336(SP)
- MOVUPS X15, 352(SP)
+ // Save extended register state to p.xRegs.scratch
+ // Don't make assumptions about ABI register state. See mkpreempt.go
+ get_tls(CX)
+ MOVQ g(CX), R14
+ MOVQ g_m(R14), AX
+ MOVQ m_p(AX), AX
+ LEAQ (p_xRegs+xRegPerP_scratch)(AX), AX
+ MOVUPS X0, 0(AX)
+ MOVUPS X1, 16(AX)
+ MOVUPS X2, 32(AX)
+ MOVUPS X3, 48(AX)
+ MOVUPS X4, 64(AX)
+ MOVUPS X5, 80(AX)
+ MOVUPS X6, 96(AX)
+ MOVUPS X7, 112(AX)
+ MOVUPS X8, 128(AX)
+ MOVUPS X9, 144(AX)
+ MOVUPS X10, 160(AX)
+ MOVUPS X11, 176(AX)
+ MOVUPS X12, 192(AX)
+ MOVUPS X13, 208(AX)
+ MOVUPS X14, 224(AX)
+ MOVUPS X15, 240(AX)
CALL ·asyncPreempt2(SB)
- MOVUPS 352(SP), X15
- MOVUPS 336(SP), X14
- MOVUPS 320(SP), X13
- MOVUPS 304(SP), X12
- MOVUPS 288(SP), X11
- MOVUPS 272(SP), X10
- MOVUPS 256(SP), X9
- MOVUPS 240(SP), X8
- MOVUPS 224(SP), X7
- MOVUPS 208(SP), X6
- MOVUPS 192(SP), X5
- MOVUPS 176(SP), X4
- MOVUPS 160(SP), X3
- MOVUPS 144(SP), X2
- MOVUPS 128(SP), X1
- MOVUPS 112(SP), X0
+ // Restore non-GPs from *p.xRegs.cache
+ MOVQ g_m(R14), AX
+ MOVQ m_p(AX), AX
+ MOVQ (p_xRegs+xRegPerP_cache)(AX), AX
+ MOVUPS 240(AX), X15
+ MOVUPS 224(AX), X14
+ MOVUPS 208(AX), X13
+ MOVUPS 192(AX), X12
+ MOVUPS 176(AX), X11
+ MOVUPS 160(AX), X10
+ MOVUPS 144(AX), X9
+ MOVUPS 128(AX), X8
+ MOVUPS 112(AX), X7
+ MOVUPS 96(AX), X6
+ MOVUPS 80(AX), X5
+ MOVUPS 64(AX), X4
+ MOVUPS 48(AX), X3
+ MOVUPS 32(AX), X2
+ MOVUPS 16(AX), X1
+ MOVUPS 0(AX), X0
+ // Restore GPs
MOVQ 104(SP), R15
MOVQ 96(SP), R14
MOVQ 88(SP), R13
@@ -74,7 +88,7 @@ TEXT ·asyncPreempt(SB),NOSPLIT|NOFRAME,$0-0
MOVQ 16(SP), DX
MOVQ 8(SP), CX
MOVQ 0(SP), AX
- ADJSP $-368
+ ADJSP $-112
POPFQ
POPQ BP
RET