diff options
Diffstat (limited to 'test/codegen')
| -rw-r--r-- | test/codegen/bmi.go | 104 |
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 |
