| ... | @@ -15190,52 +15190,8 @@ fn zirMulAdd(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. | ... | @@ -15190,52 +15190,8 @@ fn zirMulAdd(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 15190 | | 15190 | |
| 15191 | if (maybe_addend) |addend_val| { | 15191 | if (maybe_addend) |addend_val| { |
| 15192 | if (addend_val.isUndef()) return sema.addConstUndef(ty); | 15192 | if (addend_val.isUndef()) return sema.addConstUndef(ty); |
| 15193 | | 15193 | const result_val = try Value.mulAdd(ty, mulend1_val, mulend2_val, addend_val, sema.arena, target); |
| 15194 | switch (ty.zigTypeTag()) { | 15194 | return sema.addConstant(ty, result_val); |
| 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 | } | | |
| 15239 | } else { | 15195 | } else { |
| 15240 | break :rs addend_src; | 15196 | break :rs addend_src; |
| 15241 | } | 15197 | } |