aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/CBackend/CBackend.cpp
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2008-04-02 19:40:14 +0000
committerDan Gohman <gohman@apple.com>2008-04-02 19:40:14 +0000
commitd761480fe4814ff63ed49889ad3aa5bef541d025 (patch)
tree527b33e748ca0150b5f2b4842b0e1405e75197b5 /lib/Target/CBackend/CBackend.cpp
parenta022e3fc2f2faec2982ac184c98fee28d85a448a (diff)
Partial CBackend support for 128-bit integers. This is needed
now that llvm-gcc is lowering appropriately-sized struct returns to i128 on x86-64. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@49109 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/CBackend/CBackend.cpp')
-rw-r--r--lib/Target/CBackend/CBackend.cpp11
1 files changed, 9 insertions, 2 deletions
diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp
index b05c5696fa..161c6be0f9 100644
--- a/lib/Target/CBackend/CBackend.cpp
+++ b/lib/Target/CBackend/CBackend.cpp
@@ -445,9 +445,11 @@ CWriter::printSimpleType(std::ostream &Out, const Type *Ty, bool isSigned,
return Out << (isSigned?"signed":"unsigned") << " short " << NameSoFar;
else if (NumBits <= 32)
return Out << (isSigned?"signed":"unsigned") << " int " << NameSoFar;
- else {
- assert(NumBits <= 64 && "Bit widths > 64 not implemented yet");
+ else if (NumBits <= 64)
return Out << (isSigned?"signed":"unsigned") << " long long "<< NameSoFar;
+ else {
+ assert(NumBits <= 128 && "Bit widths > 128 not implemented yet");
+ return Out << (isSigned?"llvmInt128":"llvmUInt128") << " " << NameSoFar;
}
}
case Type::FloatTyID: return Out << "float " << NameSoFar;
@@ -1478,6 +1480,11 @@ static void generateCompilerSpecificCode(std::ostream& Out) {
<< "#define __builtin_stack_restore(X) /* noop */\n"
<< "#endif\n\n";
+ Out << "#ifdef __GNUC__ /* 128-bit integer types */\n"
+ << "typedef int __attribute__((mode(TI))) llvmInt128;\n"
+ << "typedef unsigned __attribute__((mode(TI))) llvmUInt128;\n"
+ << "#endif\n\n";
+
// Output target-specific code that should be inserted into main.
Out << "#define CODE_FOR_MAIN() /* Any target-specific code for main()*/\n";
}