]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile, runtime: guard X15 zeroing with GOEXPERIMENT=simd
authorCherry Mui <cherryyz@google.com>
Wed, 26 Nov 2025 15:56:15 +0000 (10:56 -0500)
committerCherry Mui <cherryyz@google.com>
Wed, 26 Nov 2025 22:28:50 +0000 (14:28 -0800)
If simd experiment is not enabled, the compiler doesn't use the
AVX part of the register. So only zero it with the SSE instruction.

Change-Id: Ia3bdf34a9ed273128db2ee0f4f5db6f7cc76a975
Reviewed-on: https://go-review.googlesource.com/c/go/+/724720
Reviewed-by: Junyang Shao <shaojunyang@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: David Chase <drchase@google.com>
src/cmd/compile/internal/amd64/ssa.go
src/runtime/asm_amd64.s
src/runtime/race_amd64.s
src/runtime/sys_darwin_amd64.s
src/runtime/sys_dragonfly_amd64.s
src/runtime/sys_freebsd_amd64.s
src/runtime/sys_linux_amd64.s
src/runtime/sys_netbsd_amd64.s
src/runtime/sys_openbsd_amd64.s
src/runtime/sys_windows_amd64.s

index a4676cd0a9bcf8c008b65c821f0f587928ab1cd1..9a0fa27470a44a30af4bd52281e7a677c5d38c8c 100644 (file)
@@ -1871,6 +1871,10 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
 
 // zeroX15 zeroes the X15 register.
 func zeroX15(s *ssagen.State) {
+       if !buildcfg.Experiment.SIMD {
+               opregreg(s, x86.AXORPS, x86.REG_X15, x86.REG_X15)
+               return
+       }
        vxorps := func(s *ssagen.State) {
                p := s.Prog(x86.AVXORPS)
                p.From.Type = obj.TYPE_REG
index 7c746803a87ac305cd538da59f25ff23d9ecacf4..ed46ad4a2846b7fdedf690fad9bb3b7fe1953682 100644 (file)
@@ -1049,9 +1049,11 @@ needm:
        // there's no need to handle that. Clear R14 so that there's
        // a bad value in there, in case needm tries to use it.
        XORPS   X15, X15
+#ifdef GOEXPERIMENT_simd
        CMPB    internal∕cpu·X86+const_offsetX86HasAVX(SB), $1
        JNE     2(PC)
        VXORPS  X15, X15, X15
+#endif
        XORQ    R14, R14
        MOVQ    $runtime·needAndBindM<ABIInternal>(SB), AX
        CALL    AX
@@ -1749,9 +1751,11 @@ TEXT ·sigpanic0(SB),NOSPLIT,$0-0
        get_tls(R14)
        MOVQ    g(R14), R14
        XORPS   X15, X15
+#ifdef GOEXPERIMENT_simd
        CMPB    internal∕cpu·X86+const_offsetX86HasAVX(SB), $1
        JNE     2(PC)
        VXORPS  X15, X15, X15
+#endif
        JMP     ·sigpanic<ABIInternal>(SB)
 
 // gcWriteBarrier informs the GC about heap pointer writes.
index 23f2e59e3d4f8b1a31f6cb136e749d5f5e1d0581..ade29bc5f1f8fdd56320204e2759e54c122a3b9d 100644 (file)
@@ -456,9 +456,11 @@ call:
        // Back to Go world, set special registers.
        // The g register (R14) is preserved in C.
        XORPS   X15, X15
+#ifdef GOEXPERIMENT_simd
        CMPB    internal∕cpu·X86+const_offsetX86HasAVX(SB), $1
        JNE     2(PC)
        VXORPS  X15, X15, X15
+#endif
        RET
 
 // C->Go callback thunk that allows to call runtime·racesymbolize from C code.
index e4e1216d569e955d5bc6ff1752a8a17ac966dc19..e033e8b7021e047acdb9f7b7866f323a9d26c7ab 100644 (file)
@@ -177,9 +177,11 @@ TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME|NOFRAME,$0
        get_tls(R12)
        MOVQ    g(R12), R14
        PXOR    X15, X15
+#ifdef GOEXPERIMENT_simd
        CMPB    internal∕cpu·X86+const_offsetX86HasAVX(SB), $1
        JNE     2(PC)
        VXORPS  X15, X15, X15
+#endif
 
        // Reserve space for spill slots.
        NOP     SP              // disable vet stack checking
index 84bf326aad32cbe07a108649755971a0fa2bf17f..e417d4b8a814f1c9d586ebabe4d8dcf6d8247b12 100644 (file)
@@ -228,9 +228,11 @@ TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME|NOFRAME,$0
        get_tls(R12)
        MOVQ    g(R12), R14
        PXOR    X15, X15
+#ifdef GOEXPERIMENT_simd
        CMPB    internal∕cpu·X86+const_offsetX86HasAVX(SB), $1
        JNE     2(PC)
        VXORPS  X15, X15, X15
+#endif
 
        // Reserve space for spill slots.
        NOP     SP              // disable vet stack checking
index a1fa3a6fa29c96d0b3f1bdb351a24ada0674143f..bab275cc7262dd23faca149243d1096d213e56fd 100644 (file)
@@ -265,9 +265,11 @@ TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME|NOFRAME,$0
        get_tls(R12)
        MOVQ    g(R12), R14
        PXOR    X15, X15
+#ifdef GOEXPERIMENT_simd
        CMPB    internal∕cpu·X86+const_offsetX86HasAVX(SB), $1
        JNE     2(PC)
        VXORPS  X15, X15, X15
+#endif
 
        // Reserve space for spill slots.
        NOP     SP              // disable vet stack checking
@@ -293,9 +295,11 @@ TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT|NOFRAME,$0
        get_tls(R12)
        MOVQ    g(R12), R14
        PXOR    X15, X15
+#ifdef GOEXPERIMENT_simd
        CMPB    internal∕cpu·X86+const_offsetX86HasAVX(SB), $1
        JNE     2(PC)
        VXORPS  X15, X15, X15
+#endif
 
        // Reserve space for spill slots.
        NOP     SP              // disable vet stack checking
index 02505c2fb0aac29cab934db344f79b6ada38358f..e252a4b9147ffb99d2f101528c26ba7328522457 100644 (file)
@@ -340,9 +340,11 @@ TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME|NOFRAME,$0
        get_tls(R12)
        MOVQ    g(R12), R14
        PXOR    X15, X15
+#ifdef GOEXPERIMENT_simd
        CMPB    internal∕cpu·X86+const_offsetX86HasAVX(SB), $1
        JNE     2(PC)
        VXORPS  X15, X15, X15
+#endif
 
        // Reserve space for spill slots.
        NOP     SP              // disable vet stack checking
@@ -368,9 +370,11 @@ TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT|NOFRAME,$0
        get_tls(R12)
        MOVQ    g(R12), R14
        PXOR    X15, X15
+#ifdef GOEXPERIMENT_simd
        CMPB    internal∕cpu·X86+const_offsetX86HasAVX(SB), $1
        JNE     2(PC)
        VXORPS  X15, X15, X15
+#endif
 
        // Reserve space for spill slots.
        NOP     SP              // disable vet stack checking
index edc7f3d6ee062a906f3d4308b8ab02a03c8b1ca8..946b1fbe22cc76f893cacaec5cc53cf446b9e9da 100644 (file)
@@ -310,9 +310,11 @@ TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME|NOFRAME,$0
        get_tls(R12)
        MOVQ    g(R12), R14
        PXOR    X15, X15
+#ifdef GOEXPERIMENT_simd
        CMPB    internal∕cpu·X86+const_offsetX86HasAVX(SB), $1
        JNE     2(PC)
        VXORPS  X15, X15, X15
+#endif
 
        // Reserve space for spill slots.
        NOP     SP              // disable vet stack checking
index 734dfe6478e852a901271d8a6fc4a5b7b4e5c7dd..7766fa5194ec47e579204179c48ae0f3e7272fb2 100644 (file)
@@ -64,9 +64,11 @@ TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME|NOFRAME,$0
        get_tls(R12)
        MOVQ    g(R12), R14
        PXOR    X15, X15
+#ifdef GOEXPERIMENT_simd
        CMPB    internal∕cpu·X86+const_offsetX86HasAVX(SB), $1
        JNE     2(PC)
        VXORPS  X15, X15, X15
+#endif
 
        // Reserve space for spill slots.
        NOP     SP              // disable vet stack checking
index b0b4d3cce65688a805de8e100365a480fd752780..52a21ba89bbdc92154d769a9216daae85c09d05d 100644 (file)
@@ -32,9 +32,11 @@ TEXT sigtramp<>(SB),NOSPLIT,$0-0
        // R14 is cleared in case there's a non-zero value in there
        // if called from a non-go thread.
        XORPS   X15, X15
+#ifdef GOEXPERIMENT_simd
        CMPB    internal∕cpu·X86+const_offsetX86HasAVX(SB), $1
        JNE     2(PC)
        VXORPS  X15, X15, X15
+#endif
        XORQ    R14, R14
 
        get_tls(AX)