Skip to content

Commit 9c0639b

Browse files
authored
1 parent 177d89b commit 9c0639b

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
@@ -4356,7 +4356,18 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E,
43564356
llvm_unreachable("NEON::BI__builtin_neon_vsraq_n_v NYI");
43574357
case NEON::BI__builtin_neon_vrsra_n_v:
43584358
case NEON::BI__builtin_neon_vrsraq_n_v: {
4359-
llvm_unreachable("NEON::BI__builtin_neon_vrsraq_n_v NYI");
4359+
llvm::SmallVector<mlir::Value> tmpOps = {Ops[1], Ops[2]};
4360+
// The llvm intrinsic is expecting negative shift amount for right shift.
4361+
// Thus we have to make shift amount vec type to be signed.
4362+
cir::VectorType shitAmtVecTy =
4363+
usgn ? getSignChangedVectorType(builder, vTy) : vTy;
4364+
mlir::Value tmp =
4365+
emitNeonCall(builder, {vTy, shitAmtVecTy}, tmpOps,
4366+
usgn ? "aarch64.neon.urshl" : "aarch64.neon.srshl", vTy,
4367+
getLoc(E->getExprLoc()), false,
4368+
1 /* shift amount is args[1]*/, true /* right shift */);
4369+
Ops[0] = builder.createBitcast(Ops[0], vTy);
4370+
return builder.createBinop(Ops[0], cir::BinOpKind::Add, tmp);
43604371
}
43614372
case NEON::BI__builtin_neon_vld1_v:
43624373
case NEON::BI__builtin_neon_vld1q_v: {

0 commit comments

Comments
 (0)