diff options
| author | joachimschmidt557 <joachim.schmidt557@outlook.com> | 2022-03-08 22:47:43 +0100 |
|---|---|---|
| committer | joachimschmidt557 <joachim.schmidt557@outlook.com> | 2022-03-13 11:32:04 +0100 |
| commit | 03dddc8d9c7613aff877f0dcf0efe0193869ef73 (patch) | |
| tree | e3aba1a4b859fe33aa29713801aee664cb3ac3f4 /src/arch/aarch64/Emit.zig | |
| parent | 2036af94e97f0ac16293556423c144ec9e1b8226 (diff) | |
| download | zig-03dddc8d9c7613aff877f0dcf0efe0193869ef73.tar.gz zig-03dddc8d9c7613aff877f0dcf0efe0193869ef73.zip | |
stage2 AArch64: implement bit shifts with register operands
Diffstat (limited to 'src/arch/aarch64/Emit.zig')
| -rw-r--r-- | src/arch/aarch64/Emit.zig | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/arch/aarch64/Emit.zig b/src/arch/aarch64/Emit.zig index 84bb559824..1a3e522e36 100644 --- a/src/arch/aarch64/Emit.zig +++ b/src/arch/aarch64/Emit.zig @@ -80,6 +80,10 @@ pub fn emitMir( .cmp_immediate => try emit.mirAddSubtractImmediate(inst), .sub_immediate => try emit.mirAddSubtractImmediate(inst), + .asr_register => try emit.mirShiftRegister(inst), + .lsl_register => try emit.mirShiftRegister(inst), + .lsr_register => try emit.mirShiftRegister(inst), + .b_cond => try emit.mirConditionalBranchImmediate(inst), .b => try emit.mirBranch(inst), @@ -469,6 +473,21 @@ fn mirAddSubtractImmediate(emit: *Emit, inst: Mir.Inst.Index) !void { } } +fn mirShiftRegister(emit: *Emit, inst: Mir.Inst.Index) !void { + const tag = emit.mir.instructions.items(.tag)[inst]; + const rrr = emit.mir.instructions.items(.data)[inst].rrr; + const rd = rrr.rd; + const rn = rrr.rn; + const rm = rrr.rm; + + switch (tag) { + .asr_register => try emit.writeInstruction(Instruction.asrv(rd, rn, rm)), + .lsl_register => try emit.writeInstruction(Instruction.lslv(rd, rn, rm)), + .lsr_register => try emit.writeInstruction(Instruction.lsrv(rd, rn, rm)), + else => unreachable, + } +} + fn mirConditionalBranchImmediate(emit: *Emit, inst: Mir.Inst.Index) !void { const tag = emit.mir.instructions.items(.tag)[inst]; const inst_cond = emit.mir.instructions.items(.data)[inst].inst_cond; |
