|
|
@ -790,133 +790,8 @@ void VisitFpModifiers(Info& info, IR::Inst& inst) { |
|
|
info.uses_fp16_denorms_preserve = true; |
|
|
info.uses_fp16_denorms_preserve = true; |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
switch (control.rounding) { |
|
|
|
|
|
case IR::FpRounding::DontCare: |
|
|
|
|
|
break; |
|
|
|
|
|
case IR::FpRounding::RN: |
|
|
|
|
|
info.uses_fp16_rounding_rte = true; |
|
|
|
|
|
break; |
|
|
|
|
|
case IR::FpRounding::RZ: |
|
|
|
|
|
info.uses_fp16_rounding_rtz = true; |
|
|
|
|
|
break; |
|
|
|
|
|
default: |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
... |
|
|
|
|
|
|
|
|
|
|
|
case IR::Opcode::FPAdd32: |
|
|
|
|
|
case IR::Opcode::FPFma32: |
|
|
|
|
|
case IR::Opcode::FPMul32: |
|
|
|
|
|
case IR::Opcode::FPRoundEven32: |
|
|
|
|
|
case IR::Opcode::FPFloor32: |
|
|
|
|
|
case IR::Opcode::FPCeil32: |
|
|
|
|
|
case IR::Opcode::FPTrunc32: |
|
|
|
|
|
case IR::Opcode::FPOrdEqual32: |
|
|
|
|
|
case IR::Opcode::FPUnordEqual32: |
|
|
|
|
|
case IR::Opcode::FPOrdNotEqual32: |
|
|
|
|
|
case IR::Opcode::FPUnordNotEqual32: |
|
|
|
|
|
case IR::Opcode::FPOrdLessThan32: |
|
|
|
|
|
case IR::Opcode::FPUnordLessThan32: |
|
|
|
|
|
case IR::Opcode::FPOrdGreaterThan32: |
|
|
|
|
|
case IR::Opcode::FPUnordGreaterThan32: |
|
|
|
|
|
case IR::Opcode::FPOrdLessThanEqual32: |
|
|
|
|
|
case IR::Opcode::FPUnordLessThanEqual32: |
|
|
|
|
|
case IR::Opcode::FPOrdGreaterThanEqual32: |
|
|
|
|
|
case IR::Opcode::FPUnordGreaterThanEqual32: |
|
|
|
|
|
case IR::Opcode::ConvertF16F32: |
|
|
|
|
|
case IR::Opcode::ConvertF64F32: { |
|
|
|
|
|
const auto control{inst.Flags<IR::FpControl>()}; |
|
|
|
|
|
switch (control.fmz_mode) { |
|
|
|
|
|
case IR::FmzMode::DontCare: |
|
|
|
|
|
break; |
|
|
|
|
|
case IR::FmzMode::FTZ: |
|
|
|
|
|
case IR::FmzMode::FMZ: |
|
|
|
|
|
info.uses_fp32_denorms_flush = true; |
|
|
|
|
|
break; |
|
|
|
|
|
case IR::FmzMode::None: |
|
|
|
|
|
info.uses_fp32_denorms_preserve = true; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
switch (control.rounding) { |
|
|
|
|
|
case IR::FpRounding::DontCare: |
|
|
|
|
|
break; |
|
|
|
|
|
case IR::FpRounding::RN: |
|
|
|
|
|
info.uses_fp32_rounding_rte = true; |
|
|
|
|
|
break; |
|
|
|
|
|
case IR::FpRounding::RZ: |
|
|
|
|
|
info.uses_fp32_rounding_rtz = true; |
|
|
|
|
|
break; |
|
|
|
|
|
default: |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
... |
|
|
|
|
|
|
|
|
|
|
|
case IR::Opcode::FPAdd64: |
|
|
|
|
|
case IR::Opcode::FPCeil64: |
|
|
|
|
|
case IR::Opcode::FPFloor64: |
|
|
|
|
|
case IR::Opcode::FPFma64: |
|
|
|
|
|
case IR::Opcode::FPMax64: |
|
|
|
|
|
case IR::Opcode::FPMin64: |
|
|
|
|
|
case IR::Opcode::FPMul64: |
|
|
|
|
|
case IR::Opcode::FPNeg64: |
|
|
|
|
|
case IR::Opcode::FPRecip64: |
|
|
|
|
|
case IR::Opcode::FPRecipSqrt64: |
|
|
|
|
|
case IR::Opcode::FPRoundEven64: |
|
|
|
|
|
case IR::Opcode::FPSaturate64: |
|
|
|
|
|
case IR::Opcode::FPClamp64: |
|
|
|
|
|
case IR::Opcode::FPTrunc64: |
|
|
|
|
|
case IR::Opcode::FPOrdEqual64: |
|
|
|
|
|
case IR::Opcode::FPUnordEqual64: |
|
|
|
|
|
case IR::Opcode::FPOrdNotEqual64: |
|
|
|
|
|
case IR::Opcode::FPUnordNotEqual64: |
|
|
|
|
|
case IR::Opcode::FPOrdLessThan64: |
|
|
|
|
|
case IR::Opcode::FPUnordLessThan64: |
|
|
|
|
|
case IR::Opcode::FPOrdGreaterThan64: |
|
|
|
|
|
case IR::Opcode::FPUnordGreaterThan64: |
|
|
|
|
|
case IR::Opcode::FPOrdLessThanEqual64: |
|
|
|
|
|
case IR::Opcode::FPUnordLessThanEqual64: |
|
|
|
|
|
case IR::Opcode::FPOrdGreaterThanEqual64: |
|
|
|
|
|
case IR::Opcode::FPUnordGreaterThanEqual64: |
|
|
|
|
|
case IR::Opcode::FPIsNan64: |
|
|
|
|
|
case IR::Opcode::ConvertS16F64: |
|
|
|
|
|
case IR::Opcode::ConvertS32F64: |
|
|
|
|
|
case IR::Opcode::ConvertS64F64: |
|
|
|
|
|
case IR::Opcode::ConvertU16F64: |
|
|
|
|
|
case IR::Opcode::ConvertU32F64: |
|
|
|
|
|
case IR::Opcode::ConvertU64F64: |
|
|
|
|
|
case IR::Opcode::ConvertF32F64: |
|
|
|
|
|
case IR::Opcode::ConvertF64F32: |
|
|
|
|
|
case IR::Opcode::ConvertF64S8: |
|
|
|
|
|
case IR::Opcode::ConvertF64S16: |
|
|
|
|
|
case IR::Opcode::ConvertF64S32: |
|
|
|
|
|
case IR::Opcode::ConvertF64S64: |
|
|
|
|
|
case IR::Opcode::ConvertF64U8: |
|
|
|
|
|
case IR::Opcode::ConvertF64U16: |
|
|
|
|
|
case IR::Opcode::ConvertF64U32: |
|
|
|
|
|
case IR::Opcode::ConvertF64U64: |
|
|
|
|
|
info.uses_fp64 = true; |
|
|
|
|
|
{ |
|
|
|
|
|
const auto control{inst.Flags<IR::FpControl>()}; |
|
|
|
|
|
switch (control.rounding) { |
|
|
|
|
|
case IR::FpRounding::DontCare: |
|
|
|
|
|
break; |
|
|
|
|
|
case IR::FpRounding::RN: |
|
|
|
|
|
info.uses_fp64_rounding_rte = true; |
|
|
|
|
|
break; |
|
|
|
|
|
case IR::FpRounding::RZ: |
|
|
|
|
|
info.uses_fp64_rounding_rtz = true; |
|
|
|
|
|
break; |
|
|
|
|
|
default: |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case IR::Opcode::FPAdd32: |
|
|
case IR::Opcode::FPAdd32: |
|
|
case IR::Opcode::FPFma32: |
|
|
case IR::Opcode::FPFma32: |
|
|
case IR::Opcode::FPMul32: |
|
|
case IR::Opcode::FPMul32: |
|
|
|