Skip to content

Commit 47d1874

Browse files
stage2 ARM: implement division by constant int power-of-two divisors
1 parent 7090f04 commit 47d1874

File tree

1 file changed

+53
-8
lines changed

1 file changed

+53
-8
lines changed

src/arch/arm/CodeGen.zig

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,10 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
567567
.xor => try self.airBinOp(inst, .xor),
568568
.shr => try self.airBinOp(inst, .shr),
569569
.shr_exact => try self.airBinOp(inst, .shr_exact),
570+
.div_float => try self.airBinOp(inst, .div_float),
571+
.div_trunc => try self.airBinOp(inst, .div_trunc),
572+
.div_floor => try self.airBinOp(inst, .div_floor),
573+
.div_exact => try self.airBinOp(inst, .div_exact),
570574

571575
.ptr_add => try self.airPtrArithmetic(inst, .ptr_add),
572576
.ptr_sub => try self.airPtrArithmetic(inst, .ptr_sub),
@@ -604,8 +608,6 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
604608
.mul_with_overflow => try self.airMulWithOverflow(inst),
605609
.shl_with_overflow => try self.airShlWithOverflow(inst),
606610

607-
.div_float, .div_trunc, .div_floor, .div_exact => try self.airDiv(inst),
608-
609611
.cmp_lt => try self.airCmp(inst, .lt),
610612
.cmp_lte => try self.airCmp(inst, .lte),
611613
.cmp_eq => try self.airCmp(inst, .eq),
@@ -1729,12 +1731,6 @@ fn airShlWithOverflow(self: *Self, inst: Air.Inst.Index) !void {
17291731
return self.finishAir(inst, result, .{ extra.lhs, extra.rhs, .none });
17301732
}
17311733

1732-
fn airDiv(self: *Self, inst: Air.Inst.Index) !void {
1733-
const bin_op = self.air.instructions.items(.data)[inst].bin_op;
1734-
const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement div for {}", .{self.target.cpu.arch});
1735-
return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });
1736-
}
1737-
17381734
fn airRem(self: *Self, inst: Air.Inst.Index) !void {
17391735
const bin_op = self.air.instructions.items(.data)[inst].bin_op;
17401736
const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement rem for {}", .{self.target.cpu.arch});
@@ -2878,6 +2874,55 @@ fn binOp(
28782874
else => unreachable,
28792875
}
28802876
},
2877+
.div_float => {
2878+
switch (lhs_ty.zigTypeTag()) {
2879+
.Float => return self.fail("TODO ARM binary operations on floats", .{}),
2880+
.Vector => return self.fail("TODO ARM binary operations on vectors", .{}),
2881+
else => unreachable,
2882+
}
2883+
},
2884+
.div_trunc, .div_floor => {
2885+
switch (lhs_ty.zigTypeTag()) {
2886+
.Float => return self.fail("TODO ARM binary operations on floats", .{}),
2887+
.Vector => return self.fail("TODO ARM binary operations on vectors", .{}),
2888+
.Int => {
2889+
const mod = self.bin_file.options.module.?;
2890+
assert(lhs_ty.eql(rhs_ty, mod));
2891+
const int_info = lhs_ty.intInfo(self.target.*);
2892+
if (int_info.bits <= 32) {
2893+
switch (int_info.signedness) {
2894+
.signed => {
2895+
return self.fail("TODO ARM signed integer division", .{});
2896+
},
2897+
.unsigned => {
2898+
switch (rhs) {
2899+
.immediate => |imm| {
2900+
if (std.math.isPowerOfTwo(imm)) {
2901+
const shift = MCValue{ .immediate = std.math.log2_int(u32, imm) };
2902+
return try self.binOp(.shr, lhs, shift, lhs_ty, rhs_ty, metadata);
2903+
} else {
2904+
return self.fail("TODO ARM integer division by constants", .{});
2905+
}
2906+
},
2907+
else => return self.fail("TODO ARM integer division", .{}),
2908+
}
2909+
},
2910+
}
2911+
} else {
2912+
return self.fail("TODO ARM integer division for integers > u32/i32", .{});
2913+
}
2914+
},
2915+
else => unreachable,
2916+
}
2917+
},
2918+
.div_exact => {
2919+
switch (lhs_ty.zigTypeTag()) {
2920+
.Float => return self.fail("TODO ARM binary operations on floats", .{}),
2921+
.Vector => return self.fail("TODO ARM binary operations on vectors", .{}),
2922+
.Int => return self.fail("TODO ARM div_exact", .{}),
2923+
else => unreachable,
2924+
}
2925+
},
28812926
.addwrap,
28822927
.subwrap,
28832928
.mulwrap,

0 commit comments

Comments
 (0)