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
This commit is contained in:
parent
4af3ff4194
commit
333b67a9f1
|
@ -1,3 +1,8 @@
|
|||
2010-05-10 Wei Guozhi <carrot@google.com>
|
||||
|
||||
PR target/42879
|
||||
* config/arm/thumb2.md (thumb2_tlobits_cbranch): New insn pattern.
|
||||
|
||||
2010-05-09 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
PR c/10676
|
||||
|
|
|
@ -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)))))]
|
||||
)
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2010-05-10 Wei Guozhi <carrot@google.com>
|
||||
|
||||
PR target/42879
|
||||
* gcc.target/arm/pr42879.c: New testcase.
|
||||
|
||||
2010-05-09 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
PR c/44051
|
||||
|
|
|
@ -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();
|
||||
}
|
Loading…
Reference in New Issue