forked from OSchip/llvm-project
Enable _rotl, _lrotl, _rotr, _lrotr on all platforms.
The above builtins are currently implemented for MSVC mode, however GCC also implements these. This patch enables them for all platforms. Additionally, this corrects the type for these builtins to always be 'long int' to match the specification in the Intel Intrinsics Guide. Change-Id: Ida34be98078709584ef5136c8761783435ec02b1 llvm-svn: 355322
This commit is contained in:
parent
f3feb6adb9
commit
ac8d1b7017
|
@ -830,13 +830,13 @@ LANGBUILTIN(__popcnt64, "UWiUWi", "nc", ALL_MS_LANGUAGES)
|
|||
LANGBUILTIN(_ReturnAddress, "v*", "n", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(_rotl8, "UcUcUc", "n", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(_rotl16, "UsUsUc", "n", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(_rotl, "UiUii", "n", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(_lrotl, "UNiUNii", "n", ALL_MS_LANGUAGES)
|
||||
BUILTIN(_rotl, "UiUii", "n")
|
||||
BUILTIN(_lrotl, "ULiULii", "n")
|
||||
LANGBUILTIN(_rotl64, "UWiUWii", "n", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(_rotr8, "UcUcUc", "n", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(_rotr16, "UsUsUc", "n", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(_rotr, "UiUii", "n", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(_lrotr, "UNiUNii", "n", ALL_MS_LANGUAGES)
|
||||
BUILTIN(_rotr, "UiUii", "n")
|
||||
BUILTIN(_lrotr, "ULiULii", "n")
|
||||
LANGBUILTIN(_rotr64, "UWiUWii", "n", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(__va_start, "vc**.", "nt", ALL_MS_LANGUAGES)
|
||||
LANGBUILTIN(__fastfail, "vUi", "nr", ALL_MS_LANGUAGES)
|
||||
|
|
|
@ -12,17 +12,10 @@
|
|||
// RUN: | FileCheck %s --check-prefixes CHECK,CHECK-32BIT-LONG
|
||||
// RUN: %clang_cc1 -ffreestanding -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 \
|
||||
// RUN: -triple x86_64--linux -emit-llvm %s -o - \
|
||||
// RUN: | FileCheck %s --check-prefixes CHECK,CHECK-32BIT-LONG
|
||||
// RUN: | FileCheck %s --check-prefixes CHECK,CHECK-64BIT-LONG
|
||||
// RUN: %clang_cc1 -ffreestanding -fms-extensions \
|
||||
// RUN: -triple x86_64--darwin -emit-llvm %s -o - \
|
||||
// RUN: | FileCheck %s --check-prefixes CHECK,CHECK-32BIT-LONG
|
||||
|
||||
// LP64 targets use 'long' as 'int' for MS intrinsics (-fms-extensions)
|
||||
#ifdef __LP64__
|
||||
#define LONG int
|
||||
#else
|
||||
#define LONG long
|
||||
#endif
|
||||
// RUN: | FileCheck %s --check-prefixes CHECK,CHECK-64BIT-LONG
|
||||
|
||||
// rotate left
|
||||
|
||||
|
@ -47,12 +40,15 @@ unsigned int test_rotl(unsigned int value, int shift) {
|
|||
// CHECK: [[R:%.*]] = call i32 @llvm.fshl.i32(i32 [[X:%.*]], i32 [[X]], i32 [[Y:%.*]])
|
||||
// CHECK: ret i32 [[R]]
|
||||
|
||||
unsigned LONG test_lrotl(unsigned LONG value, int shift) {
|
||||
unsigned long test_lrotl(unsigned long value, int shift) {
|
||||
return _lrotl(value, shift);
|
||||
}
|
||||
// CHECK-32BIT-LONG: i32 @test_lrotl
|
||||
// CHECK-32BIT-LONG: [[R:%.*]] = call i32 @llvm.fshl.i32(i32 [[X:%.*]], i32 [[X]], i32 [[Y:%.*]])
|
||||
// CHECK-32BIT-LONG: ret i32 [[R]]
|
||||
// CHECK-64BIT-LONG: i64 @test_lrotl
|
||||
// CHECK-64BIT-LONG: [[R:%.*]] = call i64 @llvm.fshl.i64(i64 [[X:%.*]], i64 [[X]], i64 [[Y:%.*]])
|
||||
// CHECK-64BIT-LONG: ret i64 [[R]]
|
||||
|
||||
unsigned __int64 test_rotl64(unsigned __int64 value, int shift) {
|
||||
return _rotl64(value, shift);
|
||||
|
@ -84,12 +80,15 @@ unsigned int test_rotr(unsigned int value, int shift) {
|
|||
// CHECK: [[R:%.*]] = call i32 @llvm.fshr.i32(i32 [[X:%.*]], i32 [[X]], i32 [[Y:%.*]])
|
||||
// CHECK: ret i32 [[R]]
|
||||
|
||||
unsigned LONG test_lrotr(unsigned LONG value, int shift) {
|
||||
unsigned long test_lrotr(unsigned long value, int shift) {
|
||||
return _lrotr(value, shift);
|
||||
}
|
||||
// CHECK-32BIT-LONG: i32 @test_lrotr
|
||||
// CHECK-32BIT-LONG: [[R:%.*]] = call i32 @llvm.fshr.i32(i32 [[X:%.*]], i32 [[X]], i32 [[Y:%.*]])
|
||||
// CHECK-32BIT-LONG: ret i32 [[R]]
|
||||
// CHECK-64BIT-LONG: i64 @test_lrotr
|
||||
// CHECK-64BIT-LONG: [[R:%.*]] = call i64 @llvm.fshr.i64(i64 [[X:%.*]], i64 [[X]], i64 [[Y:%.*]])
|
||||
// CHECK-64BIT-LONG: ret i64 [[R]]
|
||||
|
||||
unsigned __int64 test_rotr64(unsigned __int64 value, int shift) {
|
||||
return _rotr64(value, shift);
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
// RUN: %clang_cc1 -ffreestanding \
|
||||
// RUN: -triple i686--linux -emit-llvm %s -o - \
|
||||
// RUN: | FileCheck %s --check-prefixes CHECK,CHECK-32BIT-LONG
|
||||
|
||||
// RUN: %clang_cc1 -ffreestanding \
|
||||
// RUN: -triple x86_64--linux -emit-llvm %s -o - \
|
||||
// RUN: | FileCheck %s --check-prefixes CHECK,CHECK-64BIT-LONG
|
||||
|
||||
unsigned int test_rotl(unsigned int value, int shift) {
|
||||
return _rotl(value, shift);
|
||||
}
|
||||
// CHECK: i32 @test_rotl
|
||||
// CHECK: [[R:%.*]] = call i32 @llvm.fshl.i32(i32 [[X:%.*]], i32 [[X]], i32 [[Y:%.*]])
|
||||
// CHECK: ret i32 [[R]]
|
||||
|
||||
unsigned long test_lrotl(unsigned long value, int shift) {
|
||||
return _lrotl(value, shift);
|
||||
}
|
||||
// CHECK-32BIT-LONG: i32 @test_lrotl
|
||||
// CHECK-32BIT-LONG: [[R:%.*]] = call i32 @llvm.fshl.i32(i32 [[X:%.*]], i32 [[X]], i32 [[Y:%.*]])
|
||||
// CHECK-32BIT-LONG: ret i32 [[R]]
|
||||
// CHECK-64BIT-LONG: i64 @test_lrotl
|
||||
// CHECK-64BIT-LONG: [[R:%.*]] = call i64 @llvm.fshl.i64(i64 [[X:%.*]], i64 [[X]], i64 [[Y:%.*]])
|
||||
// CHECK-64BIT-LONG: ret i64 [[R]]
|
||||
|
||||
|
||||
unsigned int test_rotr(unsigned int value, int shift) {
|
||||
return _rotr(value, shift);
|
||||
}
|
||||
// CHECK: i32 @test_rotr
|
||||
// CHECK: [[R:%.*]] = call i32 @llvm.fshr.i32(i32 [[X:%.*]], i32 [[X]], i32 [[Y:%.*]])
|
||||
// CHECK: ret i32 [[R]]
|
||||
|
||||
unsigned long test_lrotr(unsigned long value, int shift) {
|
||||
return _lrotr(value, shift);
|
||||
}
|
||||
// CHECK-32BIT-LONG: i32 @test_lrotr
|
||||
// CHECK-32BIT-LONG: [[R:%.*]] = call i32 @llvm.fshr.i32(i32 [[X:%.*]], i32 [[X]], i32 [[Y:%.*]])
|
||||
// CHECK-32BIT-LONG: ret i32 [[R]]
|
||||
// CHECK-64BIT-LONG: i64 @test_lrotr
|
||||
// CHECK-64BIT-LONG: [[R:%.*]] = call i64 @llvm.fshr.i64(i64 [[X:%.*]], i64 [[X]], i64 [[Y:%.*]])
|
||||
// CHECK-64BIT-LONG: ret i64 [[R]]
|
||||
|
Loading…
Reference in New Issue