Kaydet (Commit) 6b839347 authored tarafından Luboš Luňák's avatar Luboš Luňák

fix gcc inline assembler operands usage

Apparently whoever did these didn't get the gcc docs and specified
every operand only as input, and then added volatile, explicit
initialization and what not until it worked. Specify output operands
correctly instead.
I couldn't verify all assembler variants, as I don't know them,
but the ones I don't know had at least some proper usage of output
operands, so I'll assume those are all correct.

Change-Id: I2910308b5e00cce8db756496df50ed26cfe35bb6
üst 8d48e779
...@@ -67,11 +67,11 @@ void callVirtualMethod( ...@@ -67,11 +67,11 @@ void callVirtualMethod(
// never called // never called
if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address something if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address something
volatile long edx = 0, eax = 0; // for register returns long edx, eax; // for register returns
void * stackptr = 0; void * stackptr;
asm volatile ( asm volatile (
"mov %%esp, %6\n\t" "mov %%esp, %2\n\t"
"mov %0, %%eax\n\t" "mov %3, %%eax\n\t"
"mov %%eax, %%edx\n\t" "mov %%eax, %%edx\n\t"
// stack padding to keep stack aligned: // stack padding to keep stack aligned:
"shl $2, %%eax\n\t" "shl $2, %%eax\n\t"
...@@ -83,28 +83,27 @@ void callVirtualMethod( ...@@ -83,28 +83,27 @@ void callVirtualMethod(
"mov %%edx, %%eax\n\t" "mov %%edx, %%eax\n\t"
"dec %%edx\n\t" "dec %%edx\n\t"
"shl $2, %%edx\n\t" "shl $2, %%edx\n\t"
"add %1, %%edx\n" "add %4, %%edx\n"
"Lcopy:\n\t" "Lcopy:\n\t"
"pushl 0(%%edx)\n\t" "pushl 0(%%edx)\n\t"
"sub $4, %%edx\n\t" "sub $4, %%edx\n\t"
"dec %%eax\n\t" "dec %%eax\n\t"
"jne Lcopy\n\t" "jne Lcopy\n\t"
// do the actual call // do the actual call
"mov %2, %%edx\n\t" "mov %5, %%edx\n\t"
"mov 0(%%edx), %%edx\n\t" "mov 0(%%edx), %%edx\n\t"
"mov %3, %%eax\n\t" "mov %6, %%eax\n\t"
"shl $2, %%eax\n\t" "shl $2, %%eax\n\t"
"add %%eax, %%edx\n\t" "add %%eax, %%edx\n\t"
"mov 0(%%edx), %%edx\n\t" "mov 0(%%edx), %%edx\n\t"
"call *%%edx\n\t" "call *%%edx\n\t"
// save return registers // save return registers
"mov %%eax, %4\n\t" "mov %%eax, %0\n\t"
"mov %%edx, %5\n\t" "mov %%edx, %1\n\t"
// cleanup stack // cleanup stack
"mov %6, %%esp\n\t" "mov %2, %%esp\n\t"
: : "=m"(eax), "=m"(edx), "=m"(stackptr)
: "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr), : "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr), "m"(nVtableIndex)
"m"(nVtableIndex), "m"(eax), "m"(edx), "m"(stackptr)
: "eax", "edx" ); : "eax", "edx" );
switch( pReturnTypeDescr->eTypeClass ) switch( pReturnTypeDescr->eTypeClass )
{ {
......
...@@ -62,44 +62,43 @@ void CPPU_CURRENT_NAMESPACE::callVirtualMethod( ...@@ -62,44 +62,43 @@ void CPPU_CURRENT_NAMESPACE::callVirtualMethod(
if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address something if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address something
#endif #endif
volatile long edx = 0, eax = 0; // for register returns long edx, eax; // for register returns
void * stackptr; void * stackptr;
asm volatile ( asm volatile (
"mov %%esp, %6\n\t" "mov %%esp, %2\n\t"
// preserve potential 128bit stack alignment // preserve potential 128bit stack alignment
"and $0xfffffff0, %%esp\n\t" "and $0xfffffff0, %%esp\n\t"
"mov %0, %%eax\n\t" "mov %3, %%eax\n\t"
"lea -4(,%%eax,4), %%eax\n\t" "lea -4(,%%eax,4), %%eax\n\t"
"and $0xf, %%eax\n\t" "and $0xf, %%eax\n\t"
"sub $0xc, %%eax\n\t" "sub $0xc, %%eax\n\t"
"add %%eax, %%esp\n\t" "add %%eax, %%esp\n\t"
// copy values // copy values
"mov %0, %%eax\n\t" "mov %3, %%eax\n\t"
"mov %%eax, %%edx\n\t" "mov %%eax, %%edx\n\t"
"dec %%edx\n\t" "dec %%edx\n\t"
"shl $2, %%edx\n\t" "shl $2, %%edx\n\t"
"add %1, %%edx\n" "add %4, %%edx\n"
"Lcopy:\n\t" "Lcopy:\n\t"
"pushl 0(%%edx)\n\t" "pushl 0(%%edx)\n\t"
"sub $4, %%edx\n\t" "sub $4, %%edx\n\t"
"dec %%eax\n\t" "dec %%eax\n\t"
"jne Lcopy\n\t" "jne Lcopy\n\t"
// do the actual call // do the actual call
"mov %2, %%edx\n\t" "mov %5, %%edx\n\t"
"mov 0(%%edx), %%edx\n\t" "mov 0(%%edx), %%edx\n\t"
"mov %3, %%eax\n\t" "mov %6, %%eax\n\t"
"shl $2, %%eax\n\t" "shl $2, %%eax\n\t"
"add %%eax, %%edx\n\t" "add %%eax, %%edx\n\t"
"mov 0(%%edx), %%edx\n\t" "mov 0(%%edx), %%edx\n\t"
"call *%%edx\n\t" "call *%%edx\n\t"
// save return registers // save return registers
"mov %%eax, %4\n\t" "mov %%eax, %0\n\t"
"mov %%edx, %5\n\t" "mov %%edx, %1\n\t"
// cleanup stack // cleanup stack
"mov %6, %%esp\n\t" "mov %2, %%esp\n\t"
: : "=m"(eax), "=m"(edx), "=m"(stackptr)
: "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr), : "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr), "m"(nVtableIndex)
"m"(nVtableIndex), "m"(eax), "m"(edx), "m"(stackptr)
: "eax", "ecx", "edx" ); : "eax", "ecx", "edx" );
switch( pReturnTypeDescr->eTypeClass ) switch( pReturnTypeDescr->eTypeClass )
{ {
......
...@@ -70,9 +70,9 @@ void callVirtualMethod( void * pAdjustedThisPtr, ...@@ -70,9 +70,9 @@ void callVirtualMethod( void * pAdjustedThisPtr,
// never called // never called
if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address something if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address something
volatile long o0 = 0, o1 = 0; // for register returns long o0, o1; // for register returns
volatile double f0d = 0; double f0d;
volatile float f0f = 0; float f0f;
volatile long long saveReg[7]; volatile long long saveReg[7];
__asm__ ( __asm__ (
...@@ -231,12 +231,15 @@ void callVirtualMethod( void * pAdjustedThisPtr, ...@@ -231,12 +231,15 @@ void callVirtualMethod( void * pAdjustedThisPtr,
"ldd [%%l7], %%o4\n\t" "ldd [%%l7], %%o4\n\t"
"add %%l7, 8, %%l7\n\t" "add %%l7, 8, %%l7\n\t"
"ldd [%%l7], %%l6\n\t" "ldd [%%l7], %%l6\n\t"
: : :
"m"(o0), "=m"(o0),
"m"(o1), "=m"(o1),
"m"(f0d), "=m"(f0d),
"m"(f0f), "=m"(f0f),
:
"r"(&saveReg[0]) "r"(&saveReg[0])
:
"memory"
); );
switch( eReturnType ) switch( eReturnType )
{ {
......
...@@ -70,11 +70,11 @@ void callVirtualMethod( ...@@ -70,11 +70,11 @@ void callVirtualMethod(
// never called // never called
if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address something if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address something
volatile long edx = 0, eax = 0; // for register returns long edx, eax; // for register returns
void * stackptr = 0; void * stackptr;
asm volatile ( asm volatile (
"mov %%esp, %6\n\t" "mov %%esp, %2\n\t"
"mov %0, %%eax\n\t" "mov %3, %%eax\n\t"
"mov %%eax, %%edx\n\t" "mov %%eax, %%edx\n\t"
// stack padding to keep stack aligned: // stack padding to keep stack aligned:
"shl $2, %%eax\n\t" "shl $2, %%eax\n\t"
...@@ -86,28 +86,27 @@ void callVirtualMethod( ...@@ -86,28 +86,27 @@ void callVirtualMethod(
"mov %%edx, %%eax\n\t" "mov %%edx, %%eax\n\t"
"dec %%edx\n\t" "dec %%edx\n\t"
"shl $2, %%edx\n\t" "shl $2, %%edx\n\t"
"add %1, %%edx\n" "add %4, %%edx\n"
"Lcopy:\n\t" "Lcopy:\n\t"
"pushl 0(%%edx)\n\t" "pushl 0(%%edx)\n\t"
"sub $4, %%edx\n\t" "sub $4, %%edx\n\t"
"dec %%eax\n\t" "dec %%eax\n\t"
"jne Lcopy\n\t" "jne Lcopy\n\t"
// do the actual call // do the actual call
"mov %2, %%edx\n\t" "mov %5, %%edx\n\t"
"mov 0(%%edx), %%edx\n\t" "mov 0(%%edx), %%edx\n\t"
"mov %3, %%eax\n\t" "mov %6, %%eax\n\t"
"shl $2, %%eax\n\t" "shl $2, %%eax\n\t"
"add %%eax, %%edx\n\t" "add %%eax, %%edx\n\t"
"mov 0(%%edx), %%edx\n\t" "mov 0(%%edx), %%edx\n\t"
"call *%%edx\n\t" "call *%%edx\n\t"
// save return registers // save return registers
"mov %%eax, %4\n\t" "mov %%eax, %0\n\t"
"mov %%edx, %5\n\t" "mov %%edx, %1\n\t"
// cleanup stack // cleanup stack
"mov %6, %%esp\n\t" "mov %2, %%esp\n\t"
: : "=m"(eax), "=m"(edx), "=m"(stackptr)
: "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr), : "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr), "m"(nVtableIndex)
"m"(nVtableIndex), "m"(eax), "m"(edx), "m"(stackptr)
: "eax", "ecx", "edx" ); : "eax", "ecx", "edx" );
switch( pReturnTypeDescr->eTypeClass ) switch( pReturnTypeDescr->eTypeClass )
{ {
...@@ -131,10 +130,10 @@ void callVirtualMethod( ...@@ -131,10 +130,10 @@ void callVirtualMethod(
*(unsigned char*)pRegisterReturn = eax; *(unsigned char*)pRegisterReturn = eax;
break; break;
case typelib_TypeClass_FLOAT: case typelib_TypeClass_FLOAT:
asm ( "fstps %0" : : "m"(*(char *)pRegisterReturn) ); asm ( "fstps %0" : "=m"(*(char *)pRegisterReturn) );
break; break;
case typelib_TypeClass_DOUBLE: case typelib_TypeClass_DOUBLE:
asm ( "fstpl %0\n\t" : : "m"(*(char *)pRegisterReturn) ); asm ( "fstpl %0\n\t" : "=m"(*(char *)pRegisterReturn) );
break; break;
default: { default: {
sal_Int32 const nRetSize = pReturnTypeDescr->nSize; sal_Int32 const nRetSize = pReturnTypeDescr->nSize;
......
...@@ -57,37 +57,36 @@ static void callVirtualMethod( ...@@ -57,37 +57,36 @@ static void callVirtualMethod(
// never called // never called
if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address something if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address something
volatile long edx = 0, eax = 0; // for register returns long edx, eax; // for register returns
void * stackptr; void * stackptr;
asm volatile ( asm volatile (
"mov %%esp, %6\n\t" "mov %%esp, %2\n\t"
// copy values // copy values
"mov %0, %%eax\n\t" "mov %3, %%eax\n\t"
"mov %%eax, %%edx\n\t" "mov %%eax, %%edx\n\t"
"dec %%edx\n\t" "dec %%edx\n\t"
"shl $2, %%edx\n\t" "shl $2, %%edx\n\t"
"add %1, %%edx\n" "add %4, %%edx\n"
"Lcopy:\n\t" "Lcopy:\n\t"
"pushl 0(%%edx)\n\t" "pushl 0(%%edx)\n\t"
"sub $4, %%edx\n\t" "sub $4, %%edx\n\t"
"dec %%eax\n\t" "dec %%eax\n\t"
"jne Lcopy\n\t" "jne Lcopy\n\t"
// do the actual call // do the actual call
"mov %2, %%edx\n\t" "mov %5, %%edx\n\t"
"mov 0(%%edx), %%edx\n\t" "mov 0(%%edx), %%edx\n\t"
"mov %3, %%eax\n\t" "mov %6, %%eax\n\t"
"shl $2, %%eax\n\t" "shl $2, %%eax\n\t"
"add %%eax, %%edx\n\t" "add %%eax, %%edx\n\t"
"mov 0(%%edx), %%edx\n\t" "mov 0(%%edx), %%edx\n\t"
"call *%%edx\n\t" "call *%%edx\n\t"
// save return registers // save return registers
"mov %%eax, %4\n\t" "mov %%eax, %0\n\t"
"mov %%edx, %5\n\t" "mov %%edx, %1\n\t"
// cleanup stack // cleanup stack
"mov %6, %%esp\n\t" "mov %2, %%esp\n\t"
: : "=m"(eax), "=m"(edx), "=m"(stackptr)
: "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr), : "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr), "m"(nVtableIndex)
"m"(nVtableIndex), "m"(eax), "m"(edx), "m"(stackptr)
: "eax", "ecx", "edx" ); : "eax", "ecx", "edx" );
switch( eReturnType ) switch( eReturnType )
{ {
......
...@@ -68,9 +68,9 @@ void callVirtualMethod( void * pAdjustedThisPtr, ...@@ -68,9 +68,9 @@ void callVirtualMethod( void * pAdjustedThisPtr,
// never called // never called
if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address something if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address something
volatile long o0 = 0, o1 = 0; // for register returns long o0, o1; // for register returns
volatile double f0d = 0; double f0d;
volatile float f0f = 0; float f0f;
volatile long long saveReg[7]; volatile long long saveReg[7];
__asm__ ( __asm__ (
...@@ -229,12 +229,14 @@ void callVirtualMethod( void * pAdjustedThisPtr, ...@@ -229,12 +229,14 @@ void callVirtualMethod( void * pAdjustedThisPtr,
"ldd [%%l7], %%o4\n\t" "ldd [%%l7], %%o4\n\t"
"add %%l7, 8, %%l7\n\t" "add %%l7, 8, %%l7\n\t"
"ldd [%%l7], %%l6\n\t" "ldd [%%l7], %%l6\n\t"
: : :
"m"(o0), "=m"(o0),
"m"(o1), "=m"(o1),
"m"(f0d), "=m"(f0d),
"m"(f0f), "=m"(f0f),
:
"r"(&saveReg[0]) "r"(&saveReg[0])
: "memory"
); );
switch( eReturnType ) switch( eReturnType )
{ {
......
...@@ -56,37 +56,36 @@ void CPPU_CURRENT_NAMESPACE::callVirtualMethod( ...@@ -56,37 +56,36 @@ void CPPU_CURRENT_NAMESPACE::callVirtualMethod(
// never called // never called
if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address something if (! pAdjustedThisPtr) CPPU_CURRENT_NAMESPACE::dummy_can_throw_anything("xxx"); // address something
volatile long edx = 0, eax = 0; // for register returns long edx, eax; // for register returns
void * stackptr; void * stackptr;
asm volatile ( asm volatile (
"mov %%esp, %6\n\t" "mov %%esp, %2\n\t"
// copy values // copy values
"mov %0, %%eax\n\t" "mov %3, %%eax\n\t"
"mov %%eax, %%edx\n\t" "mov %%eax, %%edx\n\t"
"dec %%edx\n\t" "dec %%edx\n\t"
"shl $2, %%edx\n\t" "shl $2, %%edx\n\t"
"add %1, %%edx\n" "add %4, %%edx\n"
"Lcopy:\n\t" "Lcopy:\n\t"
"pushl 0(%%edx)\n\t" "pushl 0(%%edx)\n\t"
"sub $4, %%edx\n\t" "sub $4, %%edx\n\t"
"dec %%eax\n\t" "dec %%eax\n\t"
"jne Lcopy\n\t" "jne Lcopy\n\t"
// do the actual call // do the actual call
"mov %2, %%edx\n\t" "mov %5, %%edx\n\t"
"mov 0(%%edx), %%edx\n\t" "mov 0(%%edx), %%edx\n\t"
"mov %3, %%eax\n\t" "mov %6, %%eax\n\t"
"shl $2, %%eax\n\t" "shl $2, %%eax\n\t"
"add %%eax, %%edx\n\t" "add %%eax, %%edx\n\t"
"mov 0(%%edx), %%edx\n\t" "mov 0(%%edx), %%edx\n\t"
"call *%%edx\n\t" "call *%%edx\n\t"
// save return registers // save return registers
"mov %%eax, %4\n\t" "mov %%eax, %0\n\t"
"mov %%edx, %5\n\t" "mov %%edx, %1\n\t"
// cleanup stack // cleanup stack
"mov %6, %%esp\n\t" "mov %2, %%esp\n\t"
: : "=m"(eax), "=m"(edx), "=m"(stackptr)
: "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr), : "m"(nStackLongs), "m"(pStackLongs), "m"(pAdjustedThisPtr), "m"(nVtableIndex)
"m"(nVtableIndex), "m"(eax), "m"(edx), "m"(stackptr)
: "eax", "ecx", "edx" ); : "eax", "ecx", "edx" );
switch( returnType->eTypeClass ) switch( returnType->eTypeClass )
{ {
......
...@@ -58,7 +58,7 @@ public: ...@@ -58,7 +58,7 @@ public:
m_ER.pHandlerClass = this; m_ER.pHandlerClass = this;
m_ER.hp = handler; m_ER.hp = handler;
asm("movl %%fs:0, %%eax\n\t" asm("movl %%fs:0, %%eax\n\t"
"movl %%eax, %0": : "m" (m_ER.prev): "%eax" ); "movl %%eax, %0": "=m" (m_ER.prev): : "%eax" );
asm("movl %0, %%eax\n\t" asm("movl %0, %%eax\n\t"
"movl %%eax, %%fs:0": : "r" (&m_ER): "%eax" ); "movl %%eax, %%fs:0": : "r" (&m_ER): "%eax" );
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment