From: Andrew Bennett Date: Wed, 8 Jul 2015 09:40:35 +0000 (+0000) Subject: MIPS: Fix failing branch range checks for micromips. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=daee9ce2953033be80e974fd467201934eb1ed01;p=gcc.git MIPS: Fix failing branch range checks for micromips. The current branch range tests assume that the MIPS branch instructions have a 16 bit branch offset which is shifted by 2. Unfortunately for microMIPS this offset is shifted by 1 which reduces the branch range and caused the branch-*.c tests to fail. testsuite/ * gcc.target/mips/branch-2.c: Change NOMIPS16 to NOCOMPRESSION. * gcc.target/mips/branch-3.c: Ditto * gcc.target/mips/branch-4.c: Ditto. * gcc.target/mips/branch-5.c: Ditto. * gcc.target/mips/branch-6.c: Ditto. * gcc.target/mips/branch-7.c: Ditto. * gcc.target/mips/branch-8.c: Ditto. * gcc.target/mips/branch-9.c: Ditto. * gcc.target/mips/branch-10.c: Ditto. * gcc.target/mips/branch-11.c: Ditto. * gcc.target/mips/branch-12.c: Ditto. * gcc.target/mips/branch-13.c: Ditto. * gcc.target/mips/umips-branch-5.c: New file. * gcc.target/mips/umips-branch-6.c: New file. * gcc.target/mips/umips-branch-7.c: New file. * gcc.target/mips/umips-branch-8.c: New file. * gcc.target/mips/umips-branch-9.c: New file. * gcc.target/mips/umips-branch-10.c: New file. * gcc.target/mips/umips-branch-11.c: New file. * gcc.target/mips/umips-branch-12.c: New file. * gcc.target/mips/umips-branch-13.c: New file. * gcc.target/mips/umips-branch-14.c: New file. * gcc.target/mips/umips-branch-15.c: New file. * gcc.target/mips/umips-branch-16.c: New file. * gcc.target/mips/branch-helper.h (OCCUPY_0x10000): New define. (OCCUPY_0xfffc): New define. From-SVN: r225540 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9ee034f4ed8..f02d3e5f167 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,32 @@ +2015-07-08 Andrew Bennett + + * gcc.target/mips/branch-2.c: Change NOMIPS16 to NOCOMPRESSION. + * gcc.target/mips/branch-3.c: Ditto + * gcc.target/mips/branch-4.c: Ditto. + * gcc.target/mips/branch-5.c: Ditto. + * gcc.target/mips/branch-6.c: Ditto. + * gcc.target/mips/branch-7.c: Ditto. + * gcc.target/mips/branch-8.c: Ditto. + * gcc.target/mips/branch-9.c: Ditto. + * gcc.target/mips/branch-10.c: Ditto. + * gcc.target/mips/branch-11.c: Ditto. + * gcc.target/mips/branch-12.c: Ditto. + * gcc.target/mips/branch-13.c: Ditto. + * gcc.target/mips/umips-branch-5.c: New file. + * gcc.target/mips/umips-branch-6.c: New file. + * gcc.target/mips/umips-branch-7.c: New file. + * gcc.target/mips/umips-branch-8.c: New file. + * gcc.target/mips/umips-branch-9.c: New file. + * gcc.target/mips/umips-branch-10.c: New file. + * gcc.target/mips/umips-branch-11.c: New file. + * gcc.target/mips/umips-branch-12.c: New file. + * gcc.target/mips/umips-branch-13.c: New file. + * gcc.target/mips/umips-branch-14.c: New file. + * gcc.target/mips/umips-branch-15.c: New file. + * gcc.target/mips/umips-branch-16.c: New file. + * gcc.target/mips/branch-helper.h (OCCUPY_0x10000): New define. + (OCCUPY_0xfffc): New define. + 2015-07-08 Renlin Li * gcc.target/arm/unsigned-float.c: Different options for hf toolchain. diff --git a/gcc/testsuite/gcc.target/mips/branch-10.c b/gcc/testsuite/gcc.target/mips/branch-10.c index e2b1b5f6baa..eb21c165462 100644 --- a/gcc/testsuite/gcc.target/mips/branch-10.c +++ b/gcc/testsuite/gcc.target/mips/branch-10.c @@ -4,7 +4,7 @@ #include "branch-helper.h" -NOMIPS16 void +NOCOMPRESSION void foo (int (*bar) (void), int *x) { *x = bar (); diff --git a/gcc/testsuite/gcc.target/mips/branch-11.c b/gcc/testsuite/gcc.target/mips/branch-11.c index 962eb1b5d66..bd8e83418c0 100644 --- a/gcc/testsuite/gcc.target/mips/branch-11.c +++ b/gcc/testsuite/gcc.target/mips/branch-11.c @@ -8,7 +8,7 @@ #include "branch-helper.h" -NOMIPS16 void +NOCOMPRESSION void foo (int (*bar) (void), int *x) { *x = bar (); diff --git a/gcc/testsuite/gcc.target/mips/branch-12.c b/gcc/testsuite/gcc.target/mips/branch-12.c index 4aef160ade8..49446341ad2 100644 --- a/gcc/testsuite/gcc.target/mips/branch-12.c +++ b/gcc/testsuite/gcc.target/mips/branch-12.c @@ -4,7 +4,7 @@ #include "branch-helper.h" -NOMIPS16 void +NOCOMPRESSION void foo (int (*bar) (void), int *x) { *x = bar (); diff --git a/gcc/testsuite/gcc.target/mips/branch-13.c b/gcc/testsuite/gcc.target/mips/branch-13.c index 8a6fb049f24..f5269b9b33b 100644 --- a/gcc/testsuite/gcc.target/mips/branch-13.c +++ b/gcc/testsuite/gcc.target/mips/branch-13.c @@ -8,7 +8,7 @@ #include "branch-helper.h" -NOMIPS16 void +NOCOMPRESSION void foo (int (*bar) (void), int *x) { *x = bar (); diff --git a/gcc/testsuite/gcc.target/mips/branch-2.c b/gcc/testsuite/gcc.target/mips/branch-2.c index 6409c4cc509..b60e9cd2e3c 100644 --- a/gcc/testsuite/gcc.target/mips/branch-2.c +++ b/gcc/testsuite/gcc.target/mips/branch-2.c @@ -5,7 +5,7 @@ #include "branch-helper.h" -NOMIPS16 void +NOCOMPRESSION void foo (volatile int *x) { if (__builtin_expect (*x == 0, 1)) diff --git a/gcc/testsuite/gcc.target/mips/branch-3.c b/gcc/testsuite/gcc.target/mips/branch-3.c index 5fcfece3e9a..69300f6417c 100644 --- a/gcc/testsuite/gcc.target/mips/branch-3.c +++ b/gcc/testsuite/gcc.target/mips/branch-3.c @@ -5,7 +5,7 @@ #include "branch-helper.h" -NOMIPS16 void +NOCOMPRESSION void foo (volatile int *x) { if (__builtin_expect (*x == 0, 1)) diff --git a/gcc/testsuite/gcc.target/mips/branch-4.c b/gcc/testsuite/gcc.target/mips/branch-4.c index 31e4909e58f..29f5c9f2be3 100644 --- a/gcc/testsuite/gcc.target/mips/branch-4.c +++ b/gcc/testsuite/gcc.target/mips/branch-4.c @@ -4,7 +4,7 @@ #include "branch-helper.h" -NOMIPS16 void +NOCOMPRESSION void foo (volatile int *x) { if (__builtin_expect (*x == 0, 1)) diff --git a/gcc/testsuite/gcc.target/mips/branch-5.c b/gcc/testsuite/gcc.target/mips/branch-5.c index 1e9c120c834..0538646210a 100644 --- a/gcc/testsuite/gcc.target/mips/branch-5.c +++ b/gcc/testsuite/gcc.target/mips/branch-5.c @@ -6,7 +6,7 @@ #include "branch-helper.h" -NOMIPS16 void +NOCOMPRESSION void foo (volatile int *x) { if (__builtin_expect (*x == 0, 1)) diff --git a/gcc/testsuite/gcc.target/mips/branch-6.c b/gcc/testsuite/gcc.target/mips/branch-6.c index 77e0340eb2e..19baee1db9f 100644 --- a/gcc/testsuite/gcc.target/mips/branch-6.c +++ b/gcc/testsuite/gcc.target/mips/branch-6.c @@ -4,7 +4,7 @@ #include "branch-helper.h" -NOMIPS16 void +NOCOMPRESSION void foo (volatile int *x) { if (__builtin_expect (*x == 0, 1)) diff --git a/gcc/testsuite/gcc.target/mips/branch-7.c b/gcc/testsuite/gcc.target/mips/branch-7.c index 8ad6808c8df..16c6d8e1ac6 100644 --- a/gcc/testsuite/gcc.target/mips/branch-7.c +++ b/gcc/testsuite/gcc.target/mips/branch-7.c @@ -6,7 +6,7 @@ #include "branch-helper.h" -NOMIPS16 void +NOCOMPRESSION void foo (volatile int *x) { if (__builtin_expect (*x == 0, 1)) diff --git a/gcc/testsuite/gcc.target/mips/branch-8.c b/gcc/testsuite/gcc.target/mips/branch-8.c index ba5f954378c..2e468448fe9 100644 --- a/gcc/testsuite/gcc.target/mips/branch-8.c +++ b/gcc/testsuite/gcc.target/mips/branch-8.c @@ -4,7 +4,7 @@ #include "branch-helper.h" -NOMIPS16 void +NOCOMPRESSION void foo (int (*bar) (void), int *x) { *x = bar (); diff --git a/gcc/testsuite/gcc.target/mips/branch-9.c b/gcc/testsuite/gcc.target/mips/branch-9.c index cad1c003c3e..b87f2ba675b 100644 --- a/gcc/testsuite/gcc.target/mips/branch-9.c +++ b/gcc/testsuite/gcc.target/mips/branch-9.c @@ -9,7 +9,7 @@ #include "branch-helper.h" -NOMIPS16 void +NOCOMPRESSION void foo (int (*bar) (void), int *x) { *x = bar (); diff --git a/gcc/testsuite/gcc.target/mips/branch-helper.h b/gcc/testsuite/gcc.target/mips/branch-helper.h index 85399be4c7d..3d033cc2cb8 100644 --- a/gcc/testsuite/gcc.target/mips/branch-helper.h +++ b/gcc/testsuite/gcc.target/mips/branch-helper.h @@ -33,5 +33,25 @@ D2 ("nop") "\n\t" \ D1 ("nop")) +/* Emit something that is 0xfffc bytes long, which is the largest + permissible range for microMIPS forward branches when branches + have delay slots. */ +#define OCCUPY_0xfffc \ + asm (D13 ("nop32") "\n\t" \ + D12 ("nop32") "\n\t" \ + D11 ("nop32") "\n\t" \ + D10 ("nop32") "\n\t" \ + D9 ("nop32") "\n\t" \ + D8 ("nop32") "\n\t" \ + D7 ("nop32") "\n\t" \ + D6 ("nop32") "\n\t" \ + D5 ("nop32") "\n\t" \ + D4 ("nop32") "\n\t" \ + D3 ("nop32") "\n\t" \ + D2 ("nop32") "\n\t" \ + D1 ("nop32") "\n\t" \ + D0 ("nop32")) /* Likewise emit something that is 0x1fffc bytes long. */ #define OCCUPY_0x1fffc do { asm ("nop"); OCCUPY_0x1fff8; } while (0) +/* Likewise emit something that is 0x10000 bytes long. */ +#define OCCUPY_0x10000 do { asm ("nop32"); OCCUPY_0xfffc; } while (0) diff --git a/gcc/testsuite/gcc.target/mips/umips-branch-10.c b/gcc/testsuite/gcc.target/mips/umips-branch-10.c new file mode 100644 index 00000000000..714691bfa6e --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/umips-branch-10.c @@ -0,0 +1,14 @@ +/* { dg-options "-mshared -mabi=64 -mmicromips" } */ +/* { dg-final { scan-assembler "\tdaddiu\t\\\$3,\\\$3,%lo\\(%neg\\(%gp_rel\\(foo\\)\\)\\)\n" } } */ +/* { dg-final { scan-assembler "\tld\t\\\$1,%got_page\\(\[^)\]*\\)\\(\\\$3\\)\\n" } } */ +/* { dg-final { scan-assembler "\tjr\t\\\$1\n" } } */ +/* { dg-final { scan-assembler-not "\\\$28" } } */ + +#include "branch-helper.h" + +NOMIPS16 void +foo (volatile int *x) +{ + if (__builtin_expect (*x == 0, 1)) + OCCUPY_0x10000; +} diff --git a/gcc/testsuite/gcc.target/mips/umips-branch-11.c b/gcc/testsuite/gcc.target/mips/umips-branch-11.c new file mode 100644 index 00000000000..5050669070e --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/umips-branch-11.c @@ -0,0 +1,13 @@ +/* { dg-options "-mshared -mabi=32 -mmicromips" } */ +/* { dg-final { scan-assembler-not "(\\\$28|cpload|cprestore)" } } */ +/* { dg-final { scan-assembler-not "\tjrc?\t\\\$1\n" } } */ + +#include "branch-helper.h" + +NOMIPS16 void +foo (int (*bar) (void), int *x) +{ + *x = bar (); + if (__builtin_expect (*x == 0, 1)) + OCCUPY_0xfffc; +} diff --git a/gcc/testsuite/gcc.target/mips/umips-branch-12.c b/gcc/testsuite/gcc.target/mips/umips-branch-12.c new file mode 100644 index 00000000000..a393de99932 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/umips-branch-12.c @@ -0,0 +1,18 @@ +/* { dg-options "-mshared -mabi=32 -mmicromips" } */ +/* { dg-final { scan-assembler "\t\\.cpload\t\\\$25\n" } } */ +/* { dg-final { scan-assembler "\t\\.cprestore\t16\n" } } */ +/* { dg-final { scan-assembler "\tlw\t\\\$1,16\\(\\\$(fp|sp)\\)\n" } } */ +/* { dg-final { scan-assembler "\tlw\t\\\$1,%got\\(\[^)\]*\\)\\(\\\$1\\)\n" } } */ +/* { dg-final { scan-assembler "\taddiu\t\\\$1,\\\$1,%lo\\(\[^)\]*\\)\n" } } */ +/* { dg-final { scan-assembler "\tjr\t\\\$1\n" } } */ +/* { dg-final { scan-assembler-not "\\\$28" } } */ + +#include "branch-helper.h" + +NOMIPS16 void +foo (int (*bar) (void), int *x) +{ + *x = bar (); + if (__builtin_expect (*x == 0, 1)) + OCCUPY_0x10000; +} diff --git a/gcc/testsuite/gcc.target/mips/umips-branch-13.c b/gcc/testsuite/gcc.target/mips/umips-branch-13.c new file mode 100644 index 00000000000..e84b46296e5 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/umips-branch-13.c @@ -0,0 +1,13 @@ +/* { dg-options "-mshared -mabi=n32 -mmicromips" } */ +/* { dg-final { scan-assembler-not "(\\\$28|%gp_rel|%got)" } } */ +/* { dg-final { scan-assembler-not "\tjrc?\t\\\$1\n" } } */ + +#include "branch-helper.h" + +NOMIPS16 void +foo (int (*bar) (void), int *x) +{ + *x = bar (); + if (__builtin_expect (*x == 0, 1)) + OCCUPY_0xfffc; +} diff --git a/gcc/testsuite/gcc.target/mips/umips-branch-14.c b/gcc/testsuite/gcc.target/mips/umips-branch-14.c new file mode 100644 index 00000000000..f9f30a7d7fc --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/umips-branch-14.c @@ -0,0 +1,17 @@ +/* { dg-options "-mshared -mabi=n32 -mmicromips" } */ +/* { dg-final { scan-assembler "\tsd\t\\\$28," } } */ +/* { dg-final { scan-assembler "\tld\t\\\$28," } } */ +/* { dg-final { scan-assembler "\taddiu\t\\\$28,\\\$28,%lo\\(%neg\\(%gp_rel\\(foo\\)\\)\\)\n" } } */ +/* { dg-final { scan-assembler "\tlw\t\\\$1,%got_page\\(\[^)\]*\\)\\(\\\$28\\)\n" } } */ +/* { dg-final { scan-assembler "\taddiu\t\\\$1,\\\$1,%got_ofst\\(\[^)\]*\\)\n" } } */ +/* { dg-final { scan-assembler "\tjr\t\\\$1\n" } } */ + +#include "branch-helper.h" + +NOMIPS16 void +foo (int (*bar) (void), int *x) +{ + *x = bar (); + if (__builtin_expect (*x == 0, 1)) + OCCUPY_0x10000; +} diff --git a/gcc/testsuite/gcc.target/mips/umips-branch-15.c b/gcc/testsuite/gcc.target/mips/umips-branch-15.c new file mode 100644 index 00000000000..6704aadec37 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/umips-branch-15.c @@ -0,0 +1,13 @@ +/* { dg-options "-mshared -mabi=64 -mmicromips" } */ +/* { dg-final { scan-assembler-not "(\\\$28|%gp_rel|%got)" } } */ +/* { dg-final { scan-assembler-not "\tjrc?\t\\\$1\n" } } */ + +#include "branch-helper.h" + +NOMIPS16 void +foo (int (*bar) (void), int *x) +{ + *x = bar (); + if (__builtin_expect (*x == 0, 1)) + OCCUPY_0xfffc; +} diff --git a/gcc/testsuite/gcc.target/mips/umips-branch-16.c b/gcc/testsuite/gcc.target/mips/umips-branch-16.c new file mode 100644 index 00000000000..95f7db5c483 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/umips-branch-16.c @@ -0,0 +1,17 @@ +/* { dg-options "-mshared -mabi=64 -mmicromips" } */ +/* { dg-final { scan-assembler "\tsd\t\\\$28," } } */ +/* { dg-final { scan-assembler "\tld\t\\\$28," } } */ +/* { dg-final { scan-assembler "\tdaddiu\t\\\$28,\\\$28,%lo\\(%neg\\(%gp_rel\\(foo\\)\\)\\)\n" } } */ +/* { dg-final { scan-assembler "\tld\t\\\$1,%got_page\\(\[^)\]*\\)\\(\\\$28\\)\n" } } */ +/* { dg-final { scan-assembler "\tdaddiu\t\\\$1,\\\$1,%got_ofst\\(\[^)\]*\\)\n" } } */ +/* { dg-final { scan-assembler "\tjr\t\\\$1\n" } } */ + +#include "branch-helper.h" + +NOMIPS16 void +foo (int (*bar) (void), int *x) +{ + *x = bar (); + if (__builtin_expect (*x == 0, 1)) + OCCUPY_0x10000; +} diff --git a/gcc/testsuite/gcc.target/mips/umips-branch-5.c b/gcc/testsuite/gcc.target/mips/umips-branch-5.c new file mode 100644 index 00000000000..d124f914320 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/umips-branch-5.c @@ -0,0 +1,13 @@ +/* { dg-options "-mshared -mabi=32 -mmicromips" } */ +/* { dg-final { scan-assembler-not "(\\\$25|\\\$28|cpload)" } } */ +/* { dg-final { scan-assembler-not "\tjr\t\\\$1\n" } } */ +/* { dg-final { scan-assembler-not "\\.cprestore" } } */ + +#include "branch-helper.h" + +NOMIPS16 void +foo (volatile int *x) +{ + if (__builtin_expect (*x == 0, 1)) + OCCUPY_0xfffc; +} diff --git a/gcc/testsuite/gcc.target/mips/umips-branch-6.c b/gcc/testsuite/gcc.target/mips/umips-branch-6.c new file mode 100644 index 00000000000..d688bc9c1f4 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/umips-branch-6.c @@ -0,0 +1,13 @@ +/* { dg-options "-mshared -mabi=32 -mmicromips" } */ +/* { dg-final { scan-assembler "\t\\.cpload\t\\\$25\n" } } */ +/* { dg-final { scan-assembler "\tjr\t\\\$1\n" } } */ +/* { dg-final { scan-assembler-not "\\.cprestore" } } */ + +#include "branch-helper.h" + +NOMIPS16 void +foo (volatile int *x) +{ + if (__builtin_expect (*x == 0, 1)) + OCCUPY_0x10000; +} diff --git a/gcc/testsuite/gcc.target/mips/umips-branch-7.c b/gcc/testsuite/gcc.target/mips/umips-branch-7.c new file mode 100644 index 00000000000..294805af19b --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/umips-branch-7.c @@ -0,0 +1,12 @@ +/* { dg-options "-mshared -mabi=n32 -mmicromips" } */ +/* { dg-final { scan-assembler-not "(\\\$25|\\\$28|%gp_rel|%got)" } } */ +/* { dg-final { scan-assembler-not "\tjrc?\t\\\$1\n" } } */ + +#include "branch-helper.h" + +NOMIPS16 void +foo (volatile int *x) +{ + if (__builtin_expect (*x == 0, 1)) + OCCUPY_0xfffc; +} diff --git a/gcc/testsuite/gcc.target/mips/umips-branch-8.c b/gcc/testsuite/gcc.target/mips/umips-branch-8.c new file mode 100644 index 00000000000..02273cfb1f2 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/umips-branch-8.c @@ -0,0 +1,14 @@ +/* { dg-options "-mshared -mabi=n32 -mmicromips" } */ +/* { dg-final { scan-assembler "\taddiu\t\\\$3,\\\$3,%lo\\(%neg\\(%gp_rel\\(foo\\)\\)\\)\n" } } */ +/* { dg-final { scan-assembler "\tlw\t\\\$1,%got_page\\(\[^)\]*\\)\\(\\\$3\\)\\n" } } */ +/* { dg-final { scan-assembler "\tjr\t\\\$1\n" } } */ +/* { dg-final { scan-assembler-not "\\\$28" } } */ + +#include "branch-helper.h" + +NOMIPS16 void +foo (volatile int *x) +{ + if (__builtin_expect (*x == 0, 1)) + OCCUPY_0x10000; +} diff --git a/gcc/testsuite/gcc.target/mips/umips-branch-9.c b/gcc/testsuite/gcc.target/mips/umips-branch-9.c new file mode 100644 index 00000000000..ab02e88189e --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/umips-branch-9.c @@ -0,0 +1,12 @@ +/* { dg-options "-mshared -mabi=64 -mmicromips" } */ +/* { dg-final { scan-assembler-not "(\\\$25|\\\$28|%gp_rel|%got)" } } */ +/* { dg-final { scan-assembler-not "\tjrc?\t\\\$1\n" } } */ + +#include "branch-helper.h" + +NOMIPS16 void +foo (volatile int *x) +{ + if (__builtin_expect (*x == 0, 1)) + OCCUPY_0xfffc; +}