Skip to content

Commit b79e923

Browse files
RiverDavelanza
authored andcommitted
[CIR][CIRGen][Builtin][Neon] Lower neon_vaddlv_s8 and neon_vaddlv_u8 (llvm#1671)
Hi, This is my first here! Tried to mirror some of the patterns already presented in both the codegen lib and its tests I'm very excited to start contributing and potentially making an impact in this project! feedback is much appreciated.
1 parent 7ff4fbe commit b79e923

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4397,9 +4397,6 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E,
43974397
case NEON::BI__builtin_neon_vmul_n_f64: {
43984398
llvm_unreachable("NEON::BI__builtin_neon_vmul_n_f64 NYI");
43994399
}
4400-
case NEON::BI__builtin_neon_vaddlv_u8: {
4401-
llvm_unreachable("NEON::BI__builtin_neon_vaddlv_u8 NYI");
4402-
}
44034400
case NEON::BI__builtin_neon_vaddlvq_u8: {
44044401
llvm_unreachable("NEON::BI__builtin_neon_vaddlvq_u8 NYI");
44054402
}
@@ -4413,8 +4410,16 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E,
44134410
usgn ? "aarch64.neon.uaddlv" : "aarch64.neon.saddlv",
44144411
usgn ? UInt32Ty : SInt32Ty, getLoc(E->getExprLoc()));
44154412
}
4413+
case NEON::BI__builtin_neon_vaddlv_u8:
4414+
usgn = true;
4415+
[[fallthrough]];
44164416
case NEON::BI__builtin_neon_vaddlv_s8: {
4417-
llvm_unreachable("NEON::BI__builtin_neon_vaddlv_s8 NYI");
4417+
cir::VectorType vTy = cir::VectorType::get(usgn ? UInt8Ty : SInt8Ty, 8);
4418+
Ops.push_back(emitScalarExpr(E->getArg(0)));
4419+
Ops[0] = emitNeonCall(builder, {vTy}, Ops,
4420+
usgn ? "aarch64.neon.uaddlv" : "aarch64.neon.saddlv",
4421+
usgn ? UInt32Ty : SInt32Ty, getLoc(E->getExprLoc()));
4422+
return builder.createIntCast(Ops[0], usgn ? UInt16Ty : SInt16Ty);
44184423
}
44194424
case NEON::BI__builtin_neon_vaddlv_u16:
44204425
usgn = true;

clang/test/CIR/CodeGen/AArch64/neon-arith.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -906,6 +906,29 @@ int32_t test_vaddlvq_s16(int16x8_t a) {
906906
// LLVM: ret i32 [[VADDLV_I]]
907907
}
908908

909+
int16_t test_vaddlv_s8(int8x8_t a) {
910+
return vaddlv_s8(a);
911+
912+
// CIR-LABEL: vaddlv_s8
913+
// CIR: cir.llvm.intrinsic "aarch64.neon.saddlv" {{%.*}}: (!cir.vector<!s8i x 8>) -> !s32i
914+
915+
// LLVM: {{.*}}test_vaddlv_s8(<8 x i8>{{.*}}[[A:%.*]])
916+
// LLVM: [[VADDLV_I:%.*]] = call i32 @llvm.aarch64.neon.saddlv.i32.v8i8(<8 x i8> [[A]])
917+
// LLVM-NEXT: [[TMP0:%.*]] = trunc i32 [[VADDLV_I]] to i16
918+
// LLVM-NEXT: ret i16 [[TMP0]]
919+
}
920+
921+
uint16_t test_vaddlv_u8(uint8x8_t a) {
922+
return vaddlv_u8(a);
923+
924+
// CIR-LABEL: vaddlv_u8
925+
// CIR: cir.llvm.intrinsic "aarch64.neon.uaddlv" {{%.*}}: (!cir.vector<!u8i x 8>) -> !u32i
926+
927+
// LLVM: {{.*}}test_vaddlv_u8(<8 x i8>{{.*}}[[A:%.*]])
928+
// LLVM: [[VADDLV_I:%.*]] = call i32 @llvm.aarch64.neon.uaddlv.i32.v8i8(<8 x i8> [[A]])
929+
// LLVM-NEXT: [[TMP0:%.*]] = trunc i32 [[VADDLV_I]] to i16
930+
// LLVM-NEXT: ret i16 [[TMP0]]
931+
}
909932

910933
int32_t test_vaddlv_s16(int16x4_t a) {
911934
return vaddlv_s16(a);

0 commit comments

Comments
 (0)