case OpSignExt8to64, OpSignExt8to32, OpSignExt8to16, OpSignExt16to64, OpSignExt16to32, OpSignExt32to64:
a := ft.limits[v.Args[0].ID]
return ft.signedMinMax(v, a.min, a.max)
+ case OpTrunc64to8, OpTrunc64to16, OpTrunc64to32, OpTrunc32to8, OpTrunc32to16, OpTrunc16to8:
+ a := ft.limits[v.Args[0].ID]
+ if a.umax <= 1<<(uint64(v.Type.Size())*8)-1 {
+ return ft.unsignedMinMax(v, a.umin, a.umax)
+ }
// math/bits
case OpCtz64:
return z
}
+func trunc64to16(a uint64, ensureAllBranchesCouldHappen func() bool) uint16 {
+ a &= 0xfff
+ a |= 0xff
+
+ z := uint16(a)
+ if ensureAllBranchesCouldHappen() && z > 0xfff { // ERROR "Disproved Less16U$"
+ return 42
+ }
+ if ensureAllBranchesCouldHappen() && z <= 0xfff { // ERROR "Proved Leq16U$"
+ return 1337
+ }
+ if ensureAllBranchesCouldHappen() && z < 0xff { // ERROR "Disproved Less16U$"
+ return 42
+ }
+ if ensureAllBranchesCouldHappen() && z >= 0xff { // ERROR "Proved Leq16U$"
+ return 1337
+ }
+ return z
+}
+
//go:noinline
func useInt(a int) {
}