diff --git a/src/LLVM.zig b/src/LLVM.zig index 1fa510d..e3f123b 100644 --- a/src/LLVM.zig +++ b/src/LLVM.zig @@ -584,6 +584,10 @@ pub const Builder = opaque { return api.LLVMBuildAnd(builder, left, right, ""); } + pub fn create_or(builder: *Builder, left: *Value, right: *Value) *Value { + return api.LLVMBuildOr(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 a403558..3e179a9 100644 --- a/src/converter.zig +++ b/src/converter.zig @@ -306,6 +306,7 @@ const Converter = struct { ashr, lshr, @"and", + @"or", }; fn parse_value(noalias converter: *Converter, noalias thread: *llvm.Thread, expected_type: Type) *llvm.Value { @@ -338,6 +339,7 @@ const Converter = struct { .ashr => thread.builder.create_ashr(left, right), .lshr => thread.builder.create_lshr(left, right), .@"and" => thread.builder.create_and(left, right), + .@"or" => thread.builder.create_or(left, right), }; const ch = converter.content[converter.offset]; @@ -398,6 +400,10 @@ const Converter = struct { converter.offset += 1; break :blk .@"and"; }, + '|' => blk: { + converter.offset += 1; + break :blk .@"or"; + }, else => os.abort(), }; diff --git a/src/converter_test.zig b/src/converter_test.zig index 897b05e..8e24d25 100644 --- a/src/converter_test.zig +++ b/src/converter_test.zig @@ -114,3 +114,7 @@ test "constant shift right" { test "constant and" { try invoke("constant_and"); } + +test "constant or" { + try invoke("constant_or"); +} diff --git a/src/llvm_api.zig b/src/llvm_api.zig index 41496c7..07492a3 100644 --- a/src/llvm_api.zig +++ b/src/llvm_api.zig @@ -30,6 +30,7 @@ pub extern fn LLVMBuildShl(builder: *llvm.Builder, left: *llvm.Value, right: *ll 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 LLVMBuildOr(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_or.bbb b/tests/constant_or.bbb new file mode 100644 index 0000000..4392873 --- /dev/null +++ b/tests/constant_or.bbb @@ -0,0 +1,4 @@ +[export] main = fn [cc(c)] () s32 +{ + return 0 | 0; +}