mirror of
https://github.com/ziglang/zig.git
synced 2026-02-21 16:54:52 +00:00
Use new LLVM IR builder API in bit op lowering
This commit is contained in:
parent
86f61a9d26
commit
e149f1e1de
@ -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,
|
||||
¶ms,
|
||||
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,
|
||||
¶ms,
|
||||
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,
|
||||
¶ms,
|
||||
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), "");
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user