================
@@ -1073,6 +1098,20 @@ static mlir::Value emitCommonNeonBuiltinExpr(
     mlir::Type resultType = cgf.convertType(expr->getType());
     return cgf.getBuilder().createBitcast(result, resultType);
   }
+  case NEON::BI__builtin_neon_vraddhn_v: {
+    cir::VectorType srcTy =
+        cgf.getBuilder().getExtendedOrTruncatedElementVectorType(
+            vTy, /*isExtended=*/true);
+
+    llvm::StringRef llvmIntrName = getLLVMIntrNameNoPrefix(
+        static_cast<llvm::Intrinsic::ID>(llvmIntrinsic));
+    mlir::Value result =
+        emitNeonCall(cgf.getCIRGenModule(), cgf.getBuilder(),
+                     /*argTypes=*/{srcTy, srcTy}, ops, llvmIntrName,
+                     /*funcResTy=*/vTy, loc);
+    mlir::Type resultType = cgf.convertType(expr->getType());
+    return cgf.getBuilder().createBitcast(result, resultType);
+  }
----------------
iamvickynguyen wrote:

> But since we truncate after that, does it matter whether we use lshr or ashr?

It's true that after truncating, it doesn't matter. However, the tests have 
`lshr` checks. For example
https://github.com/llvm/llvm-project/pull/204989/changes#diff-2b97ecf3f67118099b37543f4ca652bebfa9bf2ed58e590d4cf68671b1e5ab6aR1005

> It's fine to leave this as is, but could you add a comment with rationale for 
> the bitcast? And would you be able to remove the dead code in ARM.cpp? 
> Perhaps in a separate PR? Thank you đŸ™đŸ»

I've added comments to both `CIRGenBuiltinAArch64.cpp` and `ARM.cpp`. 
Interestingly, I discovered that the bitcasts in ARM.cpp aren't dead code 
:smile: Without them, LShr crashes because of the operand types mismatch. 
Another thing is without bitcasts, the Add works on <16 x i8> instead of <8 x 
i16> which might produce wrong results (I'm not too sure about that :smile: ).

> This is a bit convoluted, but should work for you nicely if you just move the 
> definition of srcTy out of this switch stmt, right?

Unfortunately, we can't move `srcTy` out of this switch statement because 
`getExtendedOrTruncatedElementVectorType` has an assert `"expected int 
vector"`. For example, `vadd_f32` has elementType float, so it triggers the 
assertion.

https://github.com/llvm/llvm-project/pull/204989
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to