<br><br><div class="gmail_quote">On Mon, Mar 25, 2013 at 4:02 PM, Jakob Stoklund Olesen <span dir="ltr"><<a href="mailto:stoklund@2pi.dk" target="_blank">stoklund@2pi.dk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im"><br>
On Mar 25, 2013, at 2:51 PM, Akira Hatanaka <<a href="mailto:ahatanak@gmail.com">ahatanak@gmail.com</a>> wrote:<br>
<br>
> Yes, it sounds like it will solve the problem.<br>
><br>
> Using the following example where live ranges of accumulators $vreg_acc0 and $vreg_acc1 conflict,<br>
><br>
> MULT $vreg_acc0, $vreg_gpr0, $vreg_gpr1<br>
> MULT $vreg_acc1, $vreg_gpr2, $vreg_gpr3<br>
><br>
> (consumer of $vreg_acc1)<br>
> (consumer of $vreg_acc0)<br>
><br>
> if the register can create new virtual registers $vreg_gpr4 and $vreg_gpr5, I think spilling can be avoided:<br>
><br>
><br>
> MULT $vreg_acc0, $vreg_gpr0, $vreg_gpr1<br>
> copy $vreg_gpr4, $vreg_acc0:lo // spill lo<br>
> copy $vreg_gpr5, $vreg_acc0:hi // spill hi<br>
> MULT $vreg_acc1, $vreg_gpr2, $vreg_gpr3<br>
><br>
> (consumer of $vreg_acc1)<br>
> copy $vreg_acc0:lo, $vreg_gpr4 // restore lo<br>
> copy $vreg_acc0:hi, $vreg_gpr5 // restore hi<br>
> (consumer of $vreg_acc0)<br>
<br>
</div>The cross class spilling doesn't support spilling to multiple registers, though. I thought you could copy the accumulator to a single 64-bit register.<br>
<div class="im"><br></div></blockquote><div><br>The size of general purpose integer registers for mips32 is 32-bit and accumulators are 64-bit registers consisting of 32-bit hi/lo register pairs. So you will need two instructions to copy two 32-bit GPR registers to a 64-bit accumulator register. If spilling to multiple registers is unsupported, perhaps I can I define a new register class consisting of paired GPR registers and pseudo copy instructions? <br>
<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">
> Also, should RA avoid splitting live intervals of accumulators, which creates copy instructions?<br>
<br>
</div>The alternative to live range splitting is spilling, which is usually worse.<br>
<span class="HOEnZb"><font color="#888888"><br></font></span></blockquote><div><br>Here I was assuming register allocator will spill accumulator registers to integer registers instead of directly to stack. In that case, splitting might be worse than spilling since reload requires two GPR-to-accumulator copy instructions while copying one accumulator to another requires four copy instructions (instruction set doesn't have any accumulator-to-accumulator copy instructions):<br>
<br>copy $vreg_gpr0, $vreg_acc0:lo<br>copy $vreg_gpr1, $vreg_acc0:hi<br>
copy $vreg_acc1:lo, $vreg_gpr0 <br>
copy $vreg_acc1:hi, $vreg_gpr1<br>

<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="HOEnZb"><font color="#888888">
/jakob<br>
<br>
</font></span></blockquote></div><br>