Add conversion folding when the source is a constant.
This change adds unary conversion folding when the source is a constant. This fixes an ISV issue whereby: ``` const float16_t f = float16_t(42.0); ``` Wouldn't compile because the conversion operator would always produce an EvqTemporary when it could have produced an EvqConst. I've also added a test case that proves out that all basic-type to basic-type conversions work.
This commit is contained in:
parent
0e6c82ce93
commit
81a63f1de0
11 changed files with 1012 additions and 40 deletions
|
|
@ -670,6 +670,279 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType)
|
|||
break;
|
||||
}
|
||||
|
||||
case EOpConvInt8ToBool:
|
||||
newConstArray[i].setBConst(unionArray[i].getI8Const()); break;
|
||||
case EOpConvUint8ToBool:
|
||||
newConstArray[i].setBConst(unionArray[i].getU8Const()); break;
|
||||
case EOpConvInt16ToBool:
|
||||
newConstArray[i].setBConst(unionArray[i].getI16Const()); break;
|
||||
case EOpConvUint16ToBool:
|
||||
newConstArray[i].setBConst(unionArray[i].getU16Const()); break;
|
||||
case EOpConvIntToBool:
|
||||
newConstArray[i].setBConst(unionArray[i].getIConst()); break;
|
||||
case EOpConvUintToBool:
|
||||
newConstArray[i].setBConst(unionArray[i].getUConst()); break;
|
||||
case EOpConvInt64ToBool:
|
||||
newConstArray[i].setBConst(unionArray[i].getI64Const()); break;
|
||||
case EOpConvUint64ToBool:
|
||||
newConstArray[i].setBConst(unionArray[i].getI64Const()); break;
|
||||
case EOpConvFloat16ToBool:
|
||||
newConstArray[i].setBConst(unionArray[i].getDConst()); break;
|
||||
case EOpConvFloatToBool:
|
||||
newConstArray[i].setBConst(unionArray[i].getDConst()); break;
|
||||
case EOpConvDoubleToBool:
|
||||
newConstArray[i].setBConst(unionArray[i].getDConst()); break;
|
||||
|
||||
case EOpConvBoolToInt8:
|
||||
newConstArray[i].setI8Const(unionArray[i].getBConst()); break;
|
||||
case EOpConvBoolToUint8:
|
||||
newConstArray[i].setU8Const(unionArray[i].getBConst()); break;
|
||||
case EOpConvBoolToInt16:
|
||||
newConstArray[i].setI16Const(unionArray[i].getBConst()); break;
|
||||
case EOpConvBoolToUint16:
|
||||
newConstArray[i].setU16Const(unionArray[i].getBConst()); break;
|
||||
case EOpConvBoolToInt:
|
||||
newConstArray[i].setIConst(unionArray[i].getBConst()); break;
|
||||
case EOpConvBoolToUint:
|
||||
newConstArray[i].setUConst(unionArray[i].getBConst()); break;
|
||||
case EOpConvBoolToInt64:
|
||||
newConstArray[i].setI64Const(unionArray[i].getBConst()); break;
|
||||
case EOpConvBoolToUint64:
|
||||
newConstArray[i].setU64Const(unionArray[i].getBConst()); break;
|
||||
case EOpConvBoolToFloat16:
|
||||
newConstArray[i].setDConst(unionArray[i].getBConst()); break;
|
||||
case EOpConvBoolToFloat:
|
||||
newConstArray[i].setDConst(unionArray[i].getBConst()); break;
|
||||
case EOpConvBoolToDouble:
|
||||
newConstArray[i].setDConst(unionArray[i].getBConst()); break;
|
||||
|
||||
case EOpConvInt8ToInt16:
|
||||
newConstArray[i].setI16Const(unionArray[i].getI8Const()); break;
|
||||
case EOpConvInt8ToInt:
|
||||
newConstArray[i].setIConst(unionArray[i].getI8Const()); break;
|
||||
case EOpConvInt8ToInt64:
|
||||
newConstArray[i].setI64Const(unionArray[i].getI8Const()); break;
|
||||
case EOpConvInt8ToUint8:
|
||||
newConstArray[i].setU8Const(unionArray[i].getI8Const()); break;
|
||||
case EOpConvInt8ToUint16:
|
||||
newConstArray[i].setU16Const(unionArray[i].getI8Const()); break;
|
||||
case EOpConvInt8ToUint:
|
||||
newConstArray[i].setUConst(unionArray[i].getI8Const()); break;
|
||||
case EOpConvInt8ToUint64:
|
||||
newConstArray[i].setU64Const(unionArray[i].getI8Const()); break;
|
||||
case EOpConvUint8ToInt8:
|
||||
newConstArray[i].setI8Const(unionArray[i].getU8Const()); break;
|
||||
case EOpConvUint8ToInt16:
|
||||
newConstArray[i].setI16Const(unionArray[i].getU8Const()); break;
|
||||
case EOpConvUint8ToInt:
|
||||
newConstArray[i].setIConst(unionArray[i].getU8Const()); break;
|
||||
case EOpConvUint8ToInt64:
|
||||
newConstArray[i].setI64Const(unionArray[i].getU8Const()); break;
|
||||
case EOpConvUint8ToUint16:
|
||||
newConstArray[i].setU16Const(unionArray[i].getU8Const()); break;
|
||||
case EOpConvUint8ToUint:
|
||||
newConstArray[i].setUConst(unionArray[i].getU8Const()); break;
|
||||
case EOpConvUint8ToUint64:
|
||||
newConstArray[i].setU64Const(unionArray[i].getU8Const()); break;
|
||||
case EOpConvInt8ToFloat16:
|
||||
newConstArray[i].setDConst(unionArray[i].getI8Const()); break;
|
||||
case EOpConvInt8ToFloat:
|
||||
newConstArray[i].setDConst(unionArray[i].getI8Const()); break;
|
||||
case EOpConvInt8ToDouble:
|
||||
newConstArray[i].setDConst(unionArray[i].getI8Const()); break;
|
||||
case EOpConvUint8ToFloat16:
|
||||
newConstArray[i].setDConst(unionArray[i].getU8Const()); break;
|
||||
case EOpConvUint8ToFloat:
|
||||
newConstArray[i].setDConst(unionArray[i].getU8Const()); break;
|
||||
case EOpConvUint8ToDouble:
|
||||
newConstArray[i].setDConst(unionArray[i].getU8Const()); break;
|
||||
|
||||
case EOpConvInt16ToInt8:
|
||||
newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getI16Const())); break;
|
||||
case EOpConvInt16ToInt:
|
||||
newConstArray[i].setIConst(unionArray[i].getI16Const()); break;
|
||||
case EOpConvInt16ToInt64:
|
||||
newConstArray[i].setI64Const(unionArray[i].getI16Const()); break;
|
||||
case EOpConvInt16ToUint8:
|
||||
newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getI16Const())); break;
|
||||
case EOpConvInt16ToUint16:
|
||||
newConstArray[i].setU16Const(unionArray[i].getI16Const()); break;
|
||||
case EOpConvInt16ToUint:
|
||||
newConstArray[i].setUConst(unionArray[i].getI16Const()); break;
|
||||
case EOpConvInt16ToUint64:
|
||||
newConstArray[i].setU64Const(unionArray[i].getI16Const()); break;
|
||||
case EOpConvUint16ToInt8:
|
||||
newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getU16Const())); break;
|
||||
case EOpConvUint16ToInt16:
|
||||
newConstArray[i].setI16Const(unionArray[i].getU16Const()); break;
|
||||
case EOpConvUint16ToInt:
|
||||
newConstArray[i].setIConst(unionArray[i].getU16Const()); break;
|
||||
case EOpConvUint16ToInt64:
|
||||
newConstArray[i].setI64Const(unionArray[i].getU16Const()); break;
|
||||
case EOpConvUint16ToUint8:
|
||||
newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getU16Const())); break;
|
||||
|
||||
case EOpConvUint16ToUint:
|
||||
newConstArray[i].setUConst(unionArray[i].getU16Const()); break;
|
||||
case EOpConvUint16ToUint64:
|
||||
newConstArray[i].setU64Const(unionArray[i].getU16Const()); break;
|
||||
case EOpConvInt16ToFloat16:
|
||||
newConstArray[i].setDConst(unionArray[i].getI16Const()); break;
|
||||
case EOpConvInt16ToFloat:
|
||||
newConstArray[i].setDConst(unionArray[i].getI16Const()); break;
|
||||
case EOpConvInt16ToDouble:
|
||||
newConstArray[i].setDConst(unionArray[i].getI16Const()); break;
|
||||
case EOpConvUint16ToFloat16:
|
||||
newConstArray[i].setDConst(unionArray[i].getU16Const()); break;
|
||||
case EOpConvUint16ToFloat:
|
||||
newConstArray[i].setDConst(unionArray[i].getU16Const()); break;
|
||||
case EOpConvUint16ToDouble:
|
||||
newConstArray[i].setDConst(unionArray[i].getU16Const()); break;
|
||||
|
||||
case EOpConvIntToInt8:
|
||||
newConstArray[i].setI8Const(unionArray[i].getIConst()); break;
|
||||
case EOpConvIntToInt16:
|
||||
newConstArray[i].setI16Const(unionArray[i].getIConst()); break;
|
||||
case EOpConvIntToInt64:
|
||||
newConstArray[i].setI64Const(unionArray[i].getIConst()); break;
|
||||
case EOpConvIntToUint8:
|
||||
newConstArray[i].setU8Const(unionArray[i].getIConst()); break;
|
||||
case EOpConvIntToUint16:
|
||||
newConstArray[i].setU16Const(unionArray[i].getIConst()); break;
|
||||
case EOpConvIntToUint:
|
||||
newConstArray[i].setUConst(unionArray[i].getIConst()); break;
|
||||
case EOpConvIntToUint64:
|
||||
newConstArray[i].setU64Const(unionArray[i].getIConst()); break;
|
||||
|
||||
case EOpConvUintToInt8:
|
||||
newConstArray[i].setI8Const(unionArray[i].getUConst()); break;
|
||||
case EOpConvUintToInt16:
|
||||
newConstArray[i].setI16Const(unionArray[i].getUConst()); break;
|
||||
case EOpConvUintToInt:
|
||||
newConstArray[i].setIConst(unionArray[i].getUConst()); break;
|
||||
case EOpConvUintToInt64:
|
||||
newConstArray[i].setI64Const(unionArray[i].getUConst()); break;
|
||||
case EOpConvUintToUint8:
|
||||
newConstArray[i].setU8Const(unionArray[i].getUConst()); break;
|
||||
case EOpConvUintToUint16:
|
||||
newConstArray[i].setU16Const(unionArray[i].getUConst()); break;
|
||||
case EOpConvUintToUint64:
|
||||
newConstArray[i].setU64Const(unionArray[i].getUConst()); break;
|
||||
case EOpConvIntToFloat16:
|
||||
newConstArray[i].setDConst(unionArray[i].getIConst()); break;
|
||||
case EOpConvIntToFloat:
|
||||
newConstArray[i].setDConst(unionArray[i].getIConst()); break;
|
||||
case EOpConvIntToDouble:
|
||||
newConstArray[i].setDConst(unionArray[i].getIConst()); break;
|
||||
case EOpConvUintToFloat16:
|
||||
newConstArray[i].setDConst(unionArray[i].getUConst()); break;
|
||||
case EOpConvUintToFloat:
|
||||
newConstArray[i].setDConst(unionArray[i].getUConst()); break;
|
||||
case EOpConvUintToDouble:
|
||||
newConstArray[i].setDConst(unionArray[i].getUConst()); break;
|
||||
case EOpConvInt64ToInt8:
|
||||
newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getI64Const())); break;
|
||||
case EOpConvInt64ToInt16:
|
||||
newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getI64Const())); break;
|
||||
case EOpConvInt64ToInt:
|
||||
newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getI64Const())); break;
|
||||
case EOpConvInt64ToUint8:
|
||||
newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getI64Const())); break;
|
||||
case EOpConvInt64ToUint16:
|
||||
newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getI64Const())); break;
|
||||
case EOpConvInt64ToUint:
|
||||
newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getI64Const())); break;
|
||||
case EOpConvInt64ToUint64:
|
||||
newConstArray[i].setU64Const(unionArray[i].getI64Const()); break;
|
||||
case EOpConvUint64ToInt8:
|
||||
newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getU64Const())); break;
|
||||
case EOpConvUint64ToInt16:
|
||||
newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getU64Const())); break;
|
||||
case EOpConvUint64ToInt:
|
||||
newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getU64Const())); break;
|
||||
case EOpConvUint64ToInt64:
|
||||
newConstArray[i].setI64Const(unionArray[i].getU64Const()); break;
|
||||
case EOpConvUint64ToUint8:
|
||||
newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getU64Const())); break;
|
||||
case EOpConvUint64ToUint16:
|
||||
newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getU64Const())); break;
|
||||
case EOpConvUint64ToUint:
|
||||
newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getU64Const())); break;
|
||||
case EOpConvInt64ToFloat16:
|
||||
newConstArray[i].setDConst(static_cast<double>(unionArray[i].getI64Const())); break;
|
||||
case EOpConvInt64ToFloat:
|
||||
newConstArray[i].setDConst(static_cast<double>(unionArray[i].getI64Const())); break;
|
||||
case EOpConvInt64ToDouble:
|
||||
newConstArray[i].setDConst(static_cast<double>(unionArray[i].getI64Const())); break;
|
||||
case EOpConvUint64ToFloat16:
|
||||
newConstArray[i].setDConst(static_cast<double>(unionArray[i].getU64Const())); break;
|
||||
case EOpConvUint64ToFloat:
|
||||
newConstArray[i].setDConst(static_cast<double>(unionArray[i].getU64Const())); break;
|
||||
case EOpConvUint64ToDouble:
|
||||
newConstArray[i].setDConst(static_cast<double>(unionArray[i].getU64Const())); break;
|
||||
case EOpConvFloat16ToInt8:
|
||||
newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvFloat16ToInt16:
|
||||
newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvFloat16ToInt:
|
||||
newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvFloat16ToInt64:
|
||||
newConstArray[i].setI64Const(static_cast<int64_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvFloat16ToUint8:
|
||||
newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvFloat16ToUint16:
|
||||
newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvFloat16ToUint:
|
||||
newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvFloat16ToUint64:
|
||||
newConstArray[i].setU64Const(static_cast<uint64_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvFloat16ToFloat:
|
||||
newConstArray[i].setDConst(unionArray[i].getDConst()); break;
|
||||
case EOpConvFloat16ToDouble:
|
||||
newConstArray[i].setDConst(unionArray[i].getDConst()); break;
|
||||
case EOpConvFloatToInt8:
|
||||
newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvFloatToInt16:
|
||||
newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvFloatToInt:
|
||||
newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvFloatToInt64:
|
||||
newConstArray[i].setI64Const(static_cast<int64_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvFloatToUint8:
|
||||
newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvFloatToUint16:
|
||||
newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvFloatToUint:
|
||||
newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvFloatToUint64:
|
||||
newConstArray[i].setU64Const(static_cast<uint64_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvFloatToFloat16:
|
||||
newConstArray[i].setDConst(unionArray[i].getDConst()); break;
|
||||
case EOpConvFloatToDouble:
|
||||
newConstArray[i].setDConst(unionArray[i].getDConst()); break;
|
||||
case EOpConvDoubleToInt8:
|
||||
newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvDoubleToInt16:
|
||||
newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvDoubleToInt:
|
||||
newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvDoubleToInt64:
|
||||
newConstArray[i].setI64Const(static_cast<int64_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvDoubleToUint8:
|
||||
newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvDoubleToUint16:
|
||||
newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvDoubleToUint:
|
||||
newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvDoubleToUint64:
|
||||
newConstArray[i].setU64Const(static_cast<uint64_t>(unionArray[i].getDConst())); break;
|
||||
case EOpConvDoubleToFloat16:
|
||||
newConstArray[i].setDConst(unionArray[i].getDConst()); break;
|
||||
case EOpConvDoubleToFloat:
|
||||
newConstArray[i].setDConst(unionArray[i].getDConst()); break;
|
||||
|
||||
|
||||
|
||||
// TODO: 3.0 Functionality: unary constant folding: the rest of the ops have to be fleshed out
|
||||
|
||||
case EOpSinh:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue