| ... | ... | @@ -1814,10 +1814,8 @@ fn genInst(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
| 1814 | 1814 | .subwrap => func.airWrapBinOp(inst, .sub), |
| 1815 | 1815 | .mul => func.airBinOp(inst, .mul), |
| 1816 | 1816 | .mulwrap => func.airWrapBinOp(inst, .mul), |
| 1817 | | .div_float, |
| 1818 | | .div_exact, |
| 1819 | | .div_trunc, |
| 1820 | | => func.airDiv(inst), |
| 1817 | .div_float, .div_exact => func.airDiv(inst), |
| 1818 | .div_trunc => func.airDivTrunc(inst), |
| 1821 | 1819 | .div_floor => func.airDivFloor(inst), |
| 1822 | 1820 | .bit_and => func.airBinOp(inst, .@"and"), |
| 1823 | 1821 | .bit_or => func.airBinOp(inst, .@"or"), |
| ... | ... | @@ -6138,6 +6136,26 @@ fn airDiv(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
| 6138 | 6136 | func.finishAir(inst, result, &.{ bin_op.lhs, bin_op.rhs }); |
| 6139 | 6137 | } |
| 6140 | 6138 | |
| 6139 | fn airDivTrunc(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
| 6140 | const bin_op = func.air.instructions.items(.data)[inst].bin_op; |
| 6141 | |
| 6142 | const ty = func.air.typeOfIndex(inst); |
| 6143 | const lhs = try func.resolveInst(bin_op.lhs); |
| 6144 | const rhs = try func.resolveInst(bin_op.rhs); |
| 6145 | |
| 6146 | const div_result = if (ty.isSignedInt()) |
| 6147 | try func.divSigned(lhs, rhs, ty) |
| 6148 | else |
| 6149 | try (try func.binOp(lhs, rhs, ty, .div)).toLocal(func, ty); |
| 6150 | |
| 6151 | if (ty.isAnyFloat()) { |
| 6152 | const trunc_result = try (try func.floatOp(.trunc, ty, &.{div_result})).toLocal(func, ty); |
| 6153 | return func.finishAir(inst, trunc_result, &.{ bin_op.lhs, bin_op.rhs }); |
| 6154 | } |
| 6155 | |
| 6156 | return func.finishAir(inst, div_result, &.{ bin_op.lhs, bin_op.rhs }); |
| 6157 | } |
| 6158 | |
| 6141 | 6159 | fn airDivFloor(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
| 6142 | 6160 | const bin_op = func.air.instructions.items(.data)[inst].bin_op; |
| 6143 | 6161 | |