Richard Sandiford wrote:
> "Omar Torres" <[EMAIL PROTECTED]> writes:
> More importantly:
>
>> operands[4] = simplify_gen_subreg(QImode,operands[1],HImode,0);
>> operands[5] = simplify_gen_subreg(QImode,operands[1],HImode,1);
>
> ..this code is designed to handle REGs and CONST_INTs correctly,
> and avoid the problem you were seeing. (As Eric says, gen_int_mode
> is the canonical way of generating a correct CONST_INT in cases where
> you do need to create one manually. In this case it's simpler to use
> simplify_gen_subreg though.)
Now, the insn:
(insn 84 5 9 (set (reg:HI 1 %r3)
(const_int 32767 [0x7fff])) 3 {*movhi} (nil)
(nil))
get's split into
(set (reg:QI 1 %r3)
(const_int 127 [0x7f])
(set (reg:QI 2 %r2)
(const_int -1 [0xffffffff])
and my movqi patter is able to match both of this patterns as expected.
But, now the output asm is
move %r2,#0xffffffff
Instead of the expected:
move %r2,#0xff
I am not fully familiar with how to fix this, but seems like there are
at least two ways of fixing this:
1- Detect the sign in the rtl template and manipulate the operand so
that the asm value is outputted. That is, use something like this:
(define_insn "movqi"
[(set (match_operand:QI 0 "nonimmediate_operand" "=r,m")
(match_operand:QI 1 "general_operand" "g,r"))]
""
"*
if (CONST_INT == GET_CODE (operands[1])) {
if (0 > INTVAL(operands[1])) {
fprintf (stderr, \"\nOperand 1 Value: %d, %d\", INTVAL
(operands[1]),0xff & INTVAL (operands[1]) );
operands[1] = gen_rtx_CONST_INT (VOIDmode, 0xff & INTVAL
(operands[1]));
}
}
return \"move.a\t%0,%1\";
")
2- Use a special letter in the asm template, to communicate with the
print_operand() function.
Is there any other way of doing this? If not, is there any advantage
of using one option over the other above?
Thanks,
-Omar