Commit 1165f377 by Hans-Peter Nilsson Committed by Hans-Peter Nilsson

re PR target/23424 (cris.md rtl canonicalization bug)

	PR target/23424
	* config/cris/cris.md ("*mov_side<mode>", "*mov_sidesisf")
	("*mov_side<mode>_mem", "*mov_sidesisf_mem", "*clear_side<mode>")
	("*ext_sideqihi", "*ext_side<mode>si", "*op_side<mode>")
	("*op_swap_side<mode>", "*extopqihi_side", "*extop<mode>si_side")
	("*extopqihi_swap_side", "*extop<mode>si_swap_side"): Have separate,
	swapped, alternatives for the R constraint.

From-SVN: r105473
parent b100540d
2005-10-16 Hans-Peter Nilsson <hp@axis.com> 2005-10-16 Hans-Peter Nilsson <hp@axis.com>
PR target/23424
* config/cris/cris.md ("*mov_side<mode>", "*mov_sidesisf")
("*mov_side<mode>_mem", "*mov_sidesisf_mem", "*clear_side<mode>")
("*ext_sideqihi", "*ext_side<mode>si", "*op_side<mode>")
("*op_swap_side<mode>", "*extopqihi_side", "*extop<mode>si_side")
("*extopqihi_swap_side", "*extop<mode>si_swap_side"): Have separate,
swapped, alternatives for the R constraint.
PR middle-end/24341 PR middle-end/24341
* builtins.c (get_builtin_sync_mode): Make unlimited * builtins.c (get_builtin_sync_mode): Make unlimited
mode_for_size request. mode_for_size request.
......
...@@ -503,38 +503,43 @@ ...@@ -503,38 +503,43 @@
;; Note that "i" is allowed to be a register. ;; Note that "i" is allowed to be a register.
(define_insn "*mov_side<mode>" (define_insn "*mov_side<mode>"
[(set (match_operand:BW 0 "register_operand" "=r,r,r") [(set (match_operand:BW 0 "register_operand" "=r,r,r,r,r")
(mem:BW (mem:BW
(plus:SI (match_operand:SI 1 "cris_bdap_operand" "%r,r,r") (plus:SI (match_operand:SI 1 "cris_bdap_operand" "%r,r,r,R,R")
(match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn")))) (match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn,r,r"))))
(set (match_operand:SI 3 "register_operand" "=*1,r,r") (set (match_operand:SI 3 "register_operand" "=*1,r,r,*2,r")
(plus:SI (match_dup 1) (plus:SI (match_dup 1)
(match_dup 2)))] (match_dup 2)))]
"cris_side_effect_mode_ok (PLUS, operands, 3, 1, 2, -1, 0)" "cris_side_effect_mode_ok (PLUS, operands, 3, 1, 2, -1, 0)"
{ {
if (which_alternative == 0 if ((which_alternative == 0 || which_alternative == 3)
&& (GET_CODE (operands[2]) != CONST_INT && (GET_CODE (operands[2]) != CONST_INT
|| INTVAL (operands[2]) > 127 || INTVAL (operands[2]) > 127
|| INTVAL (operands[2]) < -128 || INTVAL (operands[2]) < -128
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N') || CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N')
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))) || CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')))
return "#"; return "#";
if (which_alternative == 4)
return "move<m> [%3=%2%S1],%0";
return "move<m> [%3=%1%S2],%0"; return "move<m> [%3=%1%S2],%0";
}) })
(define_insn "*mov_sidesisf" (define_insn "*mov_sidesisf"
[(set (match_operand 0 "register_operand" "=r,r,r,x,x,x") [(set (match_operand 0 "register_operand" "=r,r,r,x,x,x,r,r,x,x")
(mem (mem
(plus:SI (plus:SI
(match_operand:SI 1 "cris_bdap_operand" "%r,r,r,r,r,r") (match_operand:SI 1 "cris_bdap_operand" "%r,r,r,r,r,r,R,R,R,R")
(match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn,r>Rn,r,>Rn")))) (match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn,r>Rn,r,>Rn,r,r,r,r"))))
(set (match_operand:SI 3 "register_operand" "=*1,r,r,*1,r,r") (set (match_operand:SI 3 "register_operand" "=*1,r,r,*1,r,r,*2,r,*2,r")
(plus:SI (match_dup 1) (plus:SI (match_dup 1)
(match_dup 2)))] (match_dup 2)))]
"GET_MODE_SIZE (GET_MODE (operands[0])) == UNITS_PER_WORD "GET_MODE_SIZE (GET_MODE (operands[0])) == UNITS_PER_WORD
&& cris_side_effect_mode_ok (PLUS, operands, 3, 1, 2, -1, 0)" && cris_side_effect_mode_ok (PLUS, operands, 3, 1, 2, -1, 0)"
{ {
if ((which_alternative == 0 || which_alternative == 3) if ((which_alternative == 0
|| which_alternative == 3
|| which_alternative == 6
|| which_alternative == 8)
&& (GET_CODE (operands[2]) != CONST_INT && (GET_CODE (operands[2]) != CONST_INT
|| INTVAL (operands[2]) > 127 || INTVAL (operands[2]) > 127
|| INTVAL (operands[2]) < -128 || INTVAL (operands[2]) < -128
...@@ -543,6 +548,10 @@ ...@@ -543,6 +548,10 @@
return "#"; return "#";
if (which_alternative < 3) if (which_alternative < 3)
return "move.%s0 [%3=%1%S2],%0"; return "move.%s0 [%3=%1%S2],%0";
if (which_alternative == 7)
return "move.%s0 [%3=%2%S1],%0";
if (which_alternative == 9)
return "move [%3=%2%S1],%0";
return "move [%3=%1%S2],%0"; return "move [%3=%1%S2],%0";
}) })
...@@ -641,23 +650,25 @@ ...@@ -641,23 +650,25 @@
(define_insn "*mov_side<mode>_mem" (define_insn "*mov_side<mode>_mem"
[(set (mem:BW [(set (mem:BW
(plus:SI (match_operand:SI 0 "cris_bdap_operand" "%r,r,r,r") (plus:SI (match_operand:SI 0 "cris_bdap_operand" "%r,r,r,r,R,R,R")
(match_operand:SI 1 "cris_bdap_operand" "r>Rn,r>Rn,r,>Rn"))) (match_operand:SI 1 "cris_bdap_operand" "r>Rn,r>Rn,r,>Rn,r,r,r")))
(match_operand:BW 2 "register_operand" "r,r,r,r")) (match_operand:BW 2 "register_operand" "r,r,r,r,r,r,r"))
(set (match_operand:SI 3 "register_operand" "=*0,!2,r,r") (set (match_operand:SI 3 "register_operand" "=*0,!*2,r,r,*1,!*2,r")
(plus:SI (match_dup 0) (plus:SI (match_dup 0)
(match_dup 1)))] (match_dup 1)))]
"cris_side_effect_mode_ok (PLUS, operands, 3, 0, 1, -1, 2)" "cris_side_effect_mode_ok (PLUS, operands, 3, 0, 1, -1, 2)"
{ {
if (which_alternative == 0 if ((which_alternative == 0 || which_alternative == 4)
&& (GET_CODE (operands[1]) != CONST_INT && (GET_CODE (operands[1]) != CONST_INT
|| INTVAL (operands[1]) > 127 || INTVAL (operands[1]) > 127
|| INTVAL (operands[1]) < -128 || INTVAL (operands[1]) < -128
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'N') || CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'N')
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'J'))) || CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'J')))
return "#"; return "#";
if (which_alternative == 1) if (which_alternative == 1 || which_alternative == 5)
return "#"; return "#";
if (which_alternative == 6)
return "move.%s2 %2,[%3=%1%S0]";
return "move<m> %2,[%3=%0%S1]"; return "move<m> %2,[%3=%0%S1]";
}) })
...@@ -667,11 +678,11 @@ ...@@ -667,11 +678,11 @@
[(set (mem [(set (mem
(plus:SI (plus:SI
(match_operand:SI (match_operand:SI
0 "cris_bdap_operand" "%r,r,r,r,r,r,r,r") 0 "cris_bdap_operand" "%r,r,r,r,r,r,r,r,R,R,R,R,R,R")
(match_operand:SI (match_operand:SI
1 "cris_bdap_operand" "r>Rn,r>Rn,r,>Rn,r>Rn,r>Rn,r,>Rn"))) 1 "cris_bdap_operand" "r>Rn,r>Rn,r,>Rn,r>Rn,r>Rn,r,>Rn,r,r,r,r,r,r")))
(match_operand 2 "register_operand" "r,r,r,r,x,x,x,x")) (match_operand 2 "register_operand" "r,r,r,r,x,x,x,x,r,r,r,x,x,x"))
(set (match_operand:SI 3 "register_operand" "=*0,!2,r,r,*0,!2,r,r") (set (match_operand:SI 3 "register_operand" "=*0,!2,r,r,*0,!2,r,r,*1,!*2,r,*1,!*2,r")
(plus:SI (match_dup 0) (plus:SI (match_dup 0)
(match_dup 1)))] (match_dup 1)))]
"GET_MODE_SIZE (GET_MODE (operands[2])) == UNITS_PER_WORD "GET_MODE_SIZE (GET_MODE (operands[2])) == UNITS_PER_WORD
...@@ -684,10 +695,19 @@ ...@@ -684,10 +695,19 @@
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'N') || CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'N')
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'J'))) || CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'J')))
return "#"; return "#";
if (which_alternative == 1 || which_alternative == 5) if (which_alternative == 1
|| which_alternative == 5
|| which_alternative == 8
|| which_alternative == 9
|| which_alternative == 11
|| which_alternative == 12)
return "#"; return "#";
if (which_alternative < 4) if (which_alternative < 4)
return "move.%s2 %2,[%3=%0%S1]"; return "move.%s2 %2,[%3=%0%S1]";
if (which_alternative == 10)
return "move.%s2 %2,[%3=%1%S0]";
if (which_alternative == 13)
return "move %2,[%3=%1%S0]";
return "move %2,[%3=%0%S1]"; return "move %2,[%3=%0%S1]";
}) })
...@@ -735,21 +755,23 @@ ...@@ -735,21 +755,23 @@
(define_insn "*clear_side<mode>" (define_insn "*clear_side<mode>"
[(set (mem:BWD [(set (mem:BWD
(plus:SI (match_operand:SI 0 "cris_bdap_operand" "%r,r,r") (plus:SI (match_operand:SI 0 "cris_bdap_operand" "%r,r,r,R,R")
(match_operand:SI 1 "cris_bdap_operand" "r>Rn,r,>Rn"))) (match_operand:SI 1 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))
(const_int 0)) (const_int 0))
(set (match_operand:SI 2 "register_operand" "=*0,r,r") (set (match_operand:SI 2 "register_operand" "=*0,r,r,*1,r")
(plus:SI (match_dup 0) (plus:SI (match_dup 0)
(match_dup 1)))] (match_dup 1)))]
"cris_side_effect_mode_ok (PLUS, operands, 2, 0, 1, -1, -1)" "cris_side_effect_mode_ok (PLUS, operands, 2, 0, 1, -1, -1)"
{ {
if (which_alternative == 0 if ((which_alternative == 0 || which_alternative == 3)
&& (GET_CODE (operands[1]) != CONST_INT && (GET_CODE (operands[1]) != CONST_INT
|| INTVAL (operands[1]) > 127 || INTVAL (operands[1]) > 127
|| INTVAL (operands[1]) < -128 || INTVAL (operands[1]) < -128
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'N') || CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'N')
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'J'))) || CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'J')))
return "#"; return "#";
if (which_alternative == 4)
return "clear<m> [%2=%1%S0]";
return "clear<m> [%2=%0%S1]"; return "clear<m> [%2=%0%S1]";
}) })
...@@ -1011,46 +1033,50 @@ ...@@ -1011,46 +1033,50 @@
;; QImode to HImode ;; QImode to HImode
(define_insn "*ext_sideqihi" (define_insn "*ext_sideqihi"
[(set (match_operand:HI 0 "register_operand" "=r,r,r") [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r")
(match_operator:HI (match_operator:HI
4 "cris_extend_operator" 4 "cris_extend_operator"
[(mem:QI (plus:SI [(mem:QI (plus:SI
(match_operand:SI 1 "cris_bdap_operand" "%r,r,r") (match_operand:SI 1 "cris_bdap_operand" "%r,r,r,R,R")
(match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn")))])) (match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))]))
(set (match_operand:SI 3 "register_operand" "=*1,r,r") (set (match_operand:SI 3 "register_operand" "=*1,r,r,*2,r")
(plus:SI (match_dup 1) (plus:SI (match_dup 1)
(match_dup 2)))] (match_dup 2)))]
"cris_side_effect_mode_ok (PLUS, operands, 3, 1, 2, -1, 0)" "cris_side_effect_mode_ok (PLUS, operands, 3, 1, 2, -1, 0)"
{ {
if (which_alternative == 0 if ((which_alternative == 0 || which_alternative == 3)
&& (GET_CODE (operands[2]) != CONST_INT && (GET_CODE (operands[2]) != CONST_INT
|| INTVAL (operands[2]) > 127 || INTVAL (operands[2]) > 127
|| INTVAL (operands[2]) < -128 || INTVAL (operands[2]) < -128
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N') || CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N')
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))) || CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')))
return "#"; return "#";
if (which_alternative == 4)
return "mov%e4.%m4 [%3=%2%S1],%0";
return "mov%e4.%m4 [%3=%1%S2],%0"; return "mov%e4.%m4 [%3=%1%S2],%0";
}) })
(define_insn "*ext_side<mode>si" (define_insn "*ext_side<mode>si"
[(set (match_operand:SI 0 "register_operand" "=r,r,r") [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r")
(match_operator:SI (match_operator:SI
4 "cris_extend_operator" 4 "cris_extend_operator"
[(mem:BW (plus:SI [(mem:BW (plus:SI
(match_operand:SI 1 "cris_bdap_operand" "%r,r,r") (match_operand:SI 1 "cris_bdap_operand" "%r,r,r,R,R")
(match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn")))])) (match_operand:SI 2 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))]))
(set (match_operand:SI 3 "register_operand" "=*1,r,r") (set (match_operand:SI 3 "register_operand" "=*1,r,r,*2,r")
(plus:SI (match_dup 1) (plus:SI (match_dup 1)
(match_dup 2)))] (match_dup 2)))]
"cris_side_effect_mode_ok (PLUS, operands, 3, 1, 2, -1, 0)" "cris_side_effect_mode_ok (PLUS, operands, 3, 1, 2, -1, 0)"
{ {
if (which_alternative == 0 if ((which_alternative == 0 || which_alternative == 3)
&& (GET_CODE (operands[2]) != CONST_INT && (GET_CODE (operands[2]) != CONST_INT
|| INTVAL (operands[2]) > 127 || INTVAL (operands[2]) > 127
|| INTVAL (operands[2]) < -128 || INTVAL (operands[2]) < -128
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N') || CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'N')
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J'))) || CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'J')))
return "#"; return "#";
if (which_alternative == 4)
return "mov%e4<m> [%3=%2%S1],%0";
return "mov%e4<m> [%3=%1%S2],%0"; return "mov%e4<m> [%3=%1%S2],%0";
}) })
...@@ -1307,25 +1333,27 @@ ...@@ -1307,25 +1333,27 @@
;; [rx=ry+i] ([%4=%2+%3]) ;; [rx=ry+i] ([%4=%2+%3])
(define_insn "*op_side<mode>" (define_insn "*op_side<mode>"
[(set (match_operand:BWD 0 "register_operand" "=r,r,r") [(set (match_operand:BWD 0 "register_operand" "=r,r,r,r,r")
(match_operator:BWD (match_operator:BWD
5 "cris_orthogonal_operator" 5 "cris_orthogonal_operator"
[(match_operand:BWD 1 "register_operand" "0,0,0") [(match_operand:BWD 1 "register_operand" "0,0,0,0,0")
(mem:BWD (plus:SI (mem:BWD (plus:SI
(match_operand:SI 2 "cris_bdap_operand" "%r,r,r") (match_operand:SI 2 "cris_bdap_operand" "%r,r,r,R,R")
(match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn")))])) (match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))]))
(set (match_operand:SI 4 "register_operand" "=*2,r,r") (set (match_operand:SI 4 "register_operand" "=*2,r,r,*3,r")
(plus:SI (match_dup 2) (plus:SI (match_dup 2)
(match_dup 3)))] (match_dup 3)))]
"cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)" "cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)"
{ {
if (which_alternative == 0 if ((which_alternative == 0 || which_alternative == 3)
&& (GET_CODE (operands[3]) != CONST_INT && (GET_CODE (operands[3]) != CONST_INT
|| INTVAL (operands[3]) > 127 || INTVAL (operands[3]) > 127
|| INTVAL (operands[3]) < -128 || INTVAL (operands[3]) < -128
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N') || CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N')
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J'))) || CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J')))
return "#"; return "#";
if (which_alternative == 4)
return "%x5.%s0 [%4=%3%S2],%0";
return "%x5<m> [%4=%2%S3],%0"; return "%x5<m> [%4=%2%S3],%0";
}) })
...@@ -1363,25 +1391,27 @@ ...@@ -1363,25 +1391,27 @@
;; QImode ;; QImode
(define_insn "*op_swap_side<mode>" (define_insn "*op_swap_side<mode>"
[(set (match_operand:BWD 0 "register_operand" "=r,r,r") [(set (match_operand:BWD 0 "register_operand" "=r,r,r,r,r")
(match_operator:BWD (match_operator:BWD
5 "cris_commutative_orth_op" 5 "cris_commutative_orth_op"
[(mem:BWD [(mem:BWD
(plus:SI (match_operand:SI 2 "cris_bdap_operand" "%r,r,r") (plus:SI (match_operand:SI 2 "cris_bdap_operand" "%r,r,r,R,R")
(match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn"))) (match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))
(match_operand:BWD 1 "register_operand" "0,0,0")])) (match_operand:BWD 1 "register_operand" "0,0,0,0,0")]))
(set (match_operand:SI 4 "register_operand" "=*2,r,r") (set (match_operand:SI 4 "register_operand" "=*2,r,r,*3,r")
(plus:SI (match_dup 2) (plus:SI (match_dup 2)
(match_dup 3)))] (match_dup 3)))]
"cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)" "cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)"
{ {
if (which_alternative == 0 if ((which_alternative == 0 || which_alternative == 3)
&& (GET_CODE (operands[3]) != CONST_INT && (GET_CODE (operands[3]) != CONST_INT
|| INTVAL (operands[3]) > 127 || INTVAL (operands[3]) > 127
|| INTVAL (operands[3]) < -128 || INTVAL (operands[3]) < -128
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N') || CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N')
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J'))) || CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J')))
return "#"; return "#";
if (which_alternative == 4)
return "%x5<m> [%4=%3%S2],%0";
return "%x5<m> [%4=%2%S3],%0"; return "%x5<m> [%4=%2%S3],%0";
}) })
...@@ -1631,55 +1661,59 @@ ...@@ -1631,55 +1661,59 @@
;; QImode to HImode ;; QImode to HImode
(define_insn "*extopqihi_side" (define_insn "*extopqihi_side"
[(set (match_operand:HI 0 "register_operand" "=r,r,r") [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r")
(match_operator:HI (match_operator:HI
5 "cris_additive_operand_extend_operator" 5 "cris_additive_operand_extend_operator"
[(match_operand:HI 1 "register_operand" "0,0,0") [(match_operand:HI 1 "register_operand" "0,0,0,0,0")
(match_operator:HI (match_operator:HI
6 "cris_extend_operator" 6 "cris_extend_operator"
[(mem:QI [(mem:QI
(plus:SI (match_operand:SI 2 "cris_bdap_operand" "%r,r,r") (plus:SI (match_operand:SI 2 "cris_bdap_operand" "%r,r,r,R,R")
(match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn") (match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")
))])])) ))])]))
(set (match_operand:SI 4 "register_operand" "=*2,r,r") (set (match_operand:SI 4 "register_operand" "=*2,r,r,*3,r")
(plus:SI (match_dup 2) (plus:SI (match_dup 2)
(match_dup 3)))] (match_dup 3)))]
"cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)" "cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)"
{ {
if (which_alternative == 0 if ((which_alternative == 0 || which_alternative == 3)
&& (GET_CODE (operands[3]) != CONST_INT && (GET_CODE (operands[3]) != CONST_INT
|| INTVAL (operands[3]) > 127 || INTVAL (operands[3]) > 127
|| INTVAL (operands[3]) < -128 || INTVAL (operands[3]) < -128
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N') || CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N')
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J'))) || CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J')))
return "#"; return "#";
if (which_alternative == 4)
return "%x5%e6.%m6 [%4=%3%S2],%0";
return "%x5%e6.%m6 [%4=%2%S3],%0"; return "%x5%e6.%m6 [%4=%2%S3],%0";
}) })
(define_insn "*extop<mode>si_side" (define_insn "*extop<mode>si_side"
[(set (match_operand:SI 0 "register_operand" "=r,r,r") [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r")
(match_operator:SI (match_operator:SI
5 "cris_operand_extend_operator" 5 "cris_operand_extend_operator"
[(match_operand:SI 1 "register_operand" "0,0,0") [(match_operand:SI 1 "register_operand" "0,0,0,0,0")
(match_operator:SI (match_operator:SI
6 "cris_extend_operator" 6 "cris_extend_operator"
[(mem:BW [(mem:BW
(plus:SI (match_operand:SI 2 "cris_bdap_operand" "%r,r,r") (plus:SI (match_operand:SI 2 "cris_bdap_operand" "%r,r,r,R,R")
(match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn") (match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")
))])])) ))])]))
(set (match_operand:SI 4 "register_operand" "=*2,r,r") (set (match_operand:SI 4 "register_operand" "=*2,r,r,*3,r")
(plus:SI (match_dup 2) (plus:SI (match_dup 2)
(match_dup 3)))] (match_dup 3)))]
"(GET_CODE (operands[5]) != UMIN || GET_CODE (operands[6]) == ZERO_EXTEND) "(GET_CODE (operands[5]) != UMIN || GET_CODE (operands[6]) == ZERO_EXTEND)
&& cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)" && cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)"
{ {
if (which_alternative == 0 if ((which_alternative == 0 || which_alternative == 3)
&& (GET_CODE (operands[3]) != CONST_INT && (GET_CODE (operands[3]) != CONST_INT
|| INTVAL (operands[3]) > 127 || INTVAL (operands[3]) > 127
|| INTVAL (operands[3]) < -128 || INTVAL (operands[3]) < -128
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N') || CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N')
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J'))) || CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J')))
return "#"; return "#";
if (which_alternative == 4)
return "%x5%e6<m> [%4=%3%S2],%0";
return "%x5%e6<m> [%4=%2%S3],%0"; return "%x5%e6<m> [%4=%2%S3],%0";
}) })
...@@ -1738,52 +1772,56 @@ ...@@ -1738,52 +1772,56 @@
;; QImode to HImode ;; QImode to HImode
(define_insn "*extopqihi_swap_side" (define_insn "*extopqihi_swap_side"
[(set (match_operand:HI 0 "register_operand" "=r,r,r") [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r")
(plus:HI (plus:HI
(match_operator:HI (match_operator:HI
5 "cris_extend_operator" 5 "cris_extend_operator"
[(mem:QI (plus:SI [(mem:QI (plus:SI
(match_operand:SI 2 "cris_bdap_operand" "%r,r,r") (match_operand:SI 2 "cris_bdap_operand" "%r,r,r,R,R")
(match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn")))]) (match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))])
(match_operand:HI 1 "register_operand" "0,0,0"))) (match_operand:HI 1 "register_operand" "0,0,0,0,0")))
(set (match_operand:SI 4 "register_operand" "=*2,r,r") (set (match_operand:SI 4 "register_operand" "=*2,r,r,*3,r")
(plus:SI (match_dup 2) (plus:SI (match_dup 2)
(match_dup 3)))] (match_dup 3)))]
"cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)" "cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)"
{ {
if (which_alternative == 0 if ((which_alternative == 0 || which_alternative == 3)
&& (GET_CODE (operands[3]) != CONST_INT && (GET_CODE (operands[3]) != CONST_INT
|| INTVAL (operands[3]) > 127 || INTVAL (operands[3]) > 127
|| INTVAL (operands[3]) < -128 || INTVAL (operands[3]) < -128
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N') || CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N')
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J'))) || CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J')))
return "#"; return "#";
if (which_alternative == 4)
return "add%e5.b [%4=%3%S2],%0";
return "add%e5.b [%4=%2%S3],%0"; return "add%e5.b [%4=%2%S3],%0";
}) })
(define_insn "*extop<mode>si_swap_side" (define_insn "*extop<mode>si_swap_side"
[(set (match_operand:SI 0 "register_operand" "=r,r,r") [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r")
(match_operator:SI (match_operator:SI
6 "cris_plus_or_bound_operator" 6 "cris_plus_or_bound_operator"
[(match_operator:SI [(match_operator:SI
5 "cris_extend_operator" 5 "cris_extend_operator"
[(mem:BW (plus:SI [(mem:BW (plus:SI
(match_operand:SI 2 "cris_bdap_operand" "%r,r,r") (match_operand:SI 2 "cris_bdap_operand" "%r,r,r,R,R")
(match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn")))]) (match_operand:SI 3 "cris_bdap_operand" "r>Rn,r,>Rn,r,r")))])
(match_operand:SI 1 "register_operand" "0,0,0")])) (match_operand:SI 1 "register_operand" "0,0,0,0,0")]))
(set (match_operand:SI 4 "register_operand" "=*2,r,r") (set (match_operand:SI 4 "register_operand" "=*2,r,r,*3,r")
(plus:SI (match_dup 2) (plus:SI (match_dup 2)
(match_dup 3)))] (match_dup 3)))]
"(GET_CODE (operands[6]) != UMIN || GET_CODE (operands[5]) == ZERO_EXTEND) "(GET_CODE (operands[6]) != UMIN || GET_CODE (operands[5]) == ZERO_EXTEND)
&& cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)" && cris_side_effect_mode_ok (PLUS, operands, 4, 2, 3, -1, 0)"
{ {
if (which_alternative == 0 if ((which_alternative == 0 || which_alternative == 3)
&& (GET_CODE (operands[3]) != CONST_INT && (GET_CODE (operands[3]) != CONST_INT
|| INTVAL (operands[3]) > 127 || INTVAL (operands[3]) > 127
|| INTVAL (operands[3]) < -128 || INTVAL (operands[3]) < -128
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N') || CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'N')
|| CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J'))) || CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'J')))
return "#"; return "#";
if (which_alternative == 4)
return \"%x6%e5.%m5 [%4=%3%S2],%0\";
return "%x6%e5<m> [%4=%2%S3],%0"; return "%x6%e5<m> [%4=%2%S3],%0";
}) })
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment