From 648fe7480d258e3950a96e9899125cb172c12961 Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Fri, 21 Feb 2025 13:19:40 -0600 Subject: [PATCH] Constant and --- src/LLVM.zig | 4 ++++ src/converter.zig | 6 ++++++ src/converter_test.zig | 4 ++++ src/llvm_api.zig | 1 + tests/constant_and.bbb | 4 ++++ 5 files changed, 19 insertions(+) create mode 100644 tests/constant_and.bbb diff --git a/src/LLVM.zig b/src/LLVM.zig index 22f6377..1fa510d 100644 --- a/src/LLVM.zig +++ b/src/LLVM.zig @@ -580,6 +580,10 @@ pub const Builder = opaque { return api.LLVMBuildLShr(builder, left, right, ""); } + pub fn create_and(builder: *Builder, left: *Value, right: *Value) *Value { + return api.LLVMBuildAnd(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 5d9b10f..a403558 100644 --- a/src/converter.zig +++ b/src/converter.zig @@ -305,6 +305,7 @@ const Converter = struct { shl, ashr, lshr, + @"and", }; fn parse_value(noalias converter: *Converter, noalias thread: *llvm.Thread, expected_type: Type) *llvm.Value { @@ -336,6 +337,7 @@ const Converter = struct { .shl => thread.builder.create_shl(left, right), .ashr => thread.builder.create_ashr(left, right), .lshr => thread.builder.create_lshr(left, right), + .@"and" => thread.builder.create_and(left, right), }; const ch = converter.content[converter.offset]; @@ -392,6 +394,10 @@ const Converter = struct { else => os.abort(), }; }, + '&' => blk: { + converter.offset += 1; + break :blk .@"and"; + }, else => os.abort(), }; diff --git a/src/converter_test.zig b/src/converter_test.zig index a18e68d..897b05e 100644 --- a/src/converter_test.zig +++ b/src/converter_test.zig @@ -110,3 +110,7 @@ test "constant shift left" { test "constant shift right" { try invoke("constant_shift_right"); } + +test "constant and" { + try invoke("constant_and"); +} diff --git a/src/llvm_api.zig b/src/llvm_api.zig index ae312fd..41496c7 100644 --- a/src/llvm_api.zig +++ b/src/llvm_api.zig @@ -29,6 +29,7 @@ pub extern fn LLVMBuildURem(builder: *llvm.Builder, left: *llvm.Value, right: *l pub extern fn LLVMBuildShl(builder: *llvm.Builder, left: *llvm.Value, right: *llvm.Value, name: [*:0]const u8) *llvm.Value; pub extern fn LLVMBuildAShr(builder: *llvm.Builder, left: *llvm.Value, right: *llvm.Value, name: [*:0]const u8) *llvm.Value; pub extern fn LLVMBuildLShr(builder: *llvm.Builder, left: *llvm.Value, right: *llvm.Value, name: [*:0]const u8) *llvm.Value; +pub extern fn LLVMBuildAnd(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_and.bbb b/tests/constant_and.bbb new file mode 100644 index 0000000..bc8c00e --- /dev/null +++ b/tests/constant_and.bbb @@ -0,0 +1,4 @@ +[export] main = fn [cc(c)] () s32 +{ + return 1 & 2; +}