mirror of
https://github.com/cc65/cc65.git
synced 2024-11-19 06:31:31 +00:00
Merge pull request #1992 from bbbradsmith/optstackops_toscmpbool_fix
OptStackOps label migration fix
This commit is contained in:
commit
221e6b53ef
@ -1153,6 +1153,8 @@ static unsigned Opt_a_toscmpbool (StackOpData* D, const char* BoolTransformer)
|
||||
|
||||
/* Save lhs into zeropage */
|
||||
AddStoreLhsA (D);
|
||||
/* AddStoreLhsA may have moved the OpIndex, recalculate insertion point to prevent label migration. */
|
||||
D->IP = D->OpIndex + 1;
|
||||
|
||||
/* cmp */
|
||||
X = NewCodeEntry (OP65_CMP, AM65_ZP, D->ZPLo, 0, D->OpEntry->LI);
|
||||
@ -1206,6 +1208,8 @@ static unsigned Opt_a_tosicmp (StackOpData* D)
|
||||
/* RHS src is not directly comparable */
|
||||
X = NewCodeEntry (OP65_STA, AM65_ZP, D->ZPHi, 0, D->OpEntry->LI);
|
||||
InsertEntry (D, X, D->Rhs.A.ChgIndex + 1);
|
||||
/* RHS insertion may have moved the OpIndex, recalculate insertion point to prevent label migration. */
|
||||
D->IP = D->OpIndex + 1;
|
||||
|
||||
/* Cmp with stored RHS */
|
||||
X = NewCodeEntry (OP65_CMP, AM65_ZP, D->ZPHi, 0, D->OpEntry->LI);
|
||||
|
40
test/val/bug1989.c
Normal file
40
test/val/bug1989.c
Normal file
@ -0,0 +1,40 @@
|
||||
|
||||
/* bug #1989 - OptStackOps Opt_a_toscmpbool bypassed a comparison, discovered in 544a49c */
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
unsigned char i,r,j;
|
||||
|
||||
void fail() // for the r=0 case, the == comparison was getting jumped over by OptStackOps
|
||||
{
|
||||
if ((i & 0x1f) == (r ? 0 : 16)) j -=8;
|
||||
}
|
||||
|
||||
void pass()
|
||||
{
|
||||
if ((i & 0x1f) == (unsigned char)(r ? 0 : 16)) j -= 8;
|
||||
}
|
||||
|
||||
void test(unsigned char ti, unsigned char tr, unsigned char tj)
|
||||
{
|
||||
unsigned char rj;
|
||||
i = ti;
|
||||
r = tr;
|
||||
j = tj;
|
||||
pass();
|
||||
rj = j;
|
||||
i = ti;
|
||||
r = tr;
|
||||
j = tj;
|
||||
fail();
|
||||
if (j != rj) exit(1);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
test( 1,0,33);
|
||||
test( 0,0,33);
|
||||
test( 1,1,33);
|
||||
test(16,1,33);
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user