mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 05:00:16 +03:00
carith and more branch logic (#21002)
* carith() function in exe1.c tests * more branch logic
This commit is contained in:
parent
142d509af2
commit
7d3293c45d
1 changed files with 14 additions and 10 deletions
|
@ -109,7 +109,8 @@ void REGSAVE_restore(const ref REGSAVE regsave, ref CodeBuilder cdb, reg_t reg,
|
|||
|
||||
|
||||
// https://www.scs.stanford.edu/~zyedidia/arm64/b_cond.html
|
||||
bool isBranch(uint ins) { return (ins & ((0xFF << 24) | (1 << 4))) == ((0x54 << 24) | (0 << 4)); }
|
||||
// https://www.scs.stanford.edu/~zyedidia/arm64/bc_cond.html
|
||||
bool isBranch(uint ins) { return (ins & 0xFF00_0000) == 0x5400_0000; }
|
||||
|
||||
enum MARS = true;
|
||||
|
||||
|
@ -1496,7 +1497,7 @@ printf("offset: %lld localsize: %lld REGSIZE*2: %d\n", offset, localsize, REGSIZ
|
|||
break;
|
||||
|
||||
default:
|
||||
if (0) printf("FL: %s\n", fl_str(c.IFL1));
|
||||
if (1) printf("FL: %s\n", fl_str(c.IFL1));
|
||||
assert(0);
|
||||
}
|
||||
}
|
||||
|
@ -1517,10 +1518,10 @@ printf("offset: %lld localsize: %lld REGSIZE*2: %d\n", offset, localsize, REGSIZ
|
|||
@trusted
|
||||
void jmpaddr(code* c)
|
||||
{
|
||||
code* ci,cn,ctarg,cstart;
|
||||
targ_size_t ad;
|
||||
|
||||
//printf("jmpaddr()\n");
|
||||
|
||||
code* ci,cn,ctarg,cstart;
|
||||
uint ad;
|
||||
cstart = c; /* remember start of code */
|
||||
while (c)
|
||||
{
|
||||
|
@ -1538,7 +1539,7 @@ void jmpaddr(code* c)
|
|||
}
|
||||
if (!ci)
|
||||
goto Lbackjmp; // couldn't find it
|
||||
c.Iop |= cast(uint)(ad >> 2) << 5;
|
||||
c.Iop |= (ad >> 2) << 5;
|
||||
c.IFL1 = FL.unde;
|
||||
}
|
||||
if (op == LOOP && c.IFL1 == FL.code) /* backwards refs */
|
||||
|
@ -1555,7 +1556,7 @@ void jmpaddr(code* c)
|
|||
ad += calccodsize(ci);
|
||||
ci = code_next(ci);
|
||||
}
|
||||
c.Iop = cast(uint)(-(ad >> 2)) << 5;
|
||||
c.Iop = (-(ad >> 2)) << 5;
|
||||
c.IFL1 = FL.unde;
|
||||
}
|
||||
c = code_next(c);
|
||||
|
@ -1605,8 +1606,7 @@ uint calccodsize(code* c)
|
|||
@trusted
|
||||
uint codout(int seg, code* c, Barray!ubyte* disasmBuf, ref targ_size_t framehandleroffset)
|
||||
{
|
||||
code* cn;
|
||||
uint flags;
|
||||
//printf("codout()\n");
|
||||
|
||||
debug
|
||||
if (debugc) printf("codout(%p), Coffset = x%llx\n",c,cast(ulong)Offset(seg));
|
||||
|
@ -1618,6 +1618,9 @@ uint codout(int seg, code* c, Barray!ubyte* disasmBuf, ref targ_size_t framehand
|
|||
ggen.framehandleroffset = framehandleroffset;
|
||||
ggen.disasmBuf = disasmBuf;
|
||||
|
||||
code* cn;
|
||||
uint flags;
|
||||
|
||||
for (; c; c = code_next(c))
|
||||
{
|
||||
debug
|
||||
|
@ -1681,7 +1684,8 @@ uint codout(int seg, code* c, Barray!ubyte* disasmBuf, ref targ_size_t framehand
|
|||
if (ggen.available() < 4)
|
||||
ggen.flush();
|
||||
|
||||
if (c.IFL1 == FL.block) // branch to a block - compute offset
|
||||
if (isBranch(op) && c.IFL1 == FL.block)
|
||||
|
||||
{
|
||||
ggen.flush();
|
||||
int ad = cast(int)(c.IEV1.Vblock.Boffset - ggen.offset);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue