| // Code generated by mkpreempt.go; DO NOT EDIT. | |
| #include "go_asm.h" | |
| #include "go_tls.h" | |
| #include "asm_amd64.h" | |
| #include "textflag.h" | |
| TEXT ·asyncPreempt(SB),NOSPLIT|NOFRAME,$0-0 | |
| PUSHQ BP | |
| MOVQ SP, BP | |
| // Save flags before clobbering them | |
| PUSHFQ | |
| // obj doesn't understand ADD/SUB on SP, but does understand ADJSP | |
| 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) | |
| MOVQ BX, 24(SP) | |
| MOVQ SI, 32(SP) | |
| MOVQ DI, 40(SP) | |
| MOVQ R8, 48(SP) | |
| MOVQ R9, 56(SP) | |
| MOVQ R10, 64(SP) | |
| MOVQ R11, 72(SP) | |
| MOVQ R12, 80(SP) | |
| MOVQ R13, 88(SP) | |
| MOVQ R14, 96(SP) | |
| MOVQ R15, 104(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 | |
| #ifdef GOEXPERIMENT_simd | |
| CMPB internal∕cpu·X86+const_offsetX86HasAVX512(SB), $1 | |
| JE saveAVX512 | |
| CMPB internal∕cpu·X86+const_offsetX86HasAVX2(SB), $1 | |
| JE saveAVX2 | |
| #endif | |
| saveSSE: | |
| MOVUPS X0, 0(AX) | |
| MOVUPS X1, 64(AX) | |
| MOVUPS X2, 128(AX) | |
| MOVUPS X3, 192(AX) | |
| MOVUPS X4, 256(AX) | |
| MOVUPS X5, 320(AX) | |
| MOVUPS X6, 384(AX) | |
| MOVUPS X7, 448(AX) | |
| MOVUPS X8, 512(AX) | |
| MOVUPS X9, 576(AX) | |
| MOVUPS X10, 640(AX) | |
| MOVUPS X11, 704(AX) | |
| MOVUPS X12, 768(AX) | |
| MOVUPS X13, 832(AX) | |
| MOVUPS X14, 896(AX) | |
| MOVUPS X15, 960(AX) | |
| JMP preempt | |
| saveAVX2: | |
| VMOVDQU Y0, 0(AX) | |
| VMOVDQU Y1, 64(AX) | |
| VMOVDQU Y2, 128(AX) | |
| VMOVDQU Y3, 192(AX) | |
| VMOVDQU Y4, 256(AX) | |
| VMOVDQU Y5, 320(AX) | |
| VMOVDQU Y6, 384(AX) | |
| VMOVDQU Y7, 448(AX) | |
| VMOVDQU Y8, 512(AX) | |
| VMOVDQU Y9, 576(AX) | |
| VMOVDQU Y10, 640(AX) | |
| VMOVDQU Y11, 704(AX) | |
| VMOVDQU Y12, 768(AX) | |
| VMOVDQU Y13, 832(AX) | |
| VMOVDQU Y14, 896(AX) | |
| VMOVDQU Y15, 960(AX) | |
| JMP preempt | |
| saveAVX512: | |
| VMOVDQU64 Z0, 0(AX) | |
| VMOVDQU64 Z1, 64(AX) | |
| VMOVDQU64 Z2, 128(AX) | |
| VMOVDQU64 Z3, 192(AX) | |
| VMOVDQU64 Z4, 256(AX) | |
| VMOVDQU64 Z5, 320(AX) | |
| VMOVDQU64 Z6, 384(AX) | |
| VMOVDQU64 Z7, 448(AX) | |
| VMOVDQU64 Z8, 512(AX) | |
| VMOVDQU64 Z9, 576(AX) | |
| VMOVDQU64 Z10, 640(AX) | |
| VMOVDQU64 Z11, 704(AX) | |
| VMOVDQU64 Z12, 768(AX) | |
| VMOVDQU64 Z13, 832(AX) | |
| VMOVDQU64 Z14, 896(AX) | |
| VMOVDQU64 Z15, 960(AX) | |
| KMOVQ K0, 1024(AX) | |
| KMOVQ K1, 1032(AX) | |
| KMOVQ K2, 1040(AX) | |
| KMOVQ K3, 1048(AX) | |
| KMOVQ K4, 1056(AX) | |
| KMOVQ K5, 1064(AX) | |
| KMOVQ K6, 1072(AX) | |
| KMOVQ K7, 1080(AX) | |
| JMP preempt | |
| preempt: | |
| CALL ·asyncPreempt2(SB) | |
| // Restore non-GPs from *p.xRegs.cache | |
| MOVQ g_m(R14), AX | |
| MOVQ m_p(AX), AX | |
| MOVQ (p_xRegs+xRegPerP_cache)(AX), AX | |
| #ifdef GOEXPERIMENT_simd | |
| CMPB internal∕cpu·X86+const_offsetX86HasAVX512(SB), $1 | |
| JE restoreAVX512 | |
| CMPB internal∕cpu·X86+const_offsetX86HasAVX2(SB), $1 | |
| JE restoreAVX2 | |
| #endif | |
| restoreSSE: | |
| MOVUPS 960(AX), X15 | |
| MOVUPS 896(AX), X14 | |
| MOVUPS 832(AX), X13 | |
| MOVUPS 768(AX), X12 | |
| MOVUPS 704(AX), X11 | |
| MOVUPS 640(AX), X10 | |
| MOVUPS 576(AX), X9 | |
| MOVUPS 512(AX), X8 | |
| MOVUPS 448(AX), X7 | |
| MOVUPS 384(AX), X6 | |
| MOVUPS 320(AX), X5 | |
| MOVUPS 256(AX), X4 | |
| MOVUPS 192(AX), X3 | |
| MOVUPS 128(AX), X2 | |
| MOVUPS 64(AX), X1 | |
| MOVUPS 0(AX), X0 | |
| JMP restoreGPs | |
| restoreAVX2: | |
| VMOVDQU 960(AX), Y15 | |
| VMOVDQU 896(AX), Y14 | |
| VMOVDQU 832(AX), Y13 | |
| VMOVDQU 768(AX), Y12 | |
| VMOVDQU 704(AX), Y11 | |
| VMOVDQU 640(AX), Y10 | |
| VMOVDQU 576(AX), Y9 | |
| VMOVDQU 512(AX), Y8 | |
| VMOVDQU 448(AX), Y7 | |
| VMOVDQU 384(AX), Y6 | |
| VMOVDQU 320(AX), Y5 | |
| VMOVDQU 256(AX), Y4 | |
| VMOVDQU 192(AX), Y3 | |
| VMOVDQU 128(AX), Y2 | |
| VMOVDQU 64(AX), Y1 | |
| VMOVDQU 0(AX), Y0 | |
| JMP restoreGPs | |
| restoreAVX512: | |
| KMOVQ 1080(AX), K7 | |
| KMOVQ 1072(AX), K6 | |
| KMOVQ 1064(AX), K5 | |
| KMOVQ 1056(AX), K4 | |
| KMOVQ 1048(AX), K3 | |
| KMOVQ 1040(AX), K2 | |
| KMOVQ 1032(AX), K1 | |
| KMOVQ 1024(AX), K0 | |
| VMOVDQU64 960(AX), Z15 | |
| VMOVDQU64 896(AX), Z14 | |
| VMOVDQU64 832(AX), Z13 | |
| VMOVDQU64 768(AX), Z12 | |
| VMOVDQU64 704(AX), Z11 | |
| VMOVDQU64 640(AX), Z10 | |
| VMOVDQU64 576(AX), Z9 | |
| VMOVDQU64 512(AX), Z8 | |
| VMOVDQU64 448(AX), Z7 | |
| VMOVDQU64 384(AX), Z6 | |
| VMOVDQU64 320(AX), Z5 | |
| VMOVDQU64 256(AX), Z4 | |
| VMOVDQU64 192(AX), Z3 | |
| VMOVDQU64 128(AX), Z2 | |
| VMOVDQU64 64(AX), Z1 | |
| VMOVDQU64 0(AX), Z0 | |
| JMP restoreGPs | |
| restoreGPs: | |
| // Restore GPs | |
| MOVQ 104(SP), R15 | |
| MOVQ 96(SP), R14 | |
| MOVQ 88(SP), R13 | |
| MOVQ 80(SP), R12 | |
| MOVQ 72(SP), R11 | |
| MOVQ 64(SP), R10 | |
| MOVQ 56(SP), R9 | |
| MOVQ 48(SP), R8 | |
| MOVQ 40(SP), DI | |
| MOVQ 32(SP), SI | |
| MOVQ 24(SP), BX | |
| MOVQ 16(SP), DX | |
| MOVQ 8(SP), CX | |
| MOVQ 0(SP), AX | |
| ADJSP $-112 | |
| POPFQ | |
| POPQ BP | |
| RET |