authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-03-27 11:12:42+03:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-03-27 11:12:42+03:00
log23507f20b943e7923978b293cb03bee886f913ed
treee21fb9787b9aa171b87e9f97a805ec6c1f01b728
parent97a53bb8a1703dfd09bee1124ae893f0764a8c8e
parentadc2824fa405beeea25edacd9362d1f66f8f9520
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #11315 from wsengir/stage2-simplify-muladd

stage2: simplify mul_add

2 files changed, 3 insertions(+), 51 deletions(-)

src/Sema.zig+2-46
......@@ -15190,52 +15190,8 @@ fn zirMulAdd(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.
1519015190
1519115191 if (maybe_addend) |addend_val| {
1519215192 if (addend_val.isUndef()) return sema.addConstUndef(ty);
15193
15194 switch (ty.zigTypeTag()) {
15195 .ComptimeFloat, .Float => {
15196 const result_val = try Value.mulAdd(
15197 ty,
15198 mulend1_val,
15199 mulend2_val,
15200 addend_val,
15201 sema.arena,
15202 target,
15203 );
15204 return sema.addConstant(ty, result_val);
15205 },
15206 .Vector => {
15207 const scalar_ty = ty.scalarType();
15208 switch (scalar_ty.zigTypeTag()) {
15209 .ComptimeFloat, .Float => {},
15210 else => return sema.fail(block, src, "expected vector of floats, found vector of '{}'", .{scalar_ty.fmt(target)}),
15211 }
15212
15213 const vec_len = ty.vectorLen();
15214 const result_ty = try Type.vector(sema.arena, vec_len, scalar_ty);
15215 var mulend1_buf: Value.ElemValueBuffer = undefined;
15216 var mulend2_buf: Value.ElemValueBuffer = undefined;
15217 var addend_buf: Value.ElemValueBuffer = undefined;
15218 const elems = try sema.arena.alloc(Value, vec_len);
15219 for (elems) |*elem, i| {
15220 const mulend1_elem_val = mulend1_val.elemValueBuffer(i, &mulend1_buf);
15221 const mulend2_elem_val = mulend2_val.elemValueBuffer(i, &mulend2_buf);
15222 const addend_elem_val = addend_val.elemValueBuffer(i, &addend_buf);
15223 elem.* = try Value.mulAdd(
15224 scalar_ty,
15225 mulend1_elem_val,
15226 mulend2_elem_val,
15227 addend_elem_val,
15228 sema.arena,
15229 target,
15230 );
15231 }
15232 return sema.addConstant(
15233 result_ty,
15234 try Value.Tag.aggregate.create(sema.arena, elems),
15235 );
15236 },
15237 else => unreachable,
15238 }
15193 const result_val = try Value.mulAdd(ty, mulend1_val, mulend2_val, addend_val, sema.arena, target);
15194 return sema.addConstant(ty, result_val);
1523915195 } else {
1524015196 break :rs addend_src;
1524115197 }
src/codegen/llvm.zig+1-5
......@@ -5218,6 +5218,7 @@ pub const FuncGen = struct {
52185218
52195219 const ty = self.air.typeOfIndex(inst);
52205220 const llvm_ty = try self.dg.llvmType(ty);
5221 const scalar_ty = ty.scalarType();
52215222 const target = self.dg.module.getTarget();
52225223
52235224 const Strat = union(enum) {
......@@ -5225,11 +5226,6 @@ pub const FuncGen = struct {
52255226 libc: [*:0]const u8,
52265227 };
52275228
5228 const scalar_ty = if (ty.zigTypeTag() == .Vector)
5229 ty.elemType()
5230 else
5231 ty;
5232
52335229 const strat: Strat = switch (scalar_ty.floatBits(target)) {
52345230 16, 32, 64 => Strat.intrinsic,
52355231 80 => if (CType.longdouble.sizeInBits(target) == 80) Strat{ .intrinsic = {} } else Strat{ .libc = "__fmax" },