authorgravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-07-29 03:28:30-07:00
committergravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-07-31 11:44:16-07:00
log00089347458b4c2544871666cc09570642b0d5b1
tree7d6d9d9be839703b27c48614ef3ca9a2471c8483
parenta69d403cb2c82ce6257bfa1ee7eba52f895c14e7
signaturelock-open Commit is signed but in an unrecognized format.

riscv: implement `@divExact`


1 files changed, 5 insertions(+), 3 deletions(-)

src/arch/riscv64/CodeGen.zig+5-3
...@@ -1510,6 +1510,7 @@ fn genBody(func: *Func, body: []const Air.Inst.Index) InnerError!void {...@@ -1510,6 +1510,7 @@ fn genBody(func: *Func, body: []const Air.Inst.Index) InnerError!void {
1510 .mul,1510 .mul,
1511 .mul_wrap,1511 .mul_wrap,
1512 .div_trunc, 1512 .div_trunc,
1513 .div_exact,
1513 .rem,1514 .rem,
15141515
1515 .shl, .shl_exact,1516 .shl, .shl_exact,
...@@ -1533,7 +1534,6 @@ fn genBody(func: *Func, body: []const Air.Inst.Index) InnerError!void {...@@ -1533,7 +1534,6 @@ fn genBody(func: *Func, body: []const Air.Inst.Index) InnerError!void {
1533 .mod,1534 .mod,
1534 .div_float, 1535 .div_float,
1535 .div_floor, 1536 .div_floor,
1536 .div_exact,
1537 => return func.fail("TODO: {s}", .{@tagName(tag)}),1537 => return func.fail("TODO: {s}", .{@tagName(tag)}),
15381538
1539 .sqrt,1539 .sqrt,
...@@ -2563,10 +2563,12 @@ fn genBinOp(...@@ -2563,10 +2563,12 @@ fn genBinOp(
2563 .mul_wrap,2563 .mul_wrap,
2564 .rem,2564 .rem,
2565 .div_trunc,2565 .div_trunc,
2566 .div_exact,
2566 => {2567 => {
2567 switch (tag) {2568 switch (tag) {
2568 .rem,2569 .rem,
2569 .div_trunc,2570 .div_trunc,
2571 .div_exact,
2570 => {2572 => {
2571 if (!math.isPowerOfTwo(bit_size)) {2573 if (!math.isPowerOfTwo(bit_size)) {
2572 try func.truncateRegister(lhs_ty, lhs_reg);2574 try func.truncateRegister(lhs_ty, lhs_reg);
...@@ -2576,7 +2578,7 @@ fn genBinOp(...@@ -2576,7 +2578,7 @@ fn genBinOp(
2576 else => {2578 else => {
2577 if (!math.isPowerOfTwo(bit_size))2579 if (!math.isPowerOfTwo(bit_size))
2578 return func.fail(2580 return func.fail(
2579 "TODO: genBinOp verify {s} non-pow 2, found {}",2581 "TODO: genBinOp verify if needs to truncate {s} non-pow 2, found {}",
2580 .{ @tagName(tag), bit_size },2582 .{ @tagName(tag), bit_size },
2581 );2583 );
2582 },2584 },
...@@ -2604,7 +2606,7 @@ fn genBinOp(...@@ -2604,7 +2606,7 @@ fn genBinOp(
2604 8, 16, 32 => if (is_unsigned) .remuw else .remw,2606 8, 16, 32 => if (is_unsigned) .remuw else .remw,
2605 else => if (is_unsigned) .remu else .rem,2607 else => if (is_unsigned) .remu else .rem,
2606 },2608 },
2607 .div_trunc => switch (bit_size) {2609 .div_trunc, .div_exact => switch (bit_size) {
2608 8, 16, 32 => if (is_unsigned) .divuw else .divw,2610 8, 16, 32 => if (is_unsigned) .divuw else .divw,
2609 else => if (is_unsigned) .divu else .div,2611 else => if (is_unsigned) .divu else .div,
2610 },2612 },