++ and -- compile with correct precidence now.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@164 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
7b94ee118d
commit
f98b7270f3
1 changed files with 121 additions and 2 deletions
|
@ -3940,14 +3940,133 @@ QCC_def_t *QCC_PR_Expression (int priority)
|
|||
}
|
||||
if (!op)
|
||||
{
|
||||
if (e == NULL)
|
||||
QCC_PR_ParseError(ERR_INTERNAL, "e == null");
|
||||
|
||||
|
||||
if (!STRCMP(pr_token, "++"))
|
||||
{
|
||||
//if the last statement was an ent.float (or something)
|
||||
if (((unsigned)(statements[numstatements-1].op - OP_LOAD_F) < 6 || statements[numstatements-1].op == OP_LOAD_I) && statements[numstatements-1].c == e->ofs)
|
||||
{ //we have our load.
|
||||
QCC_def_t *e3;
|
||||
//the only inefficiency here is with an extra temp (we can't reuse the origional)
|
||||
//this is not a problem, as the optimise temps or locals marshalling can clean these up for us
|
||||
qcc_usefulstatement=true;
|
||||
//load
|
||||
//add to temp
|
||||
//store temp to offset
|
||||
//return origional loaded (which is not at the same offset as the pointer we store to)
|
||||
e2 = QCC_GetTemp(type_float);
|
||||
e3 = QCC_GetTemp(type_pointer);
|
||||
QCC_PR_SimpleStatement(OP_ADDRESS, statements[numstatements-1].a, statements[numstatements-1].b, e3->ofs);
|
||||
if (e->type->type == ev_float)
|
||||
{
|
||||
QCC_PR_Statement3(&pr_opcodes[OP_ADD_F], e, QCC_MakeFloatDef(1), e2);
|
||||
QCC_PR_Statement3(&pr_opcodes[OP_STOREP_F], e2, e3, NULL);
|
||||
}
|
||||
else if (e->type->type == ev_integer)
|
||||
{
|
||||
QCC_PR_Statement3(&pr_opcodes[OP_ADD_I], e, QCC_MakeIntDef(1), e2);
|
||||
QCC_PR_Statement3(&pr_opcodes[OP_STOREP_I], e2, e3, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
QCC_PR_ParseError(ERR_PARSEERRORS, "-- suffix operator results in nonstandard behaviour. Use -=1 or prefix form instead");
|
||||
QCC_PR_IncludeChunk("-=1", false, NULL);
|
||||
}
|
||||
QCC_FreeTemp(e2);
|
||||
QCC_FreeTemp(e3);
|
||||
}
|
||||
else if (e->type->type == ev_float)
|
||||
{
|
||||
//copy to temp
|
||||
//add to origional
|
||||
//return temp (which == origional)
|
||||
QCC_PR_ParseWarning(WARN_INEFFICIENTPLUSPLUS, "++ suffix operator results in inefficient behaviour. Use +=1 or prefix form instead");
|
||||
qcc_usefulstatement=true;
|
||||
|
||||
e2 = QCC_GetTemp(type_float);
|
||||
QCC_PR_Statement3(&pr_opcodes[OP_STORE_F], e, e2, NULL);
|
||||
QCC_PR_Statement3(&pr_opcodes[OP_ADD_F], e, QCC_MakeFloatDef(1), e);
|
||||
QCC_FreeTemp(e);
|
||||
e = e2;
|
||||
}
|
||||
else if (e->type->type == ev_integer)
|
||||
{
|
||||
QCC_PR_ParseWarning(WARN_INEFFICIENTPLUSPLUS, "++ suffix operator results in inefficient behaviour. Use +=1 or prefix form instead");
|
||||
qcc_usefulstatement=true;
|
||||
|
||||
e2 = QCC_GetTemp(type_integer);
|
||||
QCC_PR_Statement3(&pr_opcodes[OP_STORE_I], e, e2, NULL);
|
||||
QCC_PR_Statement3(&pr_opcodes[OP_ADD_I], e, QCC_MakeIntDef(1), e);
|
||||
QCC_FreeTemp(e);
|
||||
e = e2;
|
||||
}
|
||||
else
|
||||
{
|
||||
QCC_PR_ParseWarning(WARN_NOTSTANDARDBEHAVIOUR, "++ suffix operator results in nonstandard behaviour. Use +=1 or prefix form instead");
|
||||
QCC_PR_IncludeChunk("+=1", false, NULL);
|
||||
}
|
||||
QCC_PR_Lex();
|
||||
}
|
||||
else if (!STRCMP(pr_token, "--"))
|
||||
{
|
||||
if (((unsigned)(statements[numstatements-1].op - OP_LOAD_F) < 6 || statements[numstatements-1].op == OP_LOAD_I) && statements[numstatements-1].c == e->ofs)
|
||||
{ //we have our load.
|
||||
QCC_def_t *e3;
|
||||
//load
|
||||
//add to temp
|
||||
//store temp to offset
|
||||
//return origional loaded (which is not at the same offset as the pointer we store to)
|
||||
e2 = QCC_GetTemp(type_float);
|
||||
e3 = QCC_GetTemp(type_pointer);
|
||||
QCC_PR_SimpleStatement(OP_ADDRESS, statements[numstatements-1].a, statements[numstatements-1].b, e3->ofs);
|
||||
if (e->type->type == ev_float)
|
||||
{
|
||||
QCC_PR_Statement3(&pr_opcodes[OP_SUB_F], e, QCC_MakeFloatDef(1), e2);
|
||||
QCC_PR_Statement3(&pr_opcodes[OP_STOREP_F], e2, e3, NULL);
|
||||
}
|
||||
else if (e->type->type == ev_integer)
|
||||
{
|
||||
QCC_PR_Statement3(&pr_opcodes[OP_SUB_I], e, QCC_MakeIntDef(1), e2);
|
||||
QCC_PR_Statement3(&pr_opcodes[OP_STOREP_I], e2, e3, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
QCC_PR_ParseError(ERR_PARSEERRORS, "-- suffix operator results in nonstandard behaviour. Use -=1 or prefix form instead");
|
||||
QCC_PR_IncludeChunk("-=1", false, NULL);
|
||||
}
|
||||
QCC_FreeTemp(e2);
|
||||
QCC_FreeTemp(e3);
|
||||
}
|
||||
else if (e->type->type == ev_float)
|
||||
{
|
||||
QCC_PR_ParseWarning(WARN_INEFFICIENTPLUSPLUS, "-- suffix operator results in inefficient behaviour. Use -=1 or prefix form instead");
|
||||
qcc_usefulstatement=true;
|
||||
|
||||
e2 = QCC_GetTemp(type_float);
|
||||
QCC_PR_Statement3(&pr_opcodes[OP_STORE_F], e, e2, NULL);
|
||||
QCC_PR_Statement3(&pr_opcodes[OP_SUB_F], e, QCC_MakeFloatDef(1), e);
|
||||
QCC_FreeTemp(e);
|
||||
e = e2;
|
||||
}
|
||||
else if (e->type->type == ev_integer)
|
||||
{
|
||||
QCC_PR_ParseWarning(WARN_INEFFICIENTPLUSPLUS, "-- suffix operator results in inefficient behaviour. Use -=1 or prefix form instead");
|
||||
qcc_usefulstatement=true;
|
||||
|
||||
e2 = QCC_GetTemp(type_integer);
|
||||
QCC_PR_Statement3(&pr_opcodes[OP_STORE_I], e, e2, NULL);
|
||||
QCC_PR_Statement3(&pr_opcodes[OP_SUB_I], e, QCC_MakeIntDef(1), e);
|
||||
QCC_FreeTemp(e);
|
||||
e = e2;
|
||||
}
|
||||
else
|
||||
{
|
||||
QCC_PR_ParseWarning(WARN_NOTSTANDARDBEHAVIOUR, "-- suffix operator results in nonstandard behaviour. Use -=1 or prefix form instead");
|
||||
QCC_PR_IncludeChunk("-=1", false, NULL);
|
||||
}
|
||||
QCC_PR_Lex();
|
||||
}
|
||||
break; // next token isn't at this priority level
|
||||
|
|
Loading…
Reference in a new issue