diff options
Diffstat (limited to 'packages/gcc/gcc-4.1.2/arm-crunch-condexec-disable.patch')
-rw-r--r-- | packages/gcc/gcc-4.1.2/arm-crunch-condexec-disable.patch | 5547 |
1 files changed, 0 insertions, 5547 deletions
diff --git a/packages/gcc/gcc-4.1.2/arm-crunch-condexec-disable.patch b/packages/gcc/gcc-4.1.2/arm-crunch-condexec-disable.patch deleted file mode 100644 index 6bb4370c63..0000000000 --- a/packages/gcc/gcc-4.1.2/arm-crunch-condexec-disable.patch +++ /dev/null @@ -1,5547 +0,0 @@ ---- gcc-4.1.2/gcc/config/arm/arm.md-original 2007-06-27 16:41:36.000000000 +1000 -+++ gcc-4.1.2/gcc/config/arm/arm.md 2007-06-27 17:28:11.000000000 +1000 -@@ -778,18 +778,18 @@ - [(set_attr "conds" "use")] - ) - --(define_insn "incscc" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (plus:SI (match_operator:SI 2 "arm_comparison_operator" -- [(match_operand:CC 3 "cc_register" "") (const_int 0)]) -- (match_operand:SI 1 "s_register_operand" "0,?r")))] -- "TARGET_ARM" -- "@ -- add%d2\\t%0, %1, #1 -- mov%D2\\t%0, %1\;add%d2\\t%0, %1, #1" -- [(set_attr "conds" "use") -- (set_attr "length" "4,8")] --) -+;(define_insn "incscc" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (plus:SI (match_operator:SI 2 "arm_comparison_operator" -+; [(match_operand:CC 3 "cc_register" "") (const_int 0)]) -+; (match_operand:SI 1 "s_register_operand" "0,?r")))] -+; "TARGET_ARM" -+; "@ -+; add%d2\\t%0, %1, #1 -+; mov%D2\\t%0, %1\;add%d2\\t%0, %1, #1" -+; [(set_attr "conds" "use") -+; (set_attr "length" "4,8")] -+;) - - ; transform ((x << y) - 1) to ~(~(x-1) << y) Where X is a constant. - (define_split -@@ -1015,18 +1015,18 @@ - [(set_attr "conds" "set")] - ) - --(define_insn "decscc" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (minus:SI (match_operand:SI 1 "s_register_operand" "0,?r") -- (match_operator:SI 2 "arm_comparison_operator" -- [(match_operand 3 "cc_register" "") (const_int 0)])))] -- "TARGET_ARM" -- "@ -- sub%d2\\t%0, %1, #1 -- mov%D2\\t%0, %1\;sub%d2\\t%0, %1, #1" -- [(set_attr "conds" "use") -- (set_attr "length" "*,8")] --) -+;(define_insn "decscc" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (minus:SI (match_operand:SI 1 "s_register_operand" "0,?r") -+; (match_operator:SI 2 "arm_comparison_operator" -+; [(match_operand 3 "cc_register" "") (const_int 0)])))] -+; "TARGET_ARM" -+; "@ -+; sub%d2\\t%0, %1, #1 -+; mov%D2\\t%0, %1\;sub%d2\\t%0, %1, #1" -+; [(set_attr "conds" "use") -+; (set_attr "length" "*,8")] -+;) - - (define_expand "subsf3" - [(set (match_operand:SF 0 "s_register_operand" "") -@@ -5729,1091 +5729,1091 @@ - ;; For a 'b' pos_range = 2046, neg_range = -2048 giving (-2040->2048). - ;; For a 'b<cond>' pos_range = 254, neg_range = -256 giving (-250 ->256). - --(define_expand "cbranchsi4" -- [(set (pc) (if_then_else -- (match_operator 0 "arm_comparison_operator" -- [(match_operand:SI 1 "s_register_operand" "") -- (match_operand:SI 2 "nonmemory_operand" "")]) -- (label_ref (match_operand 3 "" "")) -- (pc)))] -- "TARGET_THUMB" -- " -- if (thumb_cmpneg_operand (operands[2], SImode)) -- { -- emit_jump_insn (gen_cbranchsi4_scratch (NULL, operands[1], operands[2], -- operands[3], operands[0])); -- DONE; -- } -- if (!thumb_cmp_operand (operands[2], SImode)) -- operands[2] = force_reg (SImode, operands[2]); -- ") -+;(define_expand "cbranchsi4" -+; [(set (pc) (if_then_else -+; (match_operator 0 "arm_comparison_operator" -+; [(match_operand:SI 1 "s_register_operand" "") -+; (match_operand:SI 2 "nonmemory_operand" "")]) -+; (label_ref (match_operand 3 "" "")) -+; (pc)))] -+; "TARGET_THUMB" -+; " -+; if (thumb_cmpneg_operand (operands[2], SImode)) -+; { -+; emit_jump_insn (gen_cbranchsi4_scratch (NULL, operands[1], operands[2], -+; operands[3], operands[0])); -+; DONE; -+; } -+; if (!thumb_cmp_operand (operands[2], SImode)) -+; operands[2] = force_reg (SImode, operands[2]); -+; ") -+ -+;(define_insn "*cbranchsi4_insn" -+; [(set (pc) (if_then_else -+; (match_operator 0 "arm_comparison_operator" -+; [(match_operand:SI 1 "s_register_operand" "l,*h") -+; (match_operand:SI 2 "thumb_cmp_operand" "lI*h,*r")]) -+; (label_ref (match_operand 3 "" "")) -+; (pc)))] -+; "TARGET_THUMB" -+; "* -+; output_asm_insn (\"cmp\\t%1, %2\", operands); -+; -+; switch (get_attr_length (insn)) -+; { -+; case 4: return \"b%d0\\t%l3\"; -+; case 6: return \"b%D0\\t.LCB%=\;b\\t%l3\\t%@long jump\\n.LCB%=:\"; -+; default: return \"b%D0\\t.LCB%=\;bl\\t%l3\\t%@far jump\\n.LCB%=:\"; -+; } -+; " -+; [(set (attr "far_jump") -+; (if_then_else -+; (eq_attr "length" "8") -+; (const_string "yes") -+; (const_string "no"))) -+; (set (attr "length") -+; (if_then_else -+; (and (ge (minus (match_dup 3) (pc)) (const_int -250)) -+; (le (minus (match_dup 3) (pc)) (const_int 256))) -+; (const_int 4) -+; (if_then_else -+; (and (ge (minus (match_dup 3) (pc)) (const_int -2040)) -+; (le (minus (match_dup 3) (pc)) (const_int 2048))) -+; (const_int 6) -+; (const_int 8))))] -+;) - --(define_insn "*cbranchsi4_insn" -- [(set (pc) (if_then_else -- (match_operator 0 "arm_comparison_operator" -- [(match_operand:SI 1 "s_register_operand" "l,*h") -- (match_operand:SI 2 "thumb_cmp_operand" "lI*h,*r")]) -- (label_ref (match_operand 3 "" "")) -- (pc)))] -- "TARGET_THUMB" -- "* -- output_asm_insn (\"cmp\\t%1, %2\", operands); -+;(define_insn "cbranchsi4_scratch" -+; [(set (pc) (if_then_else -+; (match_operator 4 "arm_comparison_operator" -+; [(match_operand:SI 1 "s_register_operand" "l,0") -+; (match_operand:SI 2 "thumb_cmpneg_operand" "L,J")]) -+; (label_ref (match_operand 3 "" "")) -+; (pc))) -+; (clobber (match_scratch:SI 0 "=l,l"))] -+; "TARGET_THUMB" -+; "* -+; output_asm_insn (\"add\\t%0, %1, #%n2\", operands); -+; -+; switch (get_attr_length (insn)) -+; { -+; case 4: return \"b%d4\\t%l3\"; -+; case 6: return \"b%D4\\t.LCB%=\;b\\t%l3\\t%@long jump\\n.LCB%=:\"; -+; default: return \"b%D4\\t.LCB%=\;bl\\t%l3\\t%@far jump\\n.LCB%=:\"; -+; } -+; " -+; [(set (attr "far_jump") -+; (if_then_else -+; (eq_attr "length" "8") -+; (const_string "yes") -+; (const_string "no"))) -+; (set (attr "length") -+; (if_then_else -+; (and (ge (minus (match_dup 3) (pc)) (const_int -250)) -+; (le (minus (match_dup 3) (pc)) (const_int 256))) -+; (const_int 4) -+; (if_then_else -+; (and (ge (minus (match_dup 3) (pc)) (const_int -2040)) -+; (le (minus (match_dup 3) (pc)) (const_int 2048))) -+; (const_int 6) -+; (const_int 8))))] -+;) -+;(define_insn "*movsi_cbranchsi4" -+; [(set (pc) -+; (if_then_else -+; (match_operator 3 "arm_comparison_operator" -+; [(match_operand:SI 1 "s_register_operand" "0,l,l,l") -+; (const_int 0)]) -+; (label_ref (match_operand 2 "" "")) -+; (pc))) -+; (set (match_operand:SI 0 "thumb_cbrch_target_operand" "=l,l,*h,*m") -+; (match_dup 1))] -+; "TARGET_THUMB" -+; "*{ -+; if (which_alternative == 0) -+; output_asm_insn (\"cmp\t%0, #0\", operands); -+; else if (which_alternative == 1) -+; output_asm_insn (\"sub\t%0, %1, #0\", operands); -+; else -+; { -+; output_asm_insn (\"cmp\t%1, #0\", operands); -+; if (which_alternative == 2) -+; output_asm_insn (\"mov\t%0, %1\", operands); -+; else -+; output_asm_insn (\"str\t%1, %0\", operands); -+; } -+; switch (get_attr_length (insn) - ((which_alternative > 1) ? 2 : 0)) -+; { -+; case 4: return \"b%d3\\t%l2\"; -+; case 6: return \"b%D3\\t.LCB%=\;b\\t%l2\\t%@long jump\\n.LCB%=:\"; -+; default: return \"b%D3\\t.LCB%=\;bl\\t%l2\\t%@far jump\\n.LCB%=:\"; -+; } -+; }" -+; [(set (attr "far_jump") -+; (if_then_else -+; (ior (and (gt (symbol_ref ("which_alternative")) -+; (const_int 1)) -+; (eq_attr "length" "8")) -+; (eq_attr "length" "10")) -+; (const_string "yes") -+; (const_string "no"))) -+; (set (attr "length") -+; (if_then_else -+; (le (symbol_ref ("which_alternative")) -+; (const_int 1)) -+; (if_then_else -+; (and (ge (minus (match_dup 2) (pc)) (const_int -250)) -+; (le (minus (match_dup 2) (pc)) (const_int 256))) -+; (const_int 4) -+; (if_then_else -+; (and (ge (minus (match_dup 2) (pc)) (const_int -2040)) -+; (le (minus (match_dup 2) (pc)) (const_int 2048))) -+; (const_int 6) -+; (const_int 8))) -+; (if_then_else -+; (and (ge (minus (match_dup 2) (pc)) (const_int -248)) -+; (le (minus (match_dup 2) (pc)) (const_int 256))) -+; (const_int 6) -+; (if_then_else -+; (and (ge (minus (match_dup 2) (pc)) (const_int -2038)) -+; (le (minus (match_dup 2) (pc)) (const_int 2048))) -+; (const_int 8) -+; (const_int 10)))))] -+;) - -- switch (get_attr_length (insn)) -- { -- case 4: return \"b%d0\\t%l3\"; -- case 6: return \"b%D0\\t.LCB%=\;b\\t%l3\\t%@long jump\\n.LCB%=:\"; -- default: return \"b%D0\\t.LCB%=\;bl\\t%l3\\t%@far jump\\n.LCB%=:\"; -- } -- " -- [(set (attr "far_jump") -- (if_then_else -- (eq_attr "length" "8") -- (const_string "yes") -- (const_string "no"))) -- (set (attr "length") -- (if_then_else -- (and (ge (minus (match_dup 3) (pc)) (const_int -250)) -- (le (minus (match_dup 3) (pc)) (const_int 256))) -- (const_int 4) -- (if_then_else -- (and (ge (minus (match_dup 3) (pc)) (const_int -2040)) -- (le (minus (match_dup 3) (pc)) (const_int 2048))) -- (const_int 6) -- (const_int 8))))] --) -- --(define_insn "cbranchsi4_scratch" -- [(set (pc) (if_then_else -- (match_operator 4 "arm_comparison_operator" -- [(match_operand:SI 1 "s_register_operand" "l,0") -- (match_operand:SI 2 "thumb_cmpneg_operand" "L,J")]) -- (label_ref (match_operand 3 "" "")) -- (pc))) -- (clobber (match_scratch:SI 0 "=l,l"))] -- "TARGET_THUMB" -- "* -- output_asm_insn (\"add\\t%0, %1, #%n2\", operands); -+;(define_insn "*negated_cbranchsi4" -+; [(set (pc) -+; (if_then_else -+; (match_operator 0 "equality_operator" -+; [(match_operand:SI 1 "s_register_operand" "l") -+; (neg:SI (match_operand:SI 2 "s_register_operand" "l"))]) -+; (label_ref (match_operand 3 "" "")) -+; (pc)))] -+; "TARGET_THUMB" -+; "* -+; output_asm_insn (\"cmn\\t%1, %2\", operands); -+; switch (get_attr_length (insn)) -+; { -+; case 4: return \"b%d0\\t%l3\"; -+; case 6: return \"b%D0\\t.LCB%=\;b\\t%l3\\t%@long jump\\n.LCB%=:\"; -+; default: return \"b%D0\\t.LCB%=\;bl\\t%l3\\t%@far jump\\n.LCB%=:\"; -+; } -+; " -+; [(set (attr "far_jump") -+; (if_then_else -+; (eq_attr "length" "8") -+; (const_string "yes") -+; (const_string "no"))) -+; (set (attr "length") -+; (if_then_else -+; (and (ge (minus (match_dup 3) (pc)) (const_int -250)) -+; (le (minus (match_dup 3) (pc)) (const_int 256))) -+; (const_int 4) -+; (if_then_else -+; (and (ge (minus (match_dup 3) (pc)) (const_int -2040)) -+; (le (minus (match_dup 3) (pc)) (const_int 2048))) -+; (const_int 6) -+; (const_int 8))))] -+;) - -- switch (get_attr_length (insn)) -- { -- case 4: return \"b%d4\\t%l3\"; -- case 6: return \"b%D4\\t.LCB%=\;b\\t%l3\\t%@long jump\\n.LCB%=:\"; -- default: return \"b%D4\\t.LCB%=\;bl\\t%l3\\t%@far jump\\n.LCB%=:\"; -- } -- " -- [(set (attr "far_jump") -- (if_then_else -- (eq_attr "length" "8") -- (const_string "yes") -- (const_string "no"))) -- (set (attr "length") -- (if_then_else -- (and (ge (minus (match_dup 3) (pc)) (const_int -250)) -- (le (minus (match_dup 3) (pc)) (const_int 256))) -- (const_int 4) -- (if_then_else -- (and (ge (minus (match_dup 3) (pc)) (const_int -2040)) -- (le (minus (match_dup 3) (pc)) (const_int 2048))) -- (const_int 6) -- (const_int 8))))] --) --(define_insn "*movsi_cbranchsi4" -- [(set (pc) -- (if_then_else -- (match_operator 3 "arm_comparison_operator" -- [(match_operand:SI 1 "s_register_operand" "0,l,l,l") -- (const_int 0)]) -- (label_ref (match_operand 2 "" "")) -- (pc))) -- (set (match_operand:SI 0 "thumb_cbrch_target_operand" "=l,l,*h,*m") -- (match_dup 1))] -- "TARGET_THUMB" -- "*{ -- if (which_alternative == 0) -- output_asm_insn (\"cmp\t%0, #0\", operands); -- else if (which_alternative == 1) -- output_asm_insn (\"sub\t%0, %1, #0\", operands); -- else -- { -- output_asm_insn (\"cmp\t%1, #0\", operands); -- if (which_alternative == 2) -- output_asm_insn (\"mov\t%0, %1\", operands); -- else -- output_asm_insn (\"str\t%1, %0\", operands); -- } -- switch (get_attr_length (insn) - ((which_alternative > 1) ? 2 : 0)) -- { -- case 4: return \"b%d3\\t%l2\"; -- case 6: return \"b%D3\\t.LCB%=\;b\\t%l2\\t%@long jump\\n.LCB%=:\"; -- default: return \"b%D3\\t.LCB%=\;bl\\t%l2\\t%@far jump\\n.LCB%=:\"; -- } -- }" -- [(set (attr "far_jump") -- (if_then_else -- (ior (and (gt (symbol_ref ("which_alternative")) -- (const_int 1)) -- (eq_attr "length" "8")) -- (eq_attr "length" "10")) -- (const_string "yes") -- (const_string "no"))) -- (set (attr "length") -- (if_then_else -- (le (symbol_ref ("which_alternative")) -- (const_int 1)) -- (if_then_else -- (and (ge (minus (match_dup 2) (pc)) (const_int -250)) -- (le (minus (match_dup 2) (pc)) (const_int 256))) -- (const_int 4) -- (if_then_else -- (and (ge (minus (match_dup 2) (pc)) (const_int -2040)) -- (le (minus (match_dup 2) (pc)) (const_int 2048))) -- (const_int 6) -- (const_int 8))) -- (if_then_else -- (and (ge (minus (match_dup 2) (pc)) (const_int -248)) -- (le (minus (match_dup 2) (pc)) (const_int 256))) -- (const_int 6) -- (if_then_else -- (and (ge (minus (match_dup 2) (pc)) (const_int -2038)) -- (le (minus (match_dup 2) (pc)) (const_int 2048))) -- (const_int 8) -- (const_int 10)))))] --) -+;(define_insn "*tbit_cbranch" -+; [(set (pc) -+; (if_then_else -+; (match_operator 0 "equality_operator" -+; [(zero_extract:SI (match_operand:SI 1 "s_register_operand" "l") -+; (const_int 1) -+; (match_operand:SI 2 "const_int_operand" "i")) -+; (const_int 0)]) -+; (label_ref (match_operand 3 "" "")) -+; (pc))) -+; (clobber (match_scratch:SI 4 "=l"))] -+; "TARGET_THUMB" -+; "* -+; { -+; rtx op[3]; -+; op[0] = operands[4]; -+; op[1] = operands[1]; -+; op[2] = GEN_INT (32 - 1 - INTVAL (operands[2])); -+; -+; output_asm_insn (\"lsl\\t%0, %1, %2\", op); -+; switch (get_attr_length (insn)) -+; { -+; case 4: return \"b%d0\\t%l3\"; -+; case 6: return \"b%D0\\t.LCB%=\;b\\t%l3\\t%@long jump\\n.LCB%=:\"; -+; default: return \"b%D0\\t.LCB%=\;bl\\t%l3\\t%@far jump\\n.LCB%=:\"; -+; } -+; }" -+; [(set (attr "far_jump") -+; (if_then_else -+; (eq_attr "length" "8") -+; (const_string "yes") -+; (const_string "no"))) -+; (set (attr "length") -+; (if_then_else -+; (and (ge (minus (match_dup 3) (pc)) (const_int -250)) -+; (le (minus (match_dup 3) (pc)) (const_int 256))) -+; (const_int 4) -+; (if_then_else -+; (and (ge (minus (match_dup 3) (pc)) (const_int -2040)) -+; (le (minus (match_dup 3) (pc)) (const_int 2048))) -+; (const_int 6) -+; (const_int 8))))] -+;) -+ -+;(define_insn "*tstsi3_cbranch" -+; [(set (pc) -+; (if_then_else -+; (match_operator 3 "equality_operator" -+; [(and:SI (match_operand:SI 0 "s_register_operand" "%l") -+; (match_operand:SI 1 "s_register_operand" "l")) -+; (const_int 0)]) -+; (label_ref (match_operand 2 "" "")) -+; (pc)))] -+; "TARGET_THUMB" -+; "* -+; { -+; output_asm_insn (\"tst\\t%0, %1\", operands); -+; switch (get_attr_length (insn)) -+; { -+; case 4: return \"b%d3\\t%l2\"; -+; case 6: return \"b%D3\\t.LCB%=\;b\\t%l2\\t%@long jump\\n.LCB%=:\"; -+; default: return \"b%D3\\t.LCB%=\;bl\\t%l2\\t%@far jump\\n.LCB%=:\"; -+; } -+; }" -+; [(set (attr "far_jump") -+; (if_then_else -+; (eq_attr "length" "8") -+; (const_string "yes") -+; (const_string "no"))) -+; (set (attr "length") -+; (if_then_else -+; (and (ge (minus (match_dup 2) (pc)) (const_int -250)) -+; (le (minus (match_dup 2) (pc)) (const_int 256))) -+; (const_int 4) -+; (if_then_else -+; (and (ge (minus (match_dup 2) (pc)) (const_int -2040)) -+; (le (minus (match_dup 2) (pc)) (const_int 2048))) -+; (const_int 6) -+; (const_int 8))))] -+;) -+ -+;(define_insn "*andsi3_cbranch" -+; [(set (pc) -+; (if_then_else -+; (match_operator 5 "equality_operator" -+; [(and:SI (match_operand:SI 2 "s_register_operand" "%0,1,1,1") -+; (match_operand:SI 3 "s_register_operand" "l,l,l,l")) -+; (const_int 0)]) -+; (label_ref (match_operand 4 "" "")) -+; (pc))) -+; (set (match_operand:SI 0 "thumb_cbrch_target_operand" "=l,*?h,*?m,*?m") -+; (and:SI (match_dup 2) (match_dup 3))) -+; (clobber (match_scratch:SI 1 "=X,l,&l,&l"))] -+; "TARGET_THUMB" -+; "* -+; { -+; if (which_alternative == 0) -+; output_asm_insn (\"and\\t%0, %3\", operands); -+; else if (which_alternative == 1) -+; { -+; output_asm_insn (\"and\\t%1, %3\", operands); -+; output_asm_insn (\"mov\\t%0, %1\", operands); -+; } -+; else -+; { -+; output_asm_insn (\"and\\t%1, %3\", operands); -+; output_asm_insn (\"str\\t%1, %0\", operands); -+; } -+; -+; switch (get_attr_length (insn) - (which_alternative ? 2 : 0)) -+; { -+; case 4: return \"b%d5\\t%l4\"; -+; case 6: return \"b%D5\\t.LCB%=\;b\\t%l4\\t%@long jump\\n.LCB%=:\"; -+; default: return \"b%D5\\t.LCB%=\;bl\\t%l4\\t%@far jump\\n.LCB%=:\"; -+; } -+; }" -+; [(set (attr "far_jump") -+; (if_then_else -+; (ior (and (eq (symbol_ref ("which_alternative")) -+; (const_int 0)) -+; (eq_attr "length" "8")) -+; (eq_attr "length" "10")) -+; (const_string "yes") -+; (const_string "no"))) -+; (set (attr "length") -+; (if_then_else -+; (eq (symbol_ref ("which_alternative")) -+; (const_int 0)) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -250)) -+; (le (minus (match_dup 4) (pc)) (const_int 256))) -+; (const_int 4) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -2040)) -+; (le (minus (match_dup 4) (pc)) (const_int 2048))) -+; (const_int 6) -+; (const_int 8))) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -248)) -+; (le (minus (match_dup 4) (pc)) (const_int 256))) -+; (const_int 6) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -2038)) -+; (le (minus (match_dup 4) (pc)) (const_int 2048))) -+; (const_int 8) -+; (const_int 10)))))] -+;) - --(define_insn "*negated_cbranchsi4" -- [(set (pc) -- (if_then_else -- (match_operator 0 "equality_operator" -- [(match_operand:SI 1 "s_register_operand" "l") -- (neg:SI (match_operand:SI 2 "s_register_operand" "l"))]) -- (label_ref (match_operand 3 "" "")) -- (pc)))] -- "TARGET_THUMB" -- "* -- output_asm_insn (\"cmn\\t%1, %2\", operands); -- switch (get_attr_length (insn)) -- { -- case 4: return \"b%d0\\t%l3\"; -- case 6: return \"b%D0\\t.LCB%=\;b\\t%l3\\t%@long jump\\n.LCB%=:\"; -- default: return \"b%D0\\t.LCB%=\;bl\\t%l3\\t%@far jump\\n.LCB%=:\"; -- } -- " -- [(set (attr "far_jump") -- (if_then_else -- (eq_attr "length" "8") -- (const_string "yes") -- (const_string "no"))) -- (set (attr "length") -- (if_then_else -- (and (ge (minus (match_dup 3) (pc)) (const_int -250)) -- (le (minus (match_dup 3) (pc)) (const_int 256))) -- (const_int 4) -- (if_then_else -- (and (ge (minus (match_dup 3) (pc)) (const_int -2040)) -- (le (minus (match_dup 3) (pc)) (const_int 2048))) -- (const_int 6) -- (const_int 8))))] --) -+;(define_insn "*orrsi3_cbranch_scratch" -+; [(set (pc) -+; (if_then_else -+; (match_operator 4 "equality_operator" -+; [(ior:SI (match_operand:SI 1 "s_register_operand" "%0") -+; (match_operand:SI 2 "s_register_operand" "l")) -+; (const_int 0)]) -+; (label_ref (match_operand 3 "" "")) -+; (pc))) -+; (clobber (match_scratch:SI 0 "=l"))] -+; "TARGET_THUMB" -+; "* -+; { -+; output_asm_insn (\"orr\\t%0, %2\", operands); -+; switch (get_attr_length (insn)) -+; { -+; case 4: return \"b%d4\\t%l3\"; -+; case 6: return \"b%D4\\t.LCB%=\;b\\t%l3\\t%@long jump\\n.LCB%=:\"; -+; default: return \"b%D4\\t.LCB%=\;bl\\t%l3\\t%@far jump\\n.LCB%=:\"; -+; } -+; }" -+; [(set (attr "far_jump") -+; (if_then_else -+; (eq_attr "length" "8") -+; (const_string "yes") -+; (const_string "no"))) -+; (set (attr "length") -+; (if_then_else -+; (and (ge (minus (match_dup 3) (pc)) (const_int -250)) -+; (le (minus (match_dup 3) (pc)) (const_int 256))) -+; (const_int 4) -+; (if_then_else -+; (and (ge (minus (match_dup 3) (pc)) (const_int -2040)) -+; (le (minus (match_dup 3) (pc)) (const_int 2048))) -+; (const_int 6) -+; (const_int 8))))] -+;) -+ -+;(define_insn "*orrsi3_cbranch" -+; [(set (pc) -+; (if_then_else -+; (match_operator 5 "equality_operator" -+; [(ior:SI (match_operand:SI 2 "s_register_operand" "%0,1,1,1") -+; (match_operand:SI 3 "s_register_operand" "l,l,l,l")) -+; (const_int 0)]) -+; (label_ref (match_operand 4 "" "")) -+; (pc))) -+; (set (match_operand:SI 0 "thumb_cbrch_target_operand" "=l,*?h,*?m,*?m") -+; (ior:SI (match_dup 2) (match_dup 3))) -+; (clobber (match_scratch:SI 1 "=X,l,&l,&l"))] -+; "TARGET_THUMB" -+; "* -+; { -+; if (which_alternative == 0) -+; output_asm_insn (\"orr\\t%0, %3\", operands); -+; else if (which_alternative == 1) -+; { -+; output_asm_insn (\"orr\\t%1, %3\", operands); -+; output_asm_insn (\"mov\\t%0, %1\", operands); -+; } -+; else -+; { -+; output_asm_insn (\"orr\\t%1, %3\", operands); -+; output_asm_insn (\"str\\t%1, %0\", operands); -+; } -+; -+; switch (get_attr_length (insn) - (which_alternative ? 2 : 0)) -+; { -+; case 4: return \"b%d5\\t%l4\"; -+; case 6: return \"b%D5\\t.LCB%=\;b\\t%l4\\t%@long jump\\n.LCB%=:\"; -+; default: return \"b%D5\\t.LCB%=\;bl\\t%l4\\t%@far jump\\n.LCB%=:\"; -+; } -+; }" -+; [(set (attr "far_jump") -+; (if_then_else -+; (ior (and (eq (symbol_ref ("which_alternative")) -+; (const_int 0)) -+; (eq_attr "length" "8")) -+; (eq_attr "length" "10")) -+; (const_string "yes") -+; (const_string "no"))) -+; (set (attr "length") -+; (if_then_else -+; (eq (symbol_ref ("which_alternative")) -+; (const_int 0)) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -250)) -+; (le (minus (match_dup 4) (pc)) (const_int 256))) -+; (const_int 4) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -2040)) -+; (le (minus (match_dup 4) (pc)) (const_int 2048))) -+; (const_int 6) -+; (const_int 8))) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -248)) -+; (le (minus (match_dup 4) (pc)) (const_int 256))) -+; (const_int 6) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -2038)) -+; (le (minus (match_dup 4) (pc)) (const_int 2048))) -+; (const_int 8) -+; (const_int 10)))))] -+;) - --(define_insn "*tbit_cbranch" -- [(set (pc) -- (if_then_else -- (match_operator 0 "equality_operator" -- [(zero_extract:SI (match_operand:SI 1 "s_register_operand" "l") -- (const_int 1) -- (match_operand:SI 2 "const_int_operand" "i")) -- (const_int 0)]) -- (label_ref (match_operand 3 "" "")) -- (pc))) -- (clobber (match_scratch:SI 4 "=l"))] -- "TARGET_THUMB" -- "* -- { -- rtx op[3]; -- op[0] = operands[4]; -- op[1] = operands[1]; -- op[2] = GEN_INT (32 - 1 - INTVAL (operands[2])); -- -- output_asm_insn (\"lsl\\t%0, %1, %2\", op); -- switch (get_attr_length (insn)) -- { -- case 4: return \"b%d0\\t%l3\"; -- case 6: return \"b%D0\\t.LCB%=\;b\\t%l3\\t%@long jump\\n.LCB%=:\"; -- default: return \"b%D0\\t.LCB%=\;bl\\t%l3\\t%@far jump\\n.LCB%=:\"; -- } -- }" -- [(set (attr "far_jump") -- (if_then_else -- (eq_attr "length" "8") -- (const_string "yes") -- (const_string "no"))) -- (set (attr "length") -- (if_then_else -- (and (ge (minus (match_dup 3) (pc)) (const_int -250)) -- (le (minus (match_dup 3) (pc)) (const_int 256))) -- (const_int 4) -- (if_then_else -- (and (ge (minus (match_dup 3) (pc)) (const_int -2040)) -- (le (minus (match_dup 3) (pc)) (const_int 2048))) -- (const_int 6) -- (const_int 8))))] --) -+;(define_insn "*xorsi3_cbranch_scratch" -+; [(set (pc) -+; (if_then_else -+; (match_operator 4 "equality_operator" -+; [(xor:SI (match_operand:SI 1 "s_register_operand" "%0") -+; (match_operand:SI 2 "s_register_operand" "l")) -+; (const_int 0)]) -+; (label_ref (match_operand 3 "" "")) -+; (pc))) -+; (clobber (match_scratch:SI 0 "=l"))] -+; "TARGET_THUMB" -+; "* -+; { -+; output_asm_insn (\"eor\\t%0, %2\", operands); -+; switch (get_attr_length (insn)) -+; { -+; case 4: return \"b%d4\\t%l3\"; -+; case 6: return \"b%D4\\t.LCB%=\;b\\t%l3\\t%@long jump\\n.LCB%=:\"; -+; default: return \"b%D4\\t.LCB%=\;bl\\t%l3\\t%@far jump\\n.LCB%=:\"; -+; } -+; }" -+; [(set (attr "far_jump") -+; (if_then_else -+; (eq_attr "length" "8") -+; (const_string "yes") -+; (const_string "no"))) -+; (set (attr "length") -+; (if_then_else -+; (and (ge (minus (match_dup 3) (pc)) (const_int -250)) -+; (le (minus (match_dup 3) (pc)) (const_int 256))) -+; (const_int 4) -+; (if_then_else -+; (and (ge (minus (match_dup 3) (pc)) (const_int -2040)) -+; (le (minus (match_dup 3) (pc)) (const_int 2048))) -+; (const_int 6) -+; (const_int 8))))] -+;) - --(define_insn "*tstsi3_cbranch" -- [(set (pc) -- (if_then_else -- (match_operator 3 "equality_operator" -- [(and:SI (match_operand:SI 0 "s_register_operand" "%l") -- (match_operand:SI 1 "s_register_operand" "l")) -- (const_int 0)]) -- (label_ref (match_operand 2 "" "")) -- (pc)))] -- "TARGET_THUMB" -- "* -- { -- output_asm_insn (\"tst\\t%0, %1\", operands); -- switch (get_attr_length (insn)) -- { -- case 4: return \"b%d3\\t%l2\"; -- case 6: return \"b%D3\\t.LCB%=\;b\\t%l2\\t%@long jump\\n.LCB%=:\"; -- default: return \"b%D3\\t.LCB%=\;bl\\t%l2\\t%@far jump\\n.LCB%=:\"; -- } -- }" -- [(set (attr "far_jump") -- (if_then_else -- (eq_attr "length" "8") -- (const_string "yes") -- (const_string "no"))) -- (set (attr "length") -- (if_then_else -- (and (ge (minus (match_dup 2) (pc)) (const_int -250)) -- (le (minus (match_dup 2) (pc)) (const_int 256))) -- (const_int 4) -- (if_then_else -- (and (ge (minus (match_dup 2) (pc)) (const_int -2040)) -- (le (minus (match_dup 2) (pc)) (const_int 2048))) -- (const_int 6) -- (const_int 8))))] --) -+;(define_insn "*xorsi3_cbranch" -+; [(set (pc) -+; (if_then_else -+; (match_operator 5 "equality_operator" -+; [(xor:SI (match_operand:SI 2 "s_register_operand" "%0,1,1,1") -+; (match_operand:SI 3 "s_register_operand" "l,l,l,l")) -+; (const_int 0)]) -+; (label_ref (match_operand 4 "" "")) -+; (pc))) -+; (set (match_operand:SI 0 "thumb_cbrch_target_operand" "=l,*?h,*?m,*?m") -+; (xor:SI (match_dup 2) (match_dup 3))) -+; (clobber (match_scratch:SI 1 "=X,l,&l,&l"))] -+; "TARGET_THUMB" -+; "* -+; { -+; if (which_alternative == 0) -+; output_asm_insn (\"eor\\t%0, %3\", operands); -+; else if (which_alternative == 1) -+; { -+; output_asm_insn (\"eor\\t%1, %3\", operands); -+; output_asm_insn (\"mov\\t%0, %1\", operands); -+; } -+; else -+; { -+; output_asm_insn (\"eor\\t%1, %3\", operands); -+; output_asm_insn (\"str\\t%1, %0\", operands); -+; } -+; -+; switch (get_attr_length (insn) - (which_alternative ? 2 : 0)) -+; { -+; case 4: return \"b%d5\\t%l4\"; -+; case 6: return \"b%D5\\t.LCB%=\;b\\t%l4\\t%@long jump\\n.LCB%=:\"; -+; default: return \"b%D5\\t.LCB%=\;bl\\t%l4\\t%@far jump\\n.LCB%=:\"; -+; } -+; }" -+; [(set (attr "far_jump") -+; (if_then_else -+; (ior (and (eq (symbol_ref ("which_alternative")) -+; (const_int 0)) -+; (eq_attr "length" "8")) -+; (eq_attr "length" "10")) -+; (const_string "yes") -+; (const_string "no"))) -+; (set (attr "length") -+; (if_then_else -+; (eq (symbol_ref ("which_alternative")) -+; (const_int 0)) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -250)) -+; (le (minus (match_dup 4) (pc)) (const_int 256))) -+; (const_int 4) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -2040)) -+; (le (minus (match_dup 4) (pc)) (const_int 2048))) -+; (const_int 6) -+; (const_int 8))) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -248)) -+; (le (minus (match_dup 4) (pc)) (const_int 256))) -+; (const_int 6) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -2038)) -+; (le (minus (match_dup 4) (pc)) (const_int 2048))) -+; (const_int 8) -+; (const_int 10)))))] -+;) -+ -+;(define_insn "*bicsi3_cbranch_scratch" -+; [(set (pc) -+; (if_then_else -+; (match_operator 4 "equality_operator" -+; [(and:SI (not:SI (match_operand:SI 2 "s_register_operand" "l")) -+; (match_operand:SI 1 "s_register_operand" "0")) -+; (const_int 0)]) -+; (label_ref (match_operand 3 "" "")) -+; (pc))) -+; (clobber (match_scratch:SI 0 "=l"))] -+; "TARGET_THUMB" -+; "* -+; { -+; output_asm_insn (\"bic\\t%0, %2\", operands); -+; switch (get_attr_length (insn)) -+; { -+; case 4: return \"b%d4\\t%l3\"; -+; case 6: return \"b%D4\\t.LCB%=\;b\\t%l3\\t%@long jump\\n.LCB%=:\"; -+; default: return \"b%D4\\t.LCB%=\;bl\\t%l3\\t%@far jump\\n.LCB%=:\"; -+; } -+; }" -+; [(set (attr "far_jump") -+; (if_then_else -+; (eq_attr "length" "8") -+; (const_string "yes") -+; (const_string "no"))) -+; (set (attr "length") -+; (if_then_else -+; (and (ge (minus (match_dup 3) (pc)) (const_int -250)) -+; (le (minus (match_dup 3) (pc)) (const_int 256))) -+; (const_int 4) -+; (if_then_else -+; (and (ge (minus (match_dup 3) (pc)) (const_int -2040)) -+; (le (minus (match_dup 3) (pc)) (const_int 2048))) -+; (const_int 6) -+; (const_int 8))))] -+;) - --(define_insn "*andsi3_cbranch" -- [(set (pc) -- (if_then_else -- (match_operator 5 "equality_operator" -- [(and:SI (match_operand:SI 2 "s_register_operand" "%0,1,1,1") -- (match_operand:SI 3 "s_register_operand" "l,l,l,l")) -- (const_int 0)]) -- (label_ref (match_operand 4 "" "")) -- (pc))) -- (set (match_operand:SI 0 "thumb_cbrch_target_operand" "=l,*?h,*?m,*?m") -- (and:SI (match_dup 2) (match_dup 3))) -- (clobber (match_scratch:SI 1 "=X,l,&l,&l"))] -- "TARGET_THUMB" -- "* -- { -- if (which_alternative == 0) -- output_asm_insn (\"and\\t%0, %3\", operands); -- else if (which_alternative == 1) -- { -- output_asm_insn (\"and\\t%1, %3\", operands); -- output_asm_insn (\"mov\\t%0, %1\", operands); -- } -- else -- { -- output_asm_insn (\"and\\t%1, %3\", operands); -- output_asm_insn (\"str\\t%1, %0\", operands); -- } -+;(define_insn "*bicsi3_cbranch" -+; [(set (pc) -+; (if_then_else -+; (match_operator 5 "equality_operator" -+; [(and:SI (not:SI (match_operand:SI 3 "s_register_operand" "l,l,l,l,l")) -+; (match_operand:SI 2 "s_register_operand" "0,1,1,1,1")) -+; (const_int 0)]) -+; (label_ref (match_operand 4 "" "")) -+; (pc))) -+; (set (match_operand:SI 0 "thumb_cbrch_target_operand" "=!l,l,*?h,*?m,*?m") -+; (and:SI (not:SI (match_dup 3)) (match_dup 2))) -+; (clobber (match_scratch:SI 1 "=X,l,l,&l,&l"))] -+; "TARGET_THUMB" -+; "* -+; { -+; if (which_alternative == 0) -+; output_asm_insn (\"bic\\t%0, %3\", operands); -+; else if (which_alternative <= 2) -+; { -+; output_asm_insn (\"bic\\t%1, %3\", operands); -+; /* It's ok if OP0 is a lo-reg, even though the mov will set the -+; conditions again, since we're only testing for equality. */ -+; output_asm_insn (\"mov\\t%0, %1\", operands); -+; } -+; else -+; { -+; output_asm_insn (\"bic\\t%1, %3\", operands); -+; output_asm_insn (\"str\\t%1, %0\", operands); -+; } -+; -+; switch (get_attr_length (insn) - (which_alternative ? 2 : 0)) -+; { -+; case 4: return \"b%d5\\t%l4\"; -+; case 6: return \"b%D5\\t.LCB%=\;b\\t%l4\\t%@long jump\\n.LCB%=:\"; -+; default: return \"b%D5\\t.LCB%=\;bl\\t%l4\\t%@far jump\\n.LCB%=:\"; -+; } -+; }" -+; [(set (attr "far_jump") -+; (if_then_else -+; (ior (and (eq (symbol_ref ("which_alternative")) -+; (const_int 0)) -+; (eq_attr "length" "8")) -+; (eq_attr "length" "10")) -+; (const_string "yes") -+; (const_string "no"))) -+; (set (attr "length") -+; (if_then_else -+; (eq (symbol_ref ("which_alternative")) -+; (const_int 0)) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -250)) -+; (le (minus (match_dup 4) (pc)) (const_int 256))) -+; (const_int 4) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -2040)) -+; (le (minus (match_dup 4) (pc)) (const_int 2048))) -+; (const_int 6) -+; (const_int 8))) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -248)) -+; (le (minus (match_dup 4) (pc)) (const_int 256))) -+; (const_int 6) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -2038)) -+; (le (minus (match_dup 4) (pc)) (const_int 2048))) -+; (const_int 8) -+; (const_int 10)))))] -+;) - -- switch (get_attr_length (insn) - (which_alternative ? 2 : 0)) -- { -- case 4: return \"b%d5\\t%l4\"; -- case 6: return \"b%D5\\t.LCB%=\;b\\t%l4\\t%@long jump\\n.LCB%=:\"; -- default: return \"b%D5\\t.LCB%=\;bl\\t%l4\\t%@far jump\\n.LCB%=:\"; -- } -+;(define_insn "*cbranchne_decr1" -+; [(set (pc) -+; (if_then_else (match_operator 3 "equality_operator" -+; [(match_operand:SI 2 "s_register_operand" "l,l,1,l") -+; (const_int 0)]) -+; (label_ref (match_operand 4 "" "")) -+; (pc))) -+; (set (match_operand:SI 0 "thumb_cbrch_target_operand" "=l,*?h,*?m,*?m") -+; (plus:SI (match_dup 2) (const_int -1))) -+; (clobber (match_scratch:SI 1 "=X,l,&l,&l"))] -+; "TARGET_THUMB" -+; "* -+; { -+; rtx cond[2]; -+; cond[0] = gen_rtx_fmt_ee ((GET_CODE (operands[3]) == NE -+; ? GEU : LTU), -+; VOIDmode, operands[2], const1_rtx); -+; cond[1] = operands[4]; -+; -+; if (which_alternative == 0) -+; output_asm_insn (\"sub\\t%0, %2, #1\", operands); -+; else if (which_alternative == 1) -+; { -+; /* We must provide an alternative for a hi reg because reload -+; cannot handle output reloads on a jump instruction, but we -+; can't subtract into that. Fortunately a mov from lo to hi -+; does not clobber the condition codes. */ -+; output_asm_insn (\"sub\\t%1, %2, #1\", operands); -+; output_asm_insn (\"mov\\t%0, %1\", operands); -+; } -+; else -+; { -+; /* Similarly, but the target is memory. */ -+; output_asm_insn (\"sub\\t%1, %2, #1\", operands); -+; output_asm_insn (\"str\\t%1, %0\", operands); -+; } -+; -+; switch (get_attr_length (insn) - (which_alternative ? 2 : 0)) -+; { -+; case 4: -+; output_asm_insn (\"b%d0\\t%l1\", cond); -+; return \"\"; -+; case 6: -+; output_asm_insn (\"b%D0\\t.LCB%=\", cond); -+; return \"b\\t%l4\\t%@long jump\\n.LCB%=:\"; -+; default: -+; output_asm_insn (\"b%D0\\t.LCB%=\", cond); -+; return \"bl\\t%l4\\t%@far jump\\n.LCB%=:\"; -+; } -+; } -+; " -+; [(set (attr "far_jump") -+; (if_then_else -+; (ior (and (eq (symbol_ref ("which_alternative")) -+; (const_int 0)) -+; (eq_attr "length" "8")) -+; (eq_attr "length" "10")) -+; (const_string "yes") -+; (const_string "no"))) -+; (set_attr_alternative "length" -+; [ -+; ;; Alternative 0 -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -250)) -+; (le (minus (match_dup 4) (pc)) (const_int 256))) -+; (const_int 4) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -2040)) -+; (le (minus (match_dup 4) (pc)) (const_int 2048))) -+; (const_int 6) -+; (const_int 8))) -+; ;; Alternative 1 -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -248)) -+; (le (minus (match_dup 4) (pc)) (const_int 256))) -+; (const_int 6) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -2038)) -+; (le (minus (match_dup 4) (pc)) (const_int 2048))) -+; (const_int 8) -+; (const_int 10))) -+; ;; Alternative 2 -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -248)) -+; (le (minus (match_dup 4) (pc)) (const_int 256))) -+; (const_int 6) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -2038)) -+; (le (minus (match_dup 4) (pc)) (const_int 2048))) -+; (const_int 8) -+; (const_int 10))) -+; ;; Alternative 3 -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -248)) -+; (le (minus (match_dup 4) (pc)) (const_int 256))) -+; (const_int 6) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -2038)) -+; (le (minus (match_dup 4) (pc)) (const_int 2048))) -+; (const_int 8) -+; (const_int 10)))])] -+;) -+ -+;(define_insn "*addsi3_cbranch" -+; [(set (pc) -+; (if_then_else -+; (match_operator 4 "comparison_operator" -+; [(plus:SI -+; (match_operand:SI 2 "s_register_operand" "%l,0,*0,1,1,1") -+; (match_operand:SI 3 "reg_or_int_operand" "lL,IJ,*r,lIJ,lIJ,lIJ")) -+; (const_int 0)]) -+; (label_ref (match_operand 5 "" "")) -+; (pc))) -+; (set -+; (match_operand:SI 0 "thumb_cbrch_target_operand" "=l,l,*!h,*?h,*?m,*?m") -+; (plus:SI (match_dup 2) (match_dup 3))) -+; (clobber (match_scratch:SI 1 "=X,X,X,l,&l,&l"))] -+; "TARGET_THUMB -+; && (GET_CODE (operands[4]) == EQ -+; || GET_CODE (operands[4]) == NE -+; || GET_CODE (operands[4]) == GE -+; || GET_CODE (operands[4]) == LT)" -+; "* -+; { -+; rtx cond[3]; -+; -+; -+; cond[0] = (which_alternative < 3) ? operands[0] : operands[1]; -+; cond[1] = operands[2]; -+; cond[2] = operands[3]; -+; -+; if (GET_CODE (cond[2]) == CONST_INT && INTVAL (cond[2]) < 0) -+; output_asm_insn (\"sub\\t%0, %1, #%n2\", cond); -+; else -+; output_asm_insn (\"add\\t%0, %1, %2\", cond); -+; -+; if (which_alternative >= 3 -+; && which_alternative < 4) -+; output_asm_insn (\"mov\\t%0, %1\", operands); -+; else if (which_alternative >= 4) -+; output_asm_insn (\"str\\t%1, %0\", operands); -+; -+; switch (get_attr_length (insn) - ((which_alternative >= 3) ? 2 : 0)) -+; { -+; case 4: -+; return \"b%d4\\t%l5\"; -+; case 6: -+; return \"b%D4\\t.LCB%=\;b\\t%l5\\t%@long jump\\n.LCB%=:\"; -+; default: -+; return \"b%D4\\t.LCB%=\;bl\\t%l5\\t%@far jump\\n.LCB%=:\"; -+; } -+; } -+; " -+; [(set (attr "far_jump") -+; (if_then_else -+; (ior (and (lt (symbol_ref ("which_alternative")) -+; (const_int 3)) -+; (eq_attr "length" "8")) -+; (eq_attr "length" "10")) -+; (const_string "yes") -+; (const_string "no"))) -+; (set (attr "length") -+; (if_then_else -+; (lt (symbol_ref ("which_alternative")) -+; (const_int 3)) -+; (if_then_else -+; (and (ge (minus (match_dup 5) (pc)) (const_int -250)) -+; (le (minus (match_dup 5) (pc)) (const_int 256))) -+; (const_int 4) -+; (if_then_else -+; (and (ge (minus (match_dup 5) (pc)) (const_int -2040)) -+; (le (minus (match_dup 5) (pc)) (const_int 2048))) -+; (const_int 6) -+; (const_int 8))) -+; (if_then_else -+; (and (ge (minus (match_dup 5) (pc)) (const_int -248)) -+; (le (minus (match_dup 5) (pc)) (const_int 256))) -+; (const_int 6) -+; (if_then_else -+; (and (ge (minus (match_dup 5) (pc)) (const_int -2038)) -+; (le (minus (match_dup 5) (pc)) (const_int 2048))) -+; (const_int 8) -+; (const_int 10)))))] -+;) -+ -+;(define_insn "*addsi3_cbranch_scratch" -+; [(set (pc) -+; (if_then_else -+; (match_operator 3 "comparison_operator" -+; [(plus:SI -+; (match_operand:SI 1 "s_register_operand" "%l,l,l,0") -+; (match_operand:SI 2 "reg_or_int_operand" "J,l,L,IJ")) -+; (const_int 0)]) -+; (label_ref (match_operand 4 "" "")) -+; (pc))) -+; (clobber (match_scratch:SI 0 "=X,X,l,l"))] -+; "TARGET_THUMB -+; && (GET_CODE (operands[3]) == EQ -+; || GET_CODE (operands[3]) == NE -+; || GET_CODE (operands[3]) == GE -+; || GET_CODE (operands[3]) == LT)" -+; "* -+; { -+; switch (which_alternative) -+; { -+; case 0: -+; output_asm_insn (\"cmp\t%1, #%n2\", operands); -+; break; -+; case 1: -+; output_asm_insn (\"cmn\t%1, %2\", operands); -+; break; -+; case 2: -+; if (INTVAL (operands[2]) < 0) -+; output_asm_insn (\"sub\t%0, %1, %2\", operands); -+; else -+; output_asm_insn (\"add\t%0, %1, %2\", operands); -+; break; -+; case 3: -+; if (INTVAL (operands[2]) < 0) -+; output_asm_insn (\"sub\t%0, %0, %2\", operands); -+; else -+; output_asm_insn (\"add\t%0, %0, %2\", operands); -+; break; -+; } -+; -+; switch (get_attr_length (insn)) -+; { -+; case 4: -+; return \"b%d3\\t%l4\"; -+; case 6: -+; return \"b%D3\\t.LCB%=\;b\\t%l4\\t%@long jump\\n.LCB%=:\"; -+; default: -+; return \"b%D3\\t.LCB%=\;bl\\t%l4\\t%@far jump\\n.LCB%=:\"; -+; } -+; } -+; " -+; [(set (attr "far_jump") -+; (if_then_else -+; (eq_attr "length" "8") -+; (const_string "yes") -+; (const_string "no"))) -+; (set (attr "length") -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -250)) -+; (le (minus (match_dup 4) (pc)) (const_int 256))) -+; (const_int 4) -+; (if_then_else -+; (and (ge (minus (match_dup 4) (pc)) (const_int -2040)) -+; (le (minus (match_dup 4) (pc)) (const_int 2048))) -+; (const_int 6) -+; (const_int 8))))] -+;) -+ -+;(define_insn "*subsi3_cbranch" -+; [(set (pc) -+; (if_then_else -+; (match_operator 4 "comparison_operator" -+; [(minus:SI -+; (match_operand:SI 2 "s_register_operand" "l,l,1,l") -+; (match_operand:SI 3 "s_register_operand" "l,l,l,l")) -+; (const_int 0)]) -+; (label_ref (match_operand 5 "" "")) -+; (pc))) -+; (set (match_operand:SI 0 "thumb_cbrch_target_operand" "=l,*?h,*?m,*?m") -+; (minus:SI (match_dup 2) (match_dup 3))) -+; (clobber (match_scratch:SI 1 "=X,l,&l,&l"))] -+; "TARGET_THUMB -+; && (GET_CODE (operands[4]) == EQ -+; || GET_CODE (operands[4]) == NE -+; || GET_CODE (operands[4]) == GE -+; || GET_CODE (operands[4]) == LT)" -+; "* -+; { -+; if (which_alternative == 0) -+; output_asm_insn (\"sub\\t%0, %2, %3\", operands); -+; else if (which_alternative == 1) -+; { -+; /* We must provide an alternative for a hi reg because reload -+; cannot handle output reloads on a jump instruction, but we -+; can't subtract into that. Fortunately a mov from lo to hi -+; does not clobber the condition codes. */ -+; output_asm_insn (\"sub\\t%1, %2, %3\", operands); -+; output_asm_insn (\"mov\\t%0, %1\", operands); -+; } -+; else -+; { -+; /* Similarly, but the target is memory. */ -+; output_asm_insn (\"sub\\t%1, %2, %3\", operands); -+; output_asm_insn (\"str\\t%1, %0\", operands); -+; } -+; -+; switch (get_attr_length (insn) - ((which_alternative != 0) ? 2 : 0)) -+; { -+; case 4: -+; return \"b%d4\\t%l5\"; -+; case 6: -+; return \"b%D4\\t.LCB%=\;b\\t%l5\\t%@long jump\\n.LCB%=:\"; -+; default: -+; return \"b%D4\\t.LCB%=\;bl\\t%l5\\t%@far jump\\n.LCB%=:\"; -+; } -+; } -+; " -+; [(set (attr "far_jump") -+; (if_then_else -+; (ior (and (eq (symbol_ref ("which_alternative")) -+; (const_int 0)) -+; (eq_attr "length" "8")) -+; (eq_attr "length" "10")) -+; (const_string "yes") -+; (const_string "no"))) -+; (set (attr "length") -+; (if_then_else -+; (eq (symbol_ref ("which_alternative")) -+; (const_int 0)) -+; (if_then_else -+; (and (ge (minus (match_dup 5) (pc)) (const_int -250)) -+; (le (minus (match_dup 5) (pc)) (const_int 256))) -+; (const_int 4) -+; (if_then_else -+; (and (ge (minus (match_dup 5) (pc)) (const_int -2040)) -+; (le (minus (match_dup 5) (pc)) (const_int 2048))) -+; (const_int 6) -+; (const_int 8))) -+; (if_then_else -+; (and (ge (minus (match_dup 5) (pc)) (const_int -248)) -+; (le (minus (match_dup 5) (pc)) (const_int 256))) -+; (const_int 6) -+; (if_then_else -+; (and (ge (minus (match_dup 5) (pc)) (const_int -2038)) -+; (le (minus (match_dup 5) (pc)) (const_int 2048))) -+; (const_int 8) -+; (const_int 10)))))] -+;) -+ -+;(define_insn "*subsi3_cbranch_scratch" -+; [(set (pc) -+; (if_then_else -+; (match_operator 0 "arm_comparison_operator" -+; [(minus:SI (match_operand:SI 1 "register_operand" "l") -+; (match_operand:SI 2 "nonmemory_operand" "l")) -+; (const_int 0)]) -+; (label_ref (match_operand 3 "" "")) -+; (pc)))] -+; "TARGET_THUMB -+; && (GET_CODE (operands[0]) == EQ -+; || GET_CODE (operands[0]) == NE -+; || GET_CODE (operands[0]) == GE -+; || GET_CODE (operands[0]) == LT)" -+; "* -+; output_asm_insn (\"cmp\\t%1, %2\", operands); -+; switch (get_attr_length (insn)) -+; { -+; case 4: return \"b%d0\\t%l3\"; -+; case 6: return \"b%D0\\t.LCB%=\;b\\t%l3\\t%@long jump\\n.LCB%=:\"; -+; default: return \"b%D0\\t.LCB%=\;bl\\t%l3\\t%@far jump\\n.LCB%=:\"; -+; } -+; " -+; [(set (attr "far_jump") -+; (if_then_else -+; (eq_attr "length" "8") -+; (const_string "yes") -+; (const_string "no"))) -+; (set (attr "length") -+; (if_then_else -+; (and (ge (minus (match_dup 3) (pc)) (const_int -250)) -+; (le (minus (match_dup 3) (pc)) (const_int 256))) -+; (const_int 4) -+; (if_then_else -+; (and (ge (minus (match_dup 3) (pc)) (const_int -2040)) -+; (le (minus (match_dup 3) (pc)) (const_int 2048))) -+; (const_int 6) -+; (const_int 8))))] -+;) -+ -+;; Comparison and test insns -+ -+(define_expand "cmpsi" -+ [(match_operand:SI 0 "s_register_operand" "") -+ (match_operand:SI 1 "arm_add_operand" "")] -+ "TARGET_ARM" -+ "{ -+ arm_compare_op0 = operands[0]; -+ arm_compare_op1 = operands[1]; -+ DONE; - }" -- [(set (attr "far_jump") -- (if_then_else -- (ior (and (eq (symbol_ref ("which_alternative")) -- (const_int 0)) -- (eq_attr "length" "8")) -- (eq_attr "length" "10")) -- (const_string "yes") -- (const_string "no"))) -- (set (attr "length") -- (if_then_else -- (eq (symbol_ref ("which_alternative")) -- (const_int 0)) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -250)) -- (le (minus (match_dup 4) (pc)) (const_int 256))) -- (const_int 4) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -2040)) -- (le (minus (match_dup 4) (pc)) (const_int 2048))) -- (const_int 6) -- (const_int 8))) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -248)) -- (le (minus (match_dup 4) (pc)) (const_int 256))) -- (const_int 6) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -2038)) -- (le (minus (match_dup 4) (pc)) (const_int 2048))) -- (const_int 8) -- (const_int 10)))))] - ) - --(define_insn "*orrsi3_cbranch_scratch" -- [(set (pc) -- (if_then_else -- (match_operator 4 "equality_operator" -- [(ior:SI (match_operand:SI 1 "s_register_operand" "%0") -- (match_operand:SI 2 "s_register_operand" "l")) -- (const_int 0)]) -- (label_ref (match_operand 3 "" "")) -- (pc))) -- (clobber (match_scratch:SI 0 "=l"))] -- "TARGET_THUMB" -- "* -- { -- output_asm_insn (\"orr\\t%0, %2\", operands); -- switch (get_attr_length (insn)) -- { -- case 4: return \"b%d4\\t%l3\"; -- case 6: return \"b%D4\\t.LCB%=\;b\\t%l3\\t%@long jump\\n.LCB%=:\"; -- default: return \"b%D4\\t.LCB%=\;bl\\t%l3\\t%@far jump\\n.LCB%=:\"; -- } -- }" -- [(set (attr "far_jump") -- (if_then_else -- (eq_attr "length" "8") -- (const_string "yes") -- (const_string "no"))) -- (set (attr "length") -- (if_then_else -- (and (ge (minus (match_dup 3) (pc)) (const_int -250)) -- (le (minus (match_dup 3) (pc)) (const_int 256))) -- (const_int 4) -- (if_then_else -- (and (ge (minus (match_dup 3) (pc)) (const_int -2040)) -- (le (minus (match_dup 3) (pc)) (const_int 2048))) -- (const_int 6) -- (const_int 8))))] -+(define_expand "cmpsf" -+ [(match_operand:SF 0 "s_register_operand" "") -+ (match_operand:SF 1 "arm_float_compare_operand" "")] -+ "TARGET_ARM && TARGET_HARD_FLOAT" -+ " -+ arm_compare_op0 = operands[0]; -+ arm_compare_op1 = operands[1]; -+ DONE; -+ " - ) -- --(define_insn "*orrsi3_cbranch" -- [(set (pc) -- (if_then_else -- (match_operator 5 "equality_operator" -- [(ior:SI (match_operand:SI 2 "s_register_operand" "%0,1,1,1") -- (match_operand:SI 3 "s_register_operand" "l,l,l,l")) -- (const_int 0)]) -- (label_ref (match_operand 4 "" "")) -- (pc))) -- (set (match_operand:SI 0 "thumb_cbrch_target_operand" "=l,*?h,*?m,*?m") -- (ior:SI (match_dup 2) (match_dup 3))) -- (clobber (match_scratch:SI 1 "=X,l,&l,&l"))] -- "TARGET_THUMB" -- "* -- { -- if (which_alternative == 0) -- output_asm_insn (\"orr\\t%0, %3\", operands); -- else if (which_alternative == 1) -- { -- output_asm_insn (\"orr\\t%1, %3\", operands); -- output_asm_insn (\"mov\\t%0, %1\", operands); -- } -- else -- { -- output_asm_insn (\"orr\\t%1, %3\", operands); -- output_asm_insn (\"str\\t%1, %0\", operands); -- } - -- switch (get_attr_length (insn) - (which_alternative ? 2 : 0)) -- { -- case 4: return \"b%d5\\t%l4\"; -- case 6: return \"b%D5\\t.LCB%=\;b\\t%l4\\t%@long jump\\n.LCB%=:\"; -- default: return \"b%D5\\t.LCB%=\;bl\\t%l4\\t%@far jump\\n.LCB%=:\"; -- } -- }" -- [(set (attr "far_jump") -- (if_then_else -- (ior (and (eq (symbol_ref ("which_alternative")) -- (const_int 0)) -- (eq_attr "length" "8")) -- (eq_attr "length" "10")) -- (const_string "yes") -- (const_string "no"))) -- (set (attr "length") -- (if_then_else -- (eq (symbol_ref ("which_alternative")) -- (const_int 0)) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -250)) -- (le (minus (match_dup 4) (pc)) (const_int 256))) -- (const_int 4) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -2040)) -- (le (minus (match_dup 4) (pc)) (const_int 2048))) -- (const_int 6) -- (const_int 8))) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -248)) -- (le (minus (match_dup 4) (pc)) (const_int 256))) -- (const_int 6) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -2038)) -- (le (minus (match_dup 4) (pc)) (const_int 2048))) -- (const_int 8) -- (const_int 10)))))] -+(define_expand "cmpdf" -+ [(match_operand:DF 0 "s_register_operand" "") -+ (match_operand:DF 1 "arm_float_compare_operand" "")] -+ "TARGET_ARM && TARGET_HARD_FLOAT" -+ " -+ arm_compare_op0 = operands[0]; -+ arm_compare_op1 = operands[1]; -+ DONE; -+ " - ) - --(define_insn "*xorsi3_cbranch_scratch" -- [(set (pc) -- (if_then_else -- (match_operator 4 "equality_operator" -- [(xor:SI (match_operand:SI 1 "s_register_operand" "%0") -- (match_operand:SI 2 "s_register_operand" "l")) -- (const_int 0)]) -- (label_ref (match_operand 3 "" "")) -- (pc))) -- (clobber (match_scratch:SI 0 "=l"))] -- "TARGET_THUMB" -- "* -- { -- output_asm_insn (\"eor\\t%0, %2\", operands); -- switch (get_attr_length (insn)) -- { -- case 4: return \"b%d4\\t%l3\"; -- case 6: return \"b%D4\\t.LCB%=\;b\\t%l3\\t%@long jump\\n.LCB%=:\"; -- default: return \"b%D4\\t.LCB%=\;bl\\t%l3\\t%@far jump\\n.LCB%=:\"; -- } -- }" -- [(set (attr "far_jump") -- (if_then_else -- (eq_attr "length" "8") -- (const_string "yes") -- (const_string "no"))) -- (set (attr "length") -- (if_then_else -- (and (ge (minus (match_dup 3) (pc)) (const_int -250)) -- (le (minus (match_dup 3) (pc)) (const_int 256))) -- (const_int 4) -- (if_then_else -- (and (ge (minus (match_dup 3) (pc)) (const_int -2040)) -- (le (minus (match_dup 3) (pc)) (const_int 2048))) -- (const_int 6) -- (const_int 8))))] -+(define_insn "*arm_cmpsi_insn" -+ [(set (reg:CC CC_REGNUM) -+ (compare:CC (match_operand:SI 0 "s_register_operand" "r,r") -+ (match_operand:SI 1 "arm_add_operand" "rI,L")))] -+ "TARGET_ARM" -+ "@ -+ cmp%?\\t%0, %1 -+ cmn%?\\t%0, #%n1" -+ [(set_attr "conds" "set")] - ) -- --(define_insn "*xorsi3_cbranch" -- [(set (pc) -- (if_then_else -- (match_operator 5 "equality_operator" -- [(xor:SI (match_operand:SI 2 "s_register_operand" "%0,1,1,1") -- (match_operand:SI 3 "s_register_operand" "l,l,l,l")) -- (const_int 0)]) -- (label_ref (match_operand 4 "" "")) -- (pc))) -- (set (match_operand:SI 0 "thumb_cbrch_target_operand" "=l,*?h,*?m,*?m") -- (xor:SI (match_dup 2) (match_dup 3))) -- (clobber (match_scratch:SI 1 "=X,l,&l,&l"))] -- "TARGET_THUMB" -- "* -- { -- if (which_alternative == 0) -- output_asm_insn (\"eor\\t%0, %3\", operands); -- else if (which_alternative == 1) -- { -- output_asm_insn (\"eor\\t%1, %3\", operands); -- output_asm_insn (\"mov\\t%0, %1\", operands); -- } -- else -- { -- output_asm_insn (\"eor\\t%1, %3\", operands); -- output_asm_insn (\"str\\t%1, %0\", operands); -- } - -- switch (get_attr_length (insn) - (which_alternative ? 2 : 0)) -- { -- case 4: return \"b%d5\\t%l4\"; -- case 6: return \"b%D5\\t.LCB%=\;b\\t%l4\\t%@long jump\\n.LCB%=:\"; -- default: return \"b%D5\\t.LCB%=\;bl\\t%l4\\t%@far jump\\n.LCB%=:\"; -- } -- }" -- [(set (attr "far_jump") -- (if_then_else -- (ior (and (eq (symbol_ref ("which_alternative")) -- (const_int 0)) -- (eq_attr "length" "8")) -- (eq_attr "length" "10")) -- (const_string "yes") -- (const_string "no"))) -- (set (attr "length") -- (if_then_else -- (eq (symbol_ref ("which_alternative")) -- (const_int 0)) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -250)) -- (le (minus (match_dup 4) (pc)) (const_int 256))) -- (const_int 4) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -2040)) -- (le (minus (match_dup 4) (pc)) (const_int 2048))) -- (const_int 6) -- (const_int 8))) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -248)) -- (le (minus (match_dup 4) (pc)) (const_int 256))) -- (const_int 6) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -2038)) -- (le (minus (match_dup 4) (pc)) (const_int 2048))) -- (const_int 8) -- (const_int 10)))))] --) -- --(define_insn "*bicsi3_cbranch_scratch" -- [(set (pc) -- (if_then_else -- (match_operator 4 "equality_operator" -- [(and:SI (not:SI (match_operand:SI 2 "s_register_operand" "l")) -- (match_operand:SI 1 "s_register_operand" "0")) -- (const_int 0)]) -- (label_ref (match_operand 3 "" "")) -- (pc))) -- (clobber (match_scratch:SI 0 "=l"))] -- "TARGET_THUMB" -- "* -- { -- output_asm_insn (\"bic\\t%0, %2\", operands); -- switch (get_attr_length (insn)) -- { -- case 4: return \"b%d4\\t%l3\"; -- case 6: return \"b%D4\\t.LCB%=\;b\\t%l3\\t%@long jump\\n.LCB%=:\"; -- default: return \"b%D4\\t.LCB%=\;bl\\t%l3\\t%@far jump\\n.LCB%=:\"; -- } -- }" -- [(set (attr "far_jump") -- (if_then_else -- (eq_attr "length" "8") -- (const_string "yes") -- (const_string "no"))) -- (set (attr "length") -- (if_then_else -- (and (ge (minus (match_dup 3) (pc)) (const_int -250)) -- (le (minus (match_dup 3) (pc)) (const_int 256))) -- (const_int 4) -- (if_then_else -- (and (ge (minus (match_dup 3) (pc)) (const_int -2040)) -- (le (minus (match_dup 3) (pc)) (const_int 2048))) -- (const_int 6) -- (const_int 8))))] --) -- --(define_insn "*bicsi3_cbranch" -- [(set (pc) -- (if_then_else -- (match_operator 5 "equality_operator" -- [(and:SI (not:SI (match_operand:SI 3 "s_register_operand" "l,l,l,l,l")) -- (match_operand:SI 2 "s_register_operand" "0,1,1,1,1")) -- (const_int 0)]) -- (label_ref (match_operand 4 "" "")) -- (pc))) -- (set (match_operand:SI 0 "thumb_cbrch_target_operand" "=!l,l,*?h,*?m,*?m") -- (and:SI (not:SI (match_dup 3)) (match_dup 2))) -- (clobber (match_scratch:SI 1 "=X,l,l,&l,&l"))] -- "TARGET_THUMB" -- "* -- { -- if (which_alternative == 0) -- output_asm_insn (\"bic\\t%0, %3\", operands); -- else if (which_alternative <= 2) -- { -- output_asm_insn (\"bic\\t%1, %3\", operands); -- /* It's ok if OP0 is a lo-reg, even though the mov will set the -- conditions again, since we're only testing for equality. */ -- output_asm_insn (\"mov\\t%0, %1\", operands); -- } -- else -- { -- output_asm_insn (\"bic\\t%1, %3\", operands); -- output_asm_insn (\"str\\t%1, %0\", operands); -- } -- -- switch (get_attr_length (insn) - (which_alternative ? 2 : 0)) -- { -- case 4: return \"b%d5\\t%l4\"; -- case 6: return \"b%D5\\t.LCB%=\;b\\t%l4\\t%@long jump\\n.LCB%=:\"; -- default: return \"b%D5\\t.LCB%=\;bl\\t%l4\\t%@far jump\\n.LCB%=:\"; -- } -- }" -- [(set (attr "far_jump") -- (if_then_else -- (ior (and (eq (symbol_ref ("which_alternative")) -- (const_int 0)) -- (eq_attr "length" "8")) -- (eq_attr "length" "10")) -- (const_string "yes") -- (const_string "no"))) -- (set (attr "length") -- (if_then_else -- (eq (symbol_ref ("which_alternative")) -- (const_int 0)) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -250)) -- (le (minus (match_dup 4) (pc)) (const_int 256))) -- (const_int 4) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -2040)) -- (le (minus (match_dup 4) (pc)) (const_int 2048))) -- (const_int 6) -- (const_int 8))) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -248)) -- (le (minus (match_dup 4) (pc)) (const_int 256))) -- (const_int 6) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -2038)) -- (le (minus (match_dup 4) (pc)) (const_int 2048))) -- (const_int 8) -- (const_int 10)))))] --) -- --(define_insn "*cbranchne_decr1" -- [(set (pc) -- (if_then_else (match_operator 3 "equality_operator" -- [(match_operand:SI 2 "s_register_operand" "l,l,1,l") -- (const_int 0)]) -- (label_ref (match_operand 4 "" "")) -- (pc))) -- (set (match_operand:SI 0 "thumb_cbrch_target_operand" "=l,*?h,*?m,*?m") -- (plus:SI (match_dup 2) (const_int -1))) -- (clobber (match_scratch:SI 1 "=X,l,&l,&l"))] -- "TARGET_THUMB" -- "* -- { -- rtx cond[2]; -- cond[0] = gen_rtx_fmt_ee ((GET_CODE (operands[3]) == NE -- ? GEU : LTU), -- VOIDmode, operands[2], const1_rtx); -- cond[1] = operands[4]; -- -- if (which_alternative == 0) -- output_asm_insn (\"sub\\t%0, %2, #1\", operands); -- else if (which_alternative == 1) -- { -- /* We must provide an alternative for a hi reg because reload -- cannot handle output reloads on a jump instruction, but we -- can't subtract into that. Fortunately a mov from lo to hi -- does not clobber the condition codes. */ -- output_asm_insn (\"sub\\t%1, %2, #1\", operands); -- output_asm_insn (\"mov\\t%0, %1\", operands); -- } -- else -- { -- /* Similarly, but the target is memory. */ -- output_asm_insn (\"sub\\t%1, %2, #1\", operands); -- output_asm_insn (\"str\\t%1, %0\", operands); -- } -- -- switch (get_attr_length (insn) - (which_alternative ? 2 : 0)) -- { -- case 4: -- output_asm_insn (\"b%d0\\t%l1\", cond); -- return \"\"; -- case 6: -- output_asm_insn (\"b%D0\\t.LCB%=\", cond); -- return \"b\\t%l4\\t%@long jump\\n.LCB%=:\"; -- default: -- output_asm_insn (\"b%D0\\t.LCB%=\", cond); -- return \"bl\\t%l4\\t%@far jump\\n.LCB%=:\"; -- } -- } -- " -- [(set (attr "far_jump") -- (if_then_else -- (ior (and (eq (symbol_ref ("which_alternative")) -- (const_int 0)) -- (eq_attr "length" "8")) -- (eq_attr "length" "10")) -- (const_string "yes") -- (const_string "no"))) -- (set_attr_alternative "length" -- [ -- ;; Alternative 0 -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -250)) -- (le (minus (match_dup 4) (pc)) (const_int 256))) -- (const_int 4) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -2040)) -- (le (minus (match_dup 4) (pc)) (const_int 2048))) -- (const_int 6) -- (const_int 8))) -- ;; Alternative 1 -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -248)) -- (le (minus (match_dup 4) (pc)) (const_int 256))) -- (const_int 6) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -2038)) -- (le (minus (match_dup 4) (pc)) (const_int 2048))) -- (const_int 8) -- (const_int 10))) -- ;; Alternative 2 -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -248)) -- (le (minus (match_dup 4) (pc)) (const_int 256))) -- (const_int 6) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -2038)) -- (le (minus (match_dup 4) (pc)) (const_int 2048))) -- (const_int 8) -- (const_int 10))) -- ;; Alternative 3 -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -248)) -- (le (minus (match_dup 4) (pc)) (const_int 256))) -- (const_int 6) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -2038)) -- (le (minus (match_dup 4) (pc)) (const_int 2048))) -- (const_int 8) -- (const_int 10)))])] --) -- --(define_insn "*addsi3_cbranch" -- [(set (pc) -- (if_then_else -- (match_operator 4 "comparison_operator" -- [(plus:SI -- (match_operand:SI 2 "s_register_operand" "%l,0,*0,1,1,1") -- (match_operand:SI 3 "reg_or_int_operand" "lL,IJ,*r,lIJ,lIJ,lIJ")) -- (const_int 0)]) -- (label_ref (match_operand 5 "" "")) -- (pc))) -- (set -- (match_operand:SI 0 "thumb_cbrch_target_operand" "=l,l,*!h,*?h,*?m,*?m") -- (plus:SI (match_dup 2) (match_dup 3))) -- (clobber (match_scratch:SI 1 "=X,X,X,l,&l,&l"))] -- "TARGET_THUMB -- && (GET_CODE (operands[4]) == EQ -- || GET_CODE (operands[4]) == NE -- || GET_CODE (operands[4]) == GE -- || GET_CODE (operands[4]) == LT)" -- "* -- { -- rtx cond[3]; -- -- -- cond[0] = (which_alternative < 3) ? operands[0] : operands[1]; -- cond[1] = operands[2]; -- cond[2] = operands[3]; -- -- if (GET_CODE (cond[2]) == CONST_INT && INTVAL (cond[2]) < 0) -- output_asm_insn (\"sub\\t%0, %1, #%n2\", cond); -- else -- output_asm_insn (\"add\\t%0, %1, %2\", cond); -- -- if (which_alternative >= 3 -- && which_alternative < 4) -- output_asm_insn (\"mov\\t%0, %1\", operands); -- else if (which_alternative >= 4) -- output_asm_insn (\"str\\t%1, %0\", operands); -- -- switch (get_attr_length (insn) - ((which_alternative >= 3) ? 2 : 0)) -- { -- case 4: -- return \"b%d4\\t%l5\"; -- case 6: -- return \"b%D4\\t.LCB%=\;b\\t%l5\\t%@long jump\\n.LCB%=:\"; -- default: -- return \"b%D4\\t.LCB%=\;bl\\t%l5\\t%@far jump\\n.LCB%=:\"; -- } -- } -- " -- [(set (attr "far_jump") -- (if_then_else -- (ior (and (lt (symbol_ref ("which_alternative")) -- (const_int 3)) -- (eq_attr "length" "8")) -- (eq_attr "length" "10")) -- (const_string "yes") -- (const_string "no"))) -- (set (attr "length") -- (if_then_else -- (lt (symbol_ref ("which_alternative")) -- (const_int 3)) -- (if_then_else -- (and (ge (minus (match_dup 5) (pc)) (const_int -250)) -- (le (minus (match_dup 5) (pc)) (const_int 256))) -- (const_int 4) -- (if_then_else -- (and (ge (minus (match_dup 5) (pc)) (const_int -2040)) -- (le (minus (match_dup 5) (pc)) (const_int 2048))) -- (const_int 6) -- (const_int 8))) -- (if_then_else -- (and (ge (minus (match_dup 5) (pc)) (const_int -248)) -- (le (minus (match_dup 5) (pc)) (const_int 256))) -- (const_int 6) -- (if_then_else -- (and (ge (minus (match_dup 5) (pc)) (const_int -2038)) -- (le (minus (match_dup 5) (pc)) (const_int 2048))) -- (const_int 8) -- (const_int 10)))))] --) -- --(define_insn "*addsi3_cbranch_scratch" -- [(set (pc) -- (if_then_else -- (match_operator 3 "comparison_operator" -- [(plus:SI -- (match_operand:SI 1 "s_register_operand" "%l,l,l,0") -- (match_operand:SI 2 "reg_or_int_operand" "J,l,L,IJ")) -- (const_int 0)]) -- (label_ref (match_operand 4 "" "")) -- (pc))) -- (clobber (match_scratch:SI 0 "=X,X,l,l"))] -- "TARGET_THUMB -- && (GET_CODE (operands[3]) == EQ -- || GET_CODE (operands[3]) == NE -- || GET_CODE (operands[3]) == GE -- || GET_CODE (operands[3]) == LT)" -- "* -- { -- switch (which_alternative) -- { -- case 0: -- output_asm_insn (\"cmp\t%1, #%n2\", operands); -- break; -- case 1: -- output_asm_insn (\"cmn\t%1, %2\", operands); -- break; -- case 2: -- if (INTVAL (operands[2]) < 0) -- output_asm_insn (\"sub\t%0, %1, %2\", operands); -- else -- output_asm_insn (\"add\t%0, %1, %2\", operands); -- break; -- case 3: -- if (INTVAL (operands[2]) < 0) -- output_asm_insn (\"sub\t%0, %0, %2\", operands); -- else -- output_asm_insn (\"add\t%0, %0, %2\", operands); -- break; -- } -- -- switch (get_attr_length (insn)) -- { -- case 4: -- return \"b%d3\\t%l4\"; -- case 6: -- return \"b%D3\\t.LCB%=\;b\\t%l4\\t%@long jump\\n.LCB%=:\"; -- default: -- return \"b%D3\\t.LCB%=\;bl\\t%l4\\t%@far jump\\n.LCB%=:\"; -- } -- } -- " -- [(set (attr "far_jump") -- (if_then_else -- (eq_attr "length" "8") -- (const_string "yes") -- (const_string "no"))) -- (set (attr "length") -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -250)) -- (le (minus (match_dup 4) (pc)) (const_int 256))) -- (const_int 4) -- (if_then_else -- (and (ge (minus (match_dup 4) (pc)) (const_int -2040)) -- (le (minus (match_dup 4) (pc)) (const_int 2048))) -- (const_int 6) -- (const_int 8))))] --) -- --(define_insn "*subsi3_cbranch" -- [(set (pc) -- (if_then_else -- (match_operator 4 "comparison_operator" -- [(minus:SI -- (match_operand:SI 2 "s_register_operand" "l,l,1,l") -- (match_operand:SI 3 "s_register_operand" "l,l,l,l")) -- (const_int 0)]) -- (label_ref (match_operand 5 "" "")) -- (pc))) -- (set (match_operand:SI 0 "thumb_cbrch_target_operand" "=l,*?h,*?m,*?m") -- (minus:SI (match_dup 2) (match_dup 3))) -- (clobber (match_scratch:SI 1 "=X,l,&l,&l"))] -- "TARGET_THUMB -- && (GET_CODE (operands[4]) == EQ -- || GET_CODE (operands[4]) == NE -- || GET_CODE (operands[4]) == GE -- || GET_CODE (operands[4]) == LT)" -- "* -- { -- if (which_alternative == 0) -- output_asm_insn (\"sub\\t%0, %2, %3\", operands); -- else if (which_alternative == 1) -- { -- /* We must provide an alternative for a hi reg because reload -- cannot handle output reloads on a jump instruction, but we -- can't subtract into that. Fortunately a mov from lo to hi -- does not clobber the condition codes. */ -- output_asm_insn (\"sub\\t%1, %2, %3\", operands); -- output_asm_insn (\"mov\\t%0, %1\", operands); -- } -- else -- { -- /* Similarly, but the target is memory. */ -- output_asm_insn (\"sub\\t%1, %2, %3\", operands); -- output_asm_insn (\"str\\t%1, %0\", operands); -- } -- -- switch (get_attr_length (insn) - ((which_alternative != 0) ? 2 : 0)) -- { -- case 4: -- return \"b%d4\\t%l5\"; -- case 6: -- return \"b%D4\\t.LCB%=\;b\\t%l5\\t%@long jump\\n.LCB%=:\"; -- default: -- return \"b%D4\\t.LCB%=\;bl\\t%l5\\t%@far jump\\n.LCB%=:\"; -- } -- } -- " -- [(set (attr "far_jump") -- (if_then_else -- (ior (and (eq (symbol_ref ("which_alternative")) -- (const_int 0)) -- (eq_attr "length" "8")) -- (eq_attr "length" "10")) -- (const_string "yes") -- (const_string "no"))) -- (set (attr "length") -- (if_then_else -- (eq (symbol_ref ("which_alternative")) -- (const_int 0)) -- (if_then_else -- (and (ge (minus (match_dup 5) (pc)) (const_int -250)) -- (le (minus (match_dup 5) (pc)) (const_int 256))) -- (const_int 4) -- (if_then_else -- (and (ge (minus (match_dup 5) (pc)) (const_int -2040)) -- (le (minus (match_dup 5) (pc)) (const_int 2048))) -- (const_int 6) -- (const_int 8))) -- (if_then_else -- (and (ge (minus (match_dup 5) (pc)) (const_int -248)) -- (le (minus (match_dup 5) (pc)) (const_int 256))) -- (const_int 6) -- (if_then_else -- (and (ge (minus (match_dup 5) (pc)) (const_int -2038)) -- (le (minus (match_dup 5) (pc)) (const_int 2048))) -- (const_int 8) -- (const_int 10)))))] --) -- --(define_insn "*subsi3_cbranch_scratch" -- [(set (pc) -- (if_then_else -- (match_operator 0 "arm_comparison_operator" -- [(minus:SI (match_operand:SI 1 "register_operand" "l") -- (match_operand:SI 2 "nonmemory_operand" "l")) -- (const_int 0)]) -- (label_ref (match_operand 3 "" "")) -- (pc)))] -- "TARGET_THUMB -- && (GET_CODE (operands[0]) == EQ -- || GET_CODE (operands[0]) == NE -- || GET_CODE (operands[0]) == GE -- || GET_CODE (operands[0]) == LT)" -- "* -- output_asm_insn (\"cmp\\t%1, %2\", operands); -- switch (get_attr_length (insn)) -- { -- case 4: return \"b%d0\\t%l3\"; -- case 6: return \"b%D0\\t.LCB%=\;b\\t%l3\\t%@long jump\\n.LCB%=:\"; -- default: return \"b%D0\\t.LCB%=\;bl\\t%l3\\t%@far jump\\n.LCB%=:\"; -- } -- " -- [(set (attr "far_jump") -- (if_then_else -- (eq_attr "length" "8") -- (const_string "yes") -- (const_string "no"))) -- (set (attr "length") -- (if_then_else -- (and (ge (minus (match_dup 3) (pc)) (const_int -250)) -- (le (minus (match_dup 3) (pc)) (const_int 256))) -- (const_int 4) -- (if_then_else -- (and (ge (minus (match_dup 3) (pc)) (const_int -2040)) -- (le (minus (match_dup 3) (pc)) (const_int 2048))) -- (const_int 6) -- (const_int 8))))] --) -- --;; Comparison and test insns -- --(define_expand "cmpsi" -- [(match_operand:SI 0 "s_register_operand" "") -- (match_operand:SI 1 "arm_add_operand" "")] -- "TARGET_ARM" -- "{ -- arm_compare_op0 = operands[0]; -- arm_compare_op1 = operands[1]; -- DONE; -- }" --) -- --(define_expand "cmpsf" -- [(match_operand:SF 0 "s_register_operand" "") -- (match_operand:SF 1 "arm_float_compare_operand" "")] -- "TARGET_ARM && TARGET_HARD_FLOAT" -- " -- arm_compare_op0 = operands[0]; -- arm_compare_op1 = operands[1]; -- DONE; -- " --) -- --(define_expand "cmpdf" -- [(match_operand:DF 0 "s_register_operand" "") -- (match_operand:DF 1 "arm_float_compare_operand" "")] -- "TARGET_ARM && TARGET_HARD_FLOAT" -- " -- arm_compare_op0 = operands[0]; -- arm_compare_op1 = operands[1]; -- DONE; -- " --) -- --(define_insn "*arm_cmpsi_insn" -- [(set (reg:CC CC_REGNUM) -- (compare:CC (match_operand:SI 0 "s_register_operand" "r,r") -- (match_operand:SI 1 "arm_add_operand" "rI,L")))] -- "TARGET_ARM" -- "@ -- cmp%?\\t%0, %1 -- cmn%?\\t%0, #%n1" -- [(set_attr "conds" "set")] --) -- --(define_insn "*cmpsi_shiftsi" -- [(set (reg:CC CC_REGNUM) -- (compare:CC (match_operand:SI 0 "s_register_operand" "r") -- (match_operator:SI 3 "shift_operator" -- [(match_operand:SI 1 "s_register_operand" "r") -- (match_operand:SI 2 "arm_rhs_operand" "rM")])))] -- "TARGET_ARM" -- "cmp%?\\t%0, %1%S3" -- [(set_attr "conds" "set") -- (set_attr "shift" "1") -- (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "") -- (const_string "alu_shift") -- (const_string "alu_shift_reg")))] -+(define_insn "*cmpsi_shiftsi" -+ [(set (reg:CC CC_REGNUM) -+ (compare:CC (match_operand:SI 0 "s_register_operand" "r") -+ (match_operator:SI 3 "shift_operator" -+ [(match_operand:SI 1 "s_register_operand" "r") -+ (match_operand:SI 2 "arm_rhs_operand" "rM")])))] -+ "TARGET_ARM" -+ "cmp%?\\t%0, %1%S3" -+ [(set_attr "conds" "set") -+ (set_attr "shift" "1") -+ (set (attr "type") (if_then_else (match_operand 2 "const_int_operand" "") -+ (const_string "alu_shift") -+ (const_string "alu_shift_reg")))] - ) - - (define_insn "*cmpsi_shiftsi_swp" -@@ -7315,41 +7315,41 @@ - - ; scc insns - --(define_expand "seq" -- [(set (match_operand:SI 0 "s_register_operand" "") -- (eq:SI (match_dup 1) (const_int 0)))] -- "TARGET_ARM" -- "operands[1] = arm_gen_compare_reg (EQ, arm_compare_op0, arm_compare_op1);" --) -+;(define_expand "seq" -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (eq:SI (match_dup 1) (const_int 0)))] -+; "TARGET_ARM" -+; "operands[1] = arm_gen_compare_reg (EQ, arm_compare_op0, arm_compare_op1);" -+;) - --(define_expand "sne" -- [(set (match_operand:SI 0 "s_register_operand" "") -- (ne:SI (match_dup 1) (const_int 0)))] -- "TARGET_ARM" -- "operands[1] = arm_gen_compare_reg (NE, arm_compare_op0, arm_compare_op1);" --) -+;(define_expand "sne" -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (ne:SI (match_dup 1) (const_int 0)))] -+; "TARGET_ARM" -+; "operands[1] = arm_gen_compare_reg (NE, arm_compare_op0, arm_compare_op1);" -+;) - --(define_expand "sgt" -- [(set (match_operand:SI 0 "s_register_operand" "") -- (gt:SI (match_dup 1) (const_int 0)))] -- "TARGET_ARM" -- "operands[1] = arm_gen_compare_reg (GT, arm_compare_op0, arm_compare_op1);" --) -+;(define_expand "sgt" -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (gt:SI (match_dup 1) (const_int 0)))] -+; "TARGET_ARM" -+; "operands[1] = arm_gen_compare_reg (GT, arm_compare_op0, arm_compare_op1);" -+;) - --(define_expand "sle" -- [(set (match_operand:SI 0 "s_register_operand" "") -- (le:SI (match_dup 1) (const_int 0)))] -- "TARGET_ARM" -- "operands[1] = arm_gen_compare_reg (LE, arm_compare_op0, arm_compare_op1);" --) -+;(define_expand "sle" -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (le:SI (match_dup 1) (const_int 0)))] -+; "TARGET_ARM" -+; "operands[1] = arm_gen_compare_reg (LE, arm_compare_op0, arm_compare_op1);" -+;) - - ;; broken for cirrus - definitely --(define_expand "sge" -- [(set (match_operand:SI 0 "s_register_operand" "") -- (ge:SI (match_dup 1) (const_int 0)))] -- "TARGET_ARM && !(TARGET_HARD_FLOAT && TARGET_MAVERICK)" -- "operands[1] = arm_gen_compare_reg (GE, arm_compare_op0, arm_compare_op1);" --) -+;(define_expand "sge" -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (ge:SI (match_dup 1) (const_int 0)))] -+; "TARGET_ARM && !(TARGET_HARD_FLOAT && TARGET_MAVERICK)" -+; "operands[1] = arm_gen_compare_reg (GE, arm_compare_op0, arm_compare_op1);" -+;) - - ;;; DO NOT add patterns for SGE these can not be represented with MAVERICK - ; (define_expand "sge" -@@ -7359,34 +7359,34 @@ - ; "gcc_unreachable ();" - ; ) - --(define_expand "slt" -- [(set (match_operand:SI 0 "s_register_operand" "") -- (lt:SI (match_dup 1) (const_int 0)))] -- "TARGET_ARM" -- "operands[1] = arm_gen_compare_reg (LT, arm_compare_op0, arm_compare_op1);" --) -+;(define_expand "slt" -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (lt:SI (match_dup 1) (const_int 0)))] -+; "TARGET_ARM" -+; "operands[1] = arm_gen_compare_reg (LT, arm_compare_op0, arm_compare_op1);" -+;) - --(define_expand "sgtu" -- [(set (match_operand:SI 0 "s_register_operand" "") -- (gtu:SI (match_dup 1) (const_int 0)))] -- "TARGET_ARM" -- "operands[1] = arm_gen_compare_reg (GTU, arm_compare_op0, arm_compare_op1);" --) -+;(define_expand "sgtu" -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (gtu:SI (match_dup 1) (const_int 0)))] -+; "TARGET_ARM" -+; "operands[1] = arm_gen_compare_reg (GTU, arm_compare_op0, arm_compare_op1);" -+;) - --(define_expand "sleu" -- [(set (match_operand:SI 0 "s_register_operand" "") -- (leu:SI (match_dup 1) (const_int 0)))] -- "TARGET_ARM" -- "operands[1] = arm_gen_compare_reg (LEU, arm_compare_op0, arm_compare_op1);" --) -+;(define_expand "sleu" -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (leu:SI (match_dup 1) (const_int 0)))] -+; "TARGET_ARM" -+; "operands[1] = arm_gen_compare_reg (LEU, arm_compare_op0, arm_compare_op1);" -+;) - - ;; broken for cirrus - maybe --(define_expand "sgeu" -- [(set (match_operand:SI 0 "s_register_operand" "") -- (geu:SI (match_dup 1) (const_int 0)))] -- "TARGET_ARM" -- "operands[1] = arm_gen_compare_reg (GEU, arm_compare_op0, arm_compare_op1);" --) -+;(define_expand "sgeu" -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (geu:SI (match_dup 1) (const_int 0)))] -+; "TARGET_ARM" -+; "operands[1] = arm_gen_compare_reg (GEU, arm_compare_op0, arm_compare_op1);" -+;) - - ;;; DO NOT add patterns for SGEU these may not be represented with MAVERICK? - ; (define_expand "sgeu" -@@ -7396,53 +7396,53 @@ - ; "gcc_unreachable ();" - ; ) - --(define_expand "sltu" -- [(set (match_operand:SI 0 "s_register_operand" "") -- (ltu:SI (match_dup 1) (const_int 0)))] -- "TARGET_ARM" -- "operands[1] = arm_gen_compare_reg (LTU, arm_compare_op0, arm_compare_op1);" --) -+;(define_expand "sltu" -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (ltu:SI (match_dup 1) (const_int 0)))] -+; "TARGET_ARM" -+; "operands[1] = arm_gen_compare_reg (LTU, arm_compare_op0, arm_compare_op1);" -+;) - --(define_expand "sunordered" -- [(set (match_operand:SI 0 "s_register_operand" "") -- (unordered:SI (match_dup 1) (const_int 0)))] -- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" -- "operands[1] = arm_gen_compare_reg (UNORDERED, arm_compare_op0, -- arm_compare_op1);" --) -+;(define_expand "sunordered" -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (unordered:SI (match_dup 1) (const_int 0)))] -+; "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" -+; "operands[1] = arm_gen_compare_reg (UNORDERED, arm_compare_op0, -+; arm_compare_op1);" -+;) - --(define_expand "sordered" -- [(set (match_operand:SI 0 "s_register_operand" "") -- (ordered:SI (match_dup 1) (const_int 0)))] -- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" -- "operands[1] = arm_gen_compare_reg (ORDERED, arm_compare_op0, -- arm_compare_op1);" --) -+;(define_expand "sordered" -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (ordered:SI (match_dup 1) (const_int 0)))] -+; "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" -+; "operands[1] = arm_gen_compare_reg (ORDERED, arm_compare_op0, -+; arm_compare_op1);" -+;) - --(define_expand "sungt" -- [(set (match_operand:SI 0 "s_register_operand" "") -- (ungt:SI (match_dup 1) (const_int 0)))] -- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" -- "operands[1] = arm_gen_compare_reg (UNGT, arm_compare_op0, -- arm_compare_op1);" --) -+;(define_expand "sungt" -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (ungt:SI (match_dup 1) (const_int 0)))] -+; "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" -+; "operands[1] = arm_gen_compare_reg (UNGT, arm_compare_op0, -+; arm_compare_op1);" -+;) - --(define_expand "sunge" -- [(set (match_operand:SI 0 "s_register_operand" "") -- (unge:SI (match_dup 1) (const_int 0)))] -- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" -- "operands[1] = arm_gen_compare_reg (UNGE, arm_compare_op0, -- arm_compare_op1);" --) -+;(define_expand "sunge" -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (unge:SI (match_dup 1) (const_int 0)))] -+; "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" -+; "operands[1] = arm_gen_compare_reg (UNGE, arm_compare_op0, -+; arm_compare_op1);" -+;) - - ; broken for cirrus --(define_expand "sunlt" -- [(set (match_operand:SI 0 "s_register_operand" "") -- (unlt:SI (match_dup 1) (const_int 0)))] -- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" -- "operands[1] = arm_gen_compare_reg (UNLT, arm_compare_op0, -- arm_compare_op1);" --) -+;(define_expand "sunlt" -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (unlt:SI (match_dup 1) (const_int 0)))] -+; "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)" -+; "operands[1] = arm_gen_compare_reg (UNLT, arm_compare_op0, -+; arm_compare_op1);" -+;) - - ;;; DO NOT add patterns for SUNLT these can't be represented with MAVERICK - ; (define_expand "sunlt" -@@ -7452,13 +7452,13 @@ - ; "gcc_unreachable ();" - ; ) - --(define_expand "sunle" -- [(set (match_operand:SI 0 "s_register_operand" "") -- (unle:SI (match_dup 1) (const_int 0)))] -- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" -- "operands[1] = arm_gen_compare_reg (UNLE, arm_compare_op0, -- arm_compare_op1);" --) -+;(define_expand "sunle" -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (unle:SI (match_dup 1) (const_int 0)))] -+; "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" -+; "operands[1] = arm_gen_compare_reg (UNLE, arm_compare_op0, -+; arm_compare_op1);" -+;) - - ;(define_expand "suneq" - ; [(set (match_operand:SI 0 "s_register_operand" "") -@@ -7493,136 +7493,136 @@ - ; "gcc_unreachable ();" - ; ) - --(define_insn "*mov_scc" -- [(set (match_operand:SI 0 "s_register_operand" "=r") -- (match_operator:SI 1 "arm_comparison_operator" -- [(match_operand 2 "cc_register" "") (const_int 0)]))] -- "TARGET_ARM" -- "mov%D1\\t%0, #0\;mov%d1\\t%0, #1" -- [(set_attr "conds" "use") -- (set_attr "length" "8")] --) -+;(define_insn "*mov_scc" -+; [(set (match_operand:SI 0 "s_register_operand" "=r") -+; (match_operator:SI 1 "arm_comparison_operator" -+; [(match_operand 2 "cc_register" "") (const_int 0)]))] -+; "TARGET_ARM" -+; "mov%D1\\t%0, #0\;mov%d1\\t%0, #1" -+; [(set_attr "conds" "use") -+; (set_attr "length" "8")] -+;) - --(define_insn "*mov_negscc" -- [(set (match_operand:SI 0 "s_register_operand" "=r") -- (neg:SI (match_operator:SI 1 "arm_comparison_operator" -- [(match_operand 2 "cc_register" "") (const_int 0)])))] -- "TARGET_ARM" -- "mov%D1\\t%0, #0\;mvn%d1\\t%0, #0" -- [(set_attr "conds" "use") -- (set_attr "length" "8")] --) -+;(define_insn "*mov_negscc" -+; [(set (match_operand:SI 0 "s_register_operand" "=r") -+; (neg:SI (match_operator:SI 1 "arm_comparison_operator" -+; [(match_operand 2 "cc_register" "") (const_int 0)])))] -+; "TARGET_ARM" -+; "mov%D1\\t%0, #0\;mvn%d1\\t%0, #0" -+; [(set_attr "conds" "use") -+; (set_attr "length" "8")] -+;) - --(define_insn "*mov_notscc" -- [(set (match_operand:SI 0 "s_register_operand" "=r") -- (not:SI (match_operator:SI 1 "arm_comparison_operator" -- [(match_operand 2 "cc_register" "") (const_int 0)])))] -- "TARGET_ARM" -- "mov%D1\\t%0, #0\;mvn%d1\\t%0, #1" -- [(set_attr "conds" "use") -- (set_attr "length" "8")] --) -+;(define_insn "*mov_notscc" -+; [(set (match_operand:SI 0 "s_register_operand" "=r") -+; (not:SI (match_operator:SI 1 "arm_comparison_operator" -+; [(match_operand 2 "cc_register" "") (const_int 0)])))] -+; "TARGET_ARM" -+; "mov%D1\\t%0, #0\;mvn%d1\\t%0, #1" -+; [(set_attr "conds" "use") -+; (set_attr "length" "8")] -+;) - - - ;; Conditional move insns - --(define_expand "movsicc" -- [(set (match_operand:SI 0 "s_register_operand" "") -- (if_then_else:SI (match_operand 1 "arm_comparison_operator" "") -- (match_operand:SI 2 "arm_not_operand" "") -- (match_operand:SI 3 "arm_not_operand" "")))] -- "TARGET_ARM" -- " -- { -- enum rtx_code code = GET_CODE (operands[1]); -- rtx ccreg; -- -- if ((code == UNEQ || code == LTGT) || (TARGET_MAVERICK && (code == GE || code == UNLT || code == ORDERED || code == UNORDERED))) -- FAIL; -- -- ccreg = arm_gen_compare_reg (code, arm_compare_op0, arm_compare_op1); -- operands[1] = gen_rtx_fmt_ee (code, VOIDmode, ccreg, const0_rtx); -- }" --) -- --(define_expand "movsfcc" -- [(set (match_operand:SF 0 "s_register_operand" "") -- (if_then_else:SF (match_operand 1 "arm_comparison_operator" "") -- (match_operand:SF 2 "s_register_operand" "") -- (match_operand:SF 3 "nonmemory_operand" "")))] -- "TARGET_ARM" -- " -- { -- enum rtx_code code = GET_CODE (operands[1]); -- rtx ccreg; -- -- if ((code == UNEQ || code == LTGT) || (TARGET_MAVERICK && (code == GE || code == UNLT || code == ORDERED || code == UNORDERED))) -- -- FAIL; -- -- /* When compiling for SOFT_FLOAT, ensure both arms are in registers. -- Otherwise, ensure it is a valid FP add operand */ -- if ((!(TARGET_HARD_FLOAT && TARGET_FPA)) -- || (!arm_float_add_operand (operands[3], SFmode))) -- operands[3] = force_reg (SFmode, operands[3]); -- -- ccreg = arm_gen_compare_reg (code, arm_compare_op0, arm_compare_op1); -- operands[1] = gen_rtx_fmt_ee (code, VOIDmode, ccreg, const0_rtx); -- }" --) -+;(define_expand "movsicc" -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (if_then_else:SI (match_operand 1 "arm_comparison_operator" "") -+; (match_operand:SI 2 "arm_not_operand" "") -+; (match_operand:SI 3 "arm_not_operand" "")))] -+; "TARGET_ARM" -+; " -+; { -+; enum rtx_code code = GET_CODE (operands[1]); -+; rtx ccreg; -+; -+; if ((code == UNEQ || code == LTGT) || (TARGET_MAVERICK && (code == GE || code == UNLT || code == ORDERED || code == UNORDERED))) -+; FAIL; -+; -+; ccreg = arm_gen_compare_reg (code, arm_compare_op0, arm_compare_op1); -+; operands[1] = gen_rtx_fmt_ee (code, VOIDmode, ccreg, const0_rtx); -+; }" -+;) - --(define_expand "movdfcc" -- [(set (match_operand:DF 0 "s_register_operand" "") -- (if_then_else:DF (match_operand 1 "arm_comparison_operator" "") -- (match_operand:DF 2 "s_register_operand" "") -- (match_operand:DF 3 "arm_float_add_operand" "")))] -- "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" -- " -- { -- enum rtx_code code = GET_CODE (operands[1]); -- rtx ccreg; -+;(define_expand "movsfcc" -+; [(set (match_operand:SF 0 "s_register_operand" "") -+; (if_then_else:SF (match_operand 1 "arm_comparison_operator" "") -+; (match_operand:SF 2 "s_register_operand" "") -+; (match_operand:SF 3 "nonmemory_operand" "")))] -+; "TARGET_ARM" -+; " -+; { -+; enum rtx_code code = GET_CODE (operands[1]); -+; rtx ccreg; -+; -+; if ((code == UNEQ || code == LTGT) || (TARGET_MAVERICK && (code == GE || code == UNLT || code == ORDERED || code == UNORDERED))) -+; -+; FAIL; -+; -+; /* When compiling for SOFT_FLOAT, ensure both arms are in registers. -+; Otherwise, ensure it is a valid FP add operand */ -+; if ((!(TARGET_HARD_FLOAT && TARGET_FPA)) -+; || (!arm_float_add_operand (operands[3], SFmode))) -+; operands[3] = force_reg (SFmode, operands[3]); -+; -+; ccreg = arm_gen_compare_reg (code, arm_compare_op0, arm_compare_op1); -+; operands[1] = gen_rtx_fmt_ee (code, VOIDmode, ccreg, const0_rtx); -+; }" -+;) - -- if ((code == UNEQ || code == LTGT) || (TARGET_MAVERICK && (code==GE || code == UNLT || code == ORDERED || code == UNORDERED))) -- FAIL; -+;(define_expand "movdfcc" -+; [(set (match_operand:DF 0 "s_register_operand" "") -+; (if_then_else:DF (match_operand 1 "arm_comparison_operator" "") -+; (match_operand:DF 2 "s_register_operand" "") -+; (match_operand:DF 3 "arm_float_add_operand" "")))] -+; "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP || TARGET_MAVERICK)" -+; " -+; { -+; enum rtx_code code = GET_CODE (operands[1]); -+; rtx ccreg; -+; -+; if ((code == UNEQ || code == LTGT) || (TARGET_MAVERICK && (code==GE || code == UNLT || code == ORDERED || code == UNORDERED))) -+; FAIL; -+; -+; ccreg = arm_gen_compare_reg (code, arm_compare_op0, arm_compare_op1); -+; operands[1] = gen_rtx_fmt_ee (code, VOIDmode, ccreg, const0_rtx); -+; }" -+;) - -- ccreg = arm_gen_compare_reg (code, arm_compare_op0, arm_compare_op1); -- operands[1] = gen_rtx_fmt_ee (code, VOIDmode, ccreg, const0_rtx); -- }" --) -+;(define_insn "*movsicc_insn" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r,r,r,r,r") -+; (if_then_else:SI -+; (match_operator 3 "arm_comparison_operator" -+; [(match_operand 4 "cc_register" "") (const_int 0)]) -+; (match_operand:SI 1 "arm_not_operand" "0,0,rI,K,rI,rI,K,K") -+; (match_operand:SI 2 "arm_not_operand" "rI,K,0,0,rI,K,rI,K")))] -+; "TARGET_ARM" -+; "@ -+; mov%D3\\t%0, %2 -+; mvn%D3\\t%0, #%B2 -+; mov%d3\\t%0, %1 -+; mvn%d3\\t%0, #%B1 -+; mov%d3\\t%0, %1\;mov%D3\\t%0, %2 -+; mov%d3\\t%0, %1\;mvn%D3\\t%0, #%B2 -+; mvn%d3\\t%0, #%B1\;mov%D3\\t%0, %2 -+; mvn%d3\\t%0, #%B1\;mvn%D3\\t%0, #%B2" -+; [(set_attr "length" "4,4,4,4,8,8,8,8") -+; (set_attr "conds" "use")] -+;) - --(define_insn "*movsicc_insn" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r,r,r,r,r") -- (if_then_else:SI -- (match_operator 3 "arm_comparison_operator" -- [(match_operand 4 "cc_register" "") (const_int 0)]) -- (match_operand:SI 1 "arm_not_operand" "0,0,rI,K,rI,rI,K,K") -- (match_operand:SI 2 "arm_not_operand" "rI,K,0,0,rI,K,rI,K")))] -- "TARGET_ARM" -- "@ -- mov%D3\\t%0, %2 -- mvn%D3\\t%0, #%B2 -- mov%d3\\t%0, %1 -- mvn%d3\\t%0, #%B1 -- mov%d3\\t%0, %1\;mov%D3\\t%0, %2 -- mov%d3\\t%0, %1\;mvn%D3\\t%0, #%B2 -- mvn%d3\\t%0, #%B1\;mov%D3\\t%0, %2 -- mvn%d3\\t%0, #%B1\;mvn%D3\\t%0, #%B2" -- [(set_attr "length" "4,4,4,4,8,8,8,8") -- (set_attr "conds" "use")] --) -- --(define_insn "*movsfcc_soft_insn" -- [(set (match_operand:SF 0 "s_register_operand" "=r,r") -- (if_then_else:SF (match_operator 3 "arm_comparison_operator" -- [(match_operand 4 "cc_register" "") (const_int 0)]) -- (match_operand:SF 1 "s_register_operand" "0,r") -- (match_operand:SF 2 "s_register_operand" "r,0")))] -- "TARGET_ARM && TARGET_SOFT_FLOAT" -- "@ -- mov%D3\\t%0, %2 -- mov%d3\\t%0, %1" -- [(set_attr "conds" "use")] --) -+;(define_insn "*movsfcc_soft_insn" -+; [(set (match_operand:SF 0 "s_register_operand" "=r,r") -+; (if_then_else:SF (match_operator 3 "arm_comparison_operator" -+; [(match_operand 4 "cc_register" "") (const_int 0)]) -+; (match_operand:SF 1 "s_register_operand" "0,r") -+; (match_operand:SF 2 "s_register_operand" "r,0")))] -+; "TARGET_ARM && TARGET_SOFT_FLOAT" -+; "@ -+; mov%D3\\t%0, %2 -+; mov%d3\\t%0, %1" -+; [(set_attr "conds" "use")] -+;) - - - ;; Jump and linkage insns -@@ -8003,47 +8003,47 @@ - (set_attr "predicable" "yes")] - ) - --(define_insn "*cond_return" -- [(set (pc) -- (if_then_else (match_operator 0 "arm_comparison_operator" -- [(match_operand 1 "cc_register" "") (const_int 0)]) -- (return) -- (pc)))] -- "TARGET_ARM && USE_RETURN_INSN (TRUE)" -- "* -- { -- if (arm_ccfsm_state == 2) -- { -- arm_ccfsm_state += 2; -- return \"\"; -- } -- return output_return_instruction (operands[0], TRUE, FALSE); -- }" -- [(set_attr "conds" "use") -- (set_attr "length" "12") -- (set_attr "type" "load1")] --) -+;(define_insn "*cond_return" -+; [(set (pc) -+; (if_then_else (match_operator 0 "arm_comparison_operator" -+; [(match_operand 1 "cc_register" "") (const_int 0)]) -+; (return) -+; (pc)))] -+; "TARGET_ARM && USE_RETURN_INSN (TRUE)" -+; "* -+; { -+; if (arm_ccfsm_state == 2) -+; { -+; arm_ccfsm_state += 2; -+; return \"\"; -+; } -+; return output_return_instruction (operands[0], TRUE, FALSE); -+; }" -+; [(set_attr "conds" "use") -+; (set_attr "length" "12") -+; (set_attr "type" "load1")] -+;) - --(define_insn "*cond_return_inverted" -- [(set (pc) -- (if_then_else (match_operator 0 "arm_comparison_operator" -- [(match_operand 1 "cc_register" "") (const_int 0)]) -- (pc) -- (return)))] -- "TARGET_ARM && USE_RETURN_INSN (TRUE)" -- "* -- { -- if (arm_ccfsm_state == 2) -- { -- arm_ccfsm_state += 2; -- return \"\"; -- } -- return output_return_instruction (operands[0], TRUE, TRUE); -- }" -- [(set_attr "conds" "use") -- (set_attr "length" "12") -- (set_attr "type" "load1")] --) -+;(define_insn "*cond_return_inverted" -+; [(set (pc) -+; (if_then_else (match_operator 0 "arm_comparison_operator" -+; [(match_operand 1 "cc_register" "") (const_int 0)]) -+; (pc) -+; (return)))] -+; "TARGET_ARM && USE_RETURN_INSN (TRUE)" -+; "* -+; { -+; if (arm_ccfsm_state == 2) -+; { -+; arm_ccfsm_state += 2; -+; return \"\"; -+; } -+; return output_return_instruction (operands[0], TRUE, TRUE); -+; }" -+; [(set_attr "conds" "use") -+; (set_attr "length" "12") -+; (set_attr "type" "load1")] -+;) - - ;; Generate a sequence of instructions to determine if the processor is - ;; in 26-bit or 32-bit mode, and return the appropriate return address -@@ -8438,1203 +8438,1203 @@ - - - --(define_insn "*and_scc" -- [(set (match_operand:SI 0 "s_register_operand" "=r") -- (and:SI (match_operator:SI 1 "arm_comparison_operator" -- [(match_operand 3 "cc_register" "") (const_int 0)]) -- (match_operand:SI 2 "s_register_operand" "r")))] -- "TARGET_ARM" -- "mov%D1\\t%0, #0\;and%d1\\t%0, %2, #1" -- [(set_attr "conds" "use") -- (set_attr "length" "8")] --) -- --(define_insn "*ior_scc" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (ior:SI (match_operator:SI 2 "arm_comparison_operator" -- [(match_operand 3 "cc_register" "") (const_int 0)]) -- (match_operand:SI 1 "s_register_operand" "0,?r")))] -- "TARGET_ARM" -- "@ -- orr%d2\\t%0, %1, #1 -- mov%D2\\t%0, %1\;orr%d2\\t%0, %1, #1" -- [(set_attr "conds" "use") -- (set_attr "length" "4,8")] --) -- --(define_insn "*compare_scc" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (match_operator:SI 1 "arm_comparison_operator" -- [(match_operand:SI 2 "s_register_operand" "r,r") -- (match_operand:SI 3 "arm_add_operand" "rI,L")])) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "* -- if (operands[3] == const0_rtx) -- { -- if (GET_CODE (operands[1]) == LT) -- return \"mov\\t%0, %2, lsr #31\"; -- -- if (GET_CODE (operands[1]) == GE) -- return \"mvn\\t%0, %2\;mov\\t%0, %0, lsr #31\"; -- -- if (GET_CODE (operands[1]) == EQ) -- return \"rsbs\\t%0, %2, #1\;movcc\\t%0, #0\"; -- } -- -- if (GET_CODE (operands[1]) == NE) -- { -- if (which_alternative == 1) -- return \"adds\\t%0, %2, #%n3\;movne\\t%0, #1\"; -- return \"subs\\t%0, %2, %3\;movne\\t%0, #1\"; -- } -- if (which_alternative == 1) -- output_asm_insn (\"cmn\\t%2, #%n3\", operands); -- else -- output_asm_insn (\"cmp\\t%2, %3\", operands); -- return \"mov%D1\\t%0, #0\;mov%d1\\t%0, #1\"; -- " -- [(set_attr "conds" "clob") -- (set_attr "length" "12")] --) -- --(define_insn "*cond_move" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") -- (if_then_else:SI (match_operator 3 "equality_operator" -- [(match_operator 4 "arm_comparison_operator" -- [(match_operand 5 "cc_register" "") (const_int 0)]) -- (const_int 0)]) -- (match_operand:SI 1 "arm_rhs_operand" "0,rI,?rI") -- (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")))] -- "TARGET_ARM" -- "* -- if (GET_CODE (operands[3]) == NE) -- { -- if (which_alternative != 1) -- output_asm_insn (\"mov%D4\\t%0, %2\", operands); -- if (which_alternative != 0) -- output_asm_insn (\"mov%d4\\t%0, %1\", operands); -- return \"\"; -- } -- if (which_alternative != 0) -- output_asm_insn (\"mov%D4\\t%0, %1\", operands); -- if (which_alternative != 1) -- output_asm_insn (\"mov%d4\\t%0, %2\", operands); -- return \"\"; -- " -- [(set_attr "conds" "use") -- (set_attr "length" "4,4,8")] --) -- --(define_insn "*cond_arith" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (match_operator:SI 5 "shiftable_operator" -- [(match_operator:SI 4 "arm_comparison_operator" -- [(match_operand:SI 2 "s_register_operand" "r,r") -- (match_operand:SI 3 "arm_rhs_operand" "rI,rI")]) -- (match_operand:SI 1 "s_register_operand" "0,?r")])) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "* -- if (GET_CODE (operands[4]) == LT && operands[3] == const0_rtx) -- return \"%i5\\t%0, %1, %2, lsr #31\"; -- -- output_asm_insn (\"cmp\\t%2, %3\", operands); -- if (GET_CODE (operands[5]) == AND) -- output_asm_insn (\"mov%D4\\t%0, #0\", operands); -- else if (GET_CODE (operands[5]) == MINUS) -- output_asm_insn (\"rsb%D4\\t%0, %1, #0\", operands); -- else if (which_alternative != 0) -- output_asm_insn (\"mov%D4\\t%0, %1\", operands); -- return \"%i5%d4\\t%0, %1, #1\"; -- " -- [(set_attr "conds" "clob") -- (set_attr "length" "12")] --) -+;(define_insn "*and_scc" -+; [(set (match_operand:SI 0 "s_register_operand" "=r") -+; (and:SI (match_operator:SI 1 "arm_comparison_operator" -+; [(match_operand 3 "cc_register" "") (const_int 0)]) -+; (match_operand:SI 2 "s_register_operand" "r")))] -+; "TARGET_ARM" -+; "mov%D1\\t%0, #0\;and%d1\\t%0, %2, #1" -+; [(set_attr "conds" "use") -+; (set_attr "length" "8")] -+;) - --(define_insn "*cond_sub" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (minus:SI (match_operand:SI 1 "s_register_operand" "0,?r") -- (match_operator:SI 4 "arm_comparison_operator" -- [(match_operand:SI 2 "s_register_operand" "r,r") -- (match_operand:SI 3 "arm_rhs_operand" "rI,rI")]))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "* -- output_asm_insn (\"cmp\\t%2, %3\", operands); -- if (which_alternative != 0) -- output_asm_insn (\"mov%D4\\t%0, %1\", operands); -- return \"sub%d4\\t%0, %1, #1\"; -- " -- [(set_attr "conds" "clob") -- (set_attr "length" "8,12")] --) -+;(define_insn "*ior_scc" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (ior:SI (match_operator:SI 2 "arm_comparison_operator" -+; [(match_operand 3 "cc_register" "") (const_int 0)]) -+; (match_operand:SI 1 "s_register_operand" "0,?r")))] -+; "TARGET_ARM" -+; "@ -+; orr%d2\\t%0, %1, #1 -+; mov%D2\\t%0, %1\;orr%d2\\t%0, %1, #1" -+; [(set_attr "conds" "use") -+; (set_attr "length" "4,8")] -+;) - --(define_insn "*cmp_ite0" -- [(set (match_operand 6 "dominant_cc_register" "") -- (compare -- (if_then_else:SI -- (match_operator 4 "arm_comparison_operator" -- [(match_operand:SI 0 "s_register_operand" "r,r,r,r") -- (match_operand:SI 1 "arm_add_operand" "rI,L,rI,L")]) -- (match_operator:SI 5 "arm_comparison_operator" -- [(match_operand:SI 2 "s_register_operand" "r,r,r,r") -- (match_operand:SI 3 "arm_add_operand" "rI,rI,L,L")]) -- (const_int 0)) -- (const_int 0)))] -- "TARGET_ARM" -- "* -- { -- static const char * const opcodes[4][2] = -- { -- {\"cmp\\t%2, %3\;cmp%d5\\t%0, %1\", -- \"cmp\\t%0, %1\;cmp%d4\\t%2, %3\"}, -- {\"cmp\\t%2, %3\;cmn%d5\\t%0, #%n1\", -- \"cmn\\t%0, #%n1\;cmp%d4\\t%2, %3\"}, -- {\"cmn\\t%2, #%n3\;cmp%d5\\t%0, %1\", -- \"cmp\\t%0, %1\;cmn%d4\\t%2, #%n3\"}, -- {\"cmn\\t%2, #%n3\;cmn%d5\\t%0, #%n1\", -- \"cmn\\t%0, #%n1\;cmn%d4\\t%2, #%n3\"} -- }; -- int swap = -- comparison_dominates_p (GET_CODE (operands[5]), GET_CODE (operands[4])); -+;(define_insn "*compare_scc" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (match_operator:SI 1 "arm_comparison_operator" -+; [(match_operand:SI 2 "s_register_operand" "r,r") -+; (match_operand:SI 3 "arm_add_operand" "rI,L")])) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "* -+; if (operands[3] == const0_rtx) -+; { -+; if (GET_CODE (operands[1]) == LT) -+; return \"mov\\t%0, %2, lsr #31\"; -+; -+; if (GET_CODE (operands[1]) == GE) -+; return \"mvn\\t%0, %2\;mov\\t%0, %0, lsr #31\"; -+; -+; if (GET_CODE (operands[1]) == EQ) -+; return \"rsbs\\t%0, %2, #1\;movcc\\t%0, #0\"; -+; } -+; -+; if (GET_CODE (operands[1]) == NE) -+; { -+; if (which_alternative == 1) -+; return \"adds\\t%0, %2, #%n3\;movne\\t%0, #1\"; -+; return \"subs\\t%0, %2, %3\;movne\\t%0, #1\"; -+; } -+; if (which_alternative == 1) -+; output_asm_insn (\"cmn\\t%2, #%n3\", operands); -+; else -+; output_asm_insn (\"cmp\\t%2, %3\", operands); -+; return \"mov%D1\\t%0, #0\;mov%d1\\t%0, #1\"; -+; " -+; [(set_attr "conds" "clob") -+; (set_attr "length" "12")] -+;) - -- return opcodes[which_alternative][swap]; -- }" -- [(set_attr "conds" "set") -- (set_attr "length" "8")] --) -+;(define_insn "*cond_move" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") -+; (if_then_else:SI (match_operator 3 "equality_operator" -+; [(match_operator 4 "arm_comparison_operator" -+; [(match_operand 5 "cc_register" "") (const_int 0)]) -+; (const_int 0)]) -+; (match_operand:SI 1 "arm_rhs_operand" "0,rI,?rI") -+; (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")))] -+; "TARGET_ARM" -+; "* -+; if (GET_CODE (operands[3]) == NE) -+; { -+; if (which_alternative != 1) -+; output_asm_insn (\"mov%D4\\t%0, %2\", operands); -+; if (which_alternative != 0) -+; output_asm_insn (\"mov%d4\\t%0, %1\", operands); -+; return \"\"; -+; } -+; if (which_alternative != 0) -+; output_asm_insn (\"mov%D4\\t%0, %1\", operands); -+; if (which_alternative != 1) -+; output_asm_insn (\"mov%d4\\t%0, %2\", operands); -+; return \"\"; -+; " -+; [(set_attr "conds" "use") -+; (set_attr "length" "4,4,8")] -+;) - --(define_insn "*cmp_ite1" -- [(set (match_operand 6 "dominant_cc_register" "") -- (compare -- (if_then_else:SI -- (match_operator 4 "arm_comparison_operator" -- [(match_operand:SI 0 "s_register_operand" "r,r,r,r") -- (match_operand:SI 1 "arm_add_operand" "rI,L,rI,L")]) -- (match_operator:SI 5 "arm_comparison_operator" -- [(match_operand:SI 2 "s_register_operand" "r,r,r,r") -- (match_operand:SI 3 "arm_add_operand" "rI,rI,L,L")]) -- (const_int 1)) -- (const_int 0)))] -- "TARGET_ARM" -- "* -- { -- static const char * const opcodes[4][2] = -- { -- {\"cmp\\t%0, %1\;cmp%d4\\t%2, %3\", -- \"cmp\\t%2, %3\;cmp%D5\\t%0, %1\"}, -- {\"cmn\\t%0, #%n1\;cmp%d4\\t%2, %3\", -- \"cmp\\t%2, %3\;cmn%D5\\t%0, #%n1\"}, -- {\"cmp\\t%0, %1\;cmn%d4\\t%2, #%n3\", -- \"cmn\\t%2, #%n3\;cmp%D5\\t%0, %1\"}, -- {\"cmn\\t%0, #%n1\;cmn%d4\\t%2, #%n3\", -- \"cmn\\t%2, #%n3\;cmn%D5\\t%0, #%n1\"} -- }; -- int swap = -- comparison_dominates_p (GET_CODE (operands[5]), -- reverse_condition (GET_CODE (operands[4]))); -+;(define_insn "*cond_arith" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (match_operator:SI 5 "shiftable_operator" -+; [(match_operator:SI 4 "arm_comparison_operator" -+; [(match_operand:SI 2 "s_register_operand" "r,r") -+; (match_operand:SI 3 "arm_rhs_operand" "rI,rI")]) -+; (match_operand:SI 1 "s_register_operand" "0,?r")])) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "* -+; if (GET_CODE (operands[4]) == LT && operands[3] == const0_rtx) -+; return \"%i5\\t%0, %1, %2, lsr #31\"; -+; -+; output_asm_insn (\"cmp\\t%2, %3\", operands); -+; if (GET_CODE (operands[5]) == AND) -+; output_asm_insn (\"mov%D4\\t%0, #0\", operands); -+; else if (GET_CODE (operands[5]) == MINUS) -+; output_asm_insn (\"rsb%D4\\t%0, %1, #0\", operands); -+; else if (which_alternative != 0) -+; output_asm_insn (\"mov%D4\\t%0, %1\", operands); -+; return \"%i5%d4\\t%0, %1, #1\"; -+; " -+; [(set_attr "conds" "clob") -+; (set_attr "length" "12")] -+;) - -- return opcodes[which_alternative][swap]; -- }" -- [(set_attr "conds" "set") -- (set_attr "length" "8")] --) -+;(define_insn "*cond_sub" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (minus:SI (match_operand:SI 1 "s_register_operand" "0,?r") -+; (match_operator:SI 4 "arm_comparison_operator" -+; [(match_operand:SI 2 "s_register_operand" "r,r") -+; (match_operand:SI 3 "arm_rhs_operand" "rI,rI")]))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "* -+; output_asm_insn (\"cmp\\t%2, %3\", operands); -+; if (which_alternative != 0) -+; output_asm_insn (\"mov%D4\\t%0, %1\", operands); -+; return \"sub%d4\\t%0, %1, #1\"; -+; " -+; [(set_attr "conds" "clob") -+; (set_attr "length" "8,12")] -+;) - --(define_insn "*cmp_and" -- [(set (match_operand 6 "dominant_cc_register" "") -- (compare -- (and:SI -- (match_operator 4 "arm_comparison_operator" -- [(match_operand:SI 0 "s_register_operand" "r,r,r,r") -- (match_operand:SI 1 "arm_add_operand" "rI,L,rI,L")]) -- (match_operator:SI 5 "arm_comparison_operator" -- [(match_operand:SI 2 "s_register_operand" "r,r,r,r") -- (match_operand:SI 3 "arm_add_operand" "rI,rI,L,L")])) -- (const_int 0)))] -- "TARGET_ARM" -- "* -- { -- static const char *const opcodes[4][2] = -- { -- {\"cmp\\t%2, %3\;cmp%d5\\t%0, %1\", -- \"cmp\\t%0, %1\;cmp%d4\\t%2, %3\"}, -- {\"cmp\\t%2, %3\;cmn%d5\\t%0, #%n1\", -- \"cmn\\t%0, #%n1\;cmp%d4\\t%2, %3\"}, -- {\"cmn\\t%2, #%n3\;cmp%d5\\t%0, %1\", -- \"cmp\\t%0, %1\;cmn%d4\\t%2, #%n3\"}, -- {\"cmn\\t%2, #%n3\;cmn%d5\\t%0, #%n1\", -- \"cmn\\t%0, #%n1\;cmn%d4\\t%2, #%n3\"} -- }; -- int swap = -- comparison_dominates_p (GET_CODE (operands[5]), GET_CODE (operands[4])); -+;(define_insn "*cmp_ite0" -+; [(set (match_operand 6 "dominant_cc_register" "") -+; (compare -+; (if_then_else:SI -+; (match_operator 4 "arm_comparison_operator" -+; [(match_operand:SI 0 "s_register_operand" "r,r,r,r") -+; (match_operand:SI 1 "arm_add_operand" "rI,L,rI,L")]) -+; (match_operator:SI 5 "arm_comparison_operator" -+; [(match_operand:SI 2 "s_register_operand" "r,r,r,r") -+; (match_operand:SI 3 "arm_add_operand" "rI,rI,L,L")]) -+; (const_int 0)) -+; (const_int 0)))] -+; "TARGET_ARM" -+; "* -+; { -+; static const char * const opcodes[4][2] = -+; { -+; {\"cmp\\t%2, %3\;cmp%d5\\t%0, %1\", -+; \"cmp\\t%0, %1\;cmp%d4\\t%2, %3\"}, -+; {\"cmp\\t%2, %3\;cmn%d5\\t%0, #%n1\", -+; \"cmn\\t%0, #%n1\;cmp%d4\\t%2, %3\"}, -+; {\"cmn\\t%2, #%n3\;cmp%d5\\t%0, %1\", -+; \"cmp\\t%0, %1\;cmn%d4\\t%2, #%n3\"}, -+; {\"cmn\\t%2, #%n3\;cmn%d5\\t%0, #%n1\", -+; \"cmn\\t%0, #%n1\;cmn%d4\\t%2, #%n3\"} -+; }; -+; int swap = -+; comparison_dominates_p (GET_CODE (operands[5]), GET_CODE (operands[4])); -+; -+; return opcodes[which_alternative][swap]; -+; }" -+; [(set_attr "conds" "set") -+; (set_attr "length" "8")] -+;) - -- return opcodes[which_alternative][swap]; -- }" -- [(set_attr "conds" "set") -- (set_attr "predicable" "no") -- (set_attr "length" "8")] --) -+;(define_insn "*cmp_ite1" -+; [(set (match_operand 6 "dominant_cc_register" "") -+; (compare -+; (if_then_else:SI -+; (match_operator 4 "arm_comparison_operator" -+; [(match_operand:SI 0 "s_register_operand" "r,r,r,r") -+; (match_operand:SI 1 "arm_add_operand" "rI,L,rI,L")]) -+; (match_operator:SI 5 "arm_comparison_operator" -+; [(match_operand:SI 2 "s_register_operand" "r,r,r,r") -+; (match_operand:SI 3 "arm_add_operand" "rI,rI,L,L")]) -+; (const_int 1)) -+; (const_int 0)))] -+; "TARGET_ARM" -+; "* -+; { -+; static const char * const opcodes[4][2] = -+; { -+; {\"cmp\\t%0, %1\;cmp%d4\\t%2, %3\", -+; \"cmp\\t%2, %3\;cmp%D5\\t%0, %1\"}, -+; {\"cmn\\t%0, #%n1\;cmp%d4\\t%2, %3\", -+; \"cmp\\t%2, %3\;cmn%D5\\t%0, #%n1\"}, -+; {\"cmp\\t%0, %1\;cmn%d4\\t%2, #%n3\", -+; \"cmn\\t%2, #%n3\;cmp%D5\\t%0, %1\"}, -+; {\"cmn\\t%0, #%n1\;cmn%d4\\t%2, #%n3\", -+; \"cmn\\t%2, #%n3\;cmn%D5\\t%0, #%n1\"} -+; }; -+; int swap = -+; comparison_dominates_p (GET_CODE (operands[5]), -+; reverse_condition (GET_CODE (operands[4]))); -+; -+; return opcodes[which_alternative][swap]; -+; }" -+; [(set_attr "conds" "set") -+; (set_attr "length" "8")] -+;) - --(define_insn "*cmp_ior" -- [(set (match_operand 6 "dominant_cc_register" "") -- (compare -- (ior:SI -- (match_operator 4 "arm_comparison_operator" -- [(match_operand:SI 0 "s_register_operand" "r,r,r,r") -- (match_operand:SI 1 "arm_add_operand" "rI,L,rI,L")]) -- (match_operator:SI 5 "arm_comparison_operator" -- [(match_operand:SI 2 "s_register_operand" "r,r,r,r") -- (match_operand:SI 3 "arm_add_operand" "rI,rI,L,L")])) -- (const_int 0)))] -- "TARGET_ARM" -- "* --{ -- static const char *const opcodes[4][2] = -- { -- {\"cmp\\t%0, %1\;cmp%D4\\t%2, %3\", -- \"cmp\\t%2, %3\;cmp%D5\\t%0, %1\"}, -- {\"cmn\\t%0, #%n1\;cmp%D4\\t%2, %3\", -- \"cmp\\t%2, %3\;cmn%D5\\t%0, #%n1\"}, -- {\"cmp\\t%0, %1\;cmn%D4\\t%2, #%n3\", -- \"cmn\\t%2, #%n3\;cmp%D5\\t%0, %1\"}, -- {\"cmn\\t%0, #%n1\;cmn%D4\\t%2, #%n3\", -- \"cmn\\t%2, #%n3\;cmn%D5\\t%0, #%n1\"} -- }; -- int swap = -- comparison_dominates_p (GET_CODE (operands[5]), GET_CODE (operands[4])); -- -- return opcodes[which_alternative][swap]; --} --" -- [(set_attr "conds" "set") -- (set_attr "length" "8")] --) -+;(define_insn "*cmp_and" -+; [(set (match_operand 6 "dominant_cc_register" "") -+; (compare -+; (and:SI -+; (match_operator 4 "arm_comparison_operator" -+; [(match_operand:SI 0 "s_register_operand" "r,r,r,r") -+; (match_operand:SI 1 "arm_add_operand" "rI,L,rI,L")]) -+; (match_operator:SI 5 "arm_comparison_operator" -+; [(match_operand:SI 2 "s_register_operand" "r,r,r,r") -+; (match_operand:SI 3 "arm_add_operand" "rI,rI,L,L")])) -+; (const_int 0)))] -+; "TARGET_ARM" -+; "* -+; { -+; static const char *const opcodes[4][2] = -+; { -+; {\"cmp\\t%2, %3\;cmp%d5\\t%0, %1\", -+; \"cmp\\t%0, %1\;cmp%d4\\t%2, %3\"}, -+; {\"cmp\\t%2, %3\;cmn%d5\\t%0, #%n1\", -+; \"cmn\\t%0, #%n1\;cmp%d4\\t%2, %3\"}, -+; {\"cmn\\t%2, #%n3\;cmp%d5\\t%0, %1\", -+; \"cmp\\t%0, %1\;cmn%d4\\t%2, #%n3\"}, -+; {\"cmn\\t%2, #%n3\;cmn%d5\\t%0, #%n1\", -+; \"cmn\\t%0, #%n1\;cmn%d4\\t%2, #%n3\"} -+; }; -+; int swap = -+; comparison_dominates_p (GET_CODE (operands[5]), GET_CODE (operands[4])); -+; -+; return opcodes[which_alternative][swap]; -+; }" -+; [(set_attr "conds" "set") -+; (set_attr "predicable" "no") -+; (set_attr "length" "8")] -+;) - --(define_insn_and_split "*ior_scc_scc" -- [(set (match_operand:SI 0 "s_register_operand" "=r") -- (ior:SI (match_operator:SI 3 "arm_comparison_operator" -- [(match_operand:SI 1 "s_register_operand" "r") -- (match_operand:SI 2 "arm_add_operand" "rIL")]) -- (match_operator:SI 6 "arm_comparison_operator" -- [(match_operand:SI 4 "s_register_operand" "r") -- (match_operand:SI 5 "arm_add_operand" "rIL")]))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM -- && (arm_select_dominance_cc_mode (operands[3], operands[6], DOM_CC_X_OR_Y) -- != CCmode)" -- "#" -- "TARGET_ARM && reload_completed" -- [(set (match_dup 7) -- (compare -- (ior:SI -- (match_op_dup 3 [(match_dup 1) (match_dup 2)]) -- (match_op_dup 6 [(match_dup 4) (match_dup 5)])) -- (const_int 0))) -- (set (match_dup 0) (ne:SI (match_dup 7) (const_int 0)))] -- "operands[7] -- = gen_rtx_REG (arm_select_dominance_cc_mode (operands[3], operands[6], -- DOM_CC_X_OR_Y), -- CC_REGNUM);" -- [(set_attr "conds" "clob") -- (set_attr "length" "16")]) -+;(define_insn "*cmp_ior" -+; [(set (match_operand 6 "dominant_cc_register" "") -+; (compare -+; (ior:SI -+; (match_operator 4 "arm_comparison_operator" -+; [(match_operand:SI 0 "s_register_operand" "r,r,r,r") -+; (match_operand:SI 1 "arm_add_operand" "rI,L,rI,L")]) -+; (match_operator:SI 5 "arm_comparison_operator" -+; [(match_operand:SI 2 "s_register_operand" "r,r,r,r") -+; (match_operand:SI 3 "arm_add_operand" "rI,rI,L,L")])) -+; (const_int 0)))] -+; "TARGET_ARM" -+; "* -+;{ -+; static const char *const opcodes[4][2] = -+; { -+; {\"cmp\\t%0, %1\;cmp%D4\\t%2, %3\", -+; \"cmp\\t%2, %3\;cmp%D5\\t%0, %1\"}, -+; {\"cmn\\t%0, #%n1\;cmp%D4\\t%2, %3\", -+; \"cmp\\t%2, %3\;cmn%D5\\t%0, #%n1\"}, -+; {\"cmp\\t%0, %1\;cmn%D4\\t%2, #%n3\", -+; \"cmn\\t%2, #%n3\;cmp%D5\\t%0, %1\"}, -+; {\"cmn\\t%0, #%n1\;cmn%D4\\t%2, #%n3\", -+; \"cmn\\t%2, #%n3\;cmn%D5\\t%0, #%n1\"} -+; }; -+; int swap = -+; comparison_dominates_p (GET_CODE (operands[5]), GET_CODE (operands[4])); -+; -+; return opcodes[which_alternative][swap]; -+;} -+;" -+; [(set_attr "conds" "set") -+; (set_attr "length" "8")] -+;) - --; If the above pattern is followed by a CMP insn, then the compare is -+;(define_insn_and_split "*ior_scc_scc" -+; [(set (match_operand:SI 0 "s_register_operand" "=r") -+; (ior:SI (match_operator:SI 3 "arm_comparison_operator" -+; [(match_operand:SI 1 "s_register_operand" "r") -+; (match_operand:SI 2 "arm_add_operand" "rIL")]) -+; (match_operator:SI 6 "arm_comparison_operator" -+; [(match_operand:SI 4 "s_register_operand" "r") -+; (match_operand:SI 5 "arm_add_operand" "rIL")]))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM -+; && (arm_select_dominance_cc_mode (operands[3], operands[6], DOM_CC_X_OR_Y) -+; != CCmode)" -+; "#" -+; "TARGET_ARM && reload_completed" -+; [(set (match_dup 7) -+; (compare -+; (ior:SI -+; (match_op_dup 3 [(match_dup 1) (match_dup 2)]) -+; (match_op_dup 6 [(match_dup 4) (match_dup 5)])) -+; (const_int 0))) -+; (set (match_dup 0) (ne:SI (match_dup 7) (const_int 0)))] -+; "operands[7] -+; = gen_rtx_REG (arm_select_dominance_cc_mode (operands[3], operands[6], -+; DOM_CC_X_OR_Y), -+; CC_REGNUM);" -+; [(set_attr "conds" "clob") -+; (set_attr "length" "16")]) -+; -+;; If the above pattern is followed by a CMP insn, then the compare is - ; redundant, since we can rework the conditional instruction that follows. --(define_insn_and_split "*ior_scc_scc_cmp" -- [(set (match_operand 0 "dominant_cc_register" "") -- (compare (ior:SI (match_operator:SI 3 "arm_comparison_operator" -- [(match_operand:SI 1 "s_register_operand" "r") -- (match_operand:SI 2 "arm_add_operand" "rIL")]) -- (match_operator:SI 6 "arm_comparison_operator" -- [(match_operand:SI 4 "s_register_operand" "r") -- (match_operand:SI 5 "arm_add_operand" "rIL")])) -- (const_int 0))) -- (set (match_operand:SI 7 "s_register_operand" "=r") -- (ior:SI (match_op_dup 3 [(match_dup 1) (match_dup 2)]) -- (match_op_dup 6 [(match_dup 4) (match_dup 5)])))] -- "TARGET_ARM" -- "#" -- "TARGET_ARM && reload_completed" -- [(set (match_dup 0) -- (compare -- (ior:SI -- (match_op_dup 3 [(match_dup 1) (match_dup 2)]) -- (match_op_dup 6 [(match_dup 4) (match_dup 5)])) -- (const_int 0))) -- (set (match_dup 7) (ne:SI (match_dup 0) (const_int 0)))] -- "" -- [(set_attr "conds" "set") -- (set_attr "length" "16")]) -+;(define_insn_and_split "*ior_scc_scc_cmp" -+; [(set (match_operand 0 "dominant_cc_register" "") -+; (compare (ior:SI (match_operator:SI 3 "arm_comparison_operator" -+; [(match_operand:SI 1 "s_register_operand" "r") -+; (match_operand:SI 2 "arm_add_operand" "rIL")]) -+; (match_operator:SI 6 "arm_comparison_operator" -+; [(match_operand:SI 4 "s_register_operand" "r") -+; (match_operand:SI 5 "arm_add_operand" "rIL")])) -+; (const_int 0))) -+; (set (match_operand:SI 7 "s_register_operand" "=r") -+; (ior:SI (match_op_dup 3 [(match_dup 1) (match_dup 2)]) -+; (match_op_dup 6 [(match_dup 4) (match_dup 5)])))] -+; "TARGET_ARM" -+; "#" -+; "TARGET_ARM && reload_completed" -+; [(set (match_dup 0) -+; (compare -+; (ior:SI -+; (match_op_dup 3 [(match_dup 1) (match_dup 2)]) -+; (match_op_dup 6 [(match_dup 4) (match_dup 5)])) -+; (const_int 0))) -+; (set (match_dup 7) (ne:SI (match_dup 0) (const_int 0)))] -+; "" -+; [(set_attr "conds" "set") -+; (set_attr "length" "16")]) - --(define_insn_and_split "*and_scc_scc" -- [(set (match_operand:SI 0 "s_register_operand" "=r") -- (and:SI (match_operator:SI 3 "arm_comparison_operator" -- [(match_operand:SI 1 "s_register_operand" "r") -- (match_operand:SI 2 "arm_add_operand" "rIL")]) -- (match_operator:SI 6 "arm_comparison_operator" -- [(match_operand:SI 4 "s_register_operand" "r") -- (match_operand:SI 5 "arm_add_operand" "rIL")]))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM -- && (arm_select_dominance_cc_mode (operands[3], operands[6], DOM_CC_X_AND_Y) -- != CCmode)" -- "#" -- "TARGET_ARM && reload_completed -- && (arm_select_dominance_cc_mode (operands[3], operands[6], DOM_CC_X_AND_Y) -- != CCmode)" -- [(set (match_dup 7) -- (compare -- (and:SI -- (match_op_dup 3 [(match_dup 1) (match_dup 2)]) -- (match_op_dup 6 [(match_dup 4) (match_dup 5)])) -- (const_int 0))) -- (set (match_dup 0) (ne:SI (match_dup 7) (const_int 0)))] -- "operands[7] -- = gen_rtx_REG (arm_select_dominance_cc_mode (operands[3], operands[6], -- DOM_CC_X_AND_Y), -- CC_REGNUM);" -- [(set_attr "conds" "clob") -- (set_attr "length" "16")]) -+;(define_insn_and_split "*and_scc_scc" -+; [(set (match_operand:SI 0 "s_register_operand" "=r") -+; (and:SI (match_operator:SI 3 "arm_comparison_operator" -+; [(match_operand:SI 1 "s_register_operand" "r") -+; (match_operand:SI 2 "arm_add_operand" "rIL")]) -+; (match_operator:SI 6 "arm_comparison_operator" -+; [(match_operand:SI 4 "s_register_operand" "r") -+; (match_operand:SI 5 "arm_add_operand" "rIL")]))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM -+; && (arm_select_dominance_cc_mode (operands[3], operands[6], DOM_CC_X_AND_Y) -+; != CCmode)" -+; "#" -+; "TARGET_ARM && reload_completed -+; && (arm_select_dominance_cc_mode (operands[3], operands[6], DOM_CC_X_AND_Y) -+; != CCmode)" -+; [(set (match_dup 7) -+; (compare -+; (and:SI -+; (match_op_dup 3 [(match_dup 1) (match_dup 2)]) -+; (match_op_dup 6 [(match_dup 4) (match_dup 5)])) -+; (const_int 0))) -+; (set (match_dup 0) (ne:SI (match_dup 7) (const_int 0)))] -+; "operands[7] -+; = gen_rtx_REG (arm_select_dominance_cc_mode (operands[3], operands[6], -+; DOM_CC_X_AND_Y), -+; CC_REGNUM);" -+; [(set_attr "conds" "clob") -+; (set_attr "length" "16")]) - - ; If the above pattern is followed by a CMP insn, then the compare is - ; redundant, since we can rework the conditional instruction that follows. --(define_insn_and_split "*and_scc_scc_cmp" -- [(set (match_operand 0 "dominant_cc_register" "") -- (compare (and:SI (match_operator:SI 3 "arm_comparison_operator" -- [(match_operand:SI 1 "s_register_operand" "r") -- (match_operand:SI 2 "arm_add_operand" "rIL")]) -- (match_operator:SI 6 "arm_comparison_operator" -- [(match_operand:SI 4 "s_register_operand" "r") -- (match_operand:SI 5 "arm_add_operand" "rIL")])) -- (const_int 0))) -- (set (match_operand:SI 7 "s_register_operand" "=r") -- (and:SI (match_op_dup 3 [(match_dup 1) (match_dup 2)]) -- (match_op_dup 6 [(match_dup 4) (match_dup 5)])))] -- "TARGET_ARM" -- "#" -- "TARGET_ARM && reload_completed" -- [(set (match_dup 0) -- (compare -- (and:SI -- (match_op_dup 3 [(match_dup 1) (match_dup 2)]) -- (match_op_dup 6 [(match_dup 4) (match_dup 5)])) -- (const_int 0))) -- (set (match_dup 7) (ne:SI (match_dup 0) (const_int 0)))] -- "" -- [(set_attr "conds" "set") -- (set_attr "length" "16")]) -- --;; If there is no dominance in the comparison, then we can still save an --;; instruction in the AND case, since we can know that the second compare --;; need only zero the value if false (if true, then the value is already --;; correct). --(define_insn_and_split "*and_scc_scc_nodom" -- [(set (match_operand:SI 0 "s_register_operand" "=&r,&r,&r") -- (and:SI (match_operator:SI 3 "arm_comparison_operator" -- [(match_operand:SI 1 "s_register_operand" "r,r,0") -- (match_operand:SI 2 "arm_add_operand" "rIL,0,rIL")]) -- (match_operator:SI 6 "arm_comparison_operator" -- [(match_operand:SI 4 "s_register_operand" "r,r,r") -- (match_operand:SI 5 "arm_add_operand" "rIL,rIL,rIL")]))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM -- && (arm_select_dominance_cc_mode (operands[3], operands[6], DOM_CC_X_AND_Y) -- == CCmode)" -- "#" -- "TARGET_ARM && reload_completed" -- [(parallel [(set (match_dup 0) -- (match_op_dup 3 [(match_dup 1) (match_dup 2)])) -- (clobber (reg:CC CC_REGNUM))]) -- (set (match_dup 7) (match_op_dup 8 [(match_dup 4) (match_dup 5)])) -- (set (match_dup 0) -- (if_then_else:SI (match_op_dup 6 [(match_dup 7) (const_int 0)]) -- (match_dup 0) -- (const_int 0)))] -- "operands[7] = gen_rtx_REG (SELECT_CC_MODE (GET_CODE (operands[6]), -- operands[4], operands[5]), -- CC_REGNUM); -- operands[8] = gen_rtx_COMPARE (GET_MODE (operands[7]), operands[4], -- operands[5]);" -- [(set_attr "conds" "clob") -- (set_attr "length" "20")]) -- --(define_split -- [(set (reg:CC_NOOV CC_REGNUM) -- (compare:CC_NOOV (ior:SI -- (and:SI (match_operand:SI 0 "s_register_operand" "") -- (const_int 1)) -- (match_operator:SI 1 "comparison_operator" -- [(match_operand:SI 2 "s_register_operand" "") -- (match_operand:SI 3 "arm_add_operand" "")])) -- (const_int 0))) -- (clobber (match_operand:SI 4 "s_register_operand" ""))] -- "TARGET_ARM" -- [(set (match_dup 4) -- (ior:SI (match_op_dup 1 [(match_dup 2) (match_dup 3)]) -- (match_dup 0))) -- (set (reg:CC_NOOV CC_REGNUM) -- (compare:CC_NOOV (and:SI (match_dup 4) (const_int 1)) -- (const_int 0)))] -- "") -- --(define_split -- [(set (reg:CC_NOOV CC_REGNUM) -- (compare:CC_NOOV (ior:SI -- (match_operator:SI 1 "comparison_operator" -- [(match_operand:SI 2 "s_register_operand" "") -- (match_operand:SI 3 "arm_add_operand" "")]) -- (and:SI (match_operand:SI 0 "s_register_operand" "") -- (const_int 1))) -- (const_int 0))) -- (clobber (match_operand:SI 4 "s_register_operand" ""))] -- "TARGET_ARM" -- [(set (match_dup 4) -- (ior:SI (match_op_dup 1 [(match_dup 2) (match_dup 3)]) -- (match_dup 0))) -- (set (reg:CC_NOOV CC_REGNUM) -- (compare:CC_NOOV (and:SI (match_dup 4) (const_int 1)) -- (const_int 0)))] -- "") -- --(define_insn "*negscc" -- [(set (match_operand:SI 0 "s_register_operand" "=r") -- (neg:SI (match_operator 3 "arm_comparison_operator" -- [(match_operand:SI 1 "s_register_operand" "r") -- (match_operand:SI 2 "arm_rhs_operand" "rI")]))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "* -- if (GET_CODE (operands[3]) == LT && operands[3] == const0_rtx) -- return \"mov\\t%0, %1, asr #31\"; -- -- if (GET_CODE (operands[3]) == NE) -- return \"subs\\t%0, %1, %2\;mvnne\\t%0, #0\"; -- -- if (GET_CODE (operands[3]) == GT) -- return \"subs\\t%0, %1, %2\;mvnne\\t%0, %0, asr #31\"; -- -- output_asm_insn (\"cmp\\t%1, %2\", operands); -- output_asm_insn (\"mov%D3\\t%0, #0\", operands); -- return \"mvn%d3\\t%0, #0\"; -- " -- [(set_attr "conds" "clob") -- (set_attr "length" "12")] --) -- --(define_insn "movcond" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") -- (if_then_else:SI -- (match_operator 5 "arm_comparison_operator" -- [(match_operand:SI 3 "s_register_operand" "r,r,r") -- (match_operand:SI 4 "arm_add_operand" "rIL,rIL,rIL")]) -- (match_operand:SI 1 "arm_rhs_operand" "0,rI,?rI") -- (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI"))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "* -- if (GET_CODE (operands[5]) == LT -- && (operands[4] == const0_rtx)) -- { -- if (which_alternative != 1 && GET_CODE (operands[1]) == REG) -- { -- if (operands[2] == const0_rtx) -- return \"and\\t%0, %1, %3, asr #31\"; -- return \"ands\\t%0, %1, %3, asr #32\;movcc\\t%0, %2\"; -- } -- else if (which_alternative != 0 && GET_CODE (operands[2]) == REG) -- { -- if (operands[1] == const0_rtx) -- return \"bic\\t%0, %2, %3, asr #31\"; -- return \"bics\\t%0, %2, %3, asr #32\;movcs\\t%0, %1\"; -- } -- /* The only case that falls through to here is when both ops 1 & 2 -- are constants. */ -- } -- -- if (GET_CODE (operands[5]) == GE -- && (operands[4] == const0_rtx)) -- { -- if (which_alternative != 1 && GET_CODE (operands[1]) == REG) -- { -- if (operands[2] == const0_rtx) -- return \"bic\\t%0, %1, %3, asr #31\"; -- return \"bics\\t%0, %1, %3, asr #32\;movcs\\t%0, %2\"; -- } -- else if (which_alternative != 0 && GET_CODE (operands[2]) == REG) -- { -- if (operands[1] == const0_rtx) -- return \"and\\t%0, %2, %3, asr #31\"; -- return \"ands\\t%0, %2, %3, asr #32\;movcc\\t%0, %1\"; -- } -- /* The only case that falls through to here is when both ops 1 & 2 -- are constants. */ -- } -- if (GET_CODE (operands[4]) == CONST_INT -- && !const_ok_for_arm (INTVAL (operands[4]))) -- output_asm_insn (\"cmn\\t%3, #%n4\", operands); -- else -- output_asm_insn (\"cmp\\t%3, %4\", operands); -- if (which_alternative != 0) -- output_asm_insn (\"mov%d5\\t%0, %1\", operands); -- if (which_alternative != 1) -- output_asm_insn (\"mov%D5\\t%0, %2\", operands); -- return \"\"; -- " -- [(set_attr "conds" "clob") -- (set_attr "length" "8,8,12")] --) -- --(define_insn "*ifcompare_plus_move" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (if_then_else:SI (match_operator 6 "arm_comparison_operator" -- [(match_operand:SI 4 "s_register_operand" "r,r") -- (match_operand:SI 5 "arm_add_operand" "rIL,rIL")]) -- (plus:SI -- (match_operand:SI 2 "s_register_operand" "r,r") -- (match_operand:SI 3 "arm_add_operand" "rIL,rIL")) -- (match_operand:SI 1 "arm_rhs_operand" "0,?rI"))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "#" -- [(set_attr "conds" "clob") -- (set_attr "length" "8,12")] --) -- --(define_insn "*if_plus_move" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r") -- (if_then_else:SI -- (match_operator 4 "arm_comparison_operator" -- [(match_operand 5 "cc_register" "") (const_int 0)]) -- (plus:SI -- (match_operand:SI 2 "s_register_operand" "r,r,r,r") -- (match_operand:SI 3 "arm_add_operand" "rI,L,rI,L")) -- (match_operand:SI 1 "arm_rhs_operand" "0,0,?rI,?rI")))] -- "TARGET_ARM" -- "@ -- add%d4\\t%0, %2, %3 -- sub%d4\\t%0, %2, #%n3 -- add%d4\\t%0, %2, %3\;mov%D4\\t%0, %1 -- sub%d4\\t%0, %2, #%n3\;mov%D4\\t%0, %1" -- [(set_attr "conds" "use") -- (set_attr "length" "4,4,8,8") -- (set_attr "type" "*,*,*,*")] --) -- --(define_insn "*ifcompare_move_plus" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (if_then_else:SI (match_operator 6 "arm_comparison_operator" -- [(match_operand:SI 4 "s_register_operand" "r,r") -- (match_operand:SI 5 "arm_add_operand" "rIL,rIL")]) -- (match_operand:SI 1 "arm_rhs_operand" "0,?rI") -- (plus:SI -- (match_operand:SI 2 "s_register_operand" "r,r") -- (match_operand:SI 3 "arm_add_operand" "rIL,rIL")))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "#" -- [(set_attr "conds" "clob") -- (set_attr "length" "8,12")] --) -- --(define_insn "*if_move_plus" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r") -- (if_then_else:SI -- (match_operator 4 "arm_comparison_operator" -- [(match_operand 5 "cc_register" "") (const_int 0)]) -- (match_operand:SI 1 "arm_rhs_operand" "0,0,?rI,?rI") -- (plus:SI -- (match_operand:SI 2 "s_register_operand" "r,r,r,r") -- (match_operand:SI 3 "arm_add_operand" "rI,L,rI,L"))))] -- "TARGET_ARM" -- "@ -- add%D4\\t%0, %2, %3 -- sub%D4\\t%0, %2, #%n3 -- add%D4\\t%0, %2, %3\;mov%d4\\t%0, %1 -- sub%D4\\t%0, %2, #%n3\;mov%d4\\t%0, %1" -- [(set_attr "conds" "use") -- (set_attr "length" "4,4,8,8") -- (set_attr "type" "*,*,*,*")] --) -- --(define_insn "*ifcompare_arith_arith" -- [(set (match_operand:SI 0 "s_register_operand" "=r") -- (if_then_else:SI (match_operator 9 "arm_comparison_operator" -- [(match_operand:SI 5 "s_register_operand" "r") -- (match_operand:SI 6 "arm_add_operand" "rIL")]) -- (match_operator:SI 8 "shiftable_operator" -- [(match_operand:SI 1 "s_register_operand" "r") -- (match_operand:SI 2 "arm_rhs_operand" "rI")]) -- (match_operator:SI 7 "shiftable_operator" -- [(match_operand:SI 3 "s_register_operand" "r") -- (match_operand:SI 4 "arm_rhs_operand" "rI")]))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "#" -- [(set_attr "conds" "clob") -- (set_attr "length" "12")] --) -- --(define_insn "*if_arith_arith" -- [(set (match_operand:SI 0 "s_register_operand" "=r") -- (if_then_else:SI (match_operator 5 "arm_comparison_operator" -- [(match_operand 8 "cc_register" "") (const_int 0)]) -- (match_operator:SI 6 "shiftable_operator" -- [(match_operand:SI 1 "s_register_operand" "r") -- (match_operand:SI 2 "arm_rhs_operand" "rI")]) -- (match_operator:SI 7 "shiftable_operator" -- [(match_operand:SI 3 "s_register_operand" "r") -- (match_operand:SI 4 "arm_rhs_operand" "rI")])))] -- "TARGET_ARM" -- "%I6%d5\\t%0, %1, %2\;%I7%D5\\t%0, %3, %4" -- [(set_attr "conds" "use") -- (set_attr "length" "8")] --) -- --(define_insn "*ifcompare_arith_move" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (if_then_else:SI (match_operator 6 "arm_comparison_operator" -- [(match_operand:SI 2 "s_register_operand" "r,r") -- (match_operand:SI 3 "arm_add_operand" "rIL,rIL")]) -- (match_operator:SI 7 "shiftable_operator" -- [(match_operand:SI 4 "s_register_operand" "r,r") -- (match_operand:SI 5 "arm_rhs_operand" "rI,rI")]) -- (match_operand:SI 1 "arm_rhs_operand" "0,?rI"))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "* -- /* If we have an operation where (op x 0) is the identity operation and -- the conditional operator is LT or GE and we are comparing against zero and -- everything is in registers then we can do this in two instructions. */ -- if (operands[3] == const0_rtx -- && GET_CODE (operands[7]) != AND -- && GET_CODE (operands[5]) == REG -- && GET_CODE (operands[1]) == REG -- && REGNO (operands[1]) == REGNO (operands[4]) -- && REGNO (operands[4]) != REGNO (operands[0])) -- { -- if (GET_CODE (operands[6]) == LT) -- return \"and\\t%0, %5, %2, asr #31\;%I7\\t%0, %4, %0\"; -- else if (GET_CODE (operands[6]) == GE) -- return \"bic\\t%0, %5, %2, asr #31\;%I7\\t%0, %4, %0\"; -- } -- if (GET_CODE (operands[3]) == CONST_INT -- && !const_ok_for_arm (INTVAL (operands[3]))) -- output_asm_insn (\"cmn\\t%2, #%n3\", operands); -- else -- output_asm_insn (\"cmp\\t%2, %3\", operands); -- output_asm_insn (\"%I7%d6\\t%0, %4, %5\", operands); -- if (which_alternative != 0) -- return \"mov%D6\\t%0, %1\"; -- return \"\"; -- " -- [(set_attr "conds" "clob") -- (set_attr "length" "8,12")] --) -- --(define_insn "*if_arith_move" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (if_then_else:SI (match_operator 4 "arm_comparison_operator" -- [(match_operand 6 "cc_register" "") (const_int 0)]) -- (match_operator:SI 5 "shiftable_operator" -- [(match_operand:SI 2 "s_register_operand" "r,r") -- (match_operand:SI 3 "arm_rhs_operand" "rI,rI")]) -- (match_operand:SI 1 "arm_rhs_operand" "0,?rI")))] -- "TARGET_ARM" -- "@ -- %I5%d4\\t%0, %2, %3 -- %I5%d4\\t%0, %2, %3\;mov%D4\\t%0, %1" -- [(set_attr "conds" "use") -- (set_attr "length" "4,8") -- (set_attr "type" "*,*")] --) -- --(define_insn "*ifcompare_move_arith" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (if_then_else:SI (match_operator 6 "arm_comparison_operator" -- [(match_operand:SI 4 "s_register_operand" "r,r") -- (match_operand:SI 5 "arm_add_operand" "rIL,rIL")]) -- (match_operand:SI 1 "arm_rhs_operand" "0,?rI") -- (match_operator:SI 7 "shiftable_operator" -- [(match_operand:SI 2 "s_register_operand" "r,r") -- (match_operand:SI 3 "arm_rhs_operand" "rI,rI")]))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "* -- /* If we have an operation where (op x 0) is the identity operation and -- the conditional operator is LT or GE and we are comparing against zero and -- everything is in registers then we can do this in two instructions */ -- if (operands[5] == const0_rtx -- && GET_CODE (operands[7]) != AND -- && GET_CODE (operands[3]) == REG -- && GET_CODE (operands[1]) == REG -- && REGNO (operands[1]) == REGNO (operands[2]) -- && REGNO (operands[2]) != REGNO (operands[0])) -- { -- if (GET_CODE (operands[6]) == GE) -- return \"and\\t%0, %3, %4, asr #31\;%I7\\t%0, %2, %0\"; -- else if (GET_CODE (operands[6]) == LT) -- return \"bic\\t%0, %3, %4, asr #31\;%I7\\t%0, %2, %0\"; -- } -- -- if (GET_CODE (operands[5]) == CONST_INT -- && !const_ok_for_arm (INTVAL (operands[5]))) -- output_asm_insn (\"cmn\\t%4, #%n5\", operands); -- else -- output_asm_insn (\"cmp\\t%4, %5\", operands); -- -- if (which_alternative != 0) -- output_asm_insn (\"mov%d6\\t%0, %1\", operands); -- return \"%I7%D6\\t%0, %2, %3\"; -- " -- [(set_attr "conds" "clob") -- (set_attr "length" "8,12")] --) -+;(define_insn_and_split "*and_scc_scc_cmp" -+; [(set (match_operand 0 "dominant_cc_register" "") -+; (compare (and:SI (match_operator:SI 3 "arm_comparison_operator" -+; [(match_operand:SI 1 "s_register_operand" "r") -+; (match_operand:SI 2 "arm_add_operand" "rIL")]) -+; (match_operator:SI 6 "arm_comparison_operator" -+; [(match_operand:SI 4 "s_register_operand" "r") -+; (match_operand:SI 5 "arm_add_operand" "rIL")])) -+; (const_int 0))) -+; (set (match_operand:SI 7 "s_register_operand" "=r") -+; (and:SI (match_op_dup 3 [(match_dup 1) (match_dup 2)]) -+; (match_op_dup 6 [(match_dup 4) (match_dup 5)])))] -+; "TARGET_ARM" -+; "#" -+; "TARGET_ARM && reload_completed" -+; [(set (match_dup 0) -+; (compare -+; (and:SI -+; (match_op_dup 3 [(match_dup 1) (match_dup 2)]) -+; (match_op_dup 6 [(match_dup 4) (match_dup 5)])) -+; (const_int 0))) -+; (set (match_dup 7) (ne:SI (match_dup 0) (const_int 0)))] -+; "" -+; [(set_attr "conds" "set") -+; (set_attr "length" "16")]) -+; -+;;; If there is no dominance in the comparison, then we can still save an -+;;; instruction in the AND case, since we can know that the second compare -+;;; need only zero the value if false (if true, then the value is already -+;;; correct). -+;(define_insn_and_split "*and_scc_scc_nodom" -+; [(set (match_operand:SI 0 "s_register_operand" "=&r,&r,&r") -+; (and:SI (match_operator:SI 3 "arm_comparison_operator" -+; [(match_operand:SI 1 "s_register_operand" "r,r,0") -+; (match_operand:SI 2 "arm_add_operand" "rIL,0,rIL")]) -+; (match_operator:SI 6 "arm_comparison_operator" -+; [(match_operand:SI 4 "s_register_operand" "r,r,r") -+; (match_operand:SI 5 "arm_add_operand" "rIL,rIL,rIL")]))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM -+; ;&& (arm_select_dominance_cc_mode (operands[3], operands[6], DOM_CC_X_AND_Y) -+; == CCmode)" -+; "#" -+; "TARGET_ARM && reload_completed" -+; [(parallel [(set (match_dup 0) -+; (match_op_dup 3 [(match_dup 1) (match_dup 2)])) -+; (clobber (reg:CC CC_REGNUM))]) -+; (set (match_dup 7) (match_op_dup 8 [(match_dup 4) (match_dup 5)])) -+; (set (match_dup 0) -+; (if_then_else:SI (match_op_dup 6 [(match_dup 7) (const_int 0)]) -+; (match_dup 0) -+; (const_int 0)))] -+; "operands[7] = gen_rtx_REG (SELECT_CC_MODE (GET_CODE (operands[6]), -+; operands[4], operands[5]), -+; CC_REGNUM); -+; operands[8] = gen_rtx_COMPARE (GET_MODE (operands[7]), operands[4], -+; operands[5]);" -+; [(set_attr "conds" "clob") -+; (set_attr "length" "20")]) -+ -+;(define_split -+; [(set (reg:CC_NOOV CC_REGNUM) -+; (compare:CC_NOOV (ior:SI -+; (and:SI (match_operand:SI 0 "s_register_operand" "") -+; (const_int 1)) -+; (match_operator:SI 1 "comparison_operator" -+; [(match_operand:SI 2 "s_register_operand" "") -+; (match_operand:SI 3 "arm_add_operand" "")])) -+; (const_int 0))) -+; (clobber (match_operand:SI 4 "s_register_operand" ""))] -+; "TARGET_ARM" -+; [(set (match_dup 4) -+; (ior:SI (match_op_dup 1 [(match_dup 2) (match_dup 3)]) -+; (match_dup 0))) -+; (set (reg:CC_NOOV CC_REGNUM) -+; (compare:CC_NOOV (and:SI (match_dup 4) (const_int 1)) -+; (const_int 0)))] -+; "") -+ -+;(define_split -+; [(set (reg:CC_NOOV CC_REGNUM) -+; (compare:CC_NOOV (ior:SI -+; (match_operator:SI 1 "comparison_operator" -+; [(match_operand:SI 2 "s_register_operand" "") -+; (match_operand:SI 3 "arm_add_operand" "")]) -+; (and:SI (match_operand:SI 0 "s_register_operand" "") -+; (const_int 1))) -+; (const_int 0))) -+; (clobber (match_operand:SI 4 "s_register_operand" ""))] -+; "TARGET_ARM" -+; [(set (match_dup 4) -+; (ior:SI (match_op_dup 1 [(match_dup 2) (match_dup 3)]) -+; (match_dup 0))) -+; (set (reg:CC_NOOV CC_REGNUM) -+; (compare:CC_NOOV (and:SI (match_dup 4) (const_int 1)) -+; (const_int 0)))] -+; "") -+ -+;(define_insn "*negscc" -+; [(set (match_operand:SI 0 "s_register_operand" "=r") -+; (neg:SI (match_operator 3 "arm_comparison_operator" -+; [(match_operand:SI 1 "s_register_operand" "r") -+; (match_operand:SI 2 "arm_rhs_operand" "rI")]))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "* -+; if (GET_CODE (operands[3]) == LT && operands[3] == const0_rtx) -+; return \"mov\\t%0, %1, asr #31\"; -+; -+; if (GET_CODE (operands[3]) == NE) -+; return \"subs\\t%0, %1, %2\;mvnne\\t%0, #0\"; -+; -+; if (GET_CODE (operands[3]) == GT) -+; return \"subs\\t%0, %1, %2\;mvnne\\t%0, %0, asr #31\"; -+; -+; output_asm_insn (\"cmp\\t%1, %2\", operands); -+; output_asm_insn (\"mov%D3\\t%0, #0\", operands); -+; return \"mvn%d3\\t%0, #0\"; -+; " -+; [(set_attr "conds" "clob") -+; (set_attr "length" "12")] -+;) - --(define_insn "*if_move_arith" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (if_then_else:SI -- (match_operator 4 "arm_comparison_operator" -- [(match_operand 6 "cc_register" "") (const_int 0)]) -- (match_operand:SI 1 "arm_rhs_operand" "0,?rI") -- (match_operator:SI 5 "shiftable_operator" -- [(match_operand:SI 2 "s_register_operand" "r,r") -- (match_operand:SI 3 "arm_rhs_operand" "rI,rI")])))] -- "TARGET_ARM" -- "@ -- %I5%D4\\t%0, %2, %3 -- %I5%D4\\t%0, %2, %3\;mov%d4\\t%0, %1" -- [(set_attr "conds" "use") -- (set_attr "length" "4,8") -- (set_attr "type" "*,*")] --) -+;(define_insn "movcond" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") -+; (if_then_else:SI -+; (match_operator 5 "arm_comparison_operator" -+; [(match_operand:SI 3 "s_register_operand" "r,r,r") -+; (match_operand:SI 4 "arm_add_operand" "rIL,rIL,rIL")]) -+; (match_operand:SI 1 "arm_rhs_operand" "0,rI,?rI") -+; (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI"))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "* -+; if (GET_CODE (operands[5]) == LT -+; && (operands[4] == const0_rtx)) -+; { -+; if (which_alternative != 1 && GET_CODE (operands[1]) == REG) -+; { -+; if (operands[2] == const0_rtx) -+; return \"and\\t%0, %1, %3, asr #31\"; -+; return \"ands\\t%0, %1, %3, asr #32\;movcc\\t%0, %2\"; -+; } -+; else if (which_alternative != 0 && GET_CODE (operands[2]) == REG) -+; { -+; if (operands[1] == const0_rtx) -+; return \"bic\\t%0, %2, %3, asr #31\"; -+; return \"bics\\t%0, %2, %3, asr #32\;movcs\\t%0, %1\"; -+; } -+; /* The only case that falls through to here is when both ops 1 & 2 -+; are constants. */ -+; } -+; -+; if (GET_CODE (operands[5]) == GE -+; && (operands[4] == const0_rtx)) -+; { -+; if (which_alternative != 1 && GET_CODE (operands[1]) == REG) -+; { -+; if (operands[2] == const0_rtx) -+; return \"bic\\t%0, %1, %3, asr #31\"; -+; return \"bics\\t%0, %1, %3, asr #32\;movcs\\t%0, %2\"; -+; } -+; else if (which_alternative != 0 && GET_CODE (operands[2]) == REG) -+; { -+; if (operands[1] == const0_rtx) -+; return \"and\\t%0, %2, %3, asr #31\"; -+; return \"ands\\t%0, %2, %3, asr #32\;movcc\\t%0, %1\"; -+; } -+; /* The only case that falls through to here is when both ops 1 & 2 -+; are constants. */ -+; } -+; if (GET_CODE (operands[4]) == CONST_INT -+; && !const_ok_for_arm (INTVAL (operands[4]))) -+; output_asm_insn (\"cmn\\t%3, #%n4\", operands); -+; else -+; output_asm_insn (\"cmp\\t%3, %4\", operands); -+; if (which_alternative != 0) -+; output_asm_insn (\"mov%d5\\t%0, %1\", operands); -+; if (which_alternative != 1) -+; output_asm_insn (\"mov%D5\\t%0, %2\", operands); -+; return \"\"; -+; " -+; [(set_attr "conds" "clob") -+; (set_attr "length" "8,8,12")] -+;) - --(define_insn "*ifcompare_move_not" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (if_then_else:SI -- (match_operator 5 "arm_comparison_operator" -- [(match_operand:SI 3 "s_register_operand" "r,r") -- (match_operand:SI 4 "arm_add_operand" "rIL,rIL")]) -- (match_operand:SI 1 "arm_not_operand" "0,?rIK") -- (not:SI -- (match_operand:SI 2 "s_register_operand" "r,r")))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "#" -- [(set_attr "conds" "clob") -- (set_attr "length" "8,12")] --) -+;(define_insn "*ifcompare_plus_move" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (if_then_else:SI (match_operator 6 "arm_comparison_operator" -+; [(match_operand:SI 4 "s_register_operand" "r,r") -+; (match_operand:SI 5 "arm_add_operand" "rIL,rIL")]) -+; (plus:SI -+; (match_operand:SI 2 "s_register_operand" "r,r") -+; (match_operand:SI 3 "arm_add_operand" "rIL,rIL")) -+; (match_operand:SI 1 "arm_rhs_operand" "0,?rI"))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "#" -+; [(set_attr "conds" "clob") -+; (set_attr "length" "8,12")] -+;) - --(define_insn "*if_move_not" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") -- (if_then_else:SI -- (match_operator 4 "arm_comparison_operator" -- [(match_operand 3 "cc_register" "") (const_int 0)]) -- (match_operand:SI 1 "arm_not_operand" "0,?rI,K") -- (not:SI (match_operand:SI 2 "s_register_operand" "r,r,r"))))] -- "TARGET_ARM" -- "@ -- mvn%D4\\t%0, %2 -- mov%d4\\t%0, %1\;mvn%D4\\t%0, %2 -- mvn%d4\\t%0, #%B1\;mvn%D4\\t%0, %2" -- [(set_attr "conds" "use") -- (set_attr "length" "4,8,8")] --) -+;(define_insn "*if_plus_move" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r") -+; (if_then_else:SI -+; (match_operator 4 "arm_comparison_operator" -+; [(match_operand 5 "cc_register" "") (const_int 0)]) -+; (plus:SI -+; (match_operand:SI 2 "s_register_operand" "r,r,r,r") -+; (match_operand:SI 3 "arm_add_operand" "rI,L,rI,L")) -+; (match_operand:SI 1 "arm_rhs_operand" "0,0,?rI,?rI")))] -+; "TARGET_ARM" -+; "@ -+; add%d4\\t%0, %2, %3 -+; sub%d4\\t%0, %2, #%n3 -+; add%d4\\t%0, %2, %3\;mov%D4\\t%0, %1 -+; sub%d4\\t%0, %2, #%n3\;mov%D4\\t%0, %1" -+; [(set_attr "conds" "use") -+; (set_attr "length" "4,4,8,8") -+; (set_attr "type" "*,*,*,*")] -+;) - --(define_insn "*ifcompare_not_move" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (if_then_else:SI -- (match_operator 5 "arm_comparison_operator" -- [(match_operand:SI 3 "s_register_operand" "r,r") -- (match_operand:SI 4 "arm_add_operand" "rIL,rIL")]) -- (not:SI -- (match_operand:SI 2 "s_register_operand" "r,r")) -- (match_operand:SI 1 "arm_not_operand" "0,?rIK"))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "#" -- [(set_attr "conds" "clob") -- (set_attr "length" "8,12")] --) -+;(define_insn "*ifcompare_move_plus" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (if_then_else:SI (match_operator 6 "arm_comparison_operator" -+; [(match_operand:SI 4 "s_register_operand" "r,r") -+; (match_operand:SI 5 "arm_add_operand" "rIL,rIL")]) -+; (match_operand:SI 1 "arm_rhs_operand" "0,?rI") -+; (plus:SI -+; (match_operand:SI 2 "s_register_operand" "r,r") -+; (match_operand:SI 3 "arm_add_operand" "rIL,rIL")))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "#" -+; [(set_attr "conds" "clob") -+; (set_attr "length" "8,12")] -+;) - --(define_insn "*if_not_move" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") -- (if_then_else:SI -- (match_operator 4 "arm_comparison_operator" -- [(match_operand 3 "cc_register" "") (const_int 0)]) -- (not:SI (match_operand:SI 2 "s_register_operand" "r,r,r")) -- (match_operand:SI 1 "arm_not_operand" "0,?rI,K")))] -- "TARGET_ARM" -- "@ -- mvn%d4\\t%0, %2 -- mov%D4\\t%0, %1\;mvn%d4\\t%0, %2 -- mvn%D4\\t%0, #%B1\;mvn%d4\\t%0, %2" -- [(set_attr "conds" "use") -- (set_attr "length" "4,8,8")] --) -+;(define_insn "*if_move_plus" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r,r,r") -+; (if_then_else:SI -+; (match_operator 4 "arm_comparison_operator" -+; [(match_operand 5 "cc_register" "") (const_int 0)]) -+; (match_operand:SI 1 "arm_rhs_operand" "0,0,?rI,?rI") -+; (plus:SI -+; (match_operand:SI 2 "s_register_operand" "r,r,r,r") -+; (match_operand:SI 3 "arm_add_operand" "rI,L,rI,L"))))] -+; "TARGET_ARM" -+; "@ -+; add%D4\\t%0, %2, %3 -+; sub%D4\\t%0, %2, #%n3 -+; add%D4\\t%0, %2, %3\;mov%d4\\t%0, %1 -+; sub%D4\\t%0, %2, #%n3\;mov%d4\\t%0, %1" -+; [(set_attr "conds" "use") -+; (set_attr "length" "4,4,8,8") -+; (set_attr "type" "*,*,*,*")] -+;) - --(define_insn "*ifcompare_shift_move" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (if_then_else:SI -- (match_operator 6 "arm_comparison_operator" -- [(match_operand:SI 4 "s_register_operand" "r,r") -- (match_operand:SI 5 "arm_add_operand" "rIL,rIL")]) -- (match_operator:SI 7 "shift_operator" -- [(match_operand:SI 2 "s_register_operand" "r,r") -- (match_operand:SI 3 "arm_rhs_operand" "rM,rM")]) -- (match_operand:SI 1 "arm_not_operand" "0,?rIK"))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "#" -- [(set_attr "conds" "clob") -- (set_attr "length" "8,12")] --) -+;(define_insn "*ifcompare_arith_arith" -+; [(set (match_operand:SI 0 "s_register_operand" "=r") -+; (if_then_else:SI (match_operator 9 "arm_comparison_operator" -+; [(match_operand:SI 5 "s_register_operand" "r") -+; (match_operand:SI 6 "arm_add_operand" "rIL")]) -+; (match_operator:SI 8 "shiftable_operator" -+; [(match_operand:SI 1 "s_register_operand" "r") -+; (match_operand:SI 2 "arm_rhs_operand" "rI")]) -+; (match_operator:SI 7 "shiftable_operator" -+; [(match_operand:SI 3 "s_register_operand" "r") -+; (match_operand:SI 4 "arm_rhs_operand" "rI")]))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "#" -+; [(set_attr "conds" "clob") -+; (set_attr "length" "12")] -+;) - --(define_insn "*if_shift_move" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") -- (if_then_else:SI -- (match_operator 5 "arm_comparison_operator" -- [(match_operand 6 "cc_register" "") (const_int 0)]) -- (match_operator:SI 4 "shift_operator" -- [(match_operand:SI 2 "s_register_operand" "r,r,r") -- (match_operand:SI 3 "arm_rhs_operand" "rM,rM,rM")]) -- (match_operand:SI 1 "arm_not_operand" "0,?rI,K")))] -- "TARGET_ARM" -- "@ -- mov%d5\\t%0, %2%S4 -- mov%D5\\t%0, %1\;mov%d5\\t%0, %2%S4 -- mvn%D5\\t%0, #%B1\;mov%d5\\t%0, %2%S4" -- [(set_attr "conds" "use") -- (set_attr "shift" "2") -- (set_attr "length" "4,8,8") -- (set (attr "type") (if_then_else (match_operand 3 "const_int_operand" "") -- (const_string "alu_shift") -- (const_string "alu_shift_reg")))] --) -+;(define_insn "*if_arith_arith" -+; [(set (match_operand:SI 0 "s_register_operand" "=r") -+; (if_then_else:SI (match_operator 5 "arm_comparison_operator" -+; [(match_operand 8 "cc_register" "") (const_int 0)]) -+; (match_operator:SI 6 "shiftable_operator" -+; [(match_operand:SI 1 "s_register_operand" "r") -+; (match_operand:SI 2 "arm_rhs_operand" "rI")]) -+; (match_operator:SI 7 "shiftable_operator" -+; [(match_operand:SI 3 "s_register_operand" "r") -+; (match_operand:SI 4 "arm_rhs_operand" "rI")])))] -+; "TARGET_ARM" -+; "%I6%d5\\t%0, %1, %2\;%I7%D5\\t%0, %3, %4" -+; [(set_attr "conds" "use") -+; (set_attr "length" "8")] -+;) - --(define_insn "*ifcompare_move_shift" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (if_then_else:SI -- (match_operator 6 "arm_comparison_operator" -- [(match_operand:SI 4 "s_register_operand" "r,r") -- (match_operand:SI 5 "arm_add_operand" "rIL,rIL")]) -- (match_operand:SI 1 "arm_not_operand" "0,?rIK") -- (match_operator:SI 7 "shift_operator" -- [(match_operand:SI 2 "s_register_operand" "r,r") -- (match_operand:SI 3 "arm_rhs_operand" "rM,rM")]))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "#" -- [(set_attr "conds" "clob") -- (set_attr "length" "8,12")] --) -+;(define_insn "*ifcompare_arith_move" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (if_then_else:SI (match_operator 6 "arm_comparison_operator" -+; [(match_operand:SI 2 "s_register_operand" "r,r") -+; (match_operand:SI 3 "arm_add_operand" "rIL,rIL")]) -+; (match_operator:SI 7 "shiftable_operator" -+; [(match_operand:SI 4 "s_register_operand" "r,r") -+; (match_operand:SI 5 "arm_rhs_operand" "rI,rI")]) -+; (match_operand:SI 1 "arm_rhs_operand" "0,?rI"))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "* -+; /* If we have an operation where (op x 0) is the identity operation and -+; the conditional operator is LT or GE and we are comparing against zero and -+; everything is in registers then we can do this in two instructions. */ -+; if (operands[3] == const0_rtx -+; && GET_CODE (operands[7]) != AND -+; && GET_CODE (operands[5]) == REG -+; && GET_CODE (operands[1]) == REG -+; && REGNO (operands[1]) == REGNO (operands[4]) -+; && REGNO (operands[4]) != REGNO (operands[0])) -+; { -+; if (GET_CODE (operands[6]) == LT) -+; return \"and\\t%0, %5, %2, asr #31\;%I7\\t%0, %4, %0\"; -+; else if (GET_CODE (operands[6]) == GE) -+; return \"bic\\t%0, %5, %2, asr #31\;%I7\\t%0, %4, %0\"; -+; } -+; if (GET_CODE (operands[3]) == CONST_INT -+; && !const_ok_for_arm (INTVAL (operands[3]))) -+; output_asm_insn (\"cmn\\t%2, #%n3\", operands); -+; else -+; output_asm_insn (\"cmp\\t%2, %3\", operands); -+; output_asm_insn (\"%I7%d6\\t%0, %4, %5\", operands); -+; if (which_alternative != 0) -+; return \"mov%D6\\t%0, %1\"; -+; return \"\"; -+; " -+; [(set_attr "conds" "clob") -+; (set_attr "length" "8,12")] -+;) - --(define_insn "*if_move_shift" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") -- (if_then_else:SI -- (match_operator 5 "arm_comparison_operator" -- [(match_operand 6 "cc_register" "") (const_int 0)]) -- (match_operand:SI 1 "arm_not_operand" "0,?rI,K") -- (match_operator:SI 4 "shift_operator" -- [(match_operand:SI 2 "s_register_operand" "r,r,r") -- (match_operand:SI 3 "arm_rhs_operand" "rM,rM,rM")])))] -- "TARGET_ARM" -- "@ -- mov%D5\\t%0, %2%S4 -- mov%d5\\t%0, %1\;mov%D5\\t%0, %2%S4 -- mvn%d5\\t%0, #%B1\;mov%D5\\t%0, %2%S4" -- [(set_attr "conds" "use") -- (set_attr "shift" "2") -- (set_attr "length" "4,8,8") -- (set (attr "type") (if_then_else (match_operand 3 "const_int_operand" "") -- (const_string "alu_shift") -- (const_string "alu_shift_reg")))] --) -+;(define_insn "*if_arith_move" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (if_then_else:SI (match_operator 4 "arm_comparison_operator" -+; [(match_operand 6 "cc_register" "") (const_int 0)]) -+; (match_operator:SI 5 "shiftable_operator" -+; [(match_operand:SI 2 "s_register_operand" "r,r") -+; (match_operand:SI 3 "arm_rhs_operand" "rI,rI")]) -+; (match_operand:SI 1 "arm_rhs_operand" "0,?rI")))] -+; "TARGET_ARM" -+; "@ -+; %I5%d4\\t%0, %2, %3 -+; %I5%d4\\t%0, %2, %3\;mov%D4\\t%0, %1" -+; [(set_attr "conds" "use") -+; (set_attr "length" "4,8") -+; (set_attr "type" "*,*")] -+;) - --(define_insn "*ifcompare_shift_shift" -- [(set (match_operand:SI 0 "s_register_operand" "=r") -- (if_then_else:SI -- (match_operator 7 "arm_comparison_operator" -- [(match_operand:SI 5 "s_register_operand" "r") -- (match_operand:SI 6 "arm_add_operand" "rIL")]) -- (match_operator:SI 8 "shift_operator" -- [(match_operand:SI 1 "s_register_operand" "r") -- (match_operand:SI 2 "arm_rhs_operand" "rM")]) -- (match_operator:SI 9 "shift_operator" -- [(match_operand:SI 3 "s_register_operand" "r") -- (match_operand:SI 4 "arm_rhs_operand" "rM")]))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "#" -- [(set_attr "conds" "clob") -- (set_attr "length" "12")] --) -+;(define_insn "*ifcompare_move_arith" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (if_then_else:SI (match_operator 6 "arm_comparison_operator" -+; [(match_operand:SI 4 "s_register_operand" "r,r") -+; (match_operand:SI 5 "arm_add_operand" "rIL,rIL")]) -+; (match_operand:SI 1 "arm_rhs_operand" "0,?rI") -+; (match_operator:SI 7 "shiftable_operator" -+; [(match_operand:SI 2 "s_register_operand" "r,r") -+; (match_operand:SI 3 "arm_rhs_operand" "rI,rI")]))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "* -+; /* If we have an operation where (op x 0) is the identity operation and -+; the conditional operator is LT or GE and we are comparing against zero and -+; everything is in registers then we can do this in two instructions */ -+; if (operands[5] == const0_rtx -+; && GET_CODE (operands[7]) != AND -+; && GET_CODE (operands[3]) == REG -+; && GET_CODE (operands[1]) == REG -+; && REGNO (operands[1]) == REGNO (operands[2]) -+; && REGNO (operands[2]) != REGNO (operands[0])) -+; { -+; if (GET_CODE (operands[6]) == GE) -+; return \"and\\t%0, %3, %4, asr #31\;%I7\\t%0, %2, %0\"; -+; else if (GET_CODE (operands[6]) == LT) -+; return \"bic\\t%0, %3, %4, asr #31\;%I7\\t%0, %2, %0\"; -+; } -+; -+; if (GET_CODE (operands[5]) == CONST_INT -+; && !const_ok_for_arm (INTVAL (operands[5]))) -+; output_asm_insn (\"cmn\\t%4, #%n5\", operands); -+; else -+; output_asm_insn (\"cmp\\t%4, %5\", operands); -+; -+; if (which_alternative != 0) -+; output_asm_insn (\"mov%d6\\t%0, %1\", operands); -+; return \"%I7%D6\\t%0, %2, %3\"; -+; " -+; [(set_attr "conds" "clob") -+; (set_attr "length" "8,12")] -+;) - --(define_insn "*if_shift_shift" -- [(set (match_operand:SI 0 "s_register_operand" "=r") -- (if_then_else:SI -- (match_operator 5 "arm_comparison_operator" -- [(match_operand 8 "cc_register" "") (const_int 0)]) -- (match_operator:SI 6 "shift_operator" -- [(match_operand:SI 1 "s_register_operand" "r") -- (match_operand:SI 2 "arm_rhs_operand" "rM")]) -- (match_operator:SI 7 "shift_operator" -- [(match_operand:SI 3 "s_register_operand" "r") -- (match_operand:SI 4 "arm_rhs_operand" "rM")])))] -- "TARGET_ARM" -- "mov%d5\\t%0, %1%S6\;mov%D5\\t%0, %3%S7" -- [(set_attr "conds" "use") -- (set_attr "shift" "1") -- (set_attr "length" "8") -- (set (attr "type") (if_then_else -- (and (match_operand 2 "const_int_operand" "") -- (match_operand 4 "const_int_operand" "")) -- (const_string "alu_shift") -- (const_string "alu_shift_reg")))] --) -+;(define_insn "*if_move_arith" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (if_then_else:SI -+; (match_operator 4 "arm_comparison_operator" -+; [(match_operand 6 "cc_register" "") (const_int 0)]) -+; (match_operand:SI 1 "arm_rhs_operand" "0,?rI") -+; (match_operator:SI 5 "shiftable_operator" -+; [(match_operand:SI 2 "s_register_operand" "r,r") -+; (match_operand:SI 3 "arm_rhs_operand" "rI,rI")])))] -+; "TARGET_ARM" -+; "@ -+; %I5%D4\\t%0, %2, %3 -+; %I5%D4\\t%0, %2, %3\;mov%d4\\t%0, %1" -+; [(set_attr "conds" "use") -+; (set_attr "length" "4,8") -+; (set_attr "type" "*,*")] -+;) - --(define_insn "*ifcompare_not_arith" -- [(set (match_operand:SI 0 "s_register_operand" "=r") -- (if_then_else:SI -- (match_operator 6 "arm_comparison_operator" -- [(match_operand:SI 4 "s_register_operand" "r") -- (match_operand:SI 5 "arm_add_operand" "rIL")]) -- (not:SI (match_operand:SI 1 "s_register_operand" "r")) -- (match_operator:SI 7 "shiftable_operator" -- [(match_operand:SI 2 "s_register_operand" "r") -- (match_operand:SI 3 "arm_rhs_operand" "rI")]))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "#" -- [(set_attr "conds" "clob") -- (set_attr "length" "12")] --) -+;(define_insn "*ifcompare_move_not" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (if_then_else:SI -+; (match_operator 5 "arm_comparison_operator" -+; [(match_operand:SI 3 "s_register_operand" "r,r") -+; (match_operand:SI 4 "arm_add_operand" "rIL,rIL")]) -+; (match_operand:SI 1 "arm_not_operand" "0,?rIK") -+; (not:SI -+; (match_operand:SI 2 "s_register_operand" "r,r")))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "#" -+; [(set_attr "conds" "clob") -+; (set_attr "length" "8,12")] -+;) - --(define_insn "*if_not_arith" -- [(set (match_operand:SI 0 "s_register_operand" "=r") -- (if_then_else:SI -- (match_operator 5 "arm_comparison_operator" -- [(match_operand 4 "cc_register" "") (const_int 0)]) -- (not:SI (match_operand:SI 1 "s_register_operand" "r")) -- (match_operator:SI 6 "shiftable_operator" -- [(match_operand:SI 2 "s_register_operand" "r") -- (match_operand:SI 3 "arm_rhs_operand" "rI")])))] -- "TARGET_ARM" -- "mvn%d5\\t%0, %1\;%I6%D5\\t%0, %2, %3" -- [(set_attr "conds" "use") -- (set_attr "length" "8")] --) -+;(define_insn "*if_move_not" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") -+; (if_then_else:SI -+; (match_operator 4 "arm_comparison_operator" -+; [(match_operand 3 "cc_register" "") (const_int 0)]) -+; (match_operand:SI 1 "arm_not_operand" "0,?rI,K") -+; (not:SI (match_operand:SI 2 "s_register_operand" "r,r,r"))))] -+; "TARGET_ARM" -+; "@ -+; mvn%D4\\t%0, %2 -+; mov%d4\\t%0, %1\;mvn%D4\\t%0, %2 -+; mvn%d4\\t%0, #%B1\;mvn%D4\\t%0, %2" -+; [(set_attr "conds" "use") -+; (set_attr "length" "4,8,8")] -+;) - --(define_insn "*ifcompare_arith_not" -- [(set (match_operand:SI 0 "s_register_operand" "=r") -- (if_then_else:SI -- (match_operator 6 "arm_comparison_operator" -- [(match_operand:SI 4 "s_register_operand" "r") -- (match_operand:SI 5 "arm_add_operand" "rIL")]) -- (match_operator:SI 7 "shiftable_operator" -- [(match_operand:SI 2 "s_register_operand" "r") -- (match_operand:SI 3 "arm_rhs_operand" "rI")]) -- (not:SI (match_operand:SI 1 "s_register_operand" "r")))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "#" -- [(set_attr "conds" "clob") -- (set_attr "length" "12")] --) -+;(define_insn "*ifcompare_not_move" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (if_then_else:SI -+; (match_operator 5 "arm_comparison_operator" -+; [(match_operand:SI 3 "s_register_operand" "r,r") -+; (match_operand:SI 4 "arm_add_operand" "rIL,rIL")]) -+; (not:SI -+; (match_operand:SI 2 "s_register_operand" "r,r")) -+; (match_operand:SI 1 "arm_not_operand" "0,?rIK"))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "#" -+; [(set_attr "conds" "clob") -+; (set_attr "length" "8,12")] -+;) - --(define_insn "*if_arith_not" -- [(set (match_operand:SI 0 "s_register_operand" "=r") -- (if_then_else:SI -- (match_operator 5 "arm_comparison_operator" -- [(match_operand 4 "cc_register" "") (const_int 0)]) -- (match_operator:SI 6 "shiftable_operator" -- [(match_operand:SI 2 "s_register_operand" "r") -- (match_operand:SI 3 "arm_rhs_operand" "rI")]) -- (not:SI (match_operand:SI 1 "s_register_operand" "r"))))] -- "TARGET_ARM" -- "mvn%D5\\t%0, %1\;%I6%d5\\t%0, %2, %3" -- [(set_attr "conds" "use") -- (set_attr "length" "8")] --) -+;(define_insn "*if_not_move" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") -+; (if_then_else:SI -+; (match_operator 4 "arm_comparison_operator" -+; [(match_operand 3 "cc_register" "") (const_int 0)]) -+; (not:SI (match_operand:SI 2 "s_register_operand" "r,r,r")) -+; (match_operand:SI 1 "arm_not_operand" "0,?rI,K")))] -+; "TARGET_ARM" -+; "@ -+; mvn%d4\\t%0, %2 -+; mov%D4\\t%0, %1\;mvn%d4\\t%0, %2 -+; mvn%D4\\t%0, #%B1\;mvn%d4\\t%0, %2" -+; [(set_attr "conds" "use") -+; (set_attr "length" "4,8,8")] -+;) - --(define_insn "*ifcompare_neg_move" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (if_then_else:SI -- (match_operator 5 "arm_comparison_operator" -- [(match_operand:SI 3 "s_register_operand" "r,r") -- (match_operand:SI 4 "arm_add_operand" "rIL,rIL")]) -- (neg:SI (match_operand:SI 2 "s_register_operand" "r,r")) -- (match_operand:SI 1 "arm_not_operand" "0,?rIK"))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "#" -- [(set_attr "conds" "clob") -- (set_attr "length" "8,12")] --) -+;(define_insn "*ifcompare_shift_move" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (if_then_else:SI -+; (match_operator 6 "arm_comparison_operator" -+; [(match_operand:SI 4 "s_register_operand" "r,r") -+; (match_operand:SI 5 "arm_add_operand" "rIL,rIL")]) -+; (match_operator:SI 7 "shift_operator" -+; [(match_operand:SI 2 "s_register_operand" "r,r") -+; (match_operand:SI 3 "arm_rhs_operand" "rM,rM")]) -+; (match_operand:SI 1 "arm_not_operand" "0,?rIK"))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "#" -+; [(set_attr "conds" "clob") -+; (set_attr "length" "8,12")] -+;) - --(define_insn "*if_neg_move" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") -- (if_then_else:SI -- (match_operator 4 "arm_comparison_operator" -- [(match_operand 3 "cc_register" "") (const_int 0)]) -- (neg:SI (match_operand:SI 2 "s_register_operand" "r,r,r")) -- (match_operand:SI 1 "arm_not_operand" "0,?rI,K")))] -- "TARGET_ARM" -- "@ -- rsb%d4\\t%0, %2, #0 -- mov%D4\\t%0, %1\;rsb%d4\\t%0, %2, #0 -- mvn%D4\\t%0, #%B1\;rsb%d4\\t%0, %2, #0" -- [(set_attr "conds" "use") -- (set_attr "length" "4,8,8")] --) -+;(define_insn "*if_shift_move" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") -+; (if_then_else:SI -+; (match_operator 5 "arm_comparison_operator" -+; [(match_operand 6 "cc_register" "") (const_int 0)]) -+; (match_operator:SI 4 "shift_operator" -+; [(match_operand:SI 2 "s_register_operand" "r,r,r") -+; (match_operand:SI 3 "arm_rhs_operand" "rM,rM,rM")]) -+; (match_operand:SI 1 "arm_not_operand" "0,?rI,K")))] -+; "TARGET_ARM" -+; "@ -+; mov%d5\\t%0, %2%S4 -+; mov%D5\\t%0, %1\;mov%d5\\t%0, %2%S4 -+; mvn%D5\\t%0, #%B1\;mov%d5\\t%0, %2%S4" -+; [(set_attr "conds" "use") -+; (set_attr "shift" "2") -+; (set_attr "length" "4,8,8") -+; (set (attr "type") (if_then_else (match_operand 3 "const_int_operand" "") -+; (const_string "alu_shift") -+; (const_string "alu_shift_reg")))] -+;) - --(define_insn "*ifcompare_move_neg" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (if_then_else:SI -- (match_operator 5 "arm_comparison_operator" -- [(match_operand:SI 3 "s_register_operand" "r,r") -- (match_operand:SI 4 "arm_add_operand" "rIL,rIL")]) -- (match_operand:SI 1 "arm_not_operand" "0,?rIK") -- (neg:SI (match_operand:SI 2 "s_register_operand" "r,r")))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "#" -- [(set_attr "conds" "clob") -- (set_attr "length" "8,12")] --) -+;(define_insn "*ifcompare_move_shift" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (if_then_else:SI -+; (match_operator 6 "arm_comparison_operator" -+; [(match_operand:SI 4 "s_register_operand" "r,r") -+; (match_operand:SI 5 "arm_add_operand" "rIL,rIL")]) -+; (match_operand:SI 1 "arm_not_operand" "0,?rIK") -+; (match_operator:SI 7 "shift_operator" -+; [(match_operand:SI 2 "s_register_operand" "r,r") -+; (match_operand:SI 3 "arm_rhs_operand" "rM,rM")]))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "#" -+; [(set_attr "conds" "clob") -+; (set_attr "length" "8,12")] -+;) - --(define_insn "*if_move_neg" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") -- (if_then_else:SI -- (match_operator 4 "arm_comparison_operator" -- [(match_operand 3 "cc_register" "") (const_int 0)]) -- (match_operand:SI 1 "arm_not_operand" "0,?rI,K") -- (neg:SI (match_operand:SI 2 "s_register_operand" "r,r,r"))))] -- "TARGET_ARM" -- "@ -- rsb%D4\\t%0, %2, #0 -- mov%d4\\t%0, %1\;rsb%D4\\t%0, %2, #0 -- mvn%d4\\t%0, #%B1\;rsb%D4\\t%0, %2, #0" -- [(set_attr "conds" "use") -- (set_attr "length" "4,8,8")] --) -+;(define_insn "*if_move_shift" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") -+; (if_then_else:SI -+; (match_operator 5 "arm_comparison_operator" -+; [(match_operand 6 "cc_register" "") (const_int 0)]) -+; (match_operand:SI 1 "arm_not_operand" "0,?rI,K") -+; (match_operator:SI 4 "shift_operator" -+; [(match_operand:SI 2 "s_register_operand" "r,r,r") -+; (match_operand:SI 3 "arm_rhs_operand" "rM,rM,rM")])))] -+; "TARGET_ARM" -+; "@ -+; mov%D5\\t%0, %2%S4 -+; mov%d5\\t%0, %1\;mov%D5\\t%0, %2%S4 -+; mvn%d5\\t%0, #%B1\;mov%D5\\t%0, %2%S4" -+; [(set_attr "conds" "use") -+; (set_attr "shift" "2") -+; (set_attr "length" "4,8,8") -+; (set (attr "type") (if_then_else (match_operand 3 "const_int_operand" "") -+; (const_string "alu_shift") -+; (const_string "alu_shift_reg")))] -+;) - --(define_insn "*arith_adjacentmem" -- [(set (match_operand:SI 0 "s_register_operand" "=r") -- (match_operator:SI 1 "shiftable_operator" -- [(match_operand:SI 2 "memory_operand" "m") -- (match_operand:SI 3 "memory_operand" "m")])) -- (clobber (match_scratch:SI 4 "=r"))] -- "TARGET_ARM && adjacent_mem_locations (operands[2], operands[3])" -- "* -- { -- rtx ldm[3]; -- rtx arith[4]; -- rtx base_reg; -- HOST_WIDE_INT val1 = 0, val2 = 0; -+;(define_insn "*ifcompare_shift_shift" -+; [(set (match_operand:SI 0 "s_register_operand" "=r") -+; (if_then_else:SI -+; (match_operator 7 "arm_comparison_operator" -+; [(match_operand:SI 5 "s_register_operand" "r") -+; (match_operand:SI 6 "arm_add_operand" "rIL")]) -+; (match_operator:SI 8 "shift_operator" -+; [(match_operand:SI 1 "s_register_operand" "r") -+; (match_operand:SI 2 "arm_rhs_operand" "rM")]) -+; (match_operator:SI 9 "shift_operator" -+; [(match_operand:SI 3 "s_register_operand" "r") -+; (match_operand:SI 4 "arm_rhs_operand" "rM")]))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "#" -+; [(set_attr "conds" "clob") -+; (set_attr "length" "12")] -+;) - -- if (REGNO (operands[0]) > REGNO (operands[4])) -- { -- ldm[1] = operands[4]; -- ldm[2] = operands[0]; -- } -- else -- { -- ldm[1] = operands[0]; -- ldm[2] = operands[4]; -- } -+;(define_insn "*if_shift_shift" -+; [(set (match_operand:SI 0 "s_register_operand" "=r") -+; (if_then_else:SI -+; (match_operator 5 "arm_comparison_operator" -+; [(match_operand 8 "cc_register" "") (const_int 0)]) -+; (match_operator:SI 6 "shift_operator" -+; [(match_operand:SI 1 "s_register_operand" "r") -+; (match_operand:SI 2 "arm_rhs_operand" "rM")]) -+; (match_operator:SI 7 "shift_operator" -+; [(match_operand:SI 3 "s_register_operand" "r") -+; (match_operand:SI 4 "arm_rhs_operand" "rM")])))] -+; "TARGET_ARM" -+; "mov%d5\\t%0, %1%S6\;mov%D5\\t%0, %3%S7" -+; [(set_attr "conds" "use") -+; (set_attr "shift" "1") -+; (set_attr "length" "8") -+; (set (attr "type") (if_then_else -+; (and (match_operand 2 "const_int_operand" "") -+; (match_operand 4 "const_int_operand" "")) -+; (const_string "alu_shift") -+; (const_string "alu_shift_reg")))] -+;) - -- base_reg = XEXP (operands[2], 0); -+;(define_insn "*ifcompare_not_arith" -+; [(set (match_operand:SI 0 "s_register_operand" "=r") -+; (if_then_else:SI -+; (match_operator 6 "arm_comparison_operator" -+; [(match_operand:SI 4 "s_register_operand" "r") -+; (match_operand:SI 5 "arm_add_operand" "rIL")]) -+; (not:SI (match_operand:SI 1 "s_register_operand" "r")) -+; (match_operator:SI 7 "shiftable_operator" -+; [(match_operand:SI 2 "s_register_operand" "r") -+; (match_operand:SI 3 "arm_rhs_operand" "rI")]))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "#" -+; [(set_attr "conds" "clob") -+; (set_attr "length" "12")] -+;) - -- if (!REG_P (base_reg)) -- { -- val1 = INTVAL (XEXP (base_reg, 1)); -- base_reg = XEXP (base_reg, 0); -- } -+;(define_insn "*if_not_arith" -+; [(set (match_operand:SI 0 "s_register_operand" "=r") -+; (if_then_else:SI -+; (match_operator 5 "arm_comparison_operator" -+; [(match_operand 4 "cc_register" "") (const_int 0)]) -+; (not:SI (match_operand:SI 1 "s_register_operand" "r")) -+; (match_operator:SI 6 "shiftable_operator" -+; [(match_operand:SI 2 "s_register_operand" "r") -+; (match_operand:SI 3 "arm_rhs_operand" "rI")])))] -+; "TARGET_ARM" -+; "mvn%d5\\t%0, %1\;%I6%D5\\t%0, %2, %3" -+; [(set_attr "conds" "use") -+; (set_attr "length" "8")] -+;) - -- if (!REG_P (XEXP (operands[3], 0))) -- val2 = INTVAL (XEXP (XEXP (operands[3], 0), 1)); -+;(define_insn "*ifcompare_arith_not" -+; [(set (match_operand:SI 0 "s_register_operand" "=r") -+; (if_then_else:SI -+; (match_operator 6 "arm_comparison_operator" -+; [(match_operand:SI 4 "s_register_operand" "r") -+; (match_operand:SI 5 "arm_add_operand" "rIL")]) -+; (match_operator:SI 7 "shiftable_operator" -+; [(match_operand:SI 2 "s_register_operand" "r") -+; (match_operand:SI 3 "arm_rhs_operand" "rI")]) -+; (not:SI (match_operand:SI 1 "s_register_operand" "r")))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "#" -+; [(set_attr "conds" "clob") -+; (set_attr "length" "12")] -+;) - -- arith[0] = operands[0]; -- arith[3] = operands[1]; -+;(define_insn "*if_arith_not" -+; [(set (match_operand:SI 0 "s_register_operand" "=r") -+; (if_then_else:SI -+; (match_operator 5 "arm_comparison_operator" -+; [(match_operand 4 "cc_register" "") (const_int 0)]) -+; (match_operator:SI 6 "shiftable_operator" -+; [(match_operand:SI 2 "s_register_operand" "r") -+; (match_operand:SI 3 "arm_rhs_operand" "rI")]) -+; (not:SI (match_operand:SI 1 "s_register_operand" "r"))))] -+; "TARGET_ARM" -+; "mvn%D5\\t%0, %1\;%I6%d5\\t%0, %2, %3" -+; [(set_attr "conds" "use") -+; (set_attr "length" "8")] -+;) - -- if (val1 < val2) -- { -- arith[1] = ldm[1]; -- arith[2] = ldm[2]; -- } -- else -- { -- arith[1] = ldm[2]; -- arith[2] = ldm[1]; -- } -+;(define_insn "*ifcompare_neg_move" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (if_then_else:SI -+; (match_operator 5 "arm_comparison_operator" -+; [(match_operand:SI 3 "s_register_operand" "r,r") -+; (match_operand:SI 4 "arm_add_operand" "rIL,rIL")]) -+; (neg:SI (match_operand:SI 2 "s_register_operand" "r,r")) -+; (match_operand:SI 1 "arm_not_operand" "0,?rIK"))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "#" -+; [(set_attr "conds" "clob") -+; (set_attr "length" "8,12")] -+;) - -- ldm[0] = base_reg; -- if (val1 !=0 && val2 != 0) -- { -- rtx ops[3]; -+;(define_insn "*if_neg_move" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") -+; (if_then_else:SI -+; (match_operator 4 "arm_comparison_operator" -+; [(match_operand 3 "cc_register" "") (const_int 0)]) -+; (neg:SI (match_operand:SI 2 "s_register_operand" "r,r,r")) -+; (match_operand:SI 1 "arm_not_operand" "0,?rI,K")))] -+; "TARGET_ARM" -+; "@ -+; rsb%d4\\t%0, %2, #0 -+; mov%D4\\t%0, %1\;rsb%d4\\t%0, %2, #0 -+; mvn%D4\\t%0, #%B1\;rsb%d4\\t%0, %2, #0" -+; [(set_attr "conds" "use") -+; (set_attr "length" "4,8,8")] -+;) - -- if (val1 == 4 || val2 == 4) -- /* Other val must be 8, since we know they are adjacent and neither -- is zero. */ -- output_asm_insn (\"ldm%?ib\\t%0, {%1, %2}\", ldm); -- else if (const_ok_for_arm (val1) || const_ok_for_arm (-val1)) -- { -- ldm[0] = ops[0] = operands[4]; -- ops[1] = base_reg; -- ops[2] = GEN_INT (val1); -- output_add_immediate (ops); -- if (val1 < val2) -- output_asm_insn (\"ldm%?ia\\t%0, {%1, %2}\", ldm); -- else -- output_asm_insn (\"ldm%?da\\t%0, {%1, %2}\", ldm); -- } -- else -- { -- /* Offset is out of range for a single add, so use two ldr. */ -- ops[0] = ldm[1]; -- ops[1] = base_reg; -- ops[2] = GEN_INT (val1); -- output_asm_insn (\"ldr%?\\t%0, [%1, %2]\", ops); -- ops[0] = ldm[2]; -- ops[2] = GEN_INT (val2); -- output_asm_insn (\"ldr%?\\t%0, [%1, %2]\", ops); -- } -- } -- else if (val1 != 0) -- { -- if (val1 < val2) -- output_asm_insn (\"ldm%?da\\t%0, {%1, %2}\", ldm); -- else -- output_asm_insn (\"ldm%?ia\\t%0, {%1, %2}\", ldm); -- } -- else -- { -- if (val1 < val2) -- output_asm_insn (\"ldm%?ia\\t%0, {%1, %2}\", ldm); -- else -- output_asm_insn (\"ldm%?da\\t%0, {%1, %2}\", ldm); -- } -- output_asm_insn (\"%I3%?\\t%0, %1, %2\", arith); -- return \"\"; -- }" -- [(set_attr "length" "12") -- (set_attr "predicable" "yes") -- (set_attr "type" "load1")] --) -+;(define_insn "*ifcompare_move_neg" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (if_then_else:SI -+; (match_operator 5 "arm_comparison_operator" -+; [(match_operand:SI 3 "s_register_operand" "r,r") -+; (match_operand:SI 4 "arm_add_operand" "rIL,rIL")]) -+; (match_operand:SI 1 "arm_not_operand" "0,?rIK") -+; (neg:SI (match_operand:SI 2 "s_register_operand" "r,r")))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "#" -+; [(set_attr "conds" "clob") -+; (set_attr "length" "8,12")] -+;) -+ -+;(define_insn "*if_move_neg" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") -+; (if_then_else:SI -+; (match_operator 4 "arm_comparison_operator" -+; [(match_operand 3 "cc_register" "") (const_int 0)]) -+; (match_operand:SI 1 "arm_not_operand" "0,?rI,K") -+; (neg:SI (match_operand:SI 2 "s_register_operand" "r,r,r"))))] -+; "TARGET_ARM" -+; "@ -+; rsb%D4\\t%0, %2, #0 -+; mov%d4\\t%0, %1\;rsb%D4\\t%0, %2, #0 -+; mvn%d4\\t%0, #%B1\;rsb%D4\\t%0, %2, #0" -+; [(set_attr "conds" "use") -+; (set_attr "length" "4,8,8")] -+;) -+ -+;(define_insn "*arith_adjacentmem" -+; [(set (match_operand:SI 0 "s_register_operand" "=r") -+; (match_operator:SI 1 "shiftable_operator" -+; [(match_operand:SI 2 "memory_operand" "m") -+; (match_operand:SI 3 "memory_operand" "m")])) -+; (clobber (match_scratch:SI 4 "=r"))] -+; "TARGET_ARM && adjacent_mem_locations (operands[2], operands[3])" -+; "* -+; { -+; rtx ldm[3]; -+; rtx arith[4]; -+; rtx base_reg; -+; HOST_WIDE_INT val1 = 0, val2 = 0; -+; -+; if (REGNO (operands[0]) > REGNO (operands[4])) -+; { -+; ldm[1] = operands[4]; -+; ldm[2] = operands[0]; -+; } -+; else -+; { -+; ldm[1] = operands[0]; -+; ldm[2] = operands[4]; -+; } -+; -+; base_reg = XEXP (operands[2], 0); -+; -+; if (!REG_P (base_reg)) -+; { -+; val1 = INTVAL (XEXP (base_reg, 1)); -+; base_reg = XEXP (base_reg, 0); -+; } -+; -+; if (!REG_P (XEXP (operands[3], 0))) -+; val2 = INTVAL (XEXP (XEXP (operands[3], 0), 1)); -+; -+; arith[0] = operands[0]; -+; arith[3] = operands[1]; -+; -+; if (val1 < val2) -+; { -+; arith[1] = ldm[1]; -+; arith[2] = ldm[2]; -+; } -+; else -+; { -+; arith[1] = ldm[2]; -+; arith[2] = ldm[1]; -+; } -+; -+; ldm[0] = base_reg; -+; if (val1 !=0 && val2 != 0) -+; { -+; rtx ops[3]; -+; -+; if (val1 == 4 || val2 == 4) -+; /* Other val must be 8, since we know they are adjacent and neither -+; is zero. */ -+; output_asm_insn (\"ldm%?ib\\t%0, {%1, %2}\", ldm); -+; else if (const_ok_for_arm (val1) || const_ok_for_arm (-val1)) -+; { -+; ldm[0] = ops[0] = operands[4]; -+; ops[1] = base_reg; -+; ops[2] = GEN_INT (val1); -+; output_add_immediate (ops); -+; if (val1 < val2) -+; output_asm_insn (\"ldm%?ia\\t%0, {%1, %2}\", ldm); -+; else -+; output_asm_insn (\"ldm%?da\\t%0, {%1, %2}\", ldm); -+; } -+; else -+; { -+; /* Offset is out of range for a single add, so use two ldr. */ -+; ops[0] = ldm[1]; -+; ops[1] = base_reg; -+; ops[2] = GEN_INT (val1); -+; output_asm_insn (\"ldr%?\\t%0, [%1, %2]\", ops); -+; ops[0] = ldm[2]; -+; ops[2] = GEN_INT (val2); -+; output_asm_insn (\"ldr%?\\t%0, [%1, %2]\", ops); -+; } -+; } -+; else if (val1 != 0) -+; { -+; if (val1 < val2) -+; output_asm_insn (\"ldm%?da\\t%0, {%1, %2}\", ldm); -+; else -+; output_asm_insn (\"ldm%?ia\\t%0, {%1, %2}\", ldm); -+; } -+; else -+; { -+; if (val1 < val2) -+; output_asm_insn (\"ldm%?ia\\t%0, {%1, %2}\", ldm); -+; else -+; output_asm_insn (\"ldm%?da\\t%0, {%1, %2}\", ldm); -+; } -+; output_asm_insn (\"%I3%?\\t%0, %1, %2\", arith); -+; return \"\"; -+; }" -+; [(set_attr "length" "12") -+; (set_attr "predicable" "yes") -+; (set_attr "type" "load1")] -+;) - - ; This pattern is never tried by combine, so do it as a peephole - --(define_peephole2 -- [(set (match_operand:SI 0 "arm_general_register_operand" "") -- (match_operand:SI 1 "arm_general_register_operand" "")) -- (set (reg:CC CC_REGNUM) -- (compare:CC (match_dup 1) (const_int 0)))] -- "TARGET_ARM" -- [(parallel [(set (reg:CC CC_REGNUM) (compare:CC (match_dup 1) (const_int 0))) -- (set (match_dup 0) (match_dup 1))])] -- "" --) -+;(define_peephole2 -+; [(set (match_operand:SI 0 "arm_general_register_operand" "") -+; (match_operand:SI 1 "arm_general_register_operand" "")) -+; (set (reg:CC CC_REGNUM) -+; (compare:CC (match_dup 1) (const_int 0)))] -+; "TARGET_ARM" -+; [(parallel [(set (reg:CC CC_REGNUM) (compare:CC (match_dup 1) (const_int 0))) -+; (set (match_dup 0) (match_dup 1))])] -+; "" -+;) - - ; Peepholes to spot possible load- and store-multiples, if the ordering is - ; reversed, check that the memory references aren't volatile. -@@ -9717,20 +9717,20 @@ - " - ) - --(define_split -- [(set (match_operand:SI 0 "s_register_operand" "") -- (and:SI (ge:SI (match_operand:SI 1 "s_register_operand" "") -- (const_int 0)) -- (neg:SI (match_operator:SI 2 "arm_comparison_operator" -- [(match_operand:SI 3 "s_register_operand" "") -- (match_operand:SI 4 "arm_rhs_operand" "")])))) -- (clobber (match_operand:SI 5 "s_register_operand" ""))] -- "TARGET_ARM" -- [(set (match_dup 5) (not:SI (ashiftrt:SI (match_dup 1) (const_int 31)))) -- (set (match_dup 0) (and:SI (match_op_dup 2 [(match_dup 3) (match_dup 4)]) -- (match_dup 5)))] -- "" --) -+;(define_split -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (and:SI (ge:SI (match_operand:SI 1 "s_register_operand" "") -+; (const_int 0)) -+; (neg:SI (match_operator:SI 2 "arm_comparison_operator" -+; [(match_operand:SI 3 "s_register_operand" "") -+; (match_operand:SI 4 "arm_rhs_operand" "")])))) -+; (clobber (match_operand:SI 5 "s_register_operand" ""))] -+; "TARGET_ARM" -+; [(set (match_dup 5) (not:SI (ashiftrt:SI (match_dup 1) (const_int 31)))) -+; (set (match_dup 0) (and:SI (match_op_dup 2 [(match_dup 3) (match_dup 4)]) -+; (match_dup 5)))] -+; "" -+;) - - ;; This split can be used because CC_Z mode implies that the following - ;; branch will be an equality, or an unsigned inequality, so the sign -@@ -9854,168 +9854,168 @@ - ;; some extent with the conditional data operations, so we have to split them - ;; up again here. - --(define_split -- [(set (match_operand:SI 0 "s_register_operand" "") -- (if_then_else:SI (match_operator 1 "arm_comparison_operator" -- [(match_operand 2 "" "") (match_operand 3 "" "")]) -- (match_dup 0) -- (match_operand 4 "" ""))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM && reload_completed" -- [(set (match_dup 5) (match_dup 6)) -- (cond_exec (match_dup 7) -- (set (match_dup 0) (match_dup 4)))] -- " -- { -- enum machine_mode mode = SELECT_CC_MODE (GET_CODE (operands[1]), -- operands[2], operands[3]); -- enum rtx_code rc = GET_CODE (operands[1]); -- -- operands[5] = gen_rtx_REG (mode, CC_REGNUM); -- operands[6] = gen_rtx_COMPARE (mode, operands[2], operands[3]); -- if (mode == CCFPmode || mode == CCFPEmode) -- rc = reverse_condition_maybe_unordered (rc); -- else -- rc = reverse_condition (rc); -- -- operands[7] = gen_rtx_fmt_ee (rc, VOIDmode, operands[5], const0_rtx); -- }" --) -- --(define_split -- [(set (match_operand:SI 0 "s_register_operand" "") -- (if_then_else:SI (match_operator 1 "arm_comparison_operator" -- [(match_operand 2 "" "") (match_operand 3 "" "")]) -- (match_operand 4 "" "") -- (match_dup 0))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM && reload_completed" -- [(set (match_dup 5) (match_dup 6)) -- (cond_exec (match_op_dup 1 [(match_dup 5) (const_int 0)]) -- (set (match_dup 0) (match_dup 4)))] -- " -- { -- enum machine_mode mode = SELECT_CC_MODE (GET_CODE (operands[1]), -- operands[2], operands[3]); -- -- operands[5] = gen_rtx_REG (mode, CC_REGNUM); -- operands[6] = gen_rtx_COMPARE (mode, operands[2], operands[3]); -- }" --) -- --(define_split -- [(set (match_operand:SI 0 "s_register_operand" "") -- (if_then_else:SI (match_operator 1 "arm_comparison_operator" -- [(match_operand 2 "" "") (match_operand 3 "" "")]) -- (match_operand 4 "" "") -- (match_operand 5 "" ""))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM && reload_completed" -- [(set (match_dup 6) (match_dup 7)) -- (cond_exec (match_op_dup 1 [(match_dup 6) (const_int 0)]) -- (set (match_dup 0) (match_dup 4))) -- (cond_exec (match_dup 8) -- (set (match_dup 0) (match_dup 5)))] -- " -- { -- enum machine_mode mode = SELECT_CC_MODE (GET_CODE (operands[1]), -- operands[2], operands[3]); -- enum rtx_code rc = GET_CODE (operands[1]); -- -- operands[6] = gen_rtx_REG (mode, CC_REGNUM); -- operands[7] = gen_rtx_COMPARE (mode, operands[2], operands[3]); -- if (mode == CCFPmode || mode == CCFPEmode) -- rc = reverse_condition_maybe_unordered (rc); -- else -- rc = reverse_condition (rc); -+;(define_split -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (if_then_else:SI (match_operator 1 "arm_comparison_operator" -+; [(match_operand 2 "" "") (match_operand 3 "" "")]) -+; (match_dup 0) -+; (match_operand 4 "" ""))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM && reload_completed" -+; [(set (match_dup 5) (match_dup 6)) -+; (cond_exec (match_dup 7) -+; (set (match_dup 0) (match_dup 4)))] -+; " -+; { -+; enum machine_mode mode = SELECT_CC_MODE (GET_CODE (operands[1]), -+; operands[2], operands[3]); -+; enum rtx_code rc = GET_CODE (operands[1]); -+; -+; operands[5] = gen_rtx_REG (mode, CC_REGNUM); -+; operands[6] = gen_rtx_COMPARE (mode, operands[2], operands[3]); -+; if (mode == CCFPmode || mode == CCFPEmode) -+; rc = reverse_condition_maybe_unordered (rc); -+; else -+; rc = reverse_condition (rc); -+; -+; operands[7] = gen_rtx_fmt_ee (rc, VOIDmode, operands[5], const0_rtx); -+; }" -+;) - -- operands[8] = gen_rtx_fmt_ee (rc, VOIDmode, operands[6], const0_rtx); -- }" --) -+;(define_split -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (if_then_else:SI (match_operator 1 "arm_comparison_operator" -+; [(match_operand 2 "" "") (match_operand 3 "" "")]) -+; (match_operand 4 "" "") -+; (match_dup 0))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM && reload_completed" -+; [(set (match_dup 5) (match_dup 6)) -+; (cond_exec (match_op_dup 1 [(match_dup 5) (const_int 0)]) -+; (set (match_dup 0) (match_dup 4)))] -+; " -+; { -+; enum machine_mode mode = SELECT_CC_MODE (GET_CODE (operands[1]), -+; operands[2], operands[3]); -+; -+; operands[5] = gen_rtx_REG (mode, CC_REGNUM); -+; operands[6] = gen_rtx_COMPARE (mode, operands[2], operands[3]); -+; }" -+;) - --(define_split -- [(set (match_operand:SI 0 "s_register_operand" "") -- (if_then_else:SI (match_operator 1 "arm_comparison_operator" -- [(match_operand:SI 2 "s_register_operand" "") -- (match_operand:SI 3 "arm_add_operand" "")]) -- (match_operand:SI 4 "arm_rhs_operand" "") -- (not:SI -- (match_operand:SI 5 "s_register_operand" "")))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM && reload_completed" -- [(set (match_dup 6) (match_dup 7)) -- (cond_exec (match_op_dup 1 [(match_dup 6) (const_int 0)]) -- (set (match_dup 0) (match_dup 4))) -- (cond_exec (match_dup 8) -- (set (match_dup 0) (not:SI (match_dup 5))))] -- " -- { -- enum machine_mode mode = SELECT_CC_MODE (GET_CODE (operands[1]), -- operands[2], operands[3]); -- enum rtx_code rc = GET_CODE (operands[1]); -- -- operands[6] = gen_rtx_REG (mode, CC_REGNUM); -- operands[7] = gen_rtx_COMPARE (mode, operands[2], operands[3]); -- if (mode == CCFPmode || mode == CCFPEmode) -- rc = reverse_condition_maybe_unordered (rc); -- else -- rc = reverse_condition (rc); -+;(define_split -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (if_then_else:SI (match_operator 1 "arm_comparison_operator" -+; [(match_operand 2 "" "") (match_operand 3 "" "")]) -+; (match_operand 4 "" "") -+; (match_operand 5 "" ""))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM && reload_completed" -+; [(set (match_dup 6) (match_dup 7)) -+; (cond_exec (match_op_dup 1 [(match_dup 6) (const_int 0)]) -+; (set (match_dup 0) (match_dup 4))) -+; (cond_exec (match_dup 8) -+; (set (match_dup 0) (match_dup 5)))] -+; " -+; { -+; enum machine_mode mode = SELECT_CC_MODE (GET_CODE (operands[1]), -+; operands[2], operands[3]); -+; enum rtx_code rc = GET_CODE (operands[1]); -+; -+; operands[6] = gen_rtx_REG (mode, CC_REGNUM); -+; operands[7] = gen_rtx_COMPARE (mode, operands[2], operands[3]); -+; if (mode == CCFPmode || mode == CCFPEmode) -+; rc = reverse_condition_maybe_unordered (rc); -+; else -+; rc = reverse_condition (rc); -+; -+; operands[8] = gen_rtx_fmt_ee (rc, VOIDmode, operands[6], const0_rtx); -+; }" -+;) - -- operands[8] = gen_rtx_fmt_ee (rc, VOIDmode, operands[6], const0_rtx); -- }" --) -+;(define_split -+; [(set (match_operand:SI 0 "s_register_operand" "") -+; (if_then_else:SI (match_operator 1 "arm_comparison_operator" -+; [(match_operand:SI 2 "s_register_operand" "") -+; (match_operand:SI 3 "arm_add_operand" "")]) -+; (match_operand:SI 4 "arm_rhs_operand" "") -+; (not:SI -+; (match_operand:SI 5 "s_register_operand" "")))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM && reload_completed" -+; [(set (match_dup 6) (match_dup 7)) -+; (cond_exec (match_op_dup 1 [(match_dup 6) (const_int 0)]) -+; (set (match_dup 0) (match_dup 4))) -+; (cond_exec (match_dup 8) -+; (set (match_dup 0) (not:SI (match_dup 5))))] -+; " -+; { -+; enum machine_mode mode = SELECT_CC_MODE (GET_CODE (operands[1]), -+; operands[2], operands[3]); -+; enum rtx_code rc = GET_CODE (operands[1]); -+; -+; operands[6] = gen_rtx_REG (mode, CC_REGNUM); -+; operands[7] = gen_rtx_COMPARE (mode, operands[2], operands[3]); -+; if (mode == CCFPmode || mode == CCFPEmode) -+; rc = reverse_condition_maybe_unordered (rc); -+; else -+; rc = reverse_condition (rc); -+; -+; operands[8] = gen_rtx_fmt_ee (rc, VOIDmode, operands[6], const0_rtx); -+; }" -+;) - --(define_insn "*cond_move_not" -- [(set (match_operand:SI 0 "s_register_operand" "=r,r") -- (if_then_else:SI (match_operator 4 "arm_comparison_operator" -- [(match_operand 3 "cc_register" "") (const_int 0)]) -- (match_operand:SI 1 "arm_rhs_operand" "0,?rI") -- (not:SI -- (match_operand:SI 2 "s_register_operand" "r,r"))))] -- "TARGET_ARM" -- "@ -- mvn%D4\\t%0, %2 -- mov%d4\\t%0, %1\;mvn%D4\\t%0, %2" -- [(set_attr "conds" "use") -- (set_attr "length" "4,8")] --) -+;(define_insn "*cond_move_not" -+; [(set (match_operand:SI 0 "s_register_operand" "=r,r") -+; (if_then_else:SI (match_operator 4 "arm_comparison_operator" -+; [(match_operand 3 "cc_register" "") (const_int 0)]) -+; (match_operand:SI 1 "arm_rhs_operand" "0,?rI") -+; (not:SI -+; (match_operand:SI 2 "s_register_operand" "r,r"))))] -+; "TARGET_ARM" -+; "@ -+; mvn%D4\\t%0, %2 -+; mov%d4\\t%0, %1\;mvn%D4\\t%0, %2" -+; [(set_attr "conds" "use") -+; (set_attr "length" "4,8")] -+;) - - ;; The next two patterns occur when an AND operation is followed by a - ;; scc insn sequence - --(define_insn "*sign_extract_onebit" -- [(set (match_operand:SI 0 "s_register_operand" "=r") -- (sign_extract:SI (match_operand:SI 1 "s_register_operand" "r") -- (const_int 1) -- (match_operand:SI 2 "const_int_operand" "n"))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "* -- operands[2] = GEN_INT (1 << INTVAL (operands[2])); -- output_asm_insn (\"ands\\t%0, %1, %2\", operands); -- return \"mvnne\\t%0, #0\"; -- " -- [(set_attr "conds" "clob") -- (set_attr "length" "8")] --) -+;(define_insn "*sign_extract_onebit" -+; [(set (match_operand:SI 0 "s_register_operand" "=r") -+; (sign_extract:SI (match_operand:SI 1 "s_register_operand" "r") -+; (const_int 1) -+; (match_operand:SI 2 "const_int_operand" "n"))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "* -+; operands[2] = GEN_INT (1 << INTVAL (operands[2])); -+; output_asm_insn (\"ands\\t%0, %1, %2\", operands); -+; return \"mvnne\\t%0, #0\"; -+; " -+; [(set_attr "conds" "clob") -+; (set_attr "length" "8")] -+;) - --(define_insn "*not_signextract_onebit" -- [(set (match_operand:SI 0 "s_register_operand" "=r") -- (not:SI -- (sign_extract:SI (match_operand:SI 1 "s_register_operand" "r") -- (const_int 1) -- (match_operand:SI 2 "const_int_operand" "n")))) -- (clobber (reg:CC CC_REGNUM))] -- "TARGET_ARM" -- "* -- operands[2] = GEN_INT (1 << INTVAL (operands[2])); -- output_asm_insn (\"tst\\t%1, %2\", operands); -- output_asm_insn (\"mvneq\\t%0, #0\", operands); -- return \"movne\\t%0, #0\"; -- " -- [(set_attr "conds" "clob") -- (set_attr "length" "12")] --) -+;(define_insn "*not_signextract_onebit" -+; [(set (match_operand:SI 0 "s_register_operand" "=r") -+; (not:SI -+; (sign_extract:SI (match_operand:SI 1 "s_register_operand" "r") -+; (const_int 1) -+; (match_operand:SI 2 "const_int_operand" "n")))) -+; (clobber (reg:CC CC_REGNUM))] -+; "TARGET_ARM" -+; "* -+; operands[2] = GEN_INT (1 << INTVAL (operands[2])); -+; output_asm_insn (\"tst\\t%1, %2\", operands); -+; output_asm_insn (\"mvneq\\t%0, #0\", operands); -+; return \"movne\\t%0, #0\"; -+; " -+; [(set_attr "conds" "clob") -+; (set_attr "length" "12")] -+;) - - ;; Push multiple registers to the stack. Registers are in parallel (use ...) - ;; expressions. For simplicity, the first register is also in the unspec -@@ -10405,11 +10405,11 @@ - ;) - --(define_cond_exec -- [(match_operator 0 "maverick_comparison_operator" -- [(match_operand:CC 1 "cc_register" "") -- (const_int 0)])] -- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" -- "" --) -+;(define_cond_exec -+; [(match_operator 0 "arm_comparison_operator" -+; [(match_operand:CC 1 "cc_register" "") -+; (const_int 0)])] -+; "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_MAVERICK" -+; "" -+;) - - ;; General predication pattern |