authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-03-26 12:04:52+01:00
committergravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-03-26 17:21:42+01:00
log9070ad77740477f7f3806bad884b4070d476a68c
treedfc5f90526b10b60c81e0641bea7d299c600e3a4
parente2468e3f2732a7a301f4174eb4d99bca5315a643
signaturelock-open Commit is signed but in an unrecognized format.

stage2 LLVM: Adjust to new AIR arithmetic overflow instructions


1 files changed, 9 insertions(+), 18 deletions(-)

src/codegen/llvm.zig+9-18
...@@ -5189,14 +5189,12 @@ pub const FuncGen = struct {...@@ -5189,14 +5189,12 @@ pub const FuncGen = struct {
5189 if (self.liveness.isUnused(inst))5189 if (self.liveness.isUnused(inst))
5190 return null;5190 return null;
51915191
5192 const pl_op = self.air.instructions.items(.data)[inst].pl_op;5192 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
5193 const extra = self.air.extraData(Air.Bin, pl_op.payload).data;5193 const extra = self.air.extraData(Air.Bin, ty_pl.payload).data;
51945194
5195 const ptr = try self.resolveInst(pl_op.operand);
5196 const lhs = try self.resolveInst(extra.lhs);5195 const lhs = try self.resolveInst(extra.lhs);
5197 const rhs = try self.resolveInst(extra.rhs);5196 const rhs = try self.resolveInst(extra.rhs);
51985197
5199 const ptr_ty = self.air.typeOf(pl_op.operand);
5200 const lhs_ty = self.air.typeOf(extra.lhs);5198 const lhs_ty = self.air.typeOf(extra.lhs);
52015199
5202 const intrinsic_name = if (lhs_ty.isSignedInt()) signed_intrinsic else unsigned_intrinsic;5200 const intrinsic_name = if (lhs_ty.isSignedInt()) signed_intrinsic else unsigned_intrinsic;
...@@ -5205,13 +5203,7 @@ pub const FuncGen = struct {...@@ -5205,13 +5203,7 @@ pub const FuncGen = struct {
52055203
5206 const llvm_fn = self.getIntrinsic(intrinsic_name, &.{llvm_lhs_ty});5204 const llvm_fn = self.getIntrinsic(intrinsic_name, &.{llvm_lhs_ty});
5207 const result_struct = self.builder.buildCall(llvm_fn, &[_]*const llvm.Value{ lhs, rhs }, 2, .Fast, .Auto, "");5205 const result_struct = self.builder.buildCall(llvm_fn, &[_]*const llvm.Value{ lhs, rhs }, 2, .Fast, .Auto, "");
52085206 return result_struct;
5209 const result = self.builder.buildExtractValue(result_struct, 0, "");
5210 const overflow_bit = self.builder.buildExtractValue(result_struct, 1, "");
5211
5212 self.store(ptr, ptr_ty, result, .NotAtomic);
5213
5214 return overflow_bit;
5215 }5207 }
52165208
5217 fn airMulAdd(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value {5209 fn airMulAdd(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value {
...@@ -5293,16 +5285,16 @@ pub const FuncGen = struct {...@@ -5293,16 +5285,16 @@ pub const FuncGen = struct {
5293 if (self.liveness.isUnused(inst))5285 if (self.liveness.isUnused(inst))
5294 return null;5286 return null;
52955287
5296 const pl_op = self.air.instructions.items(.data)[inst].pl_op;5288 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
5297 const extra = self.air.extraData(Air.Bin, pl_op.payload).data;5289 const extra = self.air.extraData(Air.Bin, ty_pl.payload).data;
52985290
5299 const ptr = try self.resolveInst(pl_op.operand);
5300 const lhs = try self.resolveInst(extra.lhs);5291 const lhs = try self.resolveInst(extra.lhs);
5301 const rhs = try self.resolveInst(extra.rhs);5292 const rhs = try self.resolveInst(extra.rhs);
53025293
5303 const ptr_ty = self.air.typeOf(pl_op.operand);
5304 const lhs_ty = self.air.typeOf(extra.lhs);5294 const lhs_ty = self.air.typeOf(extra.lhs);
5305 const rhs_ty = self.air.typeOf(extra.rhs);5295 const rhs_ty = self.air.typeOf(extra.rhs);
5296 const dest_ty = self.air.typeOfIndex(inst);
5297 const llvm_dest_ty = try self.dg.llvmType(dest_ty);
53065298
5307 const tg = self.dg.module.getTarget();5299 const tg = self.dg.module.getTarget();
53085300
...@@ -5319,9 +5311,8 @@ pub const FuncGen = struct {...@@ -5319,9 +5311,8 @@ pub const FuncGen = struct {
53195311
5320 const overflow_bit = self.builder.buildICmp(.NE, lhs, reconstructed, "");5312 const overflow_bit = self.builder.buildICmp(.NE, lhs, reconstructed, "");
53215313
5322 self.store(ptr, ptr_ty, result, .NotAtomic);5314 const partial = self.builder.buildInsertValue(llvm_dest_ty.getUndef(), result, 0, "");
53235315 return self.builder.buildInsertValue(partial, overflow_bit, 1, "");
5324 return overflow_bit;
5325 }5316 }
53265317
5327 fn airAnd(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value {5318 fn airAnd(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value {