Prepares arguments for emitting an i64 binary operation.
(&mut self, masm: &mut M, kind: ShiftKind)
| 79 | |
| 80 | /// Prepares arguments for emitting an i64 binary operation. |
| 81 | pub fn i64_shift<M>(&mut self, masm: &mut M, kind: ShiftKind) -> Result<()> |
| 82 | where |
| 83 | M: MacroAssembler, |
| 84 | { |
| 85 | let top = self |
| 86 | .stack |
| 87 | .peek() |
| 88 | .ok_or_else(|| CodeGenError::missing_values_in_stack())?; |
| 89 | if top.is_i64_const() { |
| 90 | let val = self |
| 91 | .stack |
| 92 | .pop_i64_const() |
| 93 | .ok_or_else(|| CodeGenError::missing_values_in_stack())?; |
| 94 | let typed_reg = self.pop_to_reg(masm, None)?; |
| 95 | masm.shift_ir( |
| 96 | writable!(typed_reg.reg), |
| 97 | Imm::i64(val), |
| 98 | typed_reg.reg, |
| 99 | kind, |
| 100 | OperandSize::S64, |
| 101 | )?; |
| 102 | self.stack.push(typed_reg.into()); |
| 103 | } else { |
| 104 | masm.shift(self, kind, OperandSize::S64)?; |
| 105 | }; |
| 106 | |
| 107 | Ok(()) |
| 108 | } |
| 109 | } |
| 110 | |
| 111 | impl<'a> CodeGenContext<'a, Prologue> { |
no test coverage detected