From c641fb8f05cfbca7484a09496f33bc9c2d95941e Mon Sep 17 00:00:00 2001 From: William Sengir Date: Sat, 26 Mar 2022 15:40:31 -0700 Subject: stage2: fix {add,sub,mul}_with_overflow vectorization in LLVM backend --- src/codegen/llvm.zig | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/codegen/llvm.zig') diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 5a8516b363..3e15bd8d9a 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -5604,8 +5604,9 @@ pub const FuncGen = struct { const rhs = try self.resolveInst(extra.rhs); const lhs_ty = self.air.typeOf(extra.lhs); + const scalar_ty = lhs_ty.scalarType(); - const intrinsic_name = if (lhs_ty.isSignedInt()) signed_intrinsic else unsigned_intrinsic; + const intrinsic_name = if (scalar_ty.isSignedInt()) signed_intrinsic else unsigned_intrinsic; const llvm_lhs_ty = try self.dg.llvmType(lhs_ty); -- cgit v1.2.3 From c2cb9b7cade597bc967620174b31db3895681f96 Mon Sep 17 00:00:00 2001 From: William Sengir Date: Sat, 26 Mar 2022 15:41:44 -0700 Subject: stage2: vectorize shl_with_overflow in LLVM backend --- src/codegen/llvm.zig | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'src/codegen/llvm.zig') diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 3e15bd8d9a..3abdccfbe2 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -5899,26 +5899,30 @@ pub const FuncGen = struct { const lhs_ty = self.air.typeOf(extra.lhs); const rhs_ty = self.air.typeOf(extra.rhs); + const lhs_scalar_ty = lhs_ty.scalarType(); + const rhs_scalar_ty = rhs_ty.scalarType(); + const dest_ty = self.air.typeOfIndex(inst); const llvm_dest_ty = try self.dg.llvmType(dest_ty); const tg = self.dg.module.getTarget(); - const casted_rhs = if (rhs_ty.bitSize(tg) < lhs_ty.bitSize(tg)) + const casted_rhs = if (rhs_scalar_ty.bitSize(tg) < lhs_scalar_ty.bitSize(tg)) self.builder.buildZExt(rhs, try self.dg.llvmType(lhs_ty), "") else rhs; const result = self.builder.buildShl(lhs, casted_rhs, ""); - const reconstructed = if (lhs_ty.isSignedInt()) + const reconstructed = if (lhs_scalar_ty.isSignedInt()) self.builder.buildAShr(result, casted_rhs, "") else self.builder.buildLShr(result, casted_rhs, ""); const overflow_bit = self.builder.buildICmp(.NE, lhs, reconstructed, ""); - const partial = self.builder.buildInsertValue(llvm_dest_ty.getUndef(), result, 0, ""); - return self.builder.buildInsertValue(partial, overflow_bit, 1, ""); + var ty_buf: Type.Payload.Pointer = undefined; + const partial = self.builder.buildInsertValue(llvm_dest_ty.getUndef(), result, llvmFieldIndex(dest_ty, 0, tg, &ty_buf).?, ""); + return self.builder.buildInsertValue(partial, overflow_bit, llvmFieldIndex(dest_ty, 1, tg, &ty_buf).?, ""); } fn airAnd(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { -- cgit v1.2.3 From a5ea22d0693cf767fa47c9947399651ed3c35aaf Mon Sep 17 00:00:00 2001 From: William Sengir Date: Sat, 23 Apr 2022 02:54:52 -0700 Subject: LLVM: correctly pad result tuple of `airOverflow` --- src/codegen/llvm.zig | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'src/codegen/llvm.zig') diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 3abdccfbe2..7392b2068b 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -5605,14 +5605,24 @@ pub const FuncGen = struct { const lhs_ty = self.air.typeOf(extra.lhs); const scalar_ty = lhs_ty.scalarType(); + const dest_ty = self.air.typeOfIndex(inst); const intrinsic_name = if (scalar_ty.isSignedInt()) signed_intrinsic else unsigned_intrinsic; const llvm_lhs_ty = try self.dg.llvmType(lhs_ty); + const llvm_dest_ty = try self.dg.llvmType(dest_ty); + + const tg = self.dg.module.getTarget(); const llvm_fn = self.getIntrinsic(intrinsic_name, &.{llvm_lhs_ty}); const result_struct = self.builder.buildCall(llvm_fn, &[_]*const llvm.Value{ lhs, rhs }, 2, .Fast, .Auto, ""); - return result_struct; + + const result = self.builder.buildExtractValue(result_struct, 0, ""); + const overflow_bit = self.builder.buildExtractValue(result_struct, 1, ""); + + var ty_buf: Type.Payload.Pointer = undefined; + const partial = self.builder.buildInsertValue(llvm_dest_ty.getUndef(), result, llvmFieldIndex(dest_ty, 0, tg, &ty_buf).?, ""); + return self.builder.buildInsertValue(partial, overflow_bit, llvmFieldIndex(dest_ty, 1, tg, &ty_buf).?, ""); } fn buildElementwiseCall( -- cgit v1.2.3