and\\t%0,%1,%2
andi\\t%0,%1,%x2
lui\\t%3,(%X2)>>16\;and\\t%0,%1,%3
- li\\t%@,%X2\;and\\t%0,%1,%@"
+ li\\t%3,%X2\;and\\t%0,%1,%3"
[(set_attr "type" "arith,arith,multi,multi")
(set_attr "mode" "SI")
(set_attr "length" "1,1,2,3")
or\\t%0,%1,%2
ori\\t%0,%1,%x2
lui\\t%3,(%X2)>>16\;or\\t%0,%1,%3
- li\\t%@,%X2\;or\\t%0,%1,%@"
+ li\\t%3,%X2\;or\\t%0,%1,%3"
[(set_attr "type" "arith,arith,multi,multi")
(set_attr "mode" "SI")
(set_attr "length" "1,1,2,3")
xor\\t%0,%1,%2
xori\\t%0,%1,%x2
lui\\t%3,(%X2)>>16\;xor\\t%0,%1,%3
- li\\t%@,%X2\;xor\\t%0,%1,%@"
+ li\\t%3,%X2\;xor\\t%0,%1,%3"
[(set_attr "type" "arith,arith,multi,multi")
(set_attr "mode" "SI")
(set_attr "length" "1,1,2,3")
/* Other kinds of FIX are not handled properly by fold_convert. */
/* Two conversions in a row are not needed unless:
- the intermediate type is narrower than both initial and final, or
+ - the intermediate type and innermost type differ in signedness,
+ and the outermost type is wider than the intermediate, or
- the initial type is a pointer type and the precisions of the
intermediate and final types differ, or
- the final type is a pointer type and the precisions of the
||
TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0)))
> TYPE_PRECISION (TREE_TYPE (t)))
+ && ! ((TREE_CODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)))
+ == INTEGER_TYPE)
+ && (TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0)))
+ == INTEGER_TYPE)
+ && (TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (t, 0)))
+ != TREE_UNSIGNED (TREE_OPERAND (TREE_OPERAND (t, 0), 0)))
+ && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0)))
+ < TYPE_PRECISION (TREE_TYPE (t))))
&& ((TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (t, 0)))
&& (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (t, 0)))
> TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)))))