summaryrefslogtreecommitdiffstats
path: root/test/codegen/switch.go
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-16 19:25:22 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-16 19:25:22 +0000
commitf6ad4dcef54c5ce997a4bad5a6d86de229015700 (patch)
tree7cfa4e31ace5c2bd95c72b154d15af494b2bcbef /test/codegen/switch.go
parentInitial commit. (diff)
downloadgolang-1.22-f6ad4dcef54c5ce997a4bad5a6d86de229015700.tar.xz
golang-1.22-f6ad4dcef54c5ce997a4bad5a6d86de229015700.zip
Adding upstream version 1.22.1.upstream/1.22.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'test/codegen/switch.go')
-rw-r--r--test/codegen/switch.go185
1 files changed, 185 insertions, 0 deletions
diff --git a/test/codegen/switch.go b/test/codegen/switch.go
new file mode 100644
index 0000000..980ea70
--- /dev/null
+++ b/test/codegen/switch.go
@@ -0,0 +1,185 @@
+// asmcheck
+
+// Copyright 2019 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.
+
+// These tests check code generation of switch statements.
+
+package codegen
+
+// see issue 33934
+func f(x string) int {
+ // amd64:-`cmpstring`
+ switch x {
+ case "":
+ return -1
+ case "1", "2", "3":
+ return -2
+ default:
+ return -3
+ }
+}
+
+// use jump tables for 8+ int cases
+func square(x int) int {
+ // amd64:`JMP\s\(.*\)\(.*\)$`
+ // arm64:`MOVD\s\(R.*\)\(R.*<<3\)`,`JMP\s\(R.*\)$`
+ switch x {
+ case 1:
+ return 1
+ case 2:
+ return 4
+ case 3:
+ return 9
+ case 4:
+ return 16
+ case 5:
+ return 25
+ case 6:
+ return 36
+ case 7:
+ return 49
+ case 8:
+ return 64
+ default:
+ return x * x
+ }
+}
+
+// use jump tables for 8+ string lengths
+func length(x string) int {
+ // amd64:`JMP\s\(.*\)\(.*\)$`
+ // arm64:`MOVD\s\(R.*\)\(R.*<<3\)`,`JMP\s\(R.*\)$`
+ switch x {
+ case "a":
+ return 1
+ case "bb":
+ return 2
+ case "ccc":
+ return 3
+ case "dddd":
+ return 4
+ case "eeeee":
+ return 5
+ case "ffffff":
+ return 6
+ case "ggggggg":
+ return 7
+ case "hhhhhhhh":
+ return 8
+ default:
+ return len(x)
+ }
+}
+
+// Use single-byte ordered comparisons for binary searching strings.
+// See issue 53333.
+func mimetype(ext string) string {
+ // amd64: `CMPB\s1\(.*\), \$104$`,-`cmpstring`
+ // arm64: `MOVB\s1\(R.*\), R.*$`, `CMPW\s\$104, R.*$`, -`cmpstring`
+ switch ext {
+ // amd64: `CMPL\s\(.*\), \$1836345390$`
+ // arm64: `MOVD\s\$1836345390`, `CMPW\sR.*, R.*$`
+ case ".htm":
+ return "A"
+ // amd64: `CMPL\s\(.*\), \$1953457454$`
+ // arm64: `MOVD\s\$1953457454`, `CMPW\sR.*, R.*$`
+ case ".eot":
+ return "B"
+ // amd64: `CMPL\s\(.*\), \$1735815982$`
+ // arm64: `MOVD\s\$1735815982`, `CMPW\sR.*, R.*$`
+ case ".svg":
+ return "C"
+ // amd64: `CMPL\s\(.*\), \$1718907950$`
+ // arm64: `MOVD\s\$1718907950`, `CMPW\sR.*, R.*$`
+ case ".ttf":
+ return "D"
+ default:
+ return ""
+ }
+}
+
+// use jump tables for type switches to concrete types.
+func typeSwitch(x any) int {
+ // amd64:`JMP\s\(.*\)\(.*\)$`
+ // arm64:`MOVD\s\(R.*\)\(R.*<<3\)`,`JMP\s\(R.*\)$`
+ switch x.(type) {
+ case int:
+ return 0
+ case int8:
+ return 1
+ case int16:
+ return 2
+ case int32:
+ return 3
+ case int64:
+ return 4
+ }
+ return 7
+}
+
+type I interface {
+ foo()
+}
+type J interface {
+ bar()
+}
+type IJ interface {
+ I
+ J
+}
+type K interface {
+ baz()
+}
+
+// use a runtime call for type switches to interface types.
+func interfaceSwitch(x any) int {
+ // amd64:`CALL\truntime.interfaceSwitch`,`MOVL\t16\(AX\)`,`MOVQ\t8\(.*\)(.*\*8)`
+ // arm64:`CALL\truntime.interfaceSwitch`,`LDAR`,`MOVWU\t16\(R0\)`,`MOVD\t\(R.*\)\(R.*\)`
+ switch x.(type) {
+ case I:
+ return 1
+ case J:
+ return 2
+ default:
+ return 3
+ }
+}
+
+func interfaceSwitch2(x K) int {
+ // amd64:`CALL\truntime.interfaceSwitch`,`MOVL\t16\(AX\)`,`MOVQ\t8\(.*\)(.*\*8)`
+ // arm64:`CALL\truntime.interfaceSwitch`,`LDAR`,`MOVWU\t16\(R0\)`,`MOVD\t\(R.*\)\(R.*\)`
+ switch x.(type) {
+ case I:
+ return 1
+ case J:
+ return 2
+ default:
+ return 3
+ }
+}
+
+func interfaceCast(x any) int {
+ // amd64:`CALL\truntime.typeAssert`,`MOVL\t16\(AX\)`,`MOVQ\t8\(.*\)(.*\*1)`
+ // arm64:`CALL\truntime.typeAssert`,`LDAR`,`MOVWU\t16\(R0\)`,`MOVD\t\(R.*\)\(R.*\)`
+ if _, ok := x.(I); ok {
+ return 3
+ }
+ return 5
+}
+
+func interfaceCast2(x K) int {
+ // amd64:`CALL\truntime.typeAssert`,`MOVL\t16\(AX\)`,`MOVQ\t8\(.*\)(.*\*1)`
+ // arm64:`CALL\truntime.typeAssert`,`LDAR`,`MOVWU\t16\(R0\)`,`MOVD\t\(R.*\)\(R.*\)`
+ if _, ok := x.(I); ok {
+ return 3
+ }
+ return 5
+}
+
+func interfaceConv(x IJ) I {
+ // amd64:`CALL\truntime.typeAssert`,`MOVL\t16\(AX\)`,`MOVQ\t8\(.*\)(.*\*1)`
+ // arm64:`CALL\truntime.typeAssert`,`LDAR`,`MOVWU\t16\(R0\)`,`MOVD\t\(R.*\)\(R.*\)`
+ return x
+}