authorgravatar for jacoblevgw@gmail.comJacob G-W <jacoblevgw@gmail.com> 2021-08-18 21:29:32-04:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-08-19 22:21:16+03:00
logdf10e998ee4a935f49943fb5c0ef134f336c6ee3
tree906dfb30f30a6da36308eee7f1ea22ace0f80a0d
parent62fe4a0ba8a08b9477e772841d3ae128937f0752

stage2 x86_64: enable bitwise and + or and add tests


2 files changed, 44 insertions(+), 0 deletions(-)

src/codegen.zig+2
...@@ -1247,6 +1247,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {...@@ -1247,6 +1247,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
1247 const bin_op = self.air.instructions.items(.data)[inst].bin_op;1247 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
1248 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else switch (arch) {1248 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else switch (arch) {
1249 .arm, .armeb => try self.genArmBinOp(inst, bin_op.lhs, bin_op.rhs, .bit_and),1249 .arm, .armeb => try self.genArmBinOp(inst, bin_op.lhs, bin_op.rhs, .bit_and),
1250 .x86_64 => try self.genX8664BinMath(inst, bin_op.lhs, bin_op.rhs),
1250 else => return self.fail("TODO implement bitwise and for {}", .{self.target.cpu.arch}),1251 else => return self.fail("TODO implement bitwise and for {}", .{self.target.cpu.arch}),
1251 };1252 };
1252 return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });1253 return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });
...@@ -1256,6 +1257,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {...@@ -1256,6 +1257,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
1256 const bin_op = self.air.instructions.items(.data)[inst].bin_op;1257 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
1257 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else switch (arch) {1258 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else switch (arch) {
1258 .arm, .armeb => try self.genArmBinOp(inst, bin_op.lhs, bin_op.rhs, .bit_or),1259 .arm, .armeb => try self.genArmBinOp(inst, bin_op.lhs, bin_op.rhs, .bit_or),
1260 .x86_64 => try self.genX8664BinMath(inst, bin_op.lhs, bin_op.rhs),
1259 else => return self.fail("TODO implement bitwise or for {}", .{self.target.cpu.arch}),1261 else => return self.fail("TODO implement bitwise or for {}", .{self.target.cpu.arch}),
1260 };1262 };
1261 return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });1263 return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });
test/cases.zig+42
...@@ -1535,6 +1535,48 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -1535,6 +1535,48 @@ pub fn addCases(ctx: *TestContext) !void {
1535 \\}1535 \\}
1536 , "");1536 , "");
1537 }1537 }
1538 {
1539 var case = ctx.exe("runtime bitwise and", linux_x64);
1540
1541 case.addCompareOutput(
1542 \\pub fn main() void {
1543 \\ var i: u32 = 10;
1544 \\ var j: u32 = 11;
1545 \\ assert(i & 1 == 0);
1546 \\ assert(j & 1 == 1);
1547 \\ var m1: u32 = 0b1111;
1548 \\ var m2: u32 = 0b0000;
1549 \\ assert(m1 & 0b1010 == 0b1010);
1550 \\ assert(m2 & 0b1010 == 0b0000);
1551 \\}
1552 \\fn assert(b: bool) void {
1553 \\ if (!b) unreachable;
1554 \\}
1555 ,
1556 "",
1557 );
1558 }
1559 {
1560 var case = ctx.exe("runtime bitwise or", linux_x64);
1561
1562 case.addCompareOutput(
1563 \\pub fn main() void {
1564 \\ var i: u32 = 10;
1565 \\ var j: u32 = 11;
1566 \\ assert(i | 1 == 11);
1567 \\ assert(j | 1 == 11);
1568 \\ var m1: u32 = 0b1111;
1569 \\ var m2: u32 = 0b0000;
1570 \\ assert(m1 | 0b1010 == 0b1111);
1571 \\ assert(m2 | 0b1010 == 0b1010);
1572 \\}
1573 \\fn assert(b: bool) void {
1574 \\ if (!b) unreachable;
1575 \\}
1576 ,
1577 "",
1578 );
1579 }
1538 {1580 {
1539 var case = ctx.exe("merge error sets", linux_x64);1581 var case = ctx.exe("merge error sets", linux_x64);
15401582