On Sun, Jul 7, 2019 at 12:45 PM Segher Boessenkool <segher@xxxxxxxxxxxxxxxxxxx> wrote: > > On Sun, Jul 07, 2019 at 11:41:53AM -0600, Jeff Law wrote: > > On 7/7/19 11:02 AM, William Tambe wrote: > > > (define_constraint "A" > > > "A memory address." > > > (and (match_code "mem") > > > (ior (match_test "GET_CODE (XEXP (op, 0)) == SYMBOL_REF") > > > (match_test "GET_CODE (XEXP (op, 0)) == LABEL_REF") > > > (match_test "GET_CODE (XEXP (op, 0)) == CONST")))) > > > > > > (define_insn "movsi" > > > [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r") > > > (match_operand:SI 1 "general_operand" "A,i"))] > > > "" > > > "@ > > > gip %0, %1 > > > li %0, %1") > > > ---------------------------------------------------------- > > > > > > GCC always choose to match the line "li %0, %1" instead of the line > > > "gip %0, %1". > > > > > > How can I force GCC to match "gip %0, %1" for a symbol ? > > > > > You'd have to debug the register allocation and reloading phase to > > determine what it's doing and why. > > > > And, in general, you want your constraints and predicates to match as > > closely as possible. So in the above case your predicates are > > "nonimmediate_operand and "general_operand". You'd be better off with > > "register_operand" and "immediate_operand" since operand 0's constraints > > only allow registers and operand 1's constraints only allow immediates. > > Yup. And "A" is defined as being a mem, which makes no sense, and its > comment says it is a "memory address". If not much effort, could you please provide the change I should make to my define_contraint ? I tried the following two without success: (define_constraint "A" "A memory address." (ior (match_test "GET_CODE (XEXP (op, 0)) == SYMBOL_REF") (match_test "GET_CODE (XEXP (op, 0)) == LABEL_REF") (match_test "GET_CODE (XEXP (op, 0)) == CONST"))) (define_constraint "A" "A memory address." (ior (match_test "GET_CODE (XEXP (op, 0)) == SYMBOL_REF") (match_test "GET_CODE (XEXP (op, 0)) == LABEL_REF") (and (match_code "mem") (match_test "GET_CODE (XEXP (op, 0)) == CONST")))) > > > Segher