MCPcopy Create free account
hub / github.com/chc4/lineiform / add

Function add

tangle/src/oper.rs:87–120  ·  view source on GitHub ↗

Get left+right for JitValues. if FLAG is true, then self.context.flags are updated with eflags

(&mut self, left: JitTemp, right: JitTemp)

Source from the content-addressed store, hash-verified

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 {

Callers

nothing calls this directly

Calls 1

cloneMethod · 0.80

Tested by

no test coverage detected