From 7bd79cb741dca1491e510945762dc9d5422de534 Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Fri, 21 Feb 2025 11:34:20 -0600 Subject: [PATCH] Constant mul --- src/LLVM.zig | 4 ++++ src/converter.zig | 12 +++++++++++- src/llvm_api.zig | 1 + tests/constant_mul.bbb | 4 ++++ 4 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 tests/constant_mul.bbb diff --git a/src/LLVM.zig b/src/LLVM.zig index 6d0e585..9b4f72e 100644 --- a/src/LLVM.zig +++ b/src/LLVM.zig @@ -548,6 +548,10 @@ pub const Builder = opaque { return api.LLVMBuildSub(builder, left, right, ""); } + pub fn create_mul(builder: *Builder, left: *Value, right: *Value) *Value { + return api.LLVMBuildMul(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 90460d8..8d0d32c 100644 --- a/src/converter.zig +++ b/src/converter.zig @@ -268,8 +268,9 @@ const Converter = struct { const ExpressionState = enum { none, - sub, add, + sub, + mul, }; fn parse_value(noalias converter: *Converter, noalias thread: *llvm.Thread, expected_type: *llvm.Type) *llvm.Value { @@ -293,6 +294,7 @@ const Converter = struct { .none => current_value, .sub => thread.builder.create_sub(left, right), .add => thread.builder.create_add(left, right), + .mul => thread.builder.create_mul(left, right), }; const ch = converter.content[converter.offset]; @@ -306,6 +308,10 @@ const Converter = struct { converter.offset += 1; break :blk .add; }, + '*' => blk: { + converter.offset += 1; + break :blk .mul; + }, else => os.abort(), }; @@ -693,3 +699,7 @@ test "constant add" { test "constant sub" { try invoke("constant_sub"); } + +test "constant mul" { + try invoke("constant_mul"); +} diff --git a/src/llvm_api.zig b/src/llvm_api.zig index f277d13..0f4ccad 100644 --- a/src/llvm_api.zig +++ b/src/llvm_api.zig @@ -21,6 +21,7 @@ pub extern fn LLVMPositionBuilderAtEnd(builder: *llvm.Builder, basic_block: *llv pub extern fn LLVMBuildRet(builder: *llvm.Builder, value: ?*llvm.Value) void; pub extern fn LLVMBuildAdd(builder: *llvm.Builder, left: *llvm.Value, right: *llvm.Value, name: [*:0]const u8) *llvm.Value; pub extern fn LLVMBuildSub(builder: *llvm.Builder, left: *llvm.Value, right: *llvm.Value, name: [*:0]const u8) *llvm.Value; +pub extern fn LLVMBuildMul(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_mul.bbb b/tests/constant_mul.bbb new file mode 100644 index 0000000..db66565 --- /dev/null +++ b/tests/constant_mul.bbb @@ -0,0 +1,4 @@ +[export] main = fn [cc(c)] () s32 +{ + return 1 * 0; +}