Hi again,<br>I'm finally getting some time to work on my m68k backend again. :)<br><br>I was trying to solve the problem that loads from arbitrary addresses need to go through address registers. 68k allows flexible addressing similar to what the x86 can do, only that the adressing base has to reside in an address register:<br>
<br>move.size[b/w/l] <Displacement>(Ax, Dx * Scale[1/2/4/8]), <Dest>  -- Dest = *(Ax + Displacement + Dx * Scale)<br><br>This is very powerful and suits a variant of the X86 backend SelectAddr() pretty well, so I've adapter pieces of that code for my own little backend.<br>
<br>The issue I'm pondering is how to ensure that addresses end up in address registers just before the load. We discussed different alternatives on the list a while back such as pseudo registers and fixup passes; but then today I sat down again and tried something really stupid. In my SelectAddr() hook, which I know is going to be attempted for all loads, I can simply augment the source of the load to include a register copy so I know it's guaranteed to be loading from the correct register class in the end.<br>
<br>I tried mocking this up using the following. (Base is what's returned as the Ax in the move expression above when the DAG is constructed due to SelectAddr().)<br><br>    SDOperand chain = CurDAG->getCopyToReg(Base, M68K::A3, Base);<br>
    Base = CurDAG->getCopyFromReg(chain, M68K::A3, MVT::i32);<br><br>This actually generates valid, but horrible code:<br><br>int deref(int *p) { return *p; } gives<br><br>move.l a0, a3    -- a0 is a live in (first pointer arg)<br>
move.l (a3), d0 -- d0 is a live out (first integer return value)<br>rts<br><br>int deref(int **p) { return **p; } gives<br>
<br>move.l a0, a3<br>move.l (a3), d0<br>move.l d0, a3<br>move.l (a3), d0<br>
rts<br>
<br>Could this work (given there's a way to correctly get a hold of a virtual register of address type rather than hard coding A3) or am I missing something?<br><br>// Andreas<br>