From 60b078caf3d780d69a1c8280d3f2083ab06ae0a0 Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Fri, 21 Feb 2025 12:52:33 -0600 Subject: [PATCH] Constant rem --- src/LLVM.zig | 8 ++++++++ src/converter.zig | 15 +++++++++++++++ src/llvm_api.zig | 2 ++ tests/constant_rem.bbb | 4 ++++ 4 files changed, 29 insertions(+) create mode 100644 tests/constant_rem.bbb diff --git a/src/LLVM.zig b/src/LLVM.zig index e04df12..0ba09f4 100644 --- a/src/LLVM.zig +++ b/src/LLVM.zig @@ -560,6 +560,14 @@ pub const Builder = opaque { return api.LLVMBuildUDiv(builder, left, right, ""); } + pub fn create_srem(builder: *Builder, left: *Value, right: *Value) *Value { + return api.LLVMBuildSRem(builder, left, right, ""); + } + + pub fn create_urem(builder: *Builder, left: *Value, right: *Value) *Value { + return api.LLVMBuildURem(builder, left, right, ""); + } + pub fn create_ret_void(builder: *Builder) void { builder.create_ret(null); } diff --git a/src/converter.zig b/src/converter.zig index 0a38d81..51eca06 100644 --- a/src/converter.zig +++ b/src/converter.zig @@ -296,6 +296,8 @@ const Converter = struct { mul, udiv, sdiv, + urem, + srem, }; fn parse_value(noalias converter: *Converter, noalias thread: *llvm.Thread, expected_type: Type) *llvm.Value { @@ -322,6 +324,8 @@ const Converter = struct { .mul => thread.builder.create_mul(left, right), .sdiv => thread.builder.create_sdiv(left, right), .udiv => thread.builder.create_udiv(left, right), + .srem => thread.builder.create_srem(left, right), + .urem => thread.builder.create_urem(left, right), }; const ch = converter.content[converter.offset]; @@ -346,6 +350,13 @@ const Converter = struct { false => break :blk .udiv, } }, + '%' => blk: { + converter.offset += 1; + switch (expected_type.signedness) { + true => break :blk .srem, + false => break :blk .urem, + } + }, else => os.abort(), }; @@ -728,3 +739,7 @@ test "constant mul" { test "constant div" { try invoke("constant_div"); } + +test "constant rem" { + try invoke("constant_rem"); +} diff --git a/src/llvm_api.zig b/src/llvm_api.zig index f266c71..a7903ba 100644 --- a/src/llvm_api.zig +++ b/src/llvm_api.zig @@ -24,6 +24,8 @@ pub extern fn LLVMBuildSub(builder: *llvm.Builder, left: *llvm.Value, right: *ll pub extern fn LLVMBuildMul(builder: *llvm.Builder, left: *llvm.Value, right: *llvm.Value, name: [*:0]const u8) *llvm.Value; pub extern fn LLVMBuildSDiv(builder: *llvm.Builder, left: *llvm.Value, right: *llvm.Value, name: [*:0]const u8) *llvm.Value; pub extern fn LLVMBuildUDiv(builder: *llvm.Builder, left: *llvm.Value, right: *llvm.Value, name: [*:0]const u8) *llvm.Value; +pub extern fn LLVMBuildSRem(builder: *llvm.Builder, left: *llvm.Value, right: *llvm.Value, name: [*:0]const u8) *llvm.Value; +pub extern fn LLVMBuildURem(builder: *llvm.Builder, left: *llvm.Value, right: *llvm.Value, name: [*:0]const u8) *llvm.Value; pub extern fn LLVMTypeOf(value: *llvm.Value) *llvm.Type; pub extern fn LLVMGlobalGetValueType(value: *llvm.GlobalValue) *llvm.Type; diff --git a/tests/constant_rem.bbb b/tests/constant_rem.bbb new file mode 100644 index 0000000..f30b973 --- /dev/null +++ b/tests/constant_rem.bbb @@ -0,0 +1,4 @@ +[export] main = fn [cc(c)] () s32 +{ + return 5 % 5; +}