Initial commit: Go 1.23 release state
This commit is contained in:
185
test/codegen/switch.go
Normal file
185
test/codegen/switch.go
Normal file
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user