| ... | ... | @@ -15190,52 +15190,8 @@ fn zirMulAdd(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 15190 | 15190 | |
| 15191 | 15191 | if (maybe_addend) |addend_val| { |
| 15192 | 15192 | 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); |
| 15239 | 15195 | } else { |
| 15240 | 15196 | break :rs addend_src; |
| 15241 | 15197 | } |