| author | |
| committer | |
| log | df10e998ee4a935f49943fb5c0ef134f336c6ee3 |
| tree | 906dfb30f30a6da36308eee7f1ea22ace0f80a0d |
| parent | 62fe4a0ba8a08b9477e772841d3ae128937f0752 |
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 | 1247 | const bin_op = self.air.instructions.items(.data)[inst].bin_op; |
| 1248 | 1248 | const result: MCValue = if (self.liveness.isUnused(inst)) .dead else switch (arch) { |
| 1249 | 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 | 1251 | else => return self.fail("TODO implement bitwise and for {}", .{self.target.cpu.arch}), |
| 1251 | 1252 | }; |
| 1252 | 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 | 1257 | const bin_op = self.air.instructions.items(.data)[inst].bin_op; |
| 1257 | 1258 | const result: MCValue = if (self.liveness.isUnused(inst)) .dead else switch (arch) { |
| 1258 | 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 | 1261 | else => return self.fail("TODO implement bitwise or for {}", .{self.target.cpu.arch}), |
| 1260 | 1262 | }; |
| 1261 | 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 | 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 | 1581 | var case = ctx.exe("merge error sets", linux_x64); |
| 1540 | 1582 |