Skip to content

Commit c190583

Browse files
committed
[CIR][CIRGen][Builtin][Neon] Lower vqsubd_s64 and vqadds_u32
1 parent 90833a4 commit c190583

File tree

2 files changed

+26
-14
lines changed

2 files changed

+26
-14
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -2869,7 +2869,8 @@ static mlir::Value emitCommonNeonSISDBuiltinExpr(
28692869
case NEON::BI__builtin_neon_vqadds_s32:
28702870
return builder.createAdd(ops[0], ops[1], false, false, true);
28712871
case NEON::BI__builtin_neon_vqadds_u32:
2872-
llvm_unreachable(" neon_vqadds_u32 NYI ");
2872+
return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.uqadd", resultTy,
2873+
loc);
28732874
case NEON::BI__builtin_neon_vqdmulhh_s16:
28742875
llvm_unreachable(" neon_vqdmulhh_s16 NYI ");
28752876
case NEON::BI__builtin_neon_vqdmulhs_s32:
@@ -3017,7 +3018,8 @@ static mlir::Value emitCommonNeonSISDBuiltinExpr(
30173018
case NEON::BI__builtin_neon_vqsubb_u8:
30183019
llvm_unreachable(" neon_vqsubb_u8 NYI ");
30193020
case NEON::BI__builtin_neon_vqsubd_s64:
3020-
llvm_unreachable(" neon_vqsubd_s64 NYI ");
3021+
return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.sqsub", resultTy,
3022+
loc);
30213023
case NEON::BI__builtin_neon_vqsubd_u64:
30223024
llvm_unreachable(" neon_vqsubd_u64 NYI ");
30233025
case NEON::BI__builtin_neon_vqsubh_s16:

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

+22-12
Original file line numberDiff line numberDiff line change
@@ -10072,12 +10072,17 @@ int32_t test_vqadds_s32(int32_t a, int32_t b) {
1007210072
// return vqaddh_u16(a, b);
1007310073
// }
1007410074

10075-
// NYI-LABEL: @test_vqadds_u32(
10076-
// NYI: [[VQADDS_U32_I:%.*]] = call i32 @llvm.aarch64.neon.uqadd.i32(i32 %a, i32 %b)
10077-
// NYI: ret i32 [[VQADDS_U32_I]]
10078-
// uint32_t test_vqadds_u32(uint32_t a, uint32_t b) {
10079-
// return vqadds_u32(a, b);
10080-
// }
10075+
uint32_t test_vqadds_u32(uint32_t a, uint32_t b) {
10076+
return vqadds_u32(a, b);
10077+
10078+
// CIR: vqadds_u32
10079+
// CIR: cir.llvm.intrinsic "aarch64.neon.uqadd" {{%.*}}, {{%.*}} : (!u32i, !u32i) -> !u32i
10080+
10081+
// LLVM-LABEL: @test_vqadds_u32
10082+
// LLVM-SAME: (i32{{.*}}[[a:%.*]], i32{{.*}}[[b:%.*]])
10083+
// LLVM: [[VQADDS_U32_I:%.*]] = call i32 @llvm.aarch64.neon.uqadd.i32(i32 [[a]], i32 [[b]])
10084+
// LLVM: ret i32 [[VQADDS_U32_I]]
10085+
}
1008110086

1008210087
// NYI-LABEL: @test_vqaddd_u64(
1008310088
// NYI: [[VQADDD_U64_I:%.*]] = call i64 @llvm.aarch64.neon.uqadd.i64(i64 %a, i64 %b)
@@ -10120,12 +10125,17 @@ int32_t test_vqsubs_s32(int32_t a, int32_t b) {
1012010125
// LLVM: ret i32 [[VQSUBS_S32_I]]
1012110126
}
1012210127

10123-
// NYI-LABEL: @test_vqsubd_s64(
10124-
// NYI: [[VQSUBD_S64_I:%.*]] = call i64 @llvm.aarch64.neon.sqsub.i64(i64 %a, i64 %b)
10125-
// NYI: ret i64 [[VQSUBD_S64_I]]
10126-
// int64_t test_vqsubd_s64(int64_t a, int64_t b) {
10127-
// return vqsubd_s64(a, b);
10128-
// }
10128+
int64_t test_vqsubd_s64(int64_t a, int64_t b) {
10129+
return vqsubd_s64(a, b);
10130+
10131+
// CIR: vqsubd_s64
10132+
// CIR: cir.llvm.intrinsic "aarch64.neon.sqsub" {{%.*}}, {{%.*}} : (!s64i, !s64i) -> !s64i
10133+
10134+
// LLVM-LABEL: @test_vqsubd_s64
10135+
// LLVM-SAME: (i64{{.*}}[[a:%.*]], i64{{.*}}[[b:%.*]])
10136+
// LLVM: [[VQSUBD_S64_I:%.*]] = call i64 @llvm.aarch64.neon.sqsub.i64(i64 [[a]], i64 [[b]])
10137+
// LLVM: ret i64 [[VQSUBD_S64_I]]
10138+
}
1012910139

1013010140
// NYI-LABEL: @test_vqsubb_u8(
1013110141
// NYI: [[TMP0:%.*]] = insertelement <8 x i8> poison, i8 %a, i64 0

0 commit comments

Comments
 (0)