75 X86_64_INTEGERSI_CLASS,
101 if (class1 == class2)
106 if (class1 == X86_64_NO_CLASS)
108 if (class2 == X86_64_NO_CLASS)
112 if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
113 return X86_64_MEMORY_CLASS;
116 if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
117 || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
118 return X86_64_INTEGERSI_CLASS;
119 if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
120 || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
121 return X86_64_INTEGER_CLASS;
124 if (class1 == X86_64_X87_CLASS || class1 == X86_64_X87UP_CLASS
125 || class2 == X86_64_X87_CLASS || class2 == X86_64_X87UP_CLASS)
126 return X86_64_MEMORY_CLASS;
129 return X86_64_SSE_CLASS;
143 switch ( pTypeRef->eTypeClass )
145 case typelib_TypeClass_VOID:
146 classes[0] = X86_64_NO_CLASS;
148 case typelib_TypeClass_CHAR:
149 case typelib_TypeClass_BOOLEAN:
150 case typelib_TypeClass_BYTE:
151 case typelib_TypeClass_SHORT:
152 case typelib_TypeClass_UNSIGNED_SHORT:
153 case typelib_TypeClass_LONG:
154 case typelib_TypeClass_UNSIGNED_LONG:
155 case typelib_TypeClass_HYPER:
156 case typelib_TypeClass_UNSIGNED_HYPER:
157 case typelib_TypeClass_ENUM:
158 if ( ( byteOffset % 8 + pTypeRef->pType->nSize ) <= 4 )
159 classes[0] = X86_64_INTEGERSI_CLASS;
161 classes[0] = X86_64_INTEGER_CLASS;
163 case typelib_TypeClass_FLOAT:
164 if ( ( byteOffset % 8 ) == 0 )
165 classes[0] = X86_64_SSESF_CLASS;
167 classes[0] = X86_64_SSE_CLASS;
169 case typelib_TypeClass_DOUBLE:
170 classes[0] = X86_64_SSEDF_CLASS;
176 case typelib_TypeClass_STRING:
177 case typelib_TypeClass_TYPE:
178 case typelib_TypeClass_ANY:
179 case typelib_TypeClass_TYPEDEF:
180 case typelib_TypeClass_SEQUENCE:
181 case typelib_TypeClass_INTERFACE:
183 case typelib_TypeClass_STRUCT:
184 case typelib_TypeClass_EXCEPTION:
187 TYPELIB_DANGER_GET( &pTypeDescr, pTypeRef );
189 const int UNITS_PER_WORD = 8;
190 int words = ( pTypeDescr->nSize + UNITS_PER_WORD - 1 ) / UNITS_PER_WORD;
194 if ( pTypeDescr->nSize > 16 )
196 TYPELIB_DANGER_RELEASE( pTypeDescr );
200 for (
int i = 0;
i < words;
i++ )
201 classes[
i] = X86_64_NO_CLASS;
203 const typelib_CompoundTypeDescription *pStruct =
reinterpret_cast<const typelib_CompoundTypeDescription*
>( pTypeDescr );
206 for ( sal_Int32 nMember = 0; nMember < pStruct->nMembers; ++nMember )
208 typelib_TypeDescriptionReference *pTypeInStruct = pStruct->ppTypeRefs[ nMember ];
209 int offset = byteOffset + pStruct->pMemberOffsets[ nMember ];
215 TYPELIB_DANGER_RELEASE( pTypeDescr );
219 for (
int i = 0;
i < num;
i++ )
221 int pos = offset / 8;
226 TYPELIB_DANGER_RELEASE( pTypeDescr );
229 for (
int i = 0;
i < words;
i++ )
233 if ( classes[
i] == X86_64_MEMORY_CLASS )
238 if ( classes[
i] == X86_64_SSEUP_CLASS
239 && (
i == 0 || classes[
i - 1] != X86_64_SSE_CLASS ) )
240 classes[
i] = X86_64_SSE_CLASS;
243 if ( classes[
i] == X86_64_X87UP_CLASS
244 && (
i == 0 || classes[
i - 1] != X86_64_X87_CLASS ) )
245 classes[
i] = X86_64_SSE_CLASS;
251 SAL_WARN(
"bridges",
"Unhandled case: pType->eTypeClass == "
252 << pTypeRef->eTypeClass);
272 for ( n--; n >= 0; n-- )
273 switch ( classes[n] )
275 case X86_64_INTEGER_CLASS:
276 case X86_64_INTEGERSI_CLASS:
279 case X86_64_SSE_CLASS:
280 case X86_64_SSESF_CLASS:
281 case X86_64_SSEDF_CLASS:
284 case X86_64_NO_CLASS:
285 case X86_64_SSEUP_CLASS:
287 case X86_64_X87_CLASS:
288 case X86_64_X87UP_CLASS:
293 SAL_WARN(
"bridges",
"Unhandled case: classes[n] == " << classes[n]);
306 void x86_64::fill_struct( typelib_TypeDescriptionReference *pTypeRef,
const sal_uInt64 *pGPR,
const double *pSSE,
void *pStruct )
throw ()
313 sal_uInt64 *pStructAlign =
static_cast<sal_uInt64 *
>( pStruct );
314 for ( n--; n >= 0; n-- )
315 switch ( classes[n] )
317 case X86_64_INTEGER_CLASS:
318 case X86_64_INTEGERSI_CLASS:
319 *pStructAlign++ = *pGPR++;
321 case X86_64_SSE_CLASS:
322 case X86_64_SSESF_CLASS:
323 case X86_64_SSEDF_CLASS:
324 *pStructAlign++ = *
reinterpret_cast<const sal_uInt64 *
>( pSSE++ );
bool examine_argument(typelib_TypeDescriptionReference *pTypeRef, bool bInReturn, int &nUsedGPR, int &nUsedSSE)
bool return_in_hidden_param(typelib_TypeDescriptionReference *pTypeRef)
Does function that returns this type use a hidden parameter, or registers?
static enum x86_64_reg_class merge_classes(enum x86_64_reg_class class1, enum x86_64_reg_class class2)
static int classify_argument(typelib_TypeDescriptionReference *pTypeRef, enum x86_64_reg_class classes[], int byteOffset)
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
void fill_struct(typelib_TypeDescriptionReference *pTypeRef, const sal_uInt64 *pGPR, const double *pSSE, void *pStruct)
struct _typelib_TypeDescription typelib_TypeDescription
#define SAL_WARN(area, stream)