aboutsummaryrefslogtreecommitdiff
path: root/test/codegen/switch.go
diff options
context:
space:
mode:
Diffstat (limited to 'test/codegen/switch.go')
-rw-r--r--test/codegen/switch.go32
1 files changed, 30 insertions, 2 deletions
diff --git a/test/codegen/switch.go b/test/codegen/switch.go
index d59ef4f2eb..07850522ab 100644
--- a/test/codegen/switch.go
+++ b/test/codegen/switch.go
@@ -21,13 +21,41 @@ func f(x string) int {
}
}
-// use jump tables for 8+ int cases
-func square(x int) int {
+// use jump tables for 8+ string cases
+// Using multiple return values prevent lookup tables.
+func squareJump(x int) (int, int) {
// amd64:`JMP \(.*\)\(.*\)$`
// arm64:`MOVD \(R.*\)\(R.*<<3\)` `JMP \(R.*\)$`
// loong64: `ALSLV` `MOVV` `JMP`
switch x {
case 1:
+ return 1, 1
+ case 2:
+ return 4, 2
+ case 3:
+ return 9, 3
+ case 4:
+ return 16, 4
+ case 5:
+ return 25, 5
+ case 6:
+ return 36, 6
+ case 7:
+ return 49, 7
+ case 8:
+ return 64, 8
+ default:
+ return x * x, x
+ }
+}
+
+// use lookup tables for 8+ int cases returning constants
+func squareLookup(x int) int {
+ // amd64:`LEAQ .*\(SB\)` `MOVQ .*\(.*\)\(.*\*8\)` -`JMP \(.*\)\(.*\)$`
+ // arm64:`MOVD \(R.*\)\(R.*<<3\)` -`JMP \(R.*\)$`
+ // loong64:`SLLV` `MOVV \(R.*\)\(R.*\)` -`ALSLV`
+ switch x {
+ case 1:
return 1
case 2:
return 4