From: Wei Guozhi Date: Mon, 10 May 2010 07:26:04 +0000 (+0000) Subject: thumb2.md (thumb2_tlobits_cbranch): New insn pattern. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=333b67a9f16208485c0f76edea0b4ecaddd0c8e6;p=gcc.git thumb2.md (thumb2_tlobits_cbranch): New insn pattern. * config/arm/thumb2.md (thumb2_tlobits_cbranch): New insn pattern. * gcc.target/arm/pr42879.c: New testcase. From-SVN: r159212 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5f792925477..76e6ea6931e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-05-10 Wei Guozhi + + PR target/42879 + * config/arm/thumb2.md (thumb2_tlobits_cbranch): New insn pattern. + 2010-05-09 Joseph Myers PR c/10676 diff --git a/gcc/config/arm/thumb2.md b/gcc/config/arm/thumb2.md index 3e2c3daea3b..9b8075296d5 100644 --- a/gcc/config/arm/thumb2.md +++ b/gcc/config/arm/thumb2.md @@ -1442,3 +1442,77 @@ [(set_attr "length" "4,4,16") (set_attr "predicable" "yes")] ) + +(define_insn "*thumb2_tlobits_cbranch" + [(set (pc) + (if_then_else + (match_operator 0 "equality_operator" + [(zero_extract:SI (match_operand:SI 1 "s_register_operand" "l,?h") + (match_operand:SI 2 "const_int_operand" "i,i") + (const_int 0)) + (const_int 0)]) + (label_ref (match_operand 3 "" "")) + (pc))) + (clobber (match_scratch:SI 4 "=l,X"))] + "TARGET_THUMB2" + "* + { + if (which_alternative == 0) + { + rtx op[3]; + op[0] = operands[4]; + op[1] = operands[1]; + op[2] = GEN_INT (32 - INTVAL (operands[2])); + + output_asm_insn (\"lsls\\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%=:\"; + } + } + else + { + rtx op[2]; + op[0] = operands[1]; + op[1] = GEN_INT ((1 << INTVAL (operands[2])) - 1); + + output_asm_insn (\"tst\\t%0, %1\", op); + switch (get_attr_length (insn)) + { + case 6: return \"b%d0\\t%l3\"; + case 8: 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 + (and (ge (minus (match_dup 3) (pc)) (const_int -2040)) + (le (minus (match_dup 3) (pc)) (const_int 2048))) + (const_string "no") + (const_string "yes"))) + (set (attr "length") + (if_then_else + (eq (symbol_ref ("which_alternative")) + (const_int 0)) + (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))) + (if_then_else + (and (ge (minus (match_dup 3) (pc)) (const_int -250)) + (le (minus (match_dup 3) (pc)) (const_int 256))) + (const_int 6) + (if_then_else + (and (ge (minus (match_dup 3) (pc)) (const_int -2040)) + (le (minus (match_dup 3) (pc)) (const_int 2048))) + (const_int 8) + (const_int 10)))))] +) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e801b1ff5a4..5ee636f4b6e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-05-10 Wei Guozhi + + PR target/42879 + * gcc.target/arm/pr42879.c: New testcase. + 2010-05-09 Joseph Myers PR c/44051 diff --git a/gcc/testsuite/gcc.target/arm/pr42879.c b/gcc/testsuite/gcc.target/arm/pr42879.c new file mode 100644 index 00000000000..02af72c18cc --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr42879.c @@ -0,0 +1,15 @@ +/* { dg-options "-march=armv7-a -mthumb -Os" } */ +/* { dg-final { scan-assembler "lsls" } } */ + +struct A +{ + int v:1; +}; + +int bar(); +int foo(struct A* p) +{ + if (p->v) + return 1; + return bar(); +}