authorgravatar for william@sengir.comWilliam Sengir <william@sengir.com> 2022-03-26 15:25:31-07:00
committergravatar for william@sengir.comWilliam Sengir <william@sengir.com> 2022-03-26 16:29:48-07:00
log6a48345649de9d0ad5c948ca1ddd3277de046567
tree433d603148cec264db8b36aafb79f747a4e84a88
parent97a53bb8a1703dfd09bee1124ae893f0764a8c8e
signature Commit is signed but in an unrecognized format.

Sema: remove redundant `mul_add` comptime vectorization

Moving comptime vectorization into `Value` has proven to simplify and clean up a lot of code.

1 files changed, 2 insertions(+), 46 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 }