summaryrefslogtreecommitdiff
path: root/abi/switch.go
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2025-03-19 04:40:49 -0500
committerJeff Carr <[email protected]>2025-03-19 04:40:49 -0500
commit17119d9298e132aa309f1cc95e439f29f61214b0 (patch)
tree578abd95ba2cfe0cdcec3f6e51d609ccb9e2f36b /abi/switch.go
day1v0.0.1
Diffstat (limited to 'abi/switch.go')
-rw-r--r--abi/switch.go58
1 files changed, 58 insertions, 0 deletions
diff --git a/abi/switch.go b/abi/switch.go
new file mode 100644
index 0000000..a30fdd0
--- /dev/null
+++ b/abi/switch.go
@@ -0,0 +1,58 @@
+// Copyright 2023 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 abi
+
+import "internal/goarch"
+
+type InterfaceSwitch struct {
+ Cache *InterfaceSwitchCache
+ NCases int
+
+ // Array of NCases elements.
+ // Each case must be a non-empty interface type.
+ Cases [1]*InterfaceType
+}
+
+type InterfaceSwitchCache struct {
+ Mask uintptr // mask for index. Must be a power of 2 minus 1
+ Entries [1]InterfaceSwitchCacheEntry // Mask+1 entries total
+}
+
+type InterfaceSwitchCacheEntry struct {
+ // type of source value (a *Type)
+ Typ uintptr
+ // case # to dispatch to
+ Case int
+ // itab to use for resulting case variable (a *runtime.itab)
+ Itab uintptr
+}
+
+func UseInterfaceSwitchCache(arch goarch.ArchFamilyType) bool {
+ // We need an atomic load instruction to make the cache multithreaded-safe.
+ // (AtomicLoadPtr needs to be implemented in cmd/compile/internal/ssa/_gen/ARCH.rules.)
+ switch arch {
+ case goarch.AMD64, goarch.ARM64, goarch.LOONG64, goarch.MIPS, goarch.MIPS64, goarch.PPC64, goarch.RISCV64, goarch.S390X:
+ return true
+ default:
+ return false
+ }
+}
+
+type TypeAssert struct {
+ Cache *TypeAssertCache
+ Inter *InterfaceType
+ CanFail bool
+}
+type TypeAssertCache struct {
+ Mask uintptr
+ Entries [1]TypeAssertCacheEntry
+}
+type TypeAssertCacheEntry struct {
+ // type of source value (a *runtime._type)
+ Typ uintptr
+ // itab to use for result (a *runtime.itab)
+ // nil if CanFail is set and conversion would fail.
+ Itab uintptr
+}