mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 08:53:02 +00:00
fixing dymatic abi for ppc, and implement a dymatic abi even for ia32 converter
svn path=/trunk/; revision=25500
This commit is contained in:
parent
3f44d73a4b
commit
22033f60ea
3 changed files with 124 additions and 59 deletions
|
@ -8,25 +8,71 @@
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "any_op.h"
|
#include "any_op.h"
|
||||||
|
|
||||||
CPU_INT ConvertToIA32Process( FILE *outfp, CPU_INT eax, CPU_INT ebp,
|
/*
|
||||||
CPU_INT edx, CPU_INT esp,
|
* eax = register 3
|
||||||
|
* edx = register 4
|
||||||
|
* esp = register 1
|
||||||
|
* ebp = register 31
|
||||||
|
|
||||||
|
* ecx = 8
|
||||||
|
* ebx = 9
|
||||||
|
* esi = 10
|
||||||
|
* edi = 11
|
||||||
|
* mmx/sse/fpu 0 = 12
|
||||||
|
* mmx/sse/fpu 1 = 14
|
||||||
|
* mmx/sse/fpu 2 = 16
|
||||||
|
* mmx/sse/fpu 3 = 18
|
||||||
|
* mmx/sse/fpu 4 = 20
|
||||||
|
* mmx/sse/fpu 5 = 22
|
||||||
|
* mmx/sse/fpu 6 = 24
|
||||||
|
* mmx/sse/fpu 7 = 28
|
||||||
|
*/
|
||||||
|
|
||||||
|
CPU_INT ConvertToIA32Process( FILE *outfp,
|
||||||
PMYBrainAnalys pMystart,
|
PMYBrainAnalys pMystart,
|
||||||
PMYBrainAnalys pMyend, CPU_INT regbits,
|
PMYBrainAnalys pMyend, CPU_INT regbits,
|
||||||
CPU_INT HowManyRegInUse)
|
CPU_INT HowManyRegInUse,
|
||||||
|
CPU_INT *RegTableCount)
|
||||||
{
|
{
|
||||||
|
|
||||||
CPU_INT stack = 0;
|
CPU_INT stack = 0;
|
||||||
CPU_UNINT tmp;
|
CPU_UNINT tmp;
|
||||||
CPU_INT setup_ebp = 0 ; /* 0 = no, 1 = yes */
|
CPU_INT setup_ebp = 0 ; /* 0 = no, 1 = yes */
|
||||||
|
CPU_INT t=0;
|
||||||
|
|
||||||
|
/* Fixme optimze the RegTableCount table */
|
||||||
|
|
||||||
/* Fixme at moment we can not optimze code */
|
|
||||||
//if (HowManyRegInUse > 9)
|
//if (HowManyRegInUse > 9)
|
||||||
if (HowManyRegInUse > 4)
|
if (HowManyRegInUse > 8)
|
||||||
{
|
{
|
||||||
setup_ebp =1; /* we will use ebx as ebp */
|
setup_ebp =1; /* we will use ebx as ebp */
|
||||||
stack = HowManyRegInUse * regbits;
|
stack = HowManyRegInUse * regbits;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (RegTableCount[1]!=0)
|
||||||
|
t++;
|
||||||
|
if (RegTableCount[3]!=0)
|
||||||
|
t++;
|
||||||
|
if (RegTableCount[4]!=0)
|
||||||
|
t++;
|
||||||
|
if (RegTableCount[8]!=0)
|
||||||
|
t++;
|
||||||
|
if (RegTableCount[9]!=0)
|
||||||
|
t++;
|
||||||
|
if (RegTableCount[10]!=0)
|
||||||
|
t++;
|
||||||
|
if (RegTableCount[11]!=0)
|
||||||
|
t++;
|
||||||
|
if (RegTableCount[31]!=0)
|
||||||
|
t++;
|
||||||
|
|
||||||
|
if (HowManyRegInUse != t)
|
||||||
|
{
|
||||||
|
/* fixme optimze the table or active the frame pointer */
|
||||||
|
setup_ebp =1; /* we will use ebx as ebp */
|
||||||
|
stack = HowManyRegInUse * regbits;
|
||||||
|
}
|
||||||
|
|
||||||
fprintf(outfp,"BITS 32\n");
|
fprintf(outfp,"BITS 32\n");
|
||||||
fprintf(outfp,"GLOBAL _main\n");
|
fprintf(outfp,"GLOBAL _main\n");
|
||||||
fprintf(outfp,"SECTION .text\n\n");
|
fprintf(outfp,"SECTION .text\n\n");
|
||||||
|
@ -42,19 +88,7 @@ CPU_INT ConvertToIA32Process( FILE *outfp, CPU_INT eax, CPU_INT ebp,
|
||||||
fprintf(outfp,"mov ebx,esp\n");
|
fprintf(outfp,"mov ebx,esp\n");
|
||||||
fprintf(outfp,"sub esp, %d ; Alloc %d bytes for reg\n\n",stack,stack);
|
fprintf(outfp,"sub esp, %d ; Alloc %d bytes for reg\n\n",stack,stack);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
0 EAX
|
|
||||||
1 ECX
|
|
||||||
2 EDX
|
|
||||||
5 EBX
|
|
||||||
6 ESP
|
|
||||||
7 EBP
|
|
||||||
8 ESI
|
|
||||||
9 EDI
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(outfp,"; Start the program \n");
|
fprintf(outfp,"; Start the program \n");
|
||||||
while (pMystart!=NULL)
|
while (pMystart!=NULL)
|
||||||
|
@ -75,34 +109,74 @@ CPU_INT ConvertToIA32Process( FILE *outfp, CPU_INT eax, CPU_INT ebp,
|
||||||
{
|
{
|
||||||
/* source are imm */
|
/* source are imm */
|
||||||
|
|
||||||
if (pMystart->dst == eax)
|
/*
|
||||||
|
* esi = 10
|
||||||
|
* edi = 11 */
|
||||||
|
|
||||||
|
/* eax */
|
||||||
|
if (pMystart->dst == RegTableCount[3])
|
||||||
{
|
{
|
||||||
if (pMystart->src == 0)
|
if (pMystart->src == 0)
|
||||||
fprintf(outfp,"xor eax,eax\n");
|
fprintf(outfp,"xor eax,eax\n");
|
||||||
else
|
else
|
||||||
fprintf(outfp,"mov eax,%llu\n",pMystart->src);
|
fprintf(outfp,"mov eax,%llu\n",pMystart->src);
|
||||||
}
|
}
|
||||||
else if (pMystart->dst == ebp)
|
/* ebp */
|
||||||
|
else if (pMystart->dst == RegTableCount[31])
|
||||||
{
|
{
|
||||||
if (pMystart->src == 0)
|
if (pMystart->src == 0)
|
||||||
fprintf(outfp,"xor ebp,ebp\n");
|
fprintf(outfp,"xor ebp,ebp\n");
|
||||||
else
|
else
|
||||||
fprintf(outfp,"mov ebp,%llu\n",pMystart->src);
|
fprintf(outfp,"mov ebp,%llu\n",pMystart->src);
|
||||||
}
|
}
|
||||||
else if (pMystart->dst == edx)
|
/* edx */
|
||||||
|
else if (pMystart->dst == RegTableCount[4])
|
||||||
{
|
{
|
||||||
if (pMystart->src == 0)
|
if (pMystart->src == 0)
|
||||||
fprintf(outfp,"xor edx,edx\n");
|
fprintf(outfp,"xor edx,edx\n");
|
||||||
else
|
else
|
||||||
fprintf(outfp,"mov edx,%llu\n",pMystart->src);
|
fprintf(outfp,"mov edx,%llu\n",pMystart->src);
|
||||||
}
|
}
|
||||||
else if (pMystart->dst == esp)
|
/* esp */
|
||||||
|
else if (pMystart->dst == RegTableCount[1])
|
||||||
{
|
{
|
||||||
if (pMystart->src == 0)
|
if (pMystart->src == 0)
|
||||||
fprintf(outfp,"xor esp,esp\n");
|
fprintf(outfp,"xor esp,esp\n");
|
||||||
else
|
else
|
||||||
fprintf(outfp,"mov esp,%llu\n",pMystart->src);
|
fprintf(outfp,"mov esp,%llu\n",pMystart->src);
|
||||||
}
|
}
|
||||||
|
/* ecx */
|
||||||
|
else if (pMystart->dst == RegTableCount[8])
|
||||||
|
{
|
||||||
|
if (pMystart->src == 0)
|
||||||
|
fprintf(outfp,"xor ecx,ecx\n");
|
||||||
|
else
|
||||||
|
fprintf(outfp,"mov ecx,%llu\n",pMystart->src);
|
||||||
|
}
|
||||||
|
/* ebx */
|
||||||
|
else if (pMystart->dst == RegTableCount[9])
|
||||||
|
{
|
||||||
|
if (pMystart->src == 0)
|
||||||
|
fprintf(outfp,"xor ebx,ebx\n");
|
||||||
|
else
|
||||||
|
fprintf(outfp,"mov ebx,%llu\n",pMystart->src);
|
||||||
|
}
|
||||||
|
/* esi */
|
||||||
|
else if (pMystart->dst == RegTableCount[10])
|
||||||
|
{
|
||||||
|
if (pMystart->src == 0)
|
||||||
|
fprintf(outfp,"xor esi,esi\n");
|
||||||
|
else
|
||||||
|
fprintf(outfp,"mov esi,%llu\n",pMystart->src);
|
||||||
|
}
|
||||||
|
/* edi */
|
||||||
|
else if (pMystart->dst == RegTableCount[10])
|
||||||
|
{
|
||||||
|
if (pMystart->src == 0)
|
||||||
|
fprintf(outfp,"xor edi,edi\n");
|
||||||
|
else
|
||||||
|
fprintf(outfp,"mov edi,%llu\n",pMystart->src);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (setup_ebp == 1)
|
if (setup_ebp == 1)
|
||||||
|
|
|
@ -13,10 +13,6 @@
|
||||||
CPU_INT ConvertProcess(FILE *outfp, CPU_INT FromCpuid, CPU_INT ToCpuid)
|
CPU_INT ConvertProcess(FILE *outfp, CPU_INT FromCpuid, CPU_INT ToCpuid)
|
||||||
{
|
{
|
||||||
CPU_INT ret=0;
|
CPU_INT ret=0;
|
||||||
CPU_INT eax =-1;
|
|
||||||
CPU_INT ebp =-1;
|
|
||||||
CPU_INT edx =-1;
|
|
||||||
CPU_INT esp =-1;
|
|
||||||
CPU_INT regbits=-1;
|
CPU_INT regbits=-1;
|
||||||
CPU_INT HowManyRegInUse = 0;
|
CPU_INT HowManyRegInUse = 0;
|
||||||
CPU_INT RegTableCount[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
CPU_INT RegTableCount[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
||||||
|
@ -31,10 +27,6 @@ CPU_INT ConvertProcess(FILE *outfp, CPU_INT FromCpuid, CPU_INT ToCpuid)
|
||||||
(FromCpuid == IMAGE_FILE_MACHINE_I386))
|
(FromCpuid == IMAGE_FILE_MACHINE_I386))
|
||||||
{
|
{
|
||||||
regbits = 32 / 8;
|
regbits = 32 / 8;
|
||||||
esp = 1;
|
|
||||||
eax = 3;
|
|
||||||
edx = 4;
|
|
||||||
ebp = 31;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME calc where todo first split */
|
/* FIXME calc where todo first split */
|
||||||
|
@ -61,19 +53,19 @@ CPU_INT ConvertProcess(FILE *outfp, CPU_INT FromCpuid, CPU_INT ToCpuid)
|
||||||
if (RegTableCount[t]!=0)
|
if (RegTableCount[t]!=0)
|
||||||
{
|
{
|
||||||
HowManyRegInUse++;
|
HowManyRegInUse++;
|
||||||
|
RegTableCount[t]=t;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* switch to the acual converting now */
|
/* switch to the acual converting now */
|
||||||
switch (ToCpuid)
|
switch (ToCpuid)
|
||||||
{
|
{
|
||||||
case IMAGE_FILE_MACHINE_I386:
|
case IMAGE_FILE_MACHINE_I386:
|
||||||
ret = ConvertToIA32Process( outfp, eax, ebp,
|
ret = ConvertToIA32Process( outfp, pMystart,
|
||||||
edx, esp,
|
|
||||||
pMystart,
|
|
||||||
pMyend, regbits,
|
pMyend, regbits,
|
||||||
HowManyRegInUse);
|
HowManyRegInUse,
|
||||||
|
RegTableCount);
|
||||||
if (ret !=0)
|
if (ret !=0)
|
||||||
{
|
{
|
||||||
printf("should not happen contact a devloper, x86 fail\n");
|
printf("should not happen contact a devloper, x86 fail\n");
|
||||||
|
@ -82,11 +74,10 @@ CPU_INT ConvertProcess(FILE *outfp, CPU_INT FromCpuid, CPU_INT ToCpuid)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IMAGE_FILE_MACHINE_POWERPC:
|
case IMAGE_FILE_MACHINE_POWERPC:
|
||||||
ret = ConvertToPPCProcess( outfp, eax, ebp,
|
ret = ConvertToPPCProcess( outfp, pMystart,
|
||||||
edx, esp,
|
|
||||||
pMystart,
|
|
||||||
pMyend, regbits,
|
pMyend, regbits,
|
||||||
HowManyRegInUse);
|
HowManyRegInUse,
|
||||||
|
RegTableCount);
|
||||||
if (ret !=0)
|
if (ret !=0)
|
||||||
{
|
{
|
||||||
printf("should not happen contact a devloper, x86 fail\n");
|
printf("should not happen contact a devloper, x86 fail\n");
|
||||||
|
|
|
@ -11,18 +11,18 @@
|
||||||
* esp = register 1
|
* esp = register 1
|
||||||
* ebp = register 31
|
* ebp = register 31
|
||||||
|
|
||||||
* ecx = 5
|
* ecx = 8
|
||||||
* ebx = 6
|
* ebx = 9
|
||||||
* esi = 7
|
* esi = 10
|
||||||
* edi = 8
|
* edi = 11
|
||||||
* mmx/sse/fpu 0 = 10
|
* mmx/sse/fpu 0 = 12
|
||||||
* mmx/sse/fpu 1 = 12
|
* mmx/sse/fpu 1 = 14
|
||||||
* mmx/sse/fpu 2 = 14
|
* mmx/sse/fpu 2 = 16
|
||||||
* mmx/sse/fpu 3 = 16
|
* mmx/sse/fpu 3 = 18
|
||||||
* mmx/sse/fpu 4 = 18
|
* mmx/sse/fpu 4 = 20
|
||||||
* mmx/sse/fpu 5 = 20
|
* mmx/sse/fpu 5 = 22
|
||||||
* mmx/sse/fpu 6 = 22
|
* mmx/sse/fpu 6 = 24
|
||||||
* mmx/sse/fpu 7 = 24
|
* mmx/sse/fpu 7 = 28
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct _BrainAnalys
|
typedef struct _BrainAnalys
|
||||||
|
@ -53,16 +53,16 @@ typedef struct _BrainAnalys
|
||||||
extern PMYBrainAnalys pMyBrainAnalys; /* current working address */
|
extern PMYBrainAnalys pMyBrainAnalys; /* current working address */
|
||||||
extern PMYBrainAnalys pStartMyBrainAnalys; /* start address */
|
extern PMYBrainAnalys pStartMyBrainAnalys; /* start address */
|
||||||
|
|
||||||
CPU_INT ConvertToIA32Process( FILE *outfp, CPU_INT eax, CPU_INT ebp,
|
CPU_INT ConvertToIA32Process( FILE *outfp,
|
||||||
CPU_INT edx, CPU_INT esp,
|
|
||||||
PMYBrainAnalys pMystart,
|
PMYBrainAnalys pMystart,
|
||||||
PMYBrainAnalys pMyend, CPU_INT regbits,
|
PMYBrainAnalys pMyend, CPU_INT regbits,
|
||||||
CPU_INT HowManyRegInUse);
|
CPU_INT HowManyRegInUse,
|
||||||
|
CPU_INT *RegTableCount);
|
||||||
|
|
||||||
CPU_INT ConvertToPPCProcess( FILE *outfp, CPU_INT r3, CPU_INT r31,
|
CPU_INT ConvertToPPCProcess( FILE *outfp,
|
||||||
CPU_INT r4, CPU_INT r1,
|
|
||||||
PMYBrainAnalys pMystart,
|
PMYBrainAnalys pMystart,
|
||||||
PMYBrainAnalys pMyend, CPU_INT regbits,
|
PMYBrainAnalys pMyend, CPU_INT regbits,
|
||||||
CPU_INT HowManyRegInUse);
|
CPU_INT HowManyRegInUse,
|
||||||
|
CPU_INT *RegTableCount);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue