re PR target/42093 (Compressed switch tables for Thumb2 have signed offsets)

Fix PR target/42093


2009-12-23  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>

        PR target/42093
        * config/arm/arm.h (CASE_VECTOR_PC_RELATIVE): Fix macro usage
        to TARGET_THUMB1.
        (CASE_VECTOR_SHORTEN_MODE): Allow signed offsets 
        only for TARGET_THUMB1.

2009-12-23  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>

        PR target/42093
        * gcc.target/arm/pr42093.c: New test.

From-SVN: r155428
This commit is contained in:
Ramana Radhakrishnan 2009-12-23 16:36:40 +00:00 committed by Ramana Radhakrishnan
parent 07422036e3
commit 83c3a2d826
4 changed files with 66 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2009-12-23 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
PR target/42093
* config/arm/arm.h (CASE_VECTOR_PC_RELATIVE): Fix macro usage
to TARGET_THUMB1.
(CASE_VECTOR_SHORTEN_MODE): Allow signed offsets
only for TARGET_THUMB1.
2009-12-23 Ramana Radhakrishnan <ramrad01@arm.com>
PR target/40670

View File

@ -2118,11 +2118,11 @@ typedef struct
#define CASE_VECTOR_MODE Pmode
#define CASE_VECTOR_PC_RELATIVE (TARGET_THUMB2 \
|| (TARGET_THUMB \
|| (TARGET_THUMB1 \
&& (optimize_size || flag_pic)))
#define CASE_VECTOR_SHORTEN_MODE(min, max, body) \
(TARGET_THUMB \
(TARGET_THUMB1 \
? (min >= 0 && max < 512 \
? (ADDR_DIFF_VEC_FLAGS (body).offset_unsigned = 1, QImode) \
: min >= -256 && max < 256 \

View File

@ -1,3 +1,8 @@
2009-12-23 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
PR target/42093
* gcc.target/arm/pr42093.c: New test.
2009-12-23 Ramana Radhakrishnan <ramrad01@arm.com>
PR target/40670

View File

@ -0,0 +1,51 @@
/* { dg-options "-mthumb -O2" } */
/* { dg-require-effective-target arm_thumb2_ok } */
/* { dg-final { scan-assembler-not "tbb" } } */
/* { dg-final { scan-assembler-not "tbh" } } */
#include <stdlib.h>
int gbl;
int foo (int *buf, int n)
{
int ctr = 0;
int c;
while (1)
{
c = buf[ctr++];
switch (c)
{
case '\n':
gbl++;
break;
case ' ': case '\t' : case '\f' : case '\r':
break;
case ';':
do
c = buf [ctr++];
while (c != '\n' && c != -1);
gbl++;
break;
case '/':
{
int prevc;
c = buf [ctr++];
if (c != '*')
abort ();
prevc = 0;
while ((c = buf[ctr++]) && c != -1)
{
if (c == '\n')
gbl++;
}
break;
}
default:
return c;
}
}
}