On 6/20/24 7:34 AM, Richard Sandiford wrote:
The iq2000 test and branch instructions had patterns like:

   [(set (pc)
        (if_then_else
         (eq (and:SI (match_operand:SI 0 "register_operand" "r")
                     (match_operand:SI 1 "power_of_2_operand" "I"))
              (const_int 0))
         (match_operand 2 "pc_or_label_operand" "")
         (match_operand 3 "pc_or_label_operand" "")))]

power_of_2_operand allows any 32-bit power of 2, whereas "I" only
accepts 16-bit signed constants.  This meant that any power of 2
greater than 32768 would cause an "insn does not satisfy its
constraints" ICE.

Also, the %p operand modifier barfed on 1<<31, which is sign-
rather than zero-extended to 64 bits.  The code is inherently
limited to 32-bit operands -- power_of_2_operand contains a test
involving "unsigned" -- so this patch just ands with 0xffffffff.

gcc/
        * config/iq2000/iq2000.cc (iq2000_print_operand): Make %p handle 1<<31.
        * config/iq2000/iq2000.md: Remove "I" constraints on
        power_of_2_operands.
OK for the trunk.
jeff

Reply via email to