@@ -2588,6 +2588,10 @@ bool IRTranslator::translateKnownIntrinsic(const CallInst &CI, Intrinsic::ID ID,
2588
2588
getOrCreateVReg (*CI.getOperand (0 )),
2589
2589
getOrCreateVReg (*CI.getOperand (1 )));
2590
2590
return true ;
2591
+ case Intrinsic::vector_extract:
2592
+ return translateExtractVector (CI, MIRBuilder);
2593
+ case Intrinsic::vector_insert:
2594
+ return translateInsertVector (CI, MIRBuilder);
2591
2595
case Intrinsic::prefetch: {
2592
2596
Value *Addr = CI.getOperand (0 );
2593
2597
unsigned RW = cast<ConstantInt>(CI.getOperand (1 ))->getZExtValue ();
@@ -3163,6 +3167,57 @@ bool IRTranslator::translateInsertElement(const User &U,
3163
3167
return true ;
3164
3168
}
3165
3169
3170
+ bool IRTranslator::translateInsertVector (const User &U,
3171
+ MachineIRBuilder &MIRBuilder) {
3172
+ Register Dst = getOrCreateVReg (U);
3173
+ Register Vec = getOrCreateVReg (*U.getOperand (0 ));
3174
+ Register Elt = getOrCreateVReg (*U.getOperand (1 ));
3175
+
3176
+ ConstantInt *CI = cast<ConstantInt>(U.getOperand (2 ));
3177
+ unsigned PreferredVecIdxWidth = TLI->getVectorIdxTy (*DL).getSizeInBits ();
3178
+
3179
+ // Resize Index to preferred index width.
3180
+ if (CI->getBitWidth () != PreferredVecIdxWidth) {
3181
+ APInt NewIdx = CI->getValue ().zextOrTrunc (PreferredVecIdxWidth);
3182
+ CI = ConstantInt::get (CI->getContext (), NewIdx);
3183
+ }
3184
+
3185
+ // If it is a <1 x Ty> vector, we have to use other means.
3186
+ if (auto *ResultType = dyn_cast<FixedVectorType>(U.getOperand (1 )->getType ());
3187
+ ResultType && ResultType->getNumElements () == 1 ) {
3188
+ if (auto *InputType = dyn_cast<FixedVectorType>(U.getOperand (0 )->getType ());
3189
+ InputType && InputType->getNumElements () == 1 ) {
3190
+ // We are inserting an illegal fixed vector into an illegal
3191
+ // fixed vector, use the scalar as it is not a legal vector type
3192
+ // in LLT.
3193
+ return translateCopy (U, *U.getOperand (0 ), MIRBuilder);
3194
+ }
3195
+ if (isa<FixedVectorType>(U.getOperand (0 )->getType ())) {
3196
+ // We are inserting an illegal fixed vector into a legal fixed
3197
+ // vector, use the scalar as it is not a legal vector type in
3198
+ // LLT.
3199
+ Register Idx = getOrCreateVReg (*CI);
3200
+ MIRBuilder.buildInsertVectorElement (Dst, Vec, Elt, Idx);
3201
+ return true ;
3202
+ }
3203
+ if (isa<ScalableVectorType>(U.getOperand (0 )->getType ())) {
3204
+ // We are inserting an illegal fixed vector into a scalable
3205
+ // vector, use a scalar element insert.
3206
+ LLT VecIdxTy = LLT::scalar (PreferredVecIdxWidth);
3207
+ Register Idx = getOrCreateVReg (*CI);
3208
+ auto ScaledIndex = MIRBuilder.buildMul (
3209
+ VecIdxTy, MIRBuilder.buildVScale (VecIdxTy, 1 ), Idx);
3210
+ MIRBuilder.buildInsertVectorElement (Dst, Vec, Elt, ScaledIndex);
3211
+ return true ;
3212
+ }
3213
+ }
3214
+
3215
+ MIRBuilder.buildInsertSubvector (
3216
+ getOrCreateVReg (U), getOrCreateVReg (*U.getOperand (0 )),
3217
+ getOrCreateVReg (*U.getOperand (1 )), CI->getZExtValue ());
3218
+ return true ;
3219
+ }
3220
+
3166
3221
bool IRTranslator::translateExtractElement (const User &U,
3167
3222
MachineIRBuilder &MIRBuilder) {
3168
3223
// If it is a <1 x Ty> vector, use the scalar as it is
@@ -3191,6 +3246,54 @@ bool IRTranslator::translateExtractElement(const User &U,
3191
3246
return true ;
3192
3247
}
3193
3248
3249
+ bool IRTranslator::translateExtractVector (const User &U,
3250
+ MachineIRBuilder &MIRBuilder) {
3251
+ Register Res = getOrCreateVReg (U);
3252
+ Register Vec = getOrCreateVReg (*U.getOperand (0 ));
3253
+ ConstantInt *CI = cast<ConstantInt>(U.getOperand (1 ));
3254
+ unsigned PreferredVecIdxWidth = TLI->getVectorIdxTy (*DL).getSizeInBits ();
3255
+
3256
+ // Resize Index to preferred index width.
3257
+ if (CI->getBitWidth () != PreferredVecIdxWidth) {
3258
+ APInt NewIdx = CI->getValue ().zextOrTrunc (PreferredVecIdxWidth);
3259
+ CI = ConstantInt::get (CI->getContext (), NewIdx);
3260
+ }
3261
+
3262
+ // If it is a <1 x Ty> vector, we have to use other means.
3263
+ if (auto *ResultType = dyn_cast<FixedVectorType>(U.getType ());
3264
+ ResultType && ResultType->getNumElements () == 1 ) {
3265
+ if (auto *InputType = dyn_cast<FixedVectorType>(U.getOperand (0 )->getType ());
3266
+ InputType && InputType->getNumElements () == 1 ) {
3267
+ // We are extracting an illegal fixed vector from an illegal fixed vector,
3268
+ // use the scalar as it is not a legal vector type in LLT.
3269
+ return translateCopy (U, *U.getOperand (0 ), MIRBuilder);
3270
+ }
3271
+ if (isa<FixedVectorType>(U.getOperand (0 )->getType ())) {
3272
+ // We are extracting an illegal fixed vector from a legal fixed
3273
+ // vector, use the scalar as it is not a legal vector type in
3274
+ // LLT.
3275
+ Register Idx = getOrCreateVReg (*CI);
3276
+ MIRBuilder.buildExtractVectorElement (Res, Vec, Idx);
3277
+ return true ;
3278
+ }
3279
+ if (isa<ScalableVectorType>(U.getOperand (0 )->getType ())) {
3280
+ // We are extracting an illegal fixed vector from a scalable
3281
+ // vector, use a scalar element extract.
3282
+ LLT VecIdxTy = LLT::scalar (PreferredVecIdxWidth);
3283
+ Register Idx = getOrCreateVReg (*CI);
3284
+ auto ScaledIndex = MIRBuilder.buildMul (
3285
+ VecIdxTy, MIRBuilder.buildVScale (VecIdxTy, 1 ), Idx);
3286
+ MIRBuilder.buildExtractVectorElement (Res, Vec, ScaledIndex);
3287
+ return true ;
3288
+ }
3289
+ }
3290
+
3291
+ MIRBuilder.buildExtractSubvector (getOrCreateVReg (U),
3292
+ getOrCreateVReg (*U.getOperand (0 )),
3293
+ CI->getZExtValue ());
3294
+ return true ;
3295
+ }
3296
+
3194
3297
bool IRTranslator::translateShuffleVector (const User &U,
3195
3298
MachineIRBuilder &MIRBuilder) {
3196
3299
// A ShuffleVector that operates on scalable vectors is a splat vector where
0 commit comments