diff --git a/src/jit/assertionprop.cpp b/src/jit/assertionprop.cpp index b0d54b7709ea..9dfac42e4028 100644 --- a/src/jit/assertionprop.cpp +++ b/src/jit/assertionprop.cpp @@ -1271,7 +1271,6 @@ AssertionIndex Compiler::optCreateAssertion(GenTreePtr op1, case TYP_UBYTE: case TYP_SHORT: case TYP_USHORT: - case TYP_CHAR: #ifdef _TARGET_64BIT_ case TYP_UINT: case TYP_INT: @@ -2236,7 +2235,6 @@ AssertionIndex Compiler::optAssertionIsSubrange(GenTreePtr tree, var_types toTyp case TYP_UBYTE: case TYP_SHORT: case TYP_USHORT: - case TYP_CHAR: if ((curAssertion->op2.u2.loBound < AssertionDsc::GetLowerBoundForIntegralType(toType)) || (curAssertion->op2.u2.hiBound > AssertionDsc::GetUpperBoundForIntegralType(toType))) { diff --git a/src/jit/codegenarm64.cpp b/src/jit/codegenarm64.cpp index 3ce9aba40849..974d2a9cd442 100644 --- a/src/jit/codegenarm64.cpp +++ b/src/jit/codegenarm64.cpp @@ -3749,7 +3749,7 @@ void CodeGen::genSIMDIntrinsic(GenTreeSIMD* simdNode) // NYI for unsupported base types if (simdNode->gtSIMDBaseType != TYP_INT && simdNode->gtSIMDBaseType != TYP_LONG && simdNode->gtSIMDBaseType != TYP_FLOAT && simdNode->gtSIMDBaseType != TYP_DOUBLE && - simdNode->gtSIMDBaseType != TYP_CHAR && simdNode->gtSIMDBaseType != TYP_UBYTE && + simdNode->gtSIMDBaseType != TYP_USHORT && simdNode->gtSIMDBaseType != TYP_UBYTE && simdNode->gtSIMDBaseType != TYP_SHORT && simdNode->gtSIMDBaseType != TYP_BYTE && simdNode->gtSIMDBaseType != TYP_UINT && simdNode->gtSIMDBaseType != TYP_ULONG) { @@ -3859,7 +3859,7 @@ insOpts CodeGen::genGetSimdInsOpt(bool is16B, var_types elementType) case TYP_INT: result = is16B ? INS_OPTS_4S : INS_OPTS_2S; break; - case TYP_CHAR: + case TYP_USHORT: case TYP_SHORT: result = is16B ? INS_OPTS_8H : INS_OPTS_4H; break; @@ -4329,7 +4329,7 @@ void CodeGen::genSIMDIntrinsicNarrow(GenTreeSIMD* simdNode) opt = INS_OPTS_4H; opt2 = INS_OPTS_8H; break; - case TYP_CHAR: + case TYP_USHORT: case TYP_SHORT: opt = INS_OPTS_8B; opt2 = INS_OPTS_16B; diff --git a/src/jit/codegenlegacy.cpp b/src/jit/codegenlegacy.cpp index 14e435a67572..d741a446e774 100644 --- a/src/jit/codegenlegacy.cpp +++ b/src/jit/codegenlegacy.cpp @@ -3999,7 +3999,7 @@ emitJumpKind CodeGen::genCondSetFlags(GenTreePtr cond) if (iVal & 0xffffff00) goto NO_TEST_FOR_AND; break; - case TYP_CHAR: + case TYP_USHORT: case TYP_SHORT: if (iVal & 0xffff0000) goto NO_TEST_FOR_AND; @@ -4317,7 +4317,7 @@ emitJumpKind CodeGen::genCondSetFlags(GenTreePtr cond) if (ival != (signed short)ival) smallOk = false; break; - case TYP_CHAR: + case TYP_USHORT: if (ival != (unsigned short)ival) smallOk = false; break; @@ -6724,7 +6724,7 @@ void CodeGen::genCodeForTreeSmpBinArithLogOp(GenTreePtr tree, regMaskTP destReg, andMask = 0x000000FF; break; case TYP_SHORT: - case TYP_CHAR: + case TYP_USHORT: andMask = 0x0000FFFF; break; default: @@ -6743,7 +6743,7 @@ void CodeGen::genCodeForTreeSmpBinArithLogOp(GenTreePtr tree, regMaskTP destReg, else // varTypeIsShort(typ) { assert(varTypeIsShort(typ)); - op1->gtType = TYP_CHAR; + op1->gtType = TYP_USHORT; } /* Generate the first operand into a scratch register */ @@ -10846,7 +10846,7 @@ void CodeGen::genCodeForNumericCast(GenTreePtr tree, regMaskTP destReg, regMaskT case TYP_BOOL: case TYP_BYTE: case TYP_SHORT: - case TYP_CHAR: + case TYP_USHORT: case TYP_UBYTE: break; @@ -10992,7 +10992,7 @@ void CodeGen::genCodeForNumericCast(GenTreePtr tree, regMaskTP destReg, regMaskT unsv = true; typeMask = ssize_t((int)0xFFFFFF00L); break; - case TYP_CHAR: + case TYP_USHORT: unsv = true; typeMask = ssize_t((int)0xFFFF0000L); break; @@ -11771,7 +11771,7 @@ void CodeGen::genCodeForTreeSmpOpAsg(GenTreePtr tree) case TYP_SHORT: mask = 0x0000FFFF; break; - case TYP_CHAR: + case TYP_USHORT: mask = 0x0000FFFF; break; default: @@ -14673,7 +14673,7 @@ void CodeGen::genCodeForTreeLng(GenTreePtr tree, regMaskTP needReg, regMaskTP av { case TYP_BOOL: case TYP_BYTE: - case TYP_CHAR: + case TYP_USHORT: case TYP_SHORT: case TYP_INT: case TYP_UBYTE: @@ -15733,7 +15733,7 @@ size_t CodeGen::genPushArgList(GenTreeCall* call) case TYP_BOOL: case TYP_BYTE: case TYP_SHORT: - case TYP_CHAR: + case TYP_USHORT: case TYP_UBYTE: /* Don't want to push a small value, make it a full word */ diff --git a/src/jit/codegenxarch.cpp b/src/jit/codegenxarch.cpp index df93834aba72..1c335221c070 100644 --- a/src/jit/codegenxarch.cpp +++ b/src/jit/codegenxarch.cpp @@ -6584,7 +6584,7 @@ void CodeGen::genIntToIntCast(GenTreePtr treeNode) typeMax = SHRT_MAX; break; - case TYP_CHAR: + case TYP_USHORT: typeMask = ssize_t((int)0xFFFF0000L); break; diff --git a/src/jit/compiler.h b/src/jit/compiler.h index 5b47689fe9f7..75b45b4dc2ec 100644 --- a/src/jit/compiler.h +++ b/src/jit/compiler.h @@ -5977,7 +5977,6 @@ class Compiler return INT_MIN; case TYP_BOOL: case TYP_UBYTE: - case TYP_CHAR: case TYP_USHORT: case TYP_UINT: return 0; @@ -5999,7 +5998,6 @@ class Compiler return INT_MAX; case TYP_UBYTE: return UCHAR_MAX; - case TYP_CHAR: case TYP_USHORT: return USHRT_MAX; case TYP_UINT: @@ -7452,8 +7450,6 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX return SIMDDoubleHandle; case TYP_INT: return SIMDIntHandle; - case TYP_CHAR: - return SIMDUShortHandle; case TYP_USHORT: return SIMDUShortHandle; case TYP_UBYTE: diff --git a/src/jit/compiler.hpp b/src/jit/compiler.hpp index bb3fa30151c1..23407805314c 100644 --- a/src/jit/compiler.hpp +++ b/src/jit/compiler.hpp @@ -538,7 +538,6 @@ inline bool genTypeCanRepresentValue(var_types type, TValue value) case TYP_BYTE: return FitsIn(value); case TYP_USHORT: - case TYP_CHAR: return FitsIn(value); case TYP_SHORT: return FitsIn(value); @@ -626,7 +625,7 @@ inline var_types genUnsignedType(var_types type) type = TYP_UBYTE; break; case TYP_SHORT: - type = TYP_CHAR; + type = TYP_USHORT; break; case TYP_INT: type = TYP_UINT; diff --git a/src/jit/ee_il_dll.hpp b/src/jit/ee_il_dll.hpp index 0565d6f56161..ce602ba24570 100644 --- a/src/jit/ee_il_dll.hpp +++ b/src/jit/ee_il_dll.hpp @@ -138,11 +138,11 @@ inline var_types JITtype2varType(CorInfoType type) TYP_UNDEF, // CORINFO_TYPE_UNDEF = 0x0, TYP_VOID, // CORINFO_TYPE_VOID = 0x1, TYP_BOOL, // CORINFO_TYPE_BOOL = 0x2, - TYP_CHAR, // CORINFO_TYPE_CHAR = 0x3, + TYP_USHORT, // CORINFO_TYPE_CHAR = 0x3, TYP_BYTE, // CORINFO_TYPE_BYTE = 0x4, TYP_UBYTE, // CORINFO_TYPE_UBYTE = 0x5, TYP_SHORT, // CORINFO_TYPE_SHORT = 0x6, - TYP_CHAR, // CORINFO_TYPE_USHORT = 0x7, + TYP_USHORT, // CORINFO_TYPE_USHORT = 0x7, TYP_INT, // CORINFO_TYPE_INT = 0x8, TYP_INT, // CORINFO_TYPE_UINT = 0x9, TYP_LONG, // CORINFO_TYPE_LONG = 0xa, diff --git a/src/jit/gentree.cpp b/src/jit/gentree.cpp index e418723831bf..5efecc883b62 100644 --- a/src/jit/gentree.cpp +++ b/src/jit/gentree.cpp @@ -13767,7 +13767,7 @@ GenTreePtr Compiler::gtFoldExprConst(GenTreePtr tree) i1 = itemp; goto CNS_INT; - case TYP_CHAR: + case TYP_USHORT: itemp = INT32(UINT16(i1)); if (tree->gtOverflow()) { @@ -13892,7 +13892,7 @@ GenTreePtr Compiler::gtFoldExprConst(GenTreePtr tree) i1 = INT32(INT16(lval1)); goto CHECK_INT_OVERFLOW; - case TYP_CHAR: + case TYP_USHORT: i1 = INT32(UINT16(lval1)); goto CHECK_UINT_OVERFLOW; @@ -14036,7 +14036,7 @@ GenTreePtr Compiler::gtFoldExprConst(GenTreePtr tree) i1 = INT32(INT16(d1)); goto CNS_INT; - case TYP_CHAR: + case TYP_USHORT: i1 = INT32(UINT16(d1)); goto CNS_INT; diff --git a/src/jit/hwintrinsiccodegenxarch.cpp b/src/jit/hwintrinsiccodegenxarch.cpp index 52c06191df73..66dbfc9c403a 100644 --- a/src/jit/hwintrinsiccodegenxarch.cpp +++ b/src/jit/hwintrinsiccodegenxarch.cpp @@ -149,7 +149,6 @@ void CodeGen::genSSE2Intrinsic(GenTreeHWIntrinsic* node) case TYP_UBYTE: ins = INS_paddb; break; - case TYP_CHAR: case TYP_SHORT: case TYP_USHORT: ins = INS_paddw; @@ -206,7 +205,7 @@ void CodeGen::genSSE42Intrinsic(GenTreeHWIntrinsic* node) inst_RV_RV(INS_mov, targetReg, op1Reg, targetType, emitTypeSize(targetType)); } - if (baseType == TYP_UBYTE || baseType == TYP_CHAR) // baseType is the type of the second argument + if (baseType == TYP_UBYTE || baseType == TYP_USHORT) // baseType is the type of the second argument { assert(targetType == TYP_INT); inst_RV_RV(INS_crc32, targetReg, op2Reg, baseType, emitTypeSize(baseType)); @@ -307,7 +306,6 @@ void CodeGen::genAVX2Intrinsic(GenTreeHWIntrinsic* node) case TYP_UBYTE: ins = INS_paddb; break; - case TYP_CHAR: case TYP_SHORT: case TYP_USHORT: ins = INS_paddw; diff --git a/src/jit/hwintrinsicxarch.cpp b/src/jit/hwintrinsicxarch.cpp index d76ce77a2fe2..e406d8868768 100644 --- a/src/jit/hwintrinsicxarch.cpp +++ b/src/jit/hwintrinsicxarch.cpp @@ -264,7 +264,6 @@ CORINFO_CLASS_HANDLE Compiler::gtGetStructHandleForHWSIMD(var_types simdType, va return Vector128DoubleHandle; case TYP_INT: return Vector128IntHandle; - case TYP_CHAR: case TYP_USHORT: return Vector128UShortHandle; case TYP_UBYTE: @@ -293,7 +292,6 @@ CORINFO_CLASS_HANDLE Compiler::gtGetStructHandleForHWSIMD(var_types simdType, va return Vector256DoubleHandle; case TYP_INT: return Vector256IntHandle; - case TYP_CHAR: case TYP_USHORT: return Vector256UShortHandle; case TYP_UBYTE: diff --git a/src/jit/importer.cpp b/src/jit/importer.cpp index 479384ba7729..521d589eb013 100644 --- a/src/jit/importer.cpp +++ b/src/jit/importer.cpp @@ -3552,7 +3552,7 @@ GenTree* Compiler::impIntrinsic(GenTree* newobjThis, case CORINFO_INTRINSIC_StringGetChar: op2 = impPopStack().val; op1 = impPopStack().val; - op1 = gtNewIndexRef(TYP_CHAR, op1, op2); + op1 = gtNewIndexRef(TYP_USHORT, op1, op2); op1->gtFlags |= GTF_INX_STRING_LAYOUT; retNode = op1; break; @@ -6373,7 +6373,6 @@ GenTreePtr Compiler::impImportStaticReadOnlyField(void* fldAddr, var_types lclTy ival = *((short*)fldAddr); goto IVAL_COMMON; - case TYP_CHAR: case TYP_USHORT: ival = *((unsigned short*)fldAddr); goto IVAL_COMMON; @@ -11208,7 +11207,7 @@ void Compiler::impImportBlockCode(BasicBlock* block) lclTyp = TYP_UBYTE; goto ARR_LD; case CEE_LDELEM_U2: - lclTyp = TYP_CHAR; + lclTyp = TYP_USHORT; goto ARR_LD; ARR_LD: @@ -12230,7 +12229,7 @@ void Compiler::impImportBlockCode(BasicBlock* block) lclTyp = TYP_UBYTE; goto CONV_OVF; case CEE_CONV_OVF_U2: - lclTyp = TYP_CHAR; + lclTyp = TYP_USHORT; goto CONV_OVF; case CEE_CONV_OVF_U: lclTyp = TYP_U_IMPL; @@ -12262,7 +12261,7 @@ void Compiler::impImportBlockCode(BasicBlock* block) lclTyp = TYP_UBYTE; goto CONV_OVF_UN; case CEE_CONV_OVF_U2_UN: - lclTyp = TYP_CHAR; + lclTyp = TYP_USHORT; goto CONV_OVF_UN; case CEE_CONV_OVF_U_UN: lclTyp = TYP_U_IMPL; @@ -12305,7 +12304,7 @@ void Compiler::impImportBlockCode(BasicBlock* block) lclTyp = TYP_UBYTE; goto CONV; case CEE_CONV_U2: - lclTyp = TYP_CHAR; + lclTyp = TYP_USHORT; goto CONV; #if (REGSIZE_BYTES == 8) case CEE_CONV_U: @@ -12419,7 +12418,7 @@ void Compiler::impImportBlockCode(BasicBlock* block) mask = 0x00FF; umask = 0x007F; break; - case TYP_CHAR: + case TYP_USHORT: case TYP_SHORT: mask = 0xFFFF; umask = 0x7FFF; @@ -12754,7 +12753,7 @@ void Compiler::impImportBlockCode(BasicBlock* block) lclTyp = TYP_UBYTE; goto LDIND; case CEE_LDIND_U2: - lclTyp = TYP_CHAR; + lclTyp = TYP_USHORT; goto LDIND; LDIND: diff --git a/src/jit/lower.cpp b/src/jit/lower.cpp index 15049c920a06..108080728565 100644 --- a/src/jit/lower.cpp +++ b/src/jit/lower.cpp @@ -2799,8 +2799,8 @@ GenTree* Lowering::OptimizeConstCompare(GenTree* cmp) } else if (FitsIn(mask) && genTypeSize(andOp1) == 2) { - andOp1->gtType = TYP_CHAR; - andOp2->gtType = TYP_CHAR; + andOp1->gtType = TYP_USHORT; + andOp2->gtType = TYP_USHORT; } } #endif @@ -5699,7 +5699,7 @@ void Lowering::getCastDescription(GenTreePtr treeNode, CastInfo* castInfo) typeMax = SHRT_MAX; break; - case TYP_CHAR: + case TYP_USHORT: typeMask = ssize_t((int)0xFFFF0000L); break; diff --git a/src/jit/optimizer.cpp b/src/jit/optimizer.cpp index 54ab3b5560af..a4516e511ffa 100644 --- a/src/jit/optimizer.cpp +++ b/src/jit/optimizer.cpp @@ -2980,7 +2980,7 @@ bool jitIterSmallOverflow(int iterAtExit, var_types incrType) case TYP_SHORT: type_MAX = SHRT_MAX; break; - case TYP_CHAR: + case TYP_USHORT: type_MAX = USHRT_MAX; break; @@ -3021,7 +3021,7 @@ bool jitIterSmallUnderflow(int iterAtExit, var_types decrType) case TYP_UBYTE: type_MIN = 0; break; - case TYP_CHAR: + case TYP_USHORT: type_MIN = 0; break; @@ -3094,7 +3094,7 @@ bool Compiler::optComputeLoopRep(int constInit, case TYP_SHORT: INIT_ITER_BY_TYPE(signed short); break; - case TYP_CHAR: + case TYP_USHORT: INIT_ITER_BY_TYPE(unsigned short); break; @@ -5656,7 +5656,7 @@ bool Compiler::optNarrowTree(GenTreePtr tree, var_types srct, var_types dstt, Va case TYP_SHORT: lmask = 0x00007FFF; break; - case TYP_CHAR: + case TYP_USHORT: lmask = 0x0000FFFF; break; case TYP_INT: @@ -5706,7 +5706,7 @@ bool Compiler::optNarrowTree(GenTreePtr tree, var_types srct, var_types dstt, Va case TYP_SHORT: imask = 0x00007FFF; break; - case TYP_CHAR: + case TYP_USHORT: imask = 0x0000FFFF; break; #ifdef _TARGET_64BIT_ diff --git a/src/jit/regalloc.cpp b/src/jit/regalloc.cpp index 399962c2e876..f23e491b7825 100644 --- a/src/jit/regalloc.cpp +++ b/src/jit/regalloc.cpp @@ -370,7 +370,6 @@ inline regMaskTP Compiler::genReturnRegForTree(GenTreePtr tree) RBM_ILLEGAL, // TYP_UNDEF, RBM_NONE, // TYP_VOID, RBM_INTRET, // TYP_BOOL, - RBM_INTRET, // TYP_CHAR, RBM_INTRET, // TYP_BYTE, RBM_INTRET, // TYP_UBYTE, RBM_INTRET, // TYP_SHORT, @@ -1131,7 +1130,7 @@ regMaskTP Compiler::rpPredictRegPick(var_types type, rpPredictReg predictReg, re case TYP_BYTE: case TYP_UBYTE: case TYP_SHORT: - case TYP_CHAR: + case TYP_USHORT: case TYP_INT: case TYP_UINT: case TYP_REF: diff --git a/src/jit/registerfp.cpp b/src/jit/registerfp.cpp index 6342ba18a726..34343646afc2 100644 --- a/src/jit/registerfp.cpp +++ b/src/jit/registerfp.cpp @@ -1248,7 +1248,7 @@ void CodeGen::genCodeForTreeCastToFloat(GenTreePtr tree, RegSet::RegisterPrefere case TYP_BOOL: case TYP_BYTE: case TYP_UBYTE: - case TYP_CHAR: + case TYP_USHORT: case TYP_SHORT: // load it into a register genCodeForTree(op1, 0); diff --git a/src/jit/simd.cpp b/src/jit/simd.cpp index 601997205025..02b81ab9980a 100644 --- a/src/jit/simd.cpp +++ b/src/jit/simd.cpp @@ -175,7 +175,7 @@ var_types Compiler::getBaseTypeAndSizeOfSIMDType(CORINFO_CLASS_HANDLE typeHnd, u } else if (typeHnd == SIMDUShortHandle) { - simdBaseType = TYP_CHAR; + simdBaseType = TYP_USHORT; JITDUMP(" Known type SIMD Vector\n"); } else if (typeHnd == SIMDUByteHandle) @@ -247,7 +247,7 @@ var_types Compiler::getBaseTypeAndSizeOfSIMDType(CORINFO_CLASS_HANDLE typeHnd, u else if (wcsncmp(&(className[25]), W("System.UInt16"), 13) == 0) { SIMDUShortHandle = typeHnd; - simdBaseType = TYP_CHAR; + simdBaseType = TYP_USHORT; JITDUMP(" Found type SIMD Vector\n"); } else if (wcsncmp(&(className[25]), W("System.Byte"), 11) == 0) @@ -383,7 +383,7 @@ var_types Compiler::getBaseTypeAndSizeOfSIMDType(CORINFO_CLASS_HANDLE typeHnd, u } else if (typeHnd == Vector256UShortHandle) { - simdBaseType = TYP_CHAR; // TODO TYP_USHORT; + simdBaseType = TYP_USHORT; size = YMM_REGSIZE_BYTES; JITDUMP(" Known type Vector256\n"); } @@ -443,7 +443,7 @@ var_types Compiler::getBaseTypeAndSizeOfSIMDType(CORINFO_CLASS_HANDLE typeHnd, u } else if (typeHnd == Vector128UShortHandle) { - simdBaseType = TYP_CHAR; // TODO TYP_USHORT; + simdBaseType = TYP_USHORT; size = XMM_REGSIZE_BYTES; JITDUMP(" Known type Vector128\n"); } @@ -518,7 +518,7 @@ var_types Compiler::getBaseTypeAndSizeOfSIMDType(CORINFO_CLASS_HANDLE typeHnd, u break; case CORINFO_TYPE_USHORT: Vector256UShortHandle = typeHnd; - simdBaseType = TYP_CHAR; // TODO TYP_USHORT; + simdBaseType = TYP_USHORT; JITDUMP(" Found type Hardware Intrinsic SIMD Vector256\n"); break; case CORINFO_TYPE_LONG: @@ -578,7 +578,7 @@ var_types Compiler::getBaseTypeAndSizeOfSIMDType(CORINFO_CLASS_HANDLE typeHnd, u break; case CORINFO_TYPE_USHORT: Vector128UShortHandle = typeHnd; - simdBaseType = TYP_CHAR; // TODO TYP_USHORT; + simdBaseType = TYP_USHORT; JITDUMP(" Found type Hardware Intrinsic SIMD Vector128\n"); break; case CORINFO_TYPE_LONG: @@ -1355,7 +1355,7 @@ SIMDIntrinsicID Compiler::impSIMDRelOp(SIMDIntrinsicID relOpIntrinsicId, constVal = 0x80808080; *inOutBaseType = TYP_BYTE; break; - case TYP_CHAR: + case TYP_USHORT: constVal = 0x80008000; *inOutBaseType = TYP_SHORT; break; @@ -1558,7 +1558,7 @@ GenTreePtr Compiler::impSIMDAbs(CORINFO_CLASS_HANDLE typeHnd, var_types baseType GenTree* bitMaskVector = gtNewSIMDNode(simdType, bitMask, SIMDIntrinsicInit, baseType, size); retVal = gtNewSIMDNode(simdType, op1, bitMaskVector, SIMDIntrinsicBitwiseAnd, baseType, size); } - else if (baseType == TYP_CHAR || baseType == TYP_UBYTE || baseType == TYP_UINT || baseType == TYP_ULONG) + else if (baseType == TYP_USHORT || baseType == TYP_UBYTE || baseType == TYP_UINT || baseType == TYP_ULONG) { // Abs is a no-op on unsigned integer type vectors retVal = op1; @@ -1700,19 +1700,19 @@ GenTreePtr Compiler::impSIMDMinMax(SIMDIntrinsicID intrinsicId, if (varTypeIsFloating(baseType) || baseType == TYP_SHORT || baseType == TYP_UBYTE || (getSIMDSupportLevel() >= SIMD_SSE4_Supported && - (baseType == TYP_BYTE || baseType == TYP_INT || baseType == TYP_UINT || baseType == TYP_CHAR))) + (baseType == TYP_BYTE || baseType == TYP_INT || baseType == TYP_UINT || baseType == TYP_USHORT))) { // SSE2 or SSE4.1 has direct support simdTree = gtNewSIMDNode(simdType, op1, op2, intrinsicId, baseType, size); } - else if (baseType == TYP_CHAR || baseType == TYP_BYTE) + else if (baseType == TYP_USHORT || baseType == TYP_BYTE) { assert(getSIMDSupportLevel() == SIMD_SSE2_Supported); int constVal; SIMDIntrinsicID operIntrinsic; SIMDIntrinsicID adjustIntrinsic; var_types minMaxOperBaseType; - if (baseType == TYP_CHAR) + if (baseType == TYP_USHORT) { constVal = 0x80008000; operIntrinsic = SIMDIntrinsicSub; @@ -2410,7 +2410,7 @@ GenTreePtr Compiler::impSIMDIntrinsic(OPCODE opcode, } else { - assert(baseType == TYP_UBYTE || baseType == TYP_CHAR); + assert(baseType == TYP_UBYTE || baseType == TYP_USHORT); t1 = gtNewCastNode(TYP_INT, op2, TYP_INT); } diff --git a/src/jit/simdcodegenxarch.cpp b/src/jit/simdcodegenxarch.cpp index b21410360a5e..8048854a877c 100644 --- a/src/jit/simdcodegenxarch.cpp +++ b/src/jit/simdcodegenxarch.cpp @@ -84,7 +84,7 @@ instruction CodeGen::getOpForSIMDIntrinsic(SIMDIntrinsicID intrinsicId, var_type case TYP_INT: result = INS_vpbroadcastd; break; - case TYP_CHAR: + case TYP_USHORT: case TYP_SHORT: result = INS_vpbroadcastw; break; @@ -151,7 +151,7 @@ instruction CodeGen::getOpForSIMDIntrinsic(SIMDIntrinsicID intrinsicId, var_type { result = INS_paddd; } - else if (baseType == TYP_CHAR || baseType == TYP_SHORT) + else if (baseType == TYP_USHORT || baseType == TYP_SHORT) { result = INS_paddw; } @@ -178,7 +178,7 @@ instruction CodeGen::getOpForSIMDIntrinsic(SIMDIntrinsicID intrinsicId, var_type { result = INS_psubd; } - else if (baseType == TYP_CHAR || baseType == TYP_SHORT) + else if (baseType == TYP_USHORT || baseType == TYP_SHORT) { result = INS_psubw; } @@ -249,7 +249,7 @@ instruction CodeGen::getOpForSIMDIntrinsic(SIMDIntrinsicID intrinsicId, var_type { result = INS_pminsb; } - else if (baseType == TYP_CHAR) + else if (baseType == TYP_USHORT) { result = INS_pminuw; } @@ -291,7 +291,7 @@ instruction CodeGen::getOpForSIMDIntrinsic(SIMDIntrinsicID intrinsicId, var_type { result = INS_pmaxsb; } - else if (baseType == TYP_CHAR) + else if (baseType == TYP_USHORT) { result = INS_pmaxuw; } @@ -345,7 +345,7 @@ instruction CodeGen::getOpForSIMDIntrinsic(SIMDIntrinsicID intrinsicId, var_type { result = INS_pcmpeqd; } - else if (baseType == TYP_CHAR || baseType == TYP_SHORT) + else if (baseType == TYP_USHORT || baseType == TYP_SHORT) { result = INS_pcmpeqw; } @@ -525,7 +525,7 @@ instruction CodeGen::getOpForSIMDIntrinsic(SIMDIntrinsicID intrinsicId, var_type } break; case TYP_SHORT: - case TYP_CHAR: + case TYP_USHORT: result = INS_packuswb; break; default: @@ -548,7 +548,7 @@ instruction CodeGen::getOpForSIMDIntrinsic(SIMDIntrinsicID intrinsicId, var_type result = INS_punpckldq; break; case TYP_SHORT: - case TYP_CHAR: + case TYP_USHORT: result = INS_punpcklwd; break; case TYP_BYTE: @@ -574,7 +574,7 @@ instruction CodeGen::getOpForSIMDIntrinsic(SIMDIntrinsicID intrinsicId, var_type result = INS_punpckhdq; break; case TYP_SHORT: - case TYP_CHAR: + case TYP_USHORT: result = INS_punpckhwd; break; case TYP_BYTE: @@ -600,7 +600,6 @@ instruction CodeGen::getOpForSIMDIntrinsic(SIMDIntrinsicID intrinsicId, var_type result = INS_pslld; break; case TYP_SHORT: - case TYP_CHAR: case TYP_USHORT: result = INS_psllw; break; @@ -623,7 +622,6 @@ instruction CodeGen::getOpForSIMDIntrinsic(SIMDIntrinsicID intrinsicId, var_type result = INS_psrld; break; case TYP_SHORT: - case TYP_CHAR: case TYP_USHORT: result = INS_psrlw; break; @@ -3116,7 +3114,7 @@ void CodeGen::genSIMDIntrinsic(GenTreeSIMD* simdNode) // NYI for unsupported base types if (simdNode->gtSIMDBaseType != TYP_INT && simdNode->gtSIMDBaseType != TYP_LONG && simdNode->gtSIMDBaseType != TYP_FLOAT && simdNode->gtSIMDBaseType != TYP_DOUBLE && - simdNode->gtSIMDBaseType != TYP_CHAR && simdNode->gtSIMDBaseType != TYP_UBYTE && + simdNode->gtSIMDBaseType != TYP_USHORT && simdNode->gtSIMDBaseType != TYP_UBYTE && simdNode->gtSIMDBaseType != TYP_SHORT && simdNode->gtSIMDBaseType != TYP_BYTE && simdNode->gtSIMDBaseType != TYP_UINT && simdNode->gtSIMDBaseType != TYP_ULONG) { diff --git a/src/jit/simdintrinsiclist.h b/src/jit/simdintrinsiclist.h index 2b59ec9058b6..56b298913e9a 100644 --- a/src/jit/simdintrinsiclist.h +++ b/src/jit/simdintrinsiclist.h @@ -39,18 +39,18 @@ ***************************************************************************************************************************************************************************************************************************/ SIMD_INTRINSIC(nullptr, false, None, "None", TYP_UNDEF, 0, {TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}, {TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) -SIMD_INTRINSIC("get_Count", false, GetCount, "count", TYP_INT, 0, {TYP_VOID, TYP_UNDEF, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) -SIMD_INTRINSIC("get_One", false, GetOne, "one", TYP_STRUCT, 0, {TYP_VOID, TYP_UNDEF, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) -SIMD_INTRINSIC("get_Zero", false, GetZero, "zero", TYP_STRUCT, 0, {TYP_VOID, TYP_UNDEF, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) -SIMD_INTRINSIC("get_AllOnes", false, GetAllOnes, "allOnes", TYP_STRUCT, 0, {TYP_VOID, TYP_UNDEF, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("get_Count", false, GetCount, "count", TYP_INT, 0, {TYP_VOID, TYP_UNDEF, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("get_One", false, GetOne, "one", TYP_STRUCT, 0, {TYP_VOID, TYP_UNDEF, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("get_Zero", false, GetZero, "zero", TYP_STRUCT, 0, {TYP_VOID, TYP_UNDEF, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("get_AllOnes", false, GetAllOnes, "allOnes", TYP_STRUCT, 0, {TYP_VOID, TYP_UNDEF, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) // .ctor call or newobj - there are four forms. // This form takes the object plus a value of the base (element) type: -SIMD_INTRINSIC(".ctor", true, Init, "init", TYP_VOID, 2, {TYP_BYREF, TYP_UNKNOWN, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC(".ctor", true, Init, "init", TYP_VOID, 2, {TYP_BYREF, TYP_UNKNOWN, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) // This form takes the object plus an array of the base (element) type: -SIMD_INTRINSIC(".ctor", true, InitArray, "initArray", TYP_VOID, 2, {TYP_BYREF, TYP_REF, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC(".ctor", true, InitArray, "initArray", TYP_VOID, 2, {TYP_BYREF, TYP_REF, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) // This form takes the object, an array of the base (element) type, and an index into the array: -SIMD_INTRINSIC(".ctor", true, InitArrayX, "initArray", TYP_VOID, 3, {TYP_BYREF, TYP_REF, TYP_INT }, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC(".ctor", true, InitArrayX, "initArray", TYP_VOID, 3, {TYP_BYREF, TYP_REF, TYP_INT }, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) // This form takes the object, and N values of the base (element) type. The actual number of arguments depends upon the Vector size, which must be a fixed type such as Vector2f/3f/4f // Right now this intrinsic is supported only on fixed float vectors and hence the supported base types lists only TYP_FLOAT. // This is currently the intrinsic that has the largest maximum number of operands - if we add new fixed vector types @@ -60,11 +60,11 @@ SIMD_INTRINSIC(".ctor", true, InitN, SIMD_INTRINSIC(".ctor", true, InitFixed, "initFixed", TYP_VOID, 3, {TYP_BYREF, TYP_STRUCT, TYP_UNKNOWN}, {TYP_FLOAT, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) // Copy vector to an array -SIMD_INTRINSIC("CopyTo", true, CopyToArray, "CopyToArray", TYP_VOID, 2, {TYP_BYREF, TYP_REF, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) -SIMD_INTRINSIC("CopyTo", true, CopyToArrayX, "CopyToArray", TYP_VOID, 3, {TYP_BYREF, TYP_REF, TYP_INT }, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("CopyTo", true, CopyToArray, "CopyToArray", TYP_VOID, 2, {TYP_BYREF, TYP_REF, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("CopyTo", true, CopyToArrayX, "CopyToArray", TYP_VOID, 3, {TYP_BYREF, TYP_REF, TYP_INT }, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) // Get operations -SIMD_INTRINSIC("get_Item", true, GetItem, "get[i]", TYP_UNKNOWN, 2, {TYP_BYREF, TYP_INT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("get_Item", true, GetItem, "get[i]", TYP_UNKNOWN, 2, {TYP_BYREF, TYP_INT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) SIMD_INTRINSIC("get_X", true, GetX, "getX", TYP_UNKNOWN, 1, {TYP_BYREF, TYP_UNDEF, TYP_UNDEF}, {TYP_FLOAT, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) SIMD_INTRINSIC("get_Y", true, GetY, "getY", TYP_UNKNOWN, 1, {TYP_BYREF, TYP_UNDEF, TYP_UNDEF}, {TYP_FLOAT, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) SIMD_INTRINSIC("get_Z", true, GetZ, "getZ", TYP_UNKNOWN, 1, {TYP_BYREF, TYP_UNDEF, TYP_UNDEF}, {TYP_FLOAT, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) @@ -77,21 +77,21 @@ SIMD_INTRINSIC("set_Z", true, SetZ, SIMD_INTRINSIC("set_W", true, SetW, "setW", TYP_VOID, 2, {TYP_BYREF, TYP_UNKNOWN, TYP_UNDEF}, {TYP_FLOAT, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) // Object.Equals() -SIMD_INTRINSIC("Equals", true, InstEquals, "equals", TYP_BOOL, 2, {TYP_BYREF, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("Equals", true, InstEquals, "equals", TYP_BOOL, 2, {TYP_BYREF, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) // Operator == and != -SIMD_INTRINSIC("op_Equality", false, OpEquality, "==", TYP_BOOL, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) -SIMD_INTRINSIC("op_Inequality", false, OpInEquality, "!=", TYP_BOOL, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("op_Equality", false, OpEquality, "==", TYP_BOOL, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("op_Inequality", false, OpInEquality, "!=", TYP_BOOL, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) // Arithmetic Operations -SIMD_INTRINSIC("op_Addition", false, Add, "+", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) -SIMD_INTRINSIC("op_Subtraction", false, Sub, "-", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("op_Addition", false, Add, "+", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("op_Subtraction", false, Sub, "-", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) #if defined(_TARGET_XARCH_) SIMD_INTRINSIC("op_Multiply", false, Mul, "*", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_SHORT,TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) #elif defined(_TARGET_ARM64_) // TODO-ARM64-CQ Investigate code sequence to accelerate LONG/ULONG vector multiply -SIMD_INTRINSIC("op_Multiply", false, Mul, "*", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_UNDEF, TYP_UNDEF}) +SIMD_INTRINSIC("op_Multiply", false, Mul, "*", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_UNDEF, TYP_UNDEF}) #endif SIMD_INTRINSIC("op_Division", false, Div, "/", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_FLOAT, TYP_DOUBLE, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) @@ -99,22 +99,22 @@ SIMD_INTRINSIC("op_Division", false, Div, // SquareRoot is recognized as an intrinsic only for float or double vectors SIMD_INTRINSIC("SquareRoot", false, Sqrt, "sqrt", TYP_STRUCT, 1, {TYP_STRUCT, TYP_UNDEF, TYP_UNDEF}, {TYP_FLOAT, TYP_DOUBLE, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) -SIMD_INTRINSIC("Min", false, Min, "min", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) -SIMD_INTRINSIC("Max", false, Max, "max", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) -SIMD_INTRINSIC("Abs", false, Abs, "abs", TYP_STRUCT, 1, {TYP_STRUCT, TYP_UNDEF, TYP_UNDEF }, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("Min", false, Min, "min", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("Max", false, Max, "max", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("Abs", false, Abs, "abs", TYP_STRUCT, 1, {TYP_STRUCT, TYP_UNDEF, TYP_UNDEF }, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) // Vector Relational operators -SIMD_INTRINSIC("Equals", false, Equal, "eq", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) -SIMD_INTRINSIC("LessThan", false, LessThan, "lt", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) -SIMD_INTRINSIC("LessThanOrEqual", false, LessThanOrEqual, "le", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) -SIMD_INTRINSIC("GreaterThan", false, GreaterThan, "gt", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) -SIMD_INTRINSIC("GreaterThanOrEqual", false, GreaterThanOrEqual, "ge", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("Equals", false, Equal, "eq", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("LessThan", false, LessThan, "lt", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("LessThanOrEqual", false, LessThanOrEqual, "le", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("GreaterThan", false, GreaterThan, "gt", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("GreaterThanOrEqual", false, GreaterThanOrEqual, "ge", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) // Bitwise operations -SIMD_INTRINSIC("op_BitwiseAnd", false, BitwiseAnd, "&", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) -SIMD_INTRINSIC("BitwiseAndNot", false, BitwiseAndNot, "&~", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) -SIMD_INTRINSIC("op_BitwiseOr", false, BitwiseOr, "|", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) -SIMD_INTRINSIC("op_ExclusiveOr", false, BitwiseXor, "^", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("op_BitwiseAnd", false, BitwiseAnd, "&", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("BitwiseAndNot", false, BitwiseAndNot, "&~", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("op_BitwiseOr", false, BitwiseOr, "|", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("op_ExclusiveOr", false, BitwiseXor, "^", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) // Dot Product #if defined(_TARGET_XARCH_) @@ -122,14 +122,14 @@ SIMD_INTRINSIC("op_ExclusiveOr", false, BitwiseXor, SIMD_INTRINSIC("Dot", false, DotProduct, "Dot", TYP_UNKNOWN, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) #elif defined(_TARGET_ARM64_) // Dot Product does not support LONG/ULONG due to lack of multiply support (see TODO-ARM64-CQ above) -SIMD_INTRINSIC("Dot", false, DotProduct, "Dot", TYP_UNKNOWN, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_UNDEF, TYP_UNDEF}) +SIMD_INTRINSIC("Dot", false, DotProduct, "Dot", TYP_UNKNOWN, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_UNDEF, TYP_UNDEF}) #endif // Select -SIMD_INTRINSIC("ConditionalSelect", false, Select, "Select", TYP_STRUCT, 3, {TYP_STRUCT, TYP_STRUCT, TYP_STRUCT}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("ConditionalSelect", false, Select, "Select", TYP_STRUCT, 3, {TYP_STRUCT, TYP_STRUCT, TYP_STRUCT}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) // Cast -SIMD_INTRINSIC("op_Explicit", false, Cast, "Cast", TYP_STRUCT, 1, {TYP_STRUCT, TYP_UNDEF, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) +SIMD_INTRINSIC("op_Explicit", false, Cast, "Cast", TYP_STRUCT, 1, {TYP_STRUCT, TYP_UNDEF, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_ULONG}) // Convert int/uint to single SIMD_INTRINSIC("ConvertToSingle", false, ConvertToSingle, "ConvertToSingle", TYP_STRUCT, 1, {TYP_STRUCT, TYP_UNDEF, TYP_UNDEF}, {TYP_INT, TYP_UINT, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) @@ -144,9 +144,9 @@ SIMD_INTRINSIC("ConvertToInt64", false, ConvertToInt64, // Convert double to ulong SIMD_INTRINSIC("ConvertToUInt64", false, ConvertToUInt64, "ConvertToUInt64", TYP_STRUCT, 1, {TYP_STRUCT, TYP_UNDEF, TYP_UNDEF}, {TYP_DOUBLE, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) // Narrow two input Vectors to a single Vector. The return value's lower elements are the elements from src1, and the upper elements are from src2. -SIMD_INTRINSIC("Narrow", false, Narrow, "Narrow", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_DOUBLE, TYP_LONG, TYP_CHAR, TYP_SHORT, TYP_UINT, TYP_ULONG, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) +SIMD_INTRINSIC("Narrow", false, Narrow, "Narrow", TYP_STRUCT, 2, {TYP_STRUCT, TYP_STRUCT, TYP_UNDEF}, {TYP_INT, TYP_DOUBLE, TYP_LONG, TYP_USHORT, TYP_SHORT, TYP_UINT, TYP_ULONG, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) // Widen one input Vector to two Vectors: dest1 contains the lower half of elements in src, and dest2 contains the upper half of elements in src. -SIMD_INTRINSIC("Widen", false, Widen, "Widen", TYP_VOID, 3, {TYP_STRUCT, TYP_BYREF, TYP_BYREF}, {TYP_INT, TYP_FLOAT, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) +SIMD_INTRINSIC("Widen", false, Widen, "Widen", TYP_VOID, 3, {TYP_STRUCT, TYP_BYREF, TYP_BYREF}, {TYP_INT, TYP_FLOAT, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) // Miscellaneous SIMD_INTRINSIC("get_IsHardwareAccelerated", false, HWAccel, "HWAccel", TYP_BOOL, 0, {TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}, {TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) @@ -166,8 +166,8 @@ SIMD_INTRINSIC("UpperSave", false, UpperSave, SIMD_INTRINSIC("UpperRestore", false, UpperRestore, "UpperRestore Internal", TYP_STRUCT, 2, {TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}, {TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) // Internal intrinsics for Widen -SIMD_INTRINSIC("WidenHi", false, WidenHi, "WidenHi", TYP_VOID, 2, {TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) -SIMD_INTRINSIC("WidenLo", false, WidenLo, "WidenLo", TYP_VOID, 2, {TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_CHAR, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) +SIMD_INTRINSIC("WidenHi", false, WidenHi, "WidenHi", TYP_VOID, 2, {TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) +SIMD_INTRINSIC("WidenLo", false, WidenLo, "WidenLo", TYP_VOID, 2, {TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}, {TYP_INT, TYP_FLOAT, TYP_USHORT, TYP_UBYTE, TYP_BYTE, TYP_SHORT, TYP_UINT, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) SIMD_INTRINSIC(nullptr, false, Invalid, "Invalid", TYP_UNDEF, 0, {TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}, {TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF, TYP_UNDEF}) #undef SIMD_INTRINSIC diff --git a/src/jit/stackfp.cpp b/src/jit/stackfp.cpp index e41a79c2e5c3..9ade2bbfd24c 100644 --- a/src/jit/stackfp.cpp +++ b/src/jit/stackfp.cpp @@ -2369,7 +2369,7 @@ void CodeGen::genCodeForTreeStackFP_Cast(GenTreePtr tree) case TYP_BOOL: case TYP_BYTE: case TYP_UBYTE: - case TYP_CHAR: + case TYP_USHORT: case TYP_SHORT: { diff --git a/src/jit/typelist.h b/src/jit/typelist.h index ed5884359d44..2e3667b40db6 100644 --- a/src/jit/typelist.h +++ b/src/jit/typelist.h @@ -38,7 +38,6 @@ DEF_TP(BOOL ,"bool" , TYP_INT, TI_BYTE, 1, 1, 4, 1, 1, VTF_INT|VT DEF_TP(BYTE ,"byte" , TYP_INT, TI_BYTE, 1, 1, 4, 1, 1, VTF_INT, TYPE_REF_INT) DEF_TP(UBYTE ,"ubyte" , TYP_INT, TI_BYTE, 1, 1, 4, 1, 1, VTF_INT|VTF_UNS,TYPE_REF_INT) -DEF_TP(CHAR ,"char" , TYP_INT, TI_SHORT, 2, 2, 4, 1, 2, VTF_INT|VTF_UNS,TYPE_REF_INT) DEF_TP(SHORT ,"short" , TYP_INT, TI_SHORT, 2, 2, 4, 1, 2, VTF_INT, TYPE_REF_INT) DEF_TP(USHORT ,"ushort" , TYP_INT, TI_SHORT, 2, 2, 4, 1, 2, VTF_INT|VTF_UNS,TYPE_REF_INT) diff --git a/src/jit/valuenum.cpp b/src/jit/valuenum.cpp index 77134b2b824f..9b231debfbd5 100644 --- a/src/jit/valuenum.cpp +++ b/src/jit/valuenum.cpp @@ -901,7 +901,6 @@ ValueNum ValueNumStore::VNZeroForType(var_types typ) case TYP_BOOL: case TYP_BYTE: case TYP_UBYTE: - case TYP_CHAR: case TYP_SHORT: case TYP_USHORT: case TYP_INT: @@ -948,7 +947,6 @@ ValueNum ValueNumStore::VNOneForType(var_types typ) case TYP_BOOL: case TYP_BYTE: case TYP_UBYTE: - case TYP_CHAR: case TYP_SHORT: case TYP_USHORT: case TYP_INT: @@ -1982,7 +1980,6 @@ ValueNum ValueNumStore::EvalCastForConstantArgs(var_types typ, VNFunc func, Valu case TYP_SHORT: assert(typ == TYP_INT); return VNForIntCon(INT16(arg0Val)); - case TYP_CHAR: case TYP_USHORT: assert(typ == TYP_INT); return VNForIntCon(UINT16(arg0Val)); @@ -2071,7 +2068,6 @@ ValueNum ValueNumStore::EvalCastForConstantArgs(var_types typ, VNFunc func, Valu case TYP_SHORT: assert(typ == TYP_INT); return VNForIntCon(INT16(arg0Val)); - case TYP_CHAR: case TYP_USHORT: assert(typ == TYP_INT); return VNForIntCon(UINT16(arg0Val)); @@ -2128,7 +2124,6 @@ ValueNum ValueNumStore::EvalCastForConstantArgs(var_types typ, VNFunc func, Valu case TYP_SHORT: assert(typ == TYP_INT); return VNForIntCon(INT16(arg0Val)); - case TYP_CHAR: case TYP_USHORT: assert(typ == TYP_INT); return VNForIntCon(UINT16(arg0Val)); @@ -2170,7 +2165,6 @@ ValueNum ValueNumStore::EvalCastForConstantArgs(var_types typ, VNFunc func, Valu case TYP_SHORT: assert(typ == TYP_INT); return VNForIntCon(INT16(arg0Val)); - case TYP_CHAR: case TYP_USHORT: assert(typ == TYP_INT); return VNForIntCon(UINT16(arg0Val)); @@ -3846,7 +3840,6 @@ void ValueNumStore::vnDump(Compiler* comp, ValueNum vn, bool isPtr) case TYP_BOOL: case TYP_BYTE: case TYP_UBYTE: - case TYP_CHAR: case TYP_SHORT: case TYP_USHORT: case TYP_INT: @@ -5196,7 +5189,7 @@ void Compiler::fgValueNumberTreeConst(GenTreePtr tree) case TYP_ULONG: case TYP_INT: case TYP_UINT: - case TYP_CHAR: + case TYP_USHORT: case TYP_SHORT: case TYP_BYTE: case TYP_UBYTE: diff --git a/src/jit/vartype.h b/src/jit/vartype.h index 7ec9d798a339..04793ea86830 100644 --- a/src/jit/vartype.h +++ b/src/jit/vartype.h @@ -128,7 +128,6 @@ inline var_types varTypeUnsignedToSigned(var_types vt) case TYP_UBYTE: return TYP_BYTE; case TYP_USHORT: - case TYP_CHAR: return TYP_SHORT; case TYP_UINT: return TYP_INT; @@ -189,7 +188,7 @@ inline bool varTypeIsByte(T vt) template inline bool varTypeIsShort(T vt) { - return (TypeGet(vt) >= TYP_CHAR) && (TypeGet(vt) <= TYP_USHORT); + return (TypeGet(vt) == TYP_SHORT) || (TypeGet(vt) == TYP_USHORT); } template