private static string ReinterpretBoolToInt(string expr, IAstNode node, VariableType dstType) { string trueExpr = NumberFormatter.FormatInt(IrConsts.True, dstType); string falseExpr = NumberFormatter.FormatInt(IrConsts.False, dstType); expr = InstGenHelper.Enclose(expr, node, Instruction.ConditionalSelect, isLhs: false); return($"({expr} ? {trueExpr} : {falseExpr})"); }
private static string ReinterpretCast(string expr, IAstNode node, VariableType srcType, VariableType dstType) { if (srcType == dstType) { return(expr); } if (srcType == VariableType.F32) { switch (dstType) { case VariableType.Bool: return($"(floatBitsToInt({expr}) != 0)"); case VariableType.S32: return($"floatBitsToInt({expr})"); case VariableType.U32: return($"floatBitsToUint({expr})"); } } else if (dstType == VariableType.F32) { switch (srcType) { case VariableType.Bool: return($"intBitsToFloat({ReinterpretBoolToInt(expr, node, VariableType.S32)})"); case VariableType.S32: return($"intBitsToFloat({expr})"); case VariableType.U32: return($"uintBitsToFloat({expr})"); } } else if (srcType == VariableType.Bool) { return(ReinterpretBoolToInt(expr, node, dstType)); } else if (dstType == VariableType.Bool) { expr = InstGenHelper.Enclose(expr, node, Instruction.CompareNotEqual, isLhs: true); return($"({expr} != 0)"); } else if (dstType == VariableType.S32) { return($"int({expr})"); } else if (dstType == VariableType.U32) { return($"uint({expr})"); } throw new ArgumentException($"Invalid reinterpret cast from \"{srcType}\" to \"{dstType}\"."); }