| // Copyright 2026 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package main |
| |
| // Regression test to verify that cgocallback restores X15 = 0 as required by |
| // ABIInternal. |
| |
| /* |
| #include <stdint.h> |
| |
| void go_callback_amd64(); |
| |
| static void call_go_callback_amd64() { |
| // Clobber X15. |
| uint64_t val = 42; |
| asm volatile( |
| "vmovdqu %0, %%xmm15;" |
| : |
| : "m" (val) |
| : "xmm15"); |
| |
| go_callback_amd64(); |
| } |
| */ |
| import "C" |
| |
| import ( |
| "runtime/testdata/testprogcgo/goasm" |
| ) |
| |
| func init() { |
| register("CgoCallbackX15", CgoCallbackX15) |
| } |
| |
| //export go_callback_amd64 |
| func go_callback_amd64() { |
| v := goasm.ReadX15() |
| if v != 0 { |
| println("X15 =", v) |
| panic("non-zero X15") |
| } |
| } |
| |
| func CgoCallbackX15() { |
| C.call_go_callback_amd64() |
| |
| println("OK") |
| } |