@@ -234,96 +234,51 @@ void Compiler::getHWIntrinsicImmOps(NamedIntrinsic intrinsic,
234
234
// intrinsic -- NamedIntrinsic associated with the HWIntrinsic to lookup
235
235
// sig -- signature of the intrinsic call.
236
236
// 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
242
237
// immSimdSize [IN/OUT] -- Size of the immediate to override
243
238
// immSimdBaseType [IN/OUT] -- Base type of the immediate to override
244
239
//
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)
255
245
{
256
246
HWIntrinsicCategory category = HWIntrinsicInfo::lookupCategory (intrinsic);
257
247
258
248
if (category == HW_Category_SIMDByIndexedElement)
259
249
{
260
250
assert (immNumber == 1 );
251
+ *immSimdSize = 0 ;
252
+ CORINFO_ARG_LIST_HANDLE immArg = sig->args ;
261
253
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 )
272
255
{
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 :
291
263
{
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 ;
299
267
}
268
+ default :
269
+ unreached ();
300
270
}
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);
319
271
}
320
272
else if (intrinsic == NI_AdvSimd_Arm64_InsertSelectedScalar)
321
273
{
322
274
if (immNumber == 2 )
323
275
{
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);
327
282
}
328
283
// For imm1 use default simd sizes.
329
284
}
0 commit comments