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 {...@@ -5100,11 +5100,11 @@ pub const FuncGen = struct {
5100 .memcpy => try self.airMemcpy(inst),5100 .memcpy => try self.airMemcpy(inst),
5101 .set_union_tag => try self.airSetUnionTag(inst),5101 .set_union_tag => try self.airSetUnionTag(inst),
5102 .get_union_tag => try self.airGetUnionTag(inst),5102 .get_union_tag => try self.airGetUnionTag(inst),
5103 .clz => try self.airClzCtz(inst, "llvm.ctlz"),5103 .clz => try self.airClzCtz(inst, .@"llvm.ctlz."),
5104 .ctz => try self.airClzCtz(inst, "llvm.cttz"),5104 .ctz => try self.airClzCtz(inst, .@"llvm.cttz."),
5105 .popcount => try self.airBitOp(inst, "llvm.ctpop"),5105 .popcount => try self.airBitOp(inst, .@"llvm.ctpop."),
5106 .byte_swap => try self.airByteSwap(inst, "llvm.bswap"),5106 .byte_swap => try self.airByteSwap(inst),
5107 .bit_reverse => try self.airBitOp(inst, "llvm.bitreverse"),5107 .bit_reverse => try self.airBitOp(inst, .@"llvm.bitreverse."),
5108 .tag_name => try self.airTagName(inst),5108 .tag_name => try self.airTagName(inst),
5109 .error_name => try self.airErrorName(inst),5109 .error_name => try self.airErrorName(inst),
5110 .splat => try self.airSplat(inst),5110 .splat => try self.airSplat(inst),
...@@ -9526,64 +9526,29 @@ pub const FuncGen = struct {...@@ -9526,64 +9526,29 @@ pub const FuncGen = struct {
9526 return self.buildFloatOp(.neg, operand_ty, 1, .{operand});9526 return self.buildFloatOp(.neg, operand_ty, 1, .{operand});
9527 }9527 }
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 {
9530 const o = self.dg.object;9530 const o = self.dg.object;
9531 const ty_op = self.air.instructions.items(.data)[inst].ty_op;9531 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
9532 const operand_ty = self.typeOf(ty_op.operand);
9533 const operand = try self.resolveInst(ty_op.operand);9532 const operand = try self.resolveInst(ty_op.operand);
95349533
9535 const llvm_operand_ty = try o.lowerType(operand_ty);9534 const wrong_size_result = try self.wip.bin(intrinsic, operand, (try o.builder.intConst(.i1, 0)).toValue(), "");
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});
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 );
9555 const result_ty = self.typeOfIndex(inst);9536 const result_ty = self.typeOfIndex(inst);
9556 return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), "");9537 return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), "");
9557 }9538 }
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 {
9560 const o = self.dg.object;9541 const o = self.dg.object;
9561 const ty_op = self.air.instructions.items(.data)[inst].ty_op;9542 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
9562 const operand_ty = self.typeOf(ty_op.operand);
9563 const operand = try self.resolveInst(ty_op.operand);9543 const operand = try self.resolveInst(ty_op.operand);
95649544
9565 const llvm_operand_ty = try o.lowerType(operand_ty);9545 const wrong_size_result = try self.wip.un(intrinsic, operand, "");
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});
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 );
9582 const result_ty = self.typeOfIndex(inst);9547 const result_ty = self.typeOfIndex(inst);
9583 return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), "");9548 return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), "");
9584 }9549 }
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 {
9587 const o = self.dg.object;9552 const o = self.dg.object;
9588 const mod = o.module;9553 const mod = o.module;
9589 const ty_op = self.air.instructions.items(.data)[inst].ty_op;9554 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
...@@ -9611,22 +9576,7 @@ pub const FuncGen = struct {...@@ -9611,22 +9576,7 @@ pub const FuncGen = struct {
9611 bits = bits + 8;9576 bits = bits + 8;
9612 }9577 }
96139578
9614 const llvm_fn_ty = try o.builder.fnType(llvm_operand_ty, &.{llvm_operand_ty}, .normal);9579 const wrong_size_result = try self.wip.un(.@"llvm.bswap.", operand, "");
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 );
96309580
9631 const result_ty = self.typeOfIndex(inst);9581 const result_ty = self.typeOfIndex(inst);
9632 return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), "");9582 return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), "");