Skip to content

Commit 7697fec

Browse files
ghehglanza
authored andcommitted
1 parent ff8e44c commit 7697fec

File tree

2 files changed

+305
-174
lines changed

2 files changed

+305
-174
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4361,7 +4361,18 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E,
43614361
llvm_unreachable("NEON::BI__builtin_neon_vsraq_n_v NYI");
43624362
case NEON::BI__builtin_neon_vrsra_n_v:
43634363
case NEON::BI__builtin_neon_vrsraq_n_v: {
4364-
llvm_unreachable("NEON::BI__builtin_neon_vrsraq_n_v NYI");
4364+
llvm::SmallVector<mlir::Value> tmpOps = {Ops[1], Ops[2]};
4365+
// The llvm intrinsic is expecting negative shift amount for right shift.
4366+
// Thus we have to make shift amount vec type to be signed.
4367+
cir::VectorType shitAmtVecTy =
4368+
usgn ? getSignChangedVectorType(builder, vTy) : vTy;
4369+
mlir::Value tmp =
4370+
emitNeonCall(builder, {vTy, shitAmtVecTy}, tmpOps,
4371+
usgn ? "aarch64.neon.urshl" : "aarch64.neon.srshl", vTy,
4372+
getLoc(E->getExprLoc()), false,
4373+
1 /* shift amount is args[1]*/, true /* right shift */);
4374+
Ops[0] = builder.createBitcast(Ops[0], vTy);
4375+
return builder.createBinop(Ops[0], cir::BinOpKind::Add, tmp);
43654376
}
43664377
case NEON::BI__builtin_neon_vld1_v:
43674378
case NEON::BI__builtin_neon_vld1q_v: {

0 commit comments

Comments
 (0)