Support the following BCD format conversion builtins for PowerPC. - `__builtin_bcdshift` – Shifts a packed decimal value by a specified number of decimal digits. - `__builtin_bcdshiftround` – Shifts a packed decimal value by a specified number of decimal digits, with rounding applied. - `__builtin_bcdtruncate` –Truncates a packed decimal value to a specified number of digits. - `__builtin_bcdunsignedtruncate` – Truncates a packed decimal value and returns the result as an unsigned packed decimal. - `__builtin_bcdunsignedshift` – Shifts an unsigned packed decimal value by a specified number of digits. > Note: This built-in functions are valid only when all following conditions are met: > -qarch is set to utilize POWER9 technology. > The bcd.h file is included. ## Prototypes ```c vector unsigned char __builtin_bcdshift(vector unsigned char, int, unsigned char); vector unsigned char __builtin_bcdshiftround(vector unsigned char, int, unsigned char); vector unsigned char __builtin_bcdtruncate(vector unsigned char, int, unsigned char); vector unsigned char __builtin_bcdunsignedtruncate(vector unsigned char, int); vector unsigned char __builtin_bcdunsignedshift(vector unsigned char, int); ``` ---------
86 lines
3.9 KiB
C
86 lines
3.9 KiB
C
// NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
|
|
// REQUIRES: powerpc-registered-target
|
|
// RUN: %clang_cc1 -triple powerpc64le-unknown-unknown -O2 -target-cpu pwr9 \
|
|
// RUN: -emit-llvm %s -o - | FileCheck %s
|
|
// RUN: %clang_cc1 -triple powerpc64-unknown-unknown -O2 -target-cpu pwr9 \
|
|
// RUN: -emit-llvm %s -o - | FileCheck %s
|
|
// RUN: %clang_cc1 -triple powerpc-unknown-unknown -O2 -target-cpu pwr9 \
|
|
// RUN: -emit-llvm %s -o - | FileCheck %s
|
|
|
|
// CHECK-LABEL: test_bcdcopysign
|
|
// CHECK: [[TMP0:%.*]] = tail call <16 x i8> @llvm.ppc.bcdcopysign(<16 x i8> %a, <16 x i8> %b)
|
|
// CHECK-NEXT: ret <16 x i8> [[TMP0]]
|
|
vector unsigned char test_bcdcopysign(vector unsigned char a, vector unsigned char b) {
|
|
return __builtin_ppc_bcdcopysign(a, b);
|
|
}
|
|
|
|
// CHECK-LABEL: test_bcdsetsign_imm0
|
|
// CHECK: [[TMP0:%.*]] = tail call <16 x i8> @llvm.ppc.bcdsetsign(<16 x i8> %a, i32 0)
|
|
// CHECK-NEXT: ret <16 x i8> [[TMP0]]
|
|
vector unsigned char test_bcdsetsign_imm0(vector unsigned char a) {
|
|
return __builtin_ppc_bcdsetsign(a, '\0');
|
|
}
|
|
|
|
// CHECK-LABEL: test_bcdsetsign_imm1
|
|
// CHECK: [[TMP0:%.*]] = tail call <16 x i8> @llvm.ppc.bcdsetsign(<16 x i8> %a, i32 1)
|
|
// CHECK-NEXT: ret <16 x i8> [[TMP0]]
|
|
vector unsigned char test_bcdsetsign_imm1(vector unsigned char a) {
|
|
return __builtin_ppc_bcdsetsign(a, '\1');
|
|
}
|
|
|
|
// CHECK-LABEL: test_bcdshift_imm0
|
|
// CHECK: [[TMP0:%.*]] = tail call <16 x i8> @llvm.ppc.bcdshift(<16 x i8> %a, i32 %b, i32 0)
|
|
// CHECK-NEXT: ret <16 x i8> [[TMP0]]
|
|
vector unsigned char test_bcdshift_imm0(vector unsigned char a, int b, unsigned char c){
|
|
return __builtin_ppc_bcdshift(a,b,'\0');
|
|
}
|
|
|
|
// CHECK-LABEL: test_bcdshift_imm1
|
|
// CHECK: [[TMP0:%.*]] = tail call <16 x i8> @llvm.ppc.bcdshift(<16 x i8> %a, i32 %b, i32 1)
|
|
// CHECK-NEXT: ret <16 x i8> [[TMP0]]
|
|
vector unsigned char test_bcdshift_imm1(vector unsigned char a, int b, unsigned char c){
|
|
return __builtin_ppc_bcdshift(a,b,'\1');
|
|
}
|
|
|
|
// CHECK-LABEL: test_bcdshiftround_imm0
|
|
// CHECK: [[TMP0:%.*]] = tail call <16 x i8> @llvm.ppc.bcdshiftround(<16 x i8> %a, i32 %b, i32 0)
|
|
// CHECK-NEXT: ret <16 x i8> [[TMP0]]
|
|
vector unsigned char test_bcdshiftround_imm0(vector unsigned char a,int b, unsigned char c){
|
|
return __builtin_ppc_bcdshiftround(a,b,'\0');
|
|
}
|
|
|
|
// CHECK-LABEL: test_bcdshiftround_imm1
|
|
// CHECK: [[TMP0:%.*]] = tail call <16 x i8> @llvm.ppc.bcdshiftround(<16 x i8> %a, i32 %b, i32 1)
|
|
// CHECK-NEXT: ret <16 x i8> [[TMP0]]
|
|
vector unsigned char test_bcdshiftround_imm1(vector unsigned char a,int b, unsigned char c){
|
|
return __builtin_ppc_bcdshiftround(a,b,'\1');
|
|
}
|
|
|
|
// CHECK-LABEL: test_bcdtruncate_imm0
|
|
// CHECK: [[TMP0:%.*]] = tail call <16 x i8> @llvm.ppc.bcdtruncate(<16 x i8> %a, i32 %b, i32 0)
|
|
// CHECK-NEXT: ret <16 x i8> [[TMP0]]
|
|
vector unsigned char test_bcdtruncate_imm0(vector unsigned char a, int b, unsigned char c){
|
|
return __builtin_ppc_bcdtruncate(a,b,'\0');
|
|
}
|
|
|
|
// CHECK-LABEL: test_bcdtruncate_imm1
|
|
// CHECK: [[TMP0:%.*]] = tail call <16 x i8> @llvm.ppc.bcdtruncate(<16 x i8> %a, i32 %b, i32 1)
|
|
// CHECK-NEXT: ret <16 x i8> [[TMP0]]
|
|
vector unsigned char test_bcdtruncate_imm1(vector unsigned char a, int b, unsigned char c){
|
|
return __builtin_ppc_bcdtruncate(a,b,'\1');
|
|
}
|
|
|
|
// CHECK-LABEL: test_bcdunsignedtruncate
|
|
// CHECK: [[TMP0:%.*]] = tail call <16 x i8> @llvm.ppc.bcdunsignedtruncate(<16 x i8> %a, i32 %b)
|
|
// CHECK-NEXT: ret <16 x i8> [[TMP0]]
|
|
vector unsigned char test_bcdunsignedtruncate(vector unsigned char a, int b) {
|
|
return __builtin_ppc_bcdunsignedtruncate(a, b);
|
|
}
|
|
|
|
// CHECK-LABEL: test_bcdunsignedshift
|
|
// CHECK: [[TMP0:%.*]] = tail call <16 x i8> @llvm.ppc.bcdunsignedshift(<16 x i8> %a, i32 %b)
|
|
// CHECK-NEXT: ret <16 x i8> [[TMP0]]
|
|
vector unsigned char test_bcdunsignedshift(vector unsigned char a, int b){
|
|
return __builtin_ppc_bcdunsignedshift(a,b);
|
|
}
|