Hello Lang, thanks for the suggestion :) it's very interesting. I'll take a read to the email you've pointed out there to understand how it works. Btw, does this mean that only your allocator is able to handle or support this type of constraint?<br>
<br>As a follow up to my previous email, the following code is a real example of what i was explaining, Lang this example is exactly why i need the constraints and how to combine instructions.<br><br>typedef short t;<br>extern t mcos(t a);<br>
extern t mdiv(t a, t b);<br>t foo(t a, t b)<br>{<br>    short p1 = mcos(b);<br>    short p2 = mcos(a);<br>    return mdiv(p1&p2, p1^p2);<br>}<br><br>This C code produces:<br>; a<- r25:r24   b<--r23:r22<br>    mov    r18, r24<br>
    mov    r19, r25 <-- can be combined into a movw r19:r18, r25:r24<br>    mov    r25, r23<br>    mov    r24, r22 <-- can be combined into a movw r25:r24, r23:r22<br>    call    mcos<br>; here we have the case i was explaining, pairs dont match because they're the other way round, function result is in r25:r24<br>
; but it's storing the hi part in r20 instead of r21, so we cant insert a movw<br>    mov    r20, r25<br>    mov    r21, r24 <--- should be mov r21, r25; mov r20, r24 to be able to insert a movw<br>    mov    r25, r19<br>
    mov    r24, r18 <-- can be combined into a movw r25:r24, r19:r18<br>    call    mcos<br>; same problem as above, again it's moving the hi part in r25 into r18 instead of r19 so we've lost another movw here<br>
    mov    r18, r25 <-- should be mov r19, r25<br>    and    r18, r20<br>    mov    r19, r24 <-- should be mov r18, r24<br>    and    r19, r21<br>    mov    r23, r25 <-- this *<br>    eor    r23, r20<br>    mov    r22, r24 <--  * and this could be combined into movw r23:r22, r25:r24<br>
    eor    r22, r21<br>    mov    r25, r18<br>    mov    r24, r19 <-- because the result returned by the second call to mcos is stored in r18:r19 (other way round)<br>                          ; we've lost another movw<br>
    call    mdiv<br>    ret<br><br>As you can see there are three cases were we've lost the opportunity of inserting a movw. This is a very important instruction because if we're able to insert it everywhere it's possible we can reduce the code in 7 instructions and 7 cycles which is a huge gain. Ignoring these issues the code produced is optimal. I hope this example make things more clearer. Also, as i said in my previous email i wrote a function pass searching for 2 moves in a row and combining them into a movw since i dont know a better way of combining machine instructions, however in this case it wouldnt work for the second half of the program because there are "and" and "xor" instructions in between the moves breaking the simple heuristic the function pass has.<br>
<br>Thanks for the help.<br><br>