| 126 | |
| 127 | |
| 128 | static ExprId GetShifted(LowLevelILFunction& il, Register reg, uint32_t ShiftAmount, Shift shift) |
| 129 | { |
| 130 | if (ShiftAmount == 0) |
| 131 | return il.Register(get_register_size(reg), reg); |
| 132 | |
| 133 | switch (shift) |
| 134 | { |
| 135 | case SHIFT_NONE: |
| 136 | return il.Register(get_register_size(reg), reg); |
| 137 | case SHIFT_LSR: |
| 138 | return il.LogicalShiftRight(get_register_size(reg), |
| 139 | il.Register(get_register_size(reg), reg), |
| 140 | il.Const(1, ShiftAmount)); |
| 141 | case SHIFT_LSL: |
| 142 | return il.ShiftLeft(get_register_size(reg), |
| 143 | il.Register(get_register_size(reg), reg), |
| 144 | il.Const(1, ShiftAmount)); |
| 145 | case SHIFT_ASR: |
| 146 | return il.ArithShiftRight(get_register_size(reg), |
| 147 | il.Register(get_register_size(reg), reg), |
| 148 | il.Const(1, ShiftAmount)); |
| 149 | case SHIFT_ROR: |
| 150 | return il.RotateRight(get_register_size(reg), |
| 151 | il.Register(get_register_size(reg), reg), |
| 152 | il.Const(1, ShiftAmount)); |
| 153 | case SHIFT_RRX: |
| 154 | //RRX can only shift 1 at a time |
| 155 | return il.RotateRightCarry(get_register_size(reg), |
| 156 | il.Register(get_register_size(reg), reg), |
| 157 | il.Const(1, 1), il.Flag(IL_FLAG_C)); |
| 158 | default: |
| 159 | return 0; |
| 160 | } |
| 161 | } |
| 162 | |
| 163 | |
| 164 | static ExprId GetShiftedOffset(LowLevelILFunction& il, InstructionOperand& op) |
no test coverage detected