authorgravatar for liljaanton2001@gmail.comantlilja <liljaanton2001@gmail.com> 2023-08-06 00:59:56+02:00
committergravatar for liljaanton2001@gmail.comantlilja <liljaanton2001@gmail.com> 2023-08-06 01:46:57+02:00
loge149f1e1de8f79a66a97da1700d9a64fc2983211
tree30a7e984201cf3c7a7accbd5d1236dc439871059
parent86f61a9d2641300a733eee2edc10f57bb3243c57
signaturelock-open Commit is signed but in an unrecognized format.

Use new LLVM IR builder API in bit op lowering


1 files changed, 11 insertions(+), 61 deletions(-)

src/codegen/llvm.zig+11-61
......@@ -5100,11 +5100,11 @@ pub const FuncGen = struct {
51005100 .memcpy => try self.airMemcpy(inst),
51015101 .set_union_tag => try self.airSetUnionTag(inst),
51025102 .get_union_tag => try self.airGetUnionTag(inst),
5103 .clz => try self.airClzCtz(inst, "llvm.ctlz"),
5104 .ctz => try self.airClzCtz(inst, "llvm.cttz"),
5105 .popcount => try self.airBitOp(inst, "llvm.ctpop"),
5106 .byte_swap => try self.airByteSwap(inst, "llvm.bswap"),
5107 .bit_reverse => try self.airBitOp(inst, "llvm.bitreverse"),
5103 .clz => try self.airClzCtz(inst, .@"llvm.ctlz."),
5104 .ctz => try self.airClzCtz(inst, .@"llvm.cttz."),
5105 .popcount => try self.airBitOp(inst, .@"llvm.ctpop."),
5106 .byte_swap => try self.airByteSwap(inst),
5107 .bit_reverse => try self.airBitOp(inst, .@"llvm.bitreverse."),
51085108 .tag_name => try self.airTagName(inst),
51095109 .error_name => try self.airErrorName(inst),
51105110 .splat => try self.airSplat(inst),
......@@ -9526,64 +9526,29 @@ pub const FuncGen = struct {
95269526 return self.buildFloatOp(.neg, operand_ty, 1, .{operand});
95279527 }
95289528
9529 fn airClzCtz(self: *FuncGen, inst: Air.Inst.Index, llvm_fn_name: []const u8) !Builder.Value {
9529 fn airClzCtz(self: *FuncGen, inst: Air.Inst.Index, intrinsic: Builder.Function.Instruction.Tag) !Builder.Value {
95309530 const o = self.dg.object;
95319531 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
9532 const operand_ty = self.typeOf(ty_op.operand);
95339532 const operand = try self.resolveInst(ty_op.operand);
95349533
9535 const llvm_operand_ty = try o.lowerType(operand_ty);
9536 const llvm_fn_ty = try o.builder.fnType(llvm_operand_ty, &.{ llvm_operand_ty, .i1 }, .normal);
9537 const fn_val = try self.getIntrinsic(llvm_fn_name, &.{llvm_operand_ty});
9534 const wrong_size_result = try self.wip.bin(intrinsic, operand, (try o.builder.intConst(.i1, 0)).toValue(), "");
95389535
9539 const params = [_]*llvm.Value{
9540 operand.toLlvm(&self.wip),
9541 Builder.Constant.false.toLlvm(&o.builder),
9542 };
9543 const wrong_size_result = (try self.wip.unimplemented(llvm_operand_ty, "")).finish(
9544 self.builder.buildCallOld(
9545 llvm_fn_ty.toLlvm(&o.builder),
9546 fn_val,
9547 &params,
9548 params.len,
9549 .C,
9550 .Auto,
9551 "",
9552 ),
9553 &self.wip,
9554 );
95559536 const result_ty = self.typeOfIndex(inst);
95569537 return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), "");
95579538 }
95589539
9559 fn airBitOp(self: *FuncGen, inst: Air.Inst.Index, llvm_fn_name: []const u8) !Builder.Value {
9540 fn airBitOp(self: *FuncGen, inst: Air.Inst.Index, intrinsic: Builder.Function.Instruction.Tag) !Builder.Value {
95609541 const o = self.dg.object;
95619542 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
9562 const operand_ty = self.typeOf(ty_op.operand);
95639543 const operand = try self.resolveInst(ty_op.operand);
95649544
9565 const llvm_operand_ty = try o.lowerType(operand_ty);
9566 const llvm_fn_ty = try o.builder.fnType(llvm_operand_ty, &.{llvm_operand_ty}, .normal);
9567 const fn_val = try self.getIntrinsic(llvm_fn_name, &.{llvm_operand_ty});
9545 const wrong_size_result = try self.wip.un(intrinsic, operand, "");
95689546
9569 const params = [_]*llvm.Value{operand.toLlvm(&self.wip)};
9570 const wrong_size_result = (try self.wip.unimplemented(llvm_operand_ty, "")).finish(
9571 self.builder.buildCallOld(
9572 llvm_fn_ty.toLlvm(&o.builder),
9573 fn_val,
9574 &params,
9575 params.len,
9576 .C,
9577 .Auto,
9578 "",
9579 ),
9580 &self.wip,
9581 );
95829547 const result_ty = self.typeOfIndex(inst);
95839548 return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), "");
95849549 }
95859550
9586 fn airByteSwap(self: *FuncGen, inst: Air.Inst.Index, llvm_fn_name: []const u8) !Builder.Value {
9551 fn airByteSwap(self: *FuncGen, inst: Air.Inst.Index) !Builder.Value {
95879552 const o = self.dg.object;
95889553 const mod = o.module;
95899554 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
......@@ -9611,22 +9576,7 @@ pub const FuncGen = struct {
96119576 bits = bits + 8;
96129577 }
96139578
9614 const llvm_fn_ty = try o.builder.fnType(llvm_operand_ty, &.{llvm_operand_ty}, .normal);
9615 const fn_val = try self.getIntrinsic(llvm_fn_name, &.{llvm_operand_ty});
9616
9617 const params = [_]*llvm.Value{operand.toLlvm(&self.wip)};
9618 const wrong_size_result = (try self.wip.unimplemented(llvm_operand_ty, "")).finish(
9619 self.builder.buildCallOld(
9620 llvm_fn_ty.toLlvm(&o.builder),
9621 fn_val,
9622 &params,
9623 params.len,
9624 .C,
9625 .Auto,
9626 "",
9627 ),
9628 &self.wip,
9629 );
9579 const wrong_size_result = try self.wip.un(.@"llvm.bswap.", operand, "");
96309580
96319581 const result_ty = self.typeOfIndex(inst);
96329582 return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), "");