aboutsummaryrefslogtreecommitdiff
path: root/test/codegen/bmi.go
diff options
context:
space:
mode:
Diffstat (limited to 'test/codegen/bmi.go')
-rw-r--r--test/codegen/bmi.go104
1 files changed, 104 insertions, 0 deletions
diff --git a/test/codegen/bmi.go b/test/codegen/bmi.go
index 3b125a1b59..aa61b03928 100644
--- a/test/codegen/bmi.go
+++ b/test/codegen/bmi.go
@@ -46,6 +46,110 @@ func blsr32(x int32) int32 {
return x & (x - 1)
}
+func isPowerOfTwo64(x int64) bool {
+ // amd64/v3:"BLSRQ",-"TESTQ",-"CALL"
+ return blsr64(x) == 0
+}
+
+func isPowerOfTwo32(x int32) bool {
+ // amd64/v3:"BLSRL",-"TESTL",-"CALL"
+ return blsr32(x) == 0
+}
+
+func isPowerOfTwoSelect64(x, a, b int64) int64 {
+ var r int64
+ // amd64/v3:"BLSRQ",-"TESTQ",-"CALL"
+ if isPowerOfTwo64(x) {
+ r = a
+ } else {
+ r = b
+ }
+ // amd64/v3:"CMOVQEQ",-"TESTQ",-"CALL"
+ return r * 2 // force return blocks joining
+}
+
+func isPowerOfTwoSelect32(x, a, b int32) int32 {
+ var r int32
+ // amd64/v3:"BLSRL",-"TESTL",-"CALL"
+ if isPowerOfTwo32(x) {
+ r = a
+ } else {
+ r = b
+ }
+ // amd64/v3:"CMOVLEQ",-"TESTL",-"CALL"
+ return r * 2 // force return blocks joining
+}
+
+func isPowerOfTwoBranch64(x int64, a func(bool), b func(string)) {
+ // amd64/v3:"BLSRQ",-"TESTQ",-"CALL"
+ if isPowerOfTwo64(x) {
+ a(true)
+ } else {
+ b("false")
+ }
+}
+
+func isPowerOfTwoBranch32(x int32, a func(bool), b func(string)) {
+ // amd64/v3:"BLSRL",-"TESTL",-"CALL"
+ if isPowerOfTwo32(x) {
+ a(true)
+ } else {
+ b("false")
+ }
+}
+
+func isNotPowerOfTwo64(x int64) bool {
+ // amd64/v3:"BLSRQ",-"TESTQ",-"CALL"
+ return blsr64(x) != 0
+}
+
+func isNotPowerOfTwo32(x int32) bool {
+ // amd64/v3:"BLSRL",-"TESTL",-"CALL"
+ return blsr32(x) != 0
+}
+
+func isNotPowerOfTwoSelect64(x, a, b int64) int64 {
+ var r int64
+ // amd64/v3:"BLSRQ",-"TESTQ",-"CALL"
+ if isNotPowerOfTwo64(x) {
+ r = a
+ } else {
+ r = b
+ }
+ // amd64/v3:"CMOVQNE",-"TESTQ",-"CALL"
+ return r * 2 // force return blocks joining
+}
+
+func isNotPowerOfTwoSelect32(x, a, b int32) int32 {
+ var r int32
+ // amd64/v3:"BLSRL",-"TESTL",-"CALL"
+ if isNotPowerOfTwo32(x) {
+ r = a
+ } else {
+ r = b
+ }
+ // amd64/v3:"CMOVLNE",-"TESTL",-"CALL"
+ return r * 2 // force return blocks joining
+}
+
+func isNotPowerOfTwoBranch64(x int64, a func(bool), b func(string)) {
+ // amd64/v3:"BLSRQ",-"TESTQ",-"CALL"
+ if isNotPowerOfTwo64(x) {
+ a(true)
+ } else {
+ b("false")
+ }
+}
+
+func isNotPowerOfTwoBranch32(x int32, a func(bool), b func(string)) {
+ // amd64/v3:"BLSRL",-"TESTL",-"CALL"
+ if isNotPowerOfTwo32(x) {
+ a(true)
+ } else {
+ b("false")
+ }
+}
+
func sarx64(x, y int64) int64 {
// amd64/v3:"SARXQ"
return x >> y