I'm tracing backwards through the call tree to find where this problem shows up. Call tree is shown below:
ira
reload
cleanup_subreg_operands
alter_subreg
simplify_subreg
Found it. The problem is in the change I made earlier in simplify-rtx. That change was to handle int-to-char conversions, but it doesn't handle long-to-char properly. It was finding the correct register to use after conversion, but the wrong mode, this was described earlier during initial investigation.
The fix was to first convert long-to-int to find the correct register, then int-to-char to complete the conversion.
Finally, I get this code, which is longer than strictly necessary
test
clr r3 # Clear upper word of temp long
mov r2, r4 # Copy lower word of input to temp
ai r4, >30 # Add '0' to temp
jnc $+>4 # Add carry bit to upper word of temp
inc r3
mov r4, r1 # Copy low word of temp into output register
swpb r1 # Move result into position for return
b *r11
A better result would be more this like:
test
ai r2, >30 # Add '0' to low word of input
mov r2, r1 # Copy result into output register
swpb r1 # Move result into position for return
b *r11
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment