aboutsummaryrefslogtreecommitdiff
path: root/src/arch/aarch64/Emit.zig
diff options
context:
space:
mode:
authorjoachimschmidt557 <joachim.schmidt557@outlook.com>2022-03-08 22:47:43 +0100
committerjoachimschmidt557 <joachim.schmidt557@outlook.com>2022-03-13 11:32:04 +0100
commit03dddc8d9c7613aff877f0dcf0efe0193869ef73 (patch)
treee3aba1a4b859fe33aa29713801aee664cb3ac3f4 /src/arch/aarch64/Emit.zig
parent2036af94e97f0ac16293556423c144ec9e1b8226 (diff)
downloadzig-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.zig19
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;