(x *Value, op string, y *Value, ucmp, scmp llvm.IntPredicate, fcmp llvm.FloatPredicate)
| 72 | } |
| 73 | |
| 74 | func (b *Builder) cmp(x *Value, op string, y *Value, ucmp, scmp llvm.IntPredicate, fcmp llvm.FloatPredicate) *Value { |
| 75 | assertTypesEqual(x.Type(), y.Type()) |
| 76 | ty := x.Type() |
| 77 | if vec, isVec := ty.(Vector); isVec { |
| 78 | ty = vec.Element |
| 79 | } |
| 80 | var v *Value |
| 81 | switch { |
| 82 | case IsSignedInteger(ty): |
| 83 | v = b.val(b.m.Types.Bool, b.llvm.CreateICmp(scmp, x.llvm, y.llvm, "")) |
| 84 | case IsUnsignedInteger(ty), IsPointer(ty), IsBool(ty): |
| 85 | v = b.val(b.m.Types.Bool, b.llvm.CreateICmp(ucmp, x.llvm, y.llvm, "")) |
| 86 | case IsFloat(ty): |
| 87 | v = b.val(b.m.Types.Bool, b.llvm.CreateFCmp(fcmp, x.llvm, y.llvm, "")) |
| 88 | default: |
| 89 | panic(fmt.Errorf("Cannot compare %v types with %v", ty.TypeName(), op)) |
| 90 | } |
| 91 | v.SetName(x.Name() + op + y.Name()) |
| 92 | return v |
| 93 | } |
| 94 | |
| 95 | // Equal returns x == y. The types of the two values must be equal. |
| 96 | func (b *Builder) Equal(x, y *Value) *Value { |
no test coverage detected