@@ -234,96 +234,51 @@ void Compiler::getHWIntrinsicImmOps(NamedIntrinsic intrinsic,
234234// intrinsic -- NamedIntrinsic associated with the HWIntrinsic to lookup
235235// sig -- signature of the intrinsic call.
236236// immNumber -- Which immediate to use (1 for most intrinsics)
237- // simdBaseType -- base type of the intrinsic
238- // simdType -- vector size of the intrinsic
239- // op1ClsHnd -- cls handler for op1
240- // op2ClsHnd -- cls handler for op2
241- // op2ClsHnd -- cls handler for op3
242237// immSimdSize [IN/OUT] -- Size of the immediate to override
243238// immSimdBaseType [IN/OUT] -- Base type of the immediate to override
244239//
245- void Compiler::getHWIntrinsicImmTypes (NamedIntrinsic intrinsic,
246- CORINFO_SIG_INFO* sig,
247- unsigned immNumber,
248- var_types simdBaseType,
249- CorInfoType simdBaseJitType,
250- CORINFO_CLASS_HANDLE op1ClsHnd,
251- CORINFO_CLASS_HANDLE op2ClsHnd,
252- CORINFO_CLASS_HANDLE op3ClsHnd,
253- unsigned * immSimdSize,
254- var_types* immSimdBaseType)
240+ void Compiler::getHWIntrinsicImmTypes (NamedIntrinsic intrinsic,
241+ CORINFO_SIG_INFO* sig,
242+ unsigned immNumber,
243+ unsigned * immSimdSize,
244+ var_types* immSimdBaseType)
255245{
256246 HWIntrinsicCategory category = HWIntrinsicInfo::lookupCategory (intrinsic);
257247
258248 if (category == HW_Category_SIMDByIndexedElement)
259249 {
260250 assert (immNumber == 1 );
251+ *immSimdSize = 0 ;
252+ CORINFO_ARG_LIST_HANDLE immArg = sig->args ;
261253
262- CorInfoType indexedElementBaseJitType;
263- var_types indexedElementBaseType;
264- *immSimdSize = 0 ;
265-
266- if (sig->numArgs == 2 )
267- {
268- indexedElementBaseJitType = getBaseJitTypeAndSizeOfSIMDType (op1ClsHnd, immSimdSize);
269- indexedElementBaseType = JitType2PreciseVarType (indexedElementBaseJitType);
270- }
271- else if (sig->numArgs == 3 )
254+ switch (sig->numArgs )
272255 {
273- indexedElementBaseJitType = getBaseJitTypeAndSizeOfSIMDType (op2ClsHnd, immSimdSize);
274- indexedElementBaseType = JitType2PreciseVarType (indexedElementBaseJitType);
275- }
276- else
277- {
278- assert (sig->numArgs == 4 );
279- indexedElementBaseJitType = getBaseJitTypeAndSizeOfSIMDType (op3ClsHnd, immSimdSize);
280- indexedElementBaseType = JitType2PreciseVarType (indexedElementBaseJitType);
281-
282- if (intrinsic == NI_Dp_DotProductBySelectedQuadruplet)
283- {
284- assert (((simdBaseType == TYP_INT) && (indexedElementBaseType == TYP_BYTE)) ||
285- ((simdBaseType == TYP_UINT) && (indexedElementBaseType == TYP_UBYTE)));
286- // The second source operand of sdot, udot instructions is an indexed 32-bit element.
287- indexedElementBaseType = simdBaseType;
288- }
289-
290- if (intrinsic == NI_Sve_DotProductBySelectedScalar)
256+ case 4 :
257+ immArg = info.compCompHnd ->getArgNext (immArg);
258+ FALLTHROUGH;
259+ case 3 :
260+ immArg = info.compCompHnd ->getArgNext (immArg);
261+ FALLTHROUGH;
262+ case 2 :
291263 {
292- assert (((simdBaseType == TYP_INT) && (indexedElementBaseType == TYP_BYTE)) ||
293- ((simdBaseType == TYP_UINT) && (indexedElementBaseType == TYP_UBYTE)) ||
294- ((simdBaseType == TYP_LONG) && (indexedElementBaseType == TYP_SHORT)) ||
295- ((simdBaseType == TYP_ULONG) && (indexedElementBaseType == TYP_USHORT)));
296-
297- // The second source operand of sdot, udot instructions is an indexed 32-bit element.
298- indexedElementBaseType = simdBaseType;
264+ CORINFO_CLASS_HANDLE typeHnd = info.compCompHnd ->getArgClass (sig, immArg);
265+ getBaseJitTypeAndSizeOfSIMDType (typeHnd, immSimdSize);
266+ break ;
299267 }
268+ default :
269+ unreached ();
300270 }
301-
302- if (intrinsic == NI_Sve2_MultiplyBySelectedScalar ||
303- intrinsic == NI_Sve2_MultiplyBySelectedScalarWideningEven ||
304- intrinsic == NI_Sve2_MultiplyBySelectedScalarWideningEvenAndAdd ||
305- intrinsic == NI_Sve2_MultiplyBySelectedScalarWideningEvenAndSubtract ||
306- intrinsic == NI_Sve2_MultiplyBySelectedScalarWideningOdd ||
307- intrinsic == NI_Sve2_MultiplyBySelectedScalarWideningOddAndAdd ||
308- intrinsic == NI_Sve2_MultiplyBySelectedScalarWideningOddAndSubtract ||
309- intrinsic == NI_Sve2_MultiplyDoublingWideningBySelectedScalarAndAddSaturateEven ||
310- intrinsic == NI_Sve2_MultiplyDoublingWideningBySelectedScalarAndAddSaturateOdd ||
311- intrinsic == NI_Sve2_MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateEven ||
312- intrinsic == NI_Sve2_MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateOdd ||
313- intrinsic == NI_Sve2_MultiplySubtractBySelectedScalar)
314- {
315- indexedElementBaseType = simdBaseType;
316- }
317-
318- assert (indexedElementBaseType == simdBaseType);
319271 }
320272 else if (intrinsic == NI_AdvSimd_Arm64_InsertSelectedScalar)
321273 {
322274 if (immNumber == 2 )
323275 {
324- CorInfoType otherBaseJitType = getBaseJitTypeAndSizeOfSIMDType (op3ClsHnd, immSimdSize);
325- *immSimdBaseType = JitType2PreciseVarType (otherBaseJitType);
326- assert (otherBaseJitType == simdBaseJitType);
276+ CORINFO_ARG_LIST_HANDLE immArg = sig->args ;
277+ immArg = info.compCompHnd ->getArgNext (immArg);
278+ immArg = info.compCompHnd ->getArgNext (immArg);
279+ CORINFO_CLASS_HANDLE typeHnd = info.compCompHnd ->getArgClass (sig, immArg);
280+ CorInfoType otherBaseJitType = getBaseJitTypeAndSizeOfSIMDType (typeHnd, immSimdSize);
281+ *immSimdBaseType = JitType2PreciseVarType (otherBaseJitType);
327282 }
328283 // For imm1 use default simd sizes.
329284 }
0 commit comments