Skip to content

Commit

Permalink
Issue 6505 - Wrong code for expression involving 8 floats, only with -O
Browse files Browse the repository at this point in the history
  • Loading branch information
WalterBright committed Aug 23, 2011
1 parent 6570430 commit a92f6bf
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 1 deletion.
20 changes: 20 additions & 0 deletions src/backend/cgen.c
Expand Up @@ -512,6 +512,26 @@ code *genadjesp(code *c, int offset)
return c;
}

/********************************
* Generate 'instruction' which tells the scheduler that the fpu stack has
* changed.
*/

code *genadjfpu(code *c, int offset)
{ code cs;

if (!I16 && offset)
{
cs.Iop = ESCAPE | ESCadjfpu;
cs.Iflags = 0;
cs.Irex = 0;
cs.IEV2.Vint = offset;
return gen(c,&cs);
}
else
return c;
}

/********************************
* Generate 'nop'
*/
Expand Down
9 changes: 8 additions & 1 deletion src/backend/cgsched.c
Expand Up @@ -1348,6 +1348,11 @@ STATIC void getinfo(Cinfo *ci,code *c)
c->Iflags |= CFpsw;
break;

case ESCAPE:
if (c->Iop == (ESCAPE | ESCadjfpu))
ci->fpuadjust = c->IEV2.Vint;
break;

case 0xD0:
case 0xD1:
case 0xD2:
Expand Down Expand Up @@ -2691,7 +2696,9 @@ code *schedule(code *c,regm_t scratch)
sch.initialize(0); // initialize scheduling table
while (c)
{
if ((c->Iop == NOP || (c->Iop & 0xFF) == ESCAPE || c->Iflags & CFclassinit) &&
if ((c->Iop == NOP ||
((c->Iop & 0xFF) == ESCAPE && c->Iop != (ESCAPE | ESCadjfpu)) ||
c->Iflags & CFclassinit) &&
!(c->Iflags & (CFtarg | CFtarg2)))
{ code *cn;

Expand Down
2 changes: 2 additions & 0 deletions src/backend/cod1.c
Expand Up @@ -3081,6 +3081,7 @@ STATIC code * funccall(elem *e,unsigned numpara,unsigned numalign,regm_t *pretre

if (retregs & mST0)
{
c = genadjfpu(c, 1);
if (*pretregs) // if we want the result
{ //assert(stackused == 0);
push87(); // one item on 8087 stack
Expand All @@ -3092,6 +3093,7 @@ STATIC code * funccall(elem *e,unsigned numpara,unsigned numalign,regm_t *pretre
}
else if (retregs & mST01)
{
c = genadjfpu(c, 2);
if (*pretregs) // if we want the result
{ assert(stackused == 0);
push87();
Expand Down
2 changes: 2 additions & 0 deletions src/backend/code.h
Expand Up @@ -244,6 +244,7 @@ extern regm_t BYTEREGS;
#define ESCframeptr (10 << 8) // replace with load of frame pointer
#define ESCdctor (11 << 8) // D object is constructed
#define ESCddtor (12 << 8) // D object is destructed
#define ESCadjfpu (13 << 8) // adjust fpustackused by IEV2.Vint

#define ASM 0x36 // string of asm bytes, actually an SS: opcode

Expand Down Expand Up @@ -876,6 +877,7 @@ code *genlinnum(code *,Srcpos);
void cgen_linnum(code **pc,Srcpos srcpos);
void cgen_prelinnum(code **pc,Srcpos srcpos);
code *genadjesp(code *c, int offset);
code *genadjfpu(code *c, int offset);
code *gennop(code *);
code *genshift(code *);
code *movregconst (code *c , unsigned reg , targ_size_t value , regm_t flags );
Expand Down

0 comments on commit a92f6bf

Please sign in to comment.