Get left+right for JitValues. if FLAG is true, then self.context.flags are updated with eflags
(&mut self, left: JitTemp, right: JitTemp)
| 85 | /// Get left+right for JitValues. |
| 86 | /// if FLAG is true, then self.context.flags are updated with eflags |
| 87 | pub fn add<const FLAG:bool>(&mut self, left: JitTemp, right: JitTemp) -> JitTemp { |
| 88 | use JitTemp::*; |
| 89 | use Flags::*; |
| 90 | let flags = vec![OF, SF, ZF, AF, PF, CF]; |
| 91 | match (left, right) { |
| 92 | (Value(val_left, typ_left), Value(val_right, _)) => { |
| 93 | let (res, flag) = self.builder.ins().iadd_cout(val_left, val_right); |
| 94 | self.context.set_flags(flags, (val_left, val_right, flag)); |
| 95 | Value(res, typ_left) |
| 96 | }, |
| 97 | (left @ _ , right @ Value(_, _)) |
| 98 | | (left @ Value(_, _), right @ _) => { |
| 99 | let typ = Type::int((left.width() * 8) as u16).unwrap(); |
| 100 | let _left = left.into_ssa(typ, self.builder); |
| 101 | let _right = right.zero_extend(self.builder, left.width()).into_ssa(typ, self.builder); |
| 102 | let (res, flag) = self.builder.ins().iadd_cout(_left, _right); |
| 103 | self.context.set_flags(flags, (_left, _right, res)); |
| 104 | Value(res, typ) |
| 105 | }, |
| 106 | (Ref(base, offset), c) if c.is_const() => { |
| 107 | let c = c.into_usize(self.builder).unwrap(); |
| 108 | Ref(base, do_op!(self.context, FLAG, offset, (c), "add {}, {}", flags, +)) |
| 109 | }, |
| 110 | (offset, Ref(base, c)) if offset.is_const() => { |
| 111 | let offset = offset.into_usize(self.builder).unwrap(); |
| 112 | Ref(base, do_op!(self.context, FLAG, offset, (c), "add {}, {}", flags, +)) |
| 113 | }, |
| 114 | (left_c, mut right_c) if left_c.clone().is_const() && right_c.clone().is_const() => { |
| 115 | right_c = right_c.zero_extend(self.builder, left_c.clone().width()); |
| 116 | const_ops!(self.context, FLAG, left_c.clone(), (right_c.clone()), "add {}, {}", flags, +) |
| 117 | }, |
| 118 | (left, right) => unimplemented!("unimplemented add {:?} {:?}", left, right) |
| 119 | } |
| 120 | } |
| 121 | |
| 122 | /// Add with carry |
| 123 | pub fn adc<const FLAG:bool>(&mut self, left: JitTemp, right: JitTemp, carry: JitTemp) -> JitTemp { |