Commit e149f1e1de

antlilja <liljaanton2001@gmail.com>
2023-08-06 00:59:56
Use new LLVM IR builder API in bit op lowering
1 parent 86f61a9
Changed files (1)
src
codegen
src/codegen/llvm.zig
@@ -5100,11 +5100,11 @@ pub const FuncGen = struct {
                 .memcpy         => try self.airMemcpy(inst),
                 .set_union_tag  => try self.airSetUnionTag(inst),
                 .get_union_tag  => try self.airGetUnionTag(inst),
-                .clz            => try self.airClzCtz(inst, "llvm.ctlz"),
-                .ctz            => try self.airClzCtz(inst, "llvm.cttz"),
-                .popcount       => try self.airBitOp(inst, "llvm.ctpop"),
-                .byte_swap      => try self.airByteSwap(inst, "llvm.bswap"),
-                .bit_reverse    => try self.airBitOp(inst, "llvm.bitreverse"),
+                .clz            => try self.airClzCtz(inst, .@"llvm.ctlz."),
+                .ctz            => try self.airClzCtz(inst, .@"llvm.cttz."),
+                .popcount       => try self.airBitOp(inst, .@"llvm.ctpop."),
+                .byte_swap      => try self.airByteSwap(inst),
+                .bit_reverse    => try self.airBitOp(inst, .@"llvm.bitreverse."),
                 .tag_name       => try self.airTagName(inst),
                 .error_name     => try self.airErrorName(inst),
                 .splat          => try self.airSplat(inst),
@@ -9526,64 +9526,29 @@ pub const FuncGen = struct {
         return self.buildFloatOp(.neg, operand_ty, 1, .{operand});
     }
 
-    fn airClzCtz(self: *FuncGen, inst: Air.Inst.Index, llvm_fn_name: []const u8) !Builder.Value {
+    fn airClzCtz(self: *FuncGen, inst: Air.Inst.Index, intrinsic: Builder.Function.Instruction.Tag) !Builder.Value {
         const o = self.dg.object;
         const ty_op = self.air.instructions.items(.data)[inst].ty_op;
-        const operand_ty = self.typeOf(ty_op.operand);
         const operand = try self.resolveInst(ty_op.operand);
 
-        const llvm_operand_ty = try o.lowerType(operand_ty);
-        const llvm_fn_ty = try o.builder.fnType(llvm_operand_ty, &.{ llvm_operand_ty, .i1 }, .normal);
-        const fn_val = try self.getIntrinsic(llvm_fn_name, &.{llvm_operand_ty});
+        const wrong_size_result = try self.wip.bin(intrinsic, operand, (try o.builder.intConst(.i1, 0)).toValue(), "");
 
-        const params = [_]*llvm.Value{
-            operand.toLlvm(&self.wip),
-            Builder.Constant.false.toLlvm(&o.builder),
-        };
-        const wrong_size_result = (try self.wip.unimplemented(llvm_operand_ty, "")).finish(
-            self.builder.buildCallOld(
-                llvm_fn_ty.toLlvm(&o.builder),
-                fn_val,
-                &params,
-                params.len,
-                .C,
-                .Auto,
-                "",
-            ),
-            &self.wip,
-        );
         const result_ty = self.typeOfIndex(inst);
         return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), "");
     }
 
-    fn airBitOp(self: *FuncGen, inst: Air.Inst.Index, llvm_fn_name: []const u8) !Builder.Value {
+    fn airBitOp(self: *FuncGen, inst: Air.Inst.Index, intrinsic: Builder.Function.Instruction.Tag) !Builder.Value {
         const o = self.dg.object;
         const ty_op = self.air.instructions.items(.data)[inst].ty_op;
-        const operand_ty = self.typeOf(ty_op.operand);
         const operand = try self.resolveInst(ty_op.operand);
 
-        const llvm_operand_ty = try o.lowerType(operand_ty);
-        const llvm_fn_ty = try o.builder.fnType(llvm_operand_ty, &.{llvm_operand_ty}, .normal);
-        const fn_val = try self.getIntrinsic(llvm_fn_name, &.{llvm_operand_ty});
+        const wrong_size_result = try self.wip.un(intrinsic, operand, "");
 
-        const params = [_]*llvm.Value{operand.toLlvm(&self.wip)};
-        const wrong_size_result = (try self.wip.unimplemented(llvm_operand_ty, "")).finish(
-            self.builder.buildCallOld(
-                llvm_fn_ty.toLlvm(&o.builder),
-                fn_val,
-                &params,
-                params.len,
-                .C,
-                .Auto,
-                "",
-            ),
-            &self.wip,
-        );
         const result_ty = self.typeOfIndex(inst);
         return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), "");
     }
 
-    fn airByteSwap(self: *FuncGen, inst: Air.Inst.Index, llvm_fn_name: []const u8) !Builder.Value {
+    fn airByteSwap(self: *FuncGen, inst: Air.Inst.Index) !Builder.Value {
         const o = self.dg.object;
         const mod = o.module;
         const ty_op = self.air.instructions.items(.data)[inst].ty_op;
@@ -9611,22 +9576,7 @@ pub const FuncGen = struct {
             bits = bits + 8;
         }
 
-        const llvm_fn_ty = try o.builder.fnType(llvm_operand_ty, &.{llvm_operand_ty}, .normal);
-        const fn_val = try self.getIntrinsic(llvm_fn_name, &.{llvm_operand_ty});
-
-        const params = [_]*llvm.Value{operand.toLlvm(&self.wip)};
-        const wrong_size_result = (try self.wip.unimplemented(llvm_operand_ty, "")).finish(
-            self.builder.buildCallOld(
-                llvm_fn_ty.toLlvm(&o.builder),
-                fn_val,
-                &params,
-                params.len,
-                .C,
-                .Auto,
-                "",
-            ),
-            &self.wip,
-        );
+        const wrong_size_result = try self.wip.un(.@"llvm.bswap.", operand, "");
 
         const result_ty = self.typeOfIndex(inst);
         return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), "");