[llvm-commits] [llvm-gcc-4.2] r89898 - in /llvm-gcc-4.2/trunk/gcc/config/i386: i386.c i386.h llvm-i386.cpp
Dale Johannesen
dalej at apple.com
Wed Nov 25 15:49:09 PST 2009
Author: johannes
Date: Wed Nov 25 17:49:09 2009
New Revision: 89898
URL: http://llvm.org/viewvc/llvm-project?rev=89898&view=rev
Log:
Add X86_64_POINTER_CLASS to x86-64 parameter passing logic,
which represents (surprise) a pointer. This has the same
semantics as INTEGER except that it generates i8* in llvm IR
rather than i64. 7375899.
Modified:
llvm-gcc-4.2/trunk/gcc/config/i386/i386.c
llvm-gcc-4.2/trunk/gcc/config/i386/i386.h
llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp
Modified: llvm-gcc-4.2/trunk/gcc/config/i386/i386.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/i386.c?rev=89898&r1=89897&r2=89898&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/i386/i386.c (original)
+++ llvm-gcc-4.2/trunk/gcc/config/i386/i386.c Wed Nov 25 17:49:09 2009
@@ -1294,13 +1294,15 @@
X86_64_X87_CLASS,
X86_64_X87UP_CLASS,
X86_64_COMPLEX_X87_CLASS,
- X86_64_MEMORY_CLASS
+ X86_64_MEMORY_CLASS,
+ X86_64_POINTER_CLASS
};
#endif /* !ENABLE_LLVM */
/* LLVM LOCAL end */
static const char * const x86_64_reg_class_name[] = {
"no", "integer", "integerSI", "sse", "sseSF", "sseDF",
- "sseup", "x87", "x87up", "cplx87", "no"
+ /* LLVM LOCAL */
+ "sseup", "x87", "x87up", "cplx87", "no", "ptr"
};
#define MAX_CLASSES 4
@@ -3303,8 +3305,12 @@
if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
|| (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
return X86_64_INTEGERSI_CLASS;
+ /* LLVM LOCAL begin */
if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
- || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
+ || class1 == X86_64_POINTER_CLASS
+ || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS
+ || class2 == X86_64_POINTER_CLASS)
+ /* LLVM LOCAL end */
return X86_64_INTEGER_CLASS;
/* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class,
@@ -3551,6 +3557,14 @@
classes[1] = X86_64_SSEUP_CLASS;
return 2;
case DImode:
+ /* LLVM LOCAL begin */
+ if (POINTER_TYPE_P(type))
+ {
+ classes[0] = X86_64_POINTER_CLASS;
+ return 1;
+ }
+ /* fall through */
+ /* LLVM LOCAL end */
case SImode:
case HImode:
case QImode:
@@ -3651,6 +3665,8 @@
{
case X86_64_INTEGER_CLASS:
case X86_64_INTEGERSI_CLASS:
+ /* LLVM LOCAL */
+ case X86_64_POINTER_CLASS:
(*int_nregs)++;
break;
case X86_64_SSE_CLASS:
@@ -3764,6 +3780,8 @@
{
case X86_64_INTEGER_CLASS:
case X86_64_INTEGERSI_CLASS:
+ /* LLVM LOCAL */
+ case X86_64_POINTER_CLASS:
return gen_rtx_REG (mode, intreg[0]);
case X86_64_SSE_CLASS:
case X86_64_SSESF_CLASS:
@@ -3799,6 +3817,8 @@
break;
case X86_64_INTEGER_CLASS:
case X86_64_INTEGERSI_CLASS:
+ /* LLVM LOCAL */
+ case X86_64_POINTER_CLASS:
/* Merge TImodes on aligned occasions here too. */
if (i * 8 + 8 > bytes)
tmpmode = mode_for_size ((bytes - i * 8) * BITS_PER_UNIT, MODE_INT, 0);
Modified: llvm-gcc-4.2/trunk/gcc/config/i386/i386.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/i386.h?rev=89898&r1=89897&r2=89898&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/i386/i386.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/i386/i386.h Wed Nov 25 17:49:09 2009
@@ -60,7 +60,8 @@
X86_64_X87_CLASS,
X86_64_X87UP_CLASS,
X86_64_COMPLEX_X87_CLASS,
- X86_64_MEMORY_CLASS
+ X86_64_MEMORY_CLASS,
+ X86_64_POINTER_CLASS
};
#endif /* ENABLE_LLVM */
Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp?rev=89898&r1=89897&r2=89898&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp Wed Nov 25 17:49:09 2009
@@ -838,6 +838,11 @@
totallyEmpty = false;
Bytes -= 8;
break;
+ case X86_64_POINTER_CLASS:
+ Elts.push_back(Type::getInt8PtrTy(Context));
+ totallyEmpty = false;
+ Bytes -= 8;
+ break;
case X86_64_SSE_CLASS:
totallyEmpty = false;
// If it's a SSE class argument, then one of the followings are possible:
@@ -902,6 +907,9 @@
} else if (Class[i+1] == X86_64_INTEGER_CLASS) {
Elts.push_back(VectorType::get(Type::getFloatTy(Context), 2));
Elts.push_back(Type::getInt64Ty(Context));
+ } else if (Class[i+1] == X86_64_POINTER_CLASS) {
+ Elts.push_back(VectorType::get(Type::getFloatTy(Context), 2));
+ Elts.push_back(Type::getInt8PtrTy(Context));
} else if (Class[i+1] == X86_64_NO_CLASS) {
// padding bytes, don't pass
Elts.push_back(Type::getDoubleTy(Context));
@@ -1069,7 +1077,8 @@
return false;
if (NumClasses == 1 &&
- (Class[0] == X86_64_INTEGERSI_CLASS || Class[0] == X86_64_INTEGER_CLASS))
+ (Class[0] == X86_64_INTEGERSI_CLASS || Class[0] == X86_64_INTEGER_CLASS ||
+ Class[0] == X86_64_POINTER_CLASS))
// This will fit in one i64 register.
return false;
@@ -1113,11 +1122,14 @@
if (NumClasses == 1) {
if (Class[0] == X86_64_INTEGERSI_CLASS ||
- Class[0] == X86_64_INTEGER_CLASS) {
+ Class[0] == X86_64_INTEGER_CLASS ||
+ Class[0] == X86_64_POINTER_CLASS) {
// one int register
HOST_WIDE_INT Bytes =
(Mode == BLKmode) ? int_size_in_bytes(type) :
(int) GET_MODE_SIZE(Mode);
+ if (Bytes==8 && Class[0] == X86_64_POINTER_CLASS)
+ return Type::getInt8PtrTy(Context);
if (Bytes>4)
return Type::getInt64Ty(Context);
else if (Bytes>2)
@@ -1135,6 +1147,8 @@
Class[0] == X86_64_NO_CLASS ||
Class[0] == X86_64_INTEGERSI_CLASS)
return Type::getInt64Ty(Context);
+ else if (Class[0] == X86_64_POINTER_CLASS)
+ return Type::getInt8PtrTy(Context);
else if (Class[0] == X86_64_SSE_CLASS || Class[0] == X86_64_SSEDF_CLASS)
return Type::getDoubleTy(Context);
else if (Class[0] == X86_64_SSESF_CLASS)
@@ -1146,6 +1160,8 @@
if (Class[1] == X86_64_INTEGERSI_CLASS ||
Class[1] == X86_64_INTEGER_CLASS)
return Type::getInt64Ty(Context);
+ else if (Class[1] == X86_64_POINTER_CLASS)
+ return Type::getInt8PtrTy(Context);
else if (Class[1] == X86_64_SSE_CLASS || Class[1] == X86_64_SSEDF_CLASS)
return Type::getDoubleTy(Context);
else if (Class[1] == X86_64_SSESF_CLASS)
@@ -1189,6 +1205,9 @@
if (NumClasses == 1 && Class[0] == X86_64_INTEGER_CLASS)
assert(0 && "This type does not need multiple return registers!");
+ if (NumClasses == 1 && Class[0] == X86_64_POINTER_CLASS)
+ assert(0 && "This type does not need multiple return registers!");
+
// classify_argument uses a single X86_64_NO_CLASS as a special case for
// empty structs. Recognize it and don't add any return values in that
// case.
@@ -1202,6 +1221,10 @@
Elts.push_back(Type::getInt64Ty(Context));
Bytes -= 8;
break;
+ case X86_64_POINTER_CLASS:
+ Elts.push_back(Type::getInt8PtrTy(Context));
+ Bytes -= 8;
+ break;
case X86_64_SSE_CLASS:
// If it's a SSE class argument, then one of the followings are possible:
// 1. 1 x SSE, size is 8: 1 x Double.
@@ -1264,6 +1287,9 @@
} else if (Class[i+1] == X86_64_INTEGER_CLASS) {
Elts.push_back(VectorType::get(Type::getFloatTy(Context), 2));
Elts.push_back(Type::getInt64Ty(Context));
+ } else if (Class[i+1] == X86_64_POINTER_CLASS) {
+ Elts.push_back(VectorType::get(Type::getFloatTy(Context), 2));
+ Elts.push_back(Type::getInt8PtrTy(Context));
} else if (Class[i+1] == X86_64_NO_CLASS) {
Elts.push_back(Type::getDoubleTy(Context));
Bytes -= 16;
@@ -1467,7 +1493,8 @@
int NumClasses = ix86_ClassifyArgument(Mode, type, Class, 0);
*DontCheckAlignment= true;
if (NumClasses == 1 && (Class[0] == X86_64_INTEGER_CLASS ||
- Class[0] == X86_64_INTEGERSI_CLASS)) {
+ Class[0] == X86_64_INTEGERSI_CLASS ||
+ Class[0] == X86_64_POINTER_CLASS)) {
// one int register
HOST_WIDE_INT Bytes =
(Mode == BLKmode) ? int_size_in_bytes(type) : (int) GET_MODE_SIZE(Mode);
@@ -1480,8 +1507,10 @@
return true;
}
if (NumClasses == 2 && (Class[0] == X86_64_INTEGERSI_CLASS ||
- Class[0] == X86_64_INTEGER_CLASS)) {
- if (Class[1] == X86_64_INTEGER_CLASS) {
+ Class[0] == X86_64_INTEGER_CLASS ||
+ Class[0] == X86_64_POINTER_CLASS)) {
+ if (Class[1] == X86_64_INTEGER_CLASS ||
+ Class[1] == X86_64_POINTER_CLASS) {
// 16 byte object, 2 int registers
*size = 16;
return true;
More information about the llvm-commits
mailing list