Skip to content

Commit daaf817

Browse files
authored
[CIR][CIRGen][Builtin][Neon] Lower neon_vaddlv_s8 and neon_vaddlv_u8 (#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 734afe6 commit daaf817

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
@@ -905,6 +905,29 @@ int32_t test_vaddlvq_s16(int16x8_t a) {
905905
// LLVM: ret i32 [[VADDLV_I]]
906906
}
907907

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

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

0 commit comments

Comments
 (0)