| ... | @@ -4495,14 +4495,24 @@ fn airMulAdd(self: *Self, inst: Air.Inst.Index) InnerError!WValue { | ... | @@ -4495,14 +4495,24 @@ fn airMulAdd(self: *Self, inst: Air.Inst.Index) InnerError!WValue { |
| 4495 | return self.fail("TODO: `@mulAdd` for vectors", .{}); | 4495 | return self.fail("TODO: `@mulAdd` for vectors", .{}); |
| 4496 | } | 4496 | } |
| 4497 | | 4497 | |
| 4498 | if (ty.floatBits(self.target) == 16) { | | |
| 4499 | return self.fail("TODO: `@mulAdd` for f16", .{}); | | |
| 4500 | } | | |
| 4501 | | | |
| 4502 | const addend = try self.resolveInst(pl_op.operand); | 4498 | const addend = try self.resolveInst(pl_op.operand); |
| 4503 | const lhs = try self.resolveInst(bin_op.lhs); | 4499 | const lhs = try self.resolveInst(bin_op.lhs); |
| 4504 | const rhs = try self.resolveInst(bin_op.rhs); | 4500 | const rhs = try self.resolveInst(bin_op.rhs); |
| 4505 | | 4501 | |
| | 4502 | if (ty.floatBits(self.target) == 16) { |
| | 4503 | const addend_ext = try self.fpext(addend, ty, Type.f32); |
| | 4504 | const lhs_ext = try self.fpext(lhs, ty, Type.f32); |
| | 4505 | const rhs_ext = try self.fpext(rhs, ty, Type.f32); |
| | 4506 | // call to compiler-rt `fn fmaf(f32, f32, f32) f32` |
| | 4507 | const result = try self.callIntrinsic( |
| | 4508 | "fmaf", |
| | 4509 | &.{ Type.f32, Type.f32, Type.f32 }, |
| | 4510 | Type.f32, |
| | 4511 | &.{ rhs_ext, lhs_ext, addend_ext }, |
| | 4512 | ); |
| | 4513 | return try self.fptrunc(result, Type.f32, ty); |
| | 4514 | } |
| | 4515 | |
| 4506 | const mul_result = try self.binOp(lhs, rhs, ty, .mul); | 4516 | const mul_result = try self.binOp(lhs, rhs, ty, .mul); |
| 4507 | return self.binOp(mul_result, addend, ty, .add); | 4517 | return self.binOp(mul_result, addend, ty, .add); |
| 4508 | } | 4518 | } |