diff options
author | Daniel Sanders <daniel.sanders@imgtec.com> | 2014-04-24 16:05:26 +0000 |
---|---|---|
committer | Daniel Sanders <daniel.sanders@imgtec.com> | 2014-04-24 16:05:26 +0000 |
commit | 81ea601b54a45f7eb636d34465fa8ea19582c6ed (patch) | |
tree | 690d73f087d57505fb946265a3c3427a7f597928 | |
parent | 11a9b1b45a8e26b59998f82f435d25384680f80a (diff) | |
download | bcm5719-llvm-81ea601b54a45f7eb636d34465fa8ea19582c6ed.tar.gz bcm5719-llvm-81ea601b54a45f7eb636d34465fa8ea19582c6ed.zip |
[mips] Support 128-bit int in N32 ABI by overriding TargetInfo::hasInt128Type()
Summary: The condition in the base class is rather strange. It says a target has the 128-bit integer type if the size of a pointer is >= 64-bits. N32 has 32-bit pointers but 64-bit integers. I'm a bit reluctant to change this for all targets so this patch makes the method virtual and overrides it for MIPS64.
Reviewers: atanasyan
Reviewed By: atanasyan
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D3472
llvm-svn: 207121
-rw-r--r-- | clang/include/clang/Basic/TargetInfo.h | 2 | ||||
-rw-r--r-- | clang/lib/Basic/Targets.cpp | 2 | ||||
-rw-r--r-- | clang/test/CodeGen/mips-type-sizes-int128.c | 13 | ||||
-rw-r--r-- | clang/test/CodeGen/mips-type-sizes.c | 92 |
4 files changed, 108 insertions, 1 deletions
diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index 24a6fa612c0..f9f7904cb3a 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -283,7 +283,7 @@ public: unsigned getLongLongAlign() const { return LongLongAlign; } /// \brief Determine whether the __int128 type is supported on this target. - bool hasInt128Type() const { return getPointerWidth(0) >= 64; } // FIXME + virtual bool hasInt128Type() const { return getPointerWidth(0) >= 64; } // FIXME /// \brief Return the alignment that is suitable for storing any /// object with a fundamental alignment requirement. diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 59f5a018b0b..f6ccbd17b9b 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -5874,6 +5874,8 @@ public: Aliases = GCCRegAliases; NumAliases = llvm::array_lengthof(GCCRegAliases); } + + bool hasInt128Type() const override { return true; } }; class Mips64EBTargetInfo : public Mips64TargetInfoBase { diff --git a/clang/test/CodeGen/mips-type-sizes-int128.c b/clang/test/CodeGen/mips-type-sizes-int128.c new file mode 100644 index 00000000000..85ad73df9b2 --- /dev/null +++ b/clang/test/CodeGen/mips-type-sizes-int128.c @@ -0,0 +1,13 @@ +// RUN: not %clang_cc1 -triple mips-none-linux-gnu -emit-llvm -w -o - %s 2> %t1 +// RUN: FileCheck --check-prefix=O32 %s < %t1 + +// RUN: %clang_cc1 -triple mips64-none-linux-gnu -emit-llvm -w -target-abi n32 -o - %s | FileCheck --check-prefix=NEW %s +// RUN: %clang_cc1 -triple mips64-none-linux-gnu -emit-llvm -w -o - %s | FileCheck --check-prefix=NEW %s + +// O32 does not support __int128 so it must be tested separately +// N32/N64 behave the same way so their tests have been combined into NEW + +int check_int128() { + return sizeof(__int128); // O32: :[[@LINE]]:17: error: __int128 is not supported on this target +// NEW: ret i32 16 +} diff --git a/clang/test/CodeGen/mips-type-sizes.c b/clang/test/CodeGen/mips-type-sizes.c new file mode 100644 index 00000000000..963b282c016 --- /dev/null +++ b/clang/test/CodeGen/mips-type-sizes.c @@ -0,0 +1,92 @@ +// RUN: %clang_cc1 -triple mips-none-linux-gnu -emit-llvm -w -o - %s | FileCheck --check-prefix=ALL --check-prefix=O32 %s +// RUN: %clang_cc1 -triple mips64-none-linux-gnu -emit-llvm -w -target-abi n32 -o - %s | FileCheck --check-prefix=ALL --check-prefix=N32 %s +// RUN: %clang_cc1 -triple mips64-none-linux-gnu -emit-llvm -w -o - %s | FileCheck --check-prefix=ALL --check-prefix=N64 %s + +int check_char() { + return sizeof(char); +// ALL: ret i32 1 +} + +int check_short() { + return sizeof(short); +// ALL: ret i32 2 +} + +int check_int() { + return sizeof(int); +// ALL: ret i32 4 +} + +int check_long() { + return sizeof(long); +// O32: ret i32 4 +// N32: ret i32 4 +// N64: ret i32 8 +} + +int check_longlong() { + return sizeof(long long); +// ALL: ret i32 8 +} + +int check_fp16() { + return sizeof(__fp16); +// ALL: ret i32 2 +} + +int check_float() { + return sizeof(float); +// ALL: ret i32 4 +} + +int check_double() { + return sizeof(double); +// ALL: ret i32 8 +} + +int check_longdouble() { + return sizeof(long double); +// O32: ret i32 8 +// N32: ret i32 16 +// N64: ret i32 16 +} + +int check_floatComplex() { + return sizeof(float _Complex); +// ALL: ret i32 8 +} + +int check_doubleComplex() { + return sizeof(double _Complex); +// ALL: ret i32 16 +} + +int check_longdoubleComplex() { + return sizeof(long double _Complex); +// O32: ret i32 16 +// N32: ret i32 32 +// N64: ret i32 32 +} + +int check_bool() { + return sizeof(_Bool); +// ALL: ret i32 1 +} + +int check_wchar() { + return sizeof(__WCHAR_TYPE__); +// ALL: ret i32 4 +} + +int check_wchar_is_unsigned() { + return (__WCHAR_TYPE__)-1 > (__WCHAR_TYPE__)0; +// ALL: ret i32 0 +} + +int check_ptr() { + return sizeof(void *); +// O32: ret i32 4 +// N32: ret i32 4 +// N64: ret i32 8 +} + |