testsuite: Add PRU tests
gcc/testsuite/ChangeLog: 2019-06-12 Dimitar Dimitrov <dimitar@dinux.eu> * gcc.target/pru/abi-arg-struct.c: New test. * gcc.target/pru/ashiftrt.c: New test. * gcc.target/pru/builtins-1.c: New test. * gcc.target/pru/builtins-error.c: New test. * gcc.target/pru/clearbit.c: New test. * gcc.target/pru/loop-asm.c: New test. * gcc.target/pru/loop-dowhile.c: New test. * gcc.target/pru/loop-hi-1.c: New test. * gcc.target/pru/loop-hi-2.c: New test. * gcc.target/pru/loop-qi-1.c: New test. * gcc.target/pru/loop-qi-2.c: New test. * gcc.target/pru/loop-short-1.c: New test. * gcc.target/pru/loop-short-2.c: New test. * gcc.target/pru/loop-si-1.c: New test. * gcc.target/pru/loop-si-2.c: New test. * gcc.target/pru/loop-u8_pcrel_overflow.c: New test. * gcc.target/pru/loop-ubyte-1.c: New test. * gcc.target/pru/loop-ubyte-2.c: New test. * gcc.target/pru/lra-framepointer-fragmentation-1.c: New test. * gcc.target/pru/lra-framepointer-fragmentation-2.c: New test. * gcc.target/pru/mabi-ti-1.c: New test. * gcc.target/pru/mabi-ti-2.c: New test. * gcc.target/pru/mabi-ti-3.c: New test. * gcc.target/pru/mabi-ti-4.c: New test. * gcc.target/pru/mabi-ti-5.c: New test. * gcc.target/pru/mabi-ti-6.c: New test. * gcc.target/pru/mabi-ti-7.c: New test. * gcc.target/pru/pr64366.c: New test. * gcc.target/pru/pragma-ctable_entry.c: New test. * gcc.target/pru/pru.exp: New file. * gcc.target/pru/qbbc-1.c: New test. * gcc.target/pru/qbbc-2.c: New test. * gcc.target/pru/qbbc-3.c: New test. * gcc.target/pru/qbbs-1.c: New test. * gcc.target/pru/qbbs-2.c: New test. * gcc.target/pru/setbit.c: New test. * gcc.target/pru/zero_extend-and-hisi.c: New test. * gcc.target/pru/zero_extend-and-qihi.c: New test. * gcc.target/pru/zero_extend-and-qisi.c: New test. * gcc.target/pru/zero_extend-hisi.c: New test. * gcc.target/pru/zero_extend-qihi.c: New test. * gcc.target/pru/zero_extend-qisi.c: New test. * lib/target-supports.exp: Add PRU to feature filters. From-SVN: r272205
This commit is contained in:
parent
ae7deb4b85
commit
506bd02c5a
@ -1,3 +1,49 @@
|
||||
2019-06-12 Dimitar Dimitrov <dimitar@dinux.eu>
|
||||
|
||||
* gcc.target/pru/abi-arg-struct.c: New test.
|
||||
* gcc.target/pru/ashiftrt.c: New test.
|
||||
* gcc.target/pru/builtins-1.c: New test.
|
||||
* gcc.target/pru/builtins-error.c: New test.
|
||||
* gcc.target/pru/clearbit.c: New test.
|
||||
* gcc.target/pru/loop-asm.c: New test.
|
||||
* gcc.target/pru/loop-dowhile.c: New test.
|
||||
* gcc.target/pru/loop-hi-1.c: New test.
|
||||
* gcc.target/pru/loop-hi-2.c: New test.
|
||||
* gcc.target/pru/loop-qi-1.c: New test.
|
||||
* gcc.target/pru/loop-qi-2.c: New test.
|
||||
* gcc.target/pru/loop-short-1.c: New test.
|
||||
* gcc.target/pru/loop-short-2.c: New test.
|
||||
* gcc.target/pru/loop-si-1.c: New test.
|
||||
* gcc.target/pru/loop-si-2.c: New test.
|
||||
* gcc.target/pru/loop-u8_pcrel_overflow.c: New test.
|
||||
* gcc.target/pru/loop-ubyte-1.c: New test.
|
||||
* gcc.target/pru/loop-ubyte-2.c: New test.
|
||||
* gcc.target/pru/lra-framepointer-fragmentation-1.c: New test.
|
||||
* gcc.target/pru/lra-framepointer-fragmentation-2.c: New test.
|
||||
* gcc.target/pru/mabi-ti-1.c: New test.
|
||||
* gcc.target/pru/mabi-ti-2.c: New test.
|
||||
* gcc.target/pru/mabi-ti-3.c: New test.
|
||||
* gcc.target/pru/mabi-ti-4.c: New test.
|
||||
* gcc.target/pru/mabi-ti-5.c: New test.
|
||||
* gcc.target/pru/mabi-ti-6.c: New test.
|
||||
* gcc.target/pru/mabi-ti-7.c: New test.
|
||||
* gcc.target/pru/pr64366.c: New test.
|
||||
* gcc.target/pru/pragma-ctable_entry.c: New test.
|
||||
* gcc.target/pru/pru.exp: New file.
|
||||
* gcc.target/pru/qbbc-1.c: New test.
|
||||
* gcc.target/pru/qbbc-2.c: New test.
|
||||
* gcc.target/pru/qbbc-3.c: New test.
|
||||
* gcc.target/pru/qbbs-1.c: New test.
|
||||
* gcc.target/pru/qbbs-2.c: New test.
|
||||
* gcc.target/pru/setbit.c: New test.
|
||||
* gcc.target/pru/zero_extend-and-hisi.c: New test.
|
||||
* gcc.target/pru/zero_extend-and-qihi.c: New test.
|
||||
* gcc.target/pru/zero_extend-and-qisi.c: New test.
|
||||
* gcc.target/pru/zero_extend-hisi.c: New test.
|
||||
* gcc.target/pru/zero_extend-qihi.c: New test.
|
||||
* gcc.target/pru/zero_extend-qisi.c: New test.
|
||||
* lib/target-supports.exp: Add PRU to feature filters.
|
||||
|
||||
2019-06-12 Steven G. Kargl <kargl@gcc.gnu.org>
|
||||
|
||||
PR fortran/90002
|
||||
|
164
gcc/testsuite/gcc.target/pru/abi-arg-struct.c
Normal file
164
gcc/testsuite/gcc.target/pru/abi-arg-struct.c
Normal file
@ -0,0 +1,164 @@
|
||||
/* Test call argument ABI: passing structs */
|
||||
|
||||
/* { dg-do run } */
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
struct S3 { char a[3]; };
|
||||
struct S7 { char a[7]; };
|
||||
struct S8 { char a[8]; };
|
||||
|
||||
struct S3 gs3 = {{11, 22, 33}};
|
||||
struct S7 gs7 = {{1, 2, 3, 4, 5, 6, 7}};
|
||||
struct S8 gs8 = {{1, 2, 3, 4, 5, 6, 7, 8}};
|
||||
|
||||
int test3_struct(char a0, char a1, char a2, char a3,
|
||||
char a4, char a5, char a6, char a7,
|
||||
char a8, char a9, char a10, char a11,
|
||||
int ai)
|
||||
{
|
||||
if (a0 != 11) return 1;
|
||||
if (a1 != 22) return 2;
|
||||
if (a2 != 33) return 3;
|
||||
if (a4 != 101) return 4;
|
||||
if (a5 != 111) return 5;
|
||||
if (a6 != 121) return 6;
|
||||
if (a8 != 55) return 8;
|
||||
if (a9 != 66) return 9;
|
||||
if (a10 != 77) return 10;
|
||||
|
||||
if (ai != 55443322) return 100;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void test3(void)
|
||||
{
|
||||
struct S3 s3x = { {101, 111, 121} };
|
||||
struct S3 s3y = { {55, 66, 77} };
|
||||
|
||||
int (* volatile f)(struct S3, struct S3, struct S3, int) =
|
||||
(int (* volatile)(struct S3, struct S3, struct S3, int)) test3_struct;
|
||||
|
||||
if (f(gs3, s3x, s3y, 55443322))
|
||||
abort();
|
||||
}
|
||||
|
||||
int test7_struct(unsigned ai, struct S7 a0, ...)
|
||||
{
|
||||
va_list ap;
|
||||
struct S7 s[3];
|
||||
int i;
|
||||
|
||||
va_start (ap, a0);
|
||||
|
||||
s[0] = a0;
|
||||
for (i = 1; i < 3; i++) {
|
||||
s[i] = va_arg (ap, struct S7);
|
||||
}
|
||||
|
||||
va_end (ap);
|
||||
|
||||
if (ai != 0xaabbccdd)
|
||||
return 1;
|
||||
|
||||
if (s[0].a[0] != 1) return 1;
|
||||
if (s[0].a[1] != 2) return 1;
|
||||
if (s[0].a[2] != 3) return 1;
|
||||
if (s[0].a[3] != 4) return 1;
|
||||
if (s[0].a[4] != 5) return 1;
|
||||
if (s[0].a[5] != 6) return 1;
|
||||
if (s[0].a[6] != 7) return 1;
|
||||
|
||||
if (s[1].a[0] != 11) return 1;
|
||||
if (s[1].a[1] != 12) return 1;
|
||||
if (s[1].a[2] != 13) return 1;
|
||||
if (s[1].a[3] != 14) return 1;
|
||||
if (s[1].a[4] != 15) return 1;
|
||||
if (s[1].a[5] != 16) return 1;
|
||||
if (s[1].a[6] != 17) return 1;
|
||||
|
||||
if (s[2].a[0] != 22) return 1;
|
||||
if (s[2].a[1] != 23) return 1;
|
||||
if (s[2].a[2] != 24) return 1;
|
||||
if (s[2].a[3] != 25) return 1;
|
||||
if (s[2].a[4] != 26) return 1;
|
||||
if (s[2].a[5] != 27) return 1;
|
||||
if (s[2].a[6] != 28) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void test7(void)
|
||||
{
|
||||
struct S7 s7x = { {11, 12, 13, 14, 15, 16, 17} };
|
||||
struct S7 s7y = { {22, 23, 24, 25, 26, 27, 28} };
|
||||
|
||||
int (* volatile f)(unsigned, struct S7, struct S7, struct S7) =
|
||||
(int (* volatile)(unsigned, struct S7, struct S7, struct S7)) test7_struct;
|
||||
|
||||
if (f(0xaabbccdd, gs7, s7x, s7y))
|
||||
abort();
|
||||
}
|
||||
|
||||
int test8_struct(char a0, char a1, char a2, char a3,
|
||||
char a4, char a5, char a6, char a7,
|
||||
char a8, char a9, char a10, char a11,
|
||||
char a12, char a13, char a14, char a15,
|
||||
char a16, char a17, char a18, char a19,
|
||||
char a20, char a21, char a22, char a23)
|
||||
{
|
||||
if (a0 != 1) return 1;
|
||||
if (a1 != 2) return 1;
|
||||
if (a2 != 3) return 1;
|
||||
if (a3 != 4) return 1;
|
||||
if (a4 != 5) return 1;
|
||||
if (a5 != 6) return 1;
|
||||
if (a6 != 7) return 1;
|
||||
if (a7 != 8) return 1;
|
||||
|
||||
if (a8 != 11) return 1;
|
||||
if (a9 != 12) return 1;
|
||||
if (a10 != 13) return 1;
|
||||
if (a11 != 14) return 1;
|
||||
if (a12 != 15) return 1;
|
||||
if (a13 != 16) return 1;
|
||||
if (a14 != 17) return 1;
|
||||
if (a15 != 18) return 1;
|
||||
|
||||
if (a16 != 22) return 1;
|
||||
if (a17 != 23) return 1;
|
||||
if (a18 != 24) return 1;
|
||||
if (a19 != 25) return 1;
|
||||
if (a20 != 26) return 1;
|
||||
if (a21 != 27) return 1;
|
||||
if (a22 != 28) return 1;
|
||||
if (a23 != 29) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void test8(void)
|
||||
{
|
||||
struct S8 s8x = { {11, 12, 13, 14, 15, 16, 17, 18} };
|
||||
struct S8 s8y = { {22, 23, 24, 25, 26, 27, 28, 29} };
|
||||
|
||||
int (* volatile f)(struct S8, struct S8, struct S8) =
|
||||
(int (* volatile)(struct S8, struct S8, struct S8)) test8_struct;
|
||||
|
||||
if (f(gs8, s8x, s8y))
|
||||
abort();
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char** argv)
|
||||
{
|
||||
test3();
|
||||
test7();
|
||||
test8();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
13
gcc/testsuite/gcc.target/pru/ashiftrt.c
Normal file
13
gcc/testsuite/gcc.target/pru/ashiftrt.c
Normal file
@ -0,0 +1,13 @@
|
||||
/* Test shift optimization */
|
||||
|
||||
/* { dg-options "-O1" } */
|
||||
|
||||
/* -O1 in the options is significant. */
|
||||
|
||||
extern void func2(unsigned char);
|
||||
|
||||
void test(unsigned char v)
|
||||
{
|
||||
/* { dg-final { scan-assembler "lsl\tr14.b0, r14.b0, .\+\n\tlsr\tr14.b0, r14.b0" } } */
|
||||
func2((v & 2) ? 1 : 0);
|
||||
}
|
12
gcc/testsuite/gcc.target/pru/builtins-1.c
Normal file
12
gcc/testsuite/gcc.target/pru/builtins-1.c
Normal file
@ -0,0 +1,12 @@
|
||||
/* { dg-do compile } */
|
||||
|
||||
void delay0 (void) { __delay_cycles (0); }
|
||||
void delay1 (void) { __delay_cycles (1); }
|
||||
void delay2 (void) { __delay_cycles (2); }
|
||||
void delay3 (void) { __delay_cycles (3); }
|
||||
|
||||
void delay_1 (void) { __delay_cycles (44); }
|
||||
void delay_2 (void) { __delay_cycles (0x1234); }
|
||||
void delay_3 (void) { __delay_cycles (0x123456); }
|
||||
|
||||
/* { dg-final { scan-assembler-not "__delay_cycles" } } */
|
6
gcc/testsuite/gcc.target/pru/builtins-error.c
Normal file
6
gcc/testsuite/gcc.target/pru/builtins-error.c
Normal file
@ -0,0 +1,6 @@
|
||||
/* { dg-do assemble } */
|
||||
|
||||
void delay (long a)
|
||||
{
|
||||
__delay_cycles (a); /* { dg-error "'__delay_cycles' only takes constant arguments" } */
|
||||
}
|
13
gcc/testsuite/gcc.target/pru/clearbit.c
Normal file
13
gcc/testsuite/gcc.target/pru/clearbit.c
Normal file
@ -0,0 +1,13 @@
|
||||
/* clearbit instruction generation */
|
||||
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O1" } */
|
||||
|
||||
unsigned int
|
||||
test_clearbit (unsigned int val)
|
||||
{
|
||||
/* { dg-final { scan-assembler "clr\\tr14, r14, 19" } } */
|
||||
val &= ~(1u << 19);
|
||||
return val;
|
||||
}
|
||||
|
19
gcc/testsuite/gcc.target/pru/loop-asm.c
Normal file
19
gcc/testsuite/gcc.target/pru/loop-asm.c
Normal file
@ -0,0 +1,19 @@
|
||||
/* Test that LOOP will not be generated when body contains asm statement */
|
||||
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O1 -mloop" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it do-loop will not be
|
||||
run. */
|
||||
|
||||
unsigned int
|
||||
test_loop (unsigned int n)
|
||||
{
|
||||
unsigned i;
|
||||
/* { dg-final { scan-assembler-not "loop\t.\+" } } */
|
||||
for (i = 0; i < 10; i++) {
|
||||
n <<= 2;
|
||||
asm volatile ("nop" : : );
|
||||
}
|
||||
return n;
|
||||
}
|
45
gcc/testsuite/gcc.target/pru/loop-dowhile.c
Normal file
45
gcc/testsuite/gcc.target/pru/loop-dowhile.c
Normal file
@ -0,0 +1,45 @@
|
||||
/* Test LOOP generation for do while.
|
||||
Ensure the post-condition "do while" is correctly translated
|
||||
to a pre-condition PRU LOOP instruction. */
|
||||
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-O1 -mloop" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it do-loop will not be
|
||||
run. */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
volatile unsigned int int_12345 = 12345;
|
||||
volatile unsigned int int_0 = 0;
|
||||
volatile unsigned int int_1 = 1;
|
||||
|
||||
unsigned int
|
||||
test_loop (unsigned int n)
|
||||
{
|
||||
unsigned int i = 0;
|
||||
volatile unsigned int s = 0;
|
||||
|
||||
if (n >= 0x7fff) return 0;
|
||||
|
||||
do {
|
||||
s++;
|
||||
i++;
|
||||
} while (i < n);
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main (int argc, char** argv)
|
||||
{
|
||||
if (test_loop (int_0) != 1)
|
||||
abort();
|
||||
if (test_loop (int_1) != 1)
|
||||
abort();
|
||||
if (test_loop (int_12345) != 12345)
|
||||
abort();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
38
gcc/testsuite/gcc.target/pru/loop-hi-1.c
Normal file
38
gcc/testsuite/gcc.target/pru/loop-hi-1.c
Normal file
@ -0,0 +1,38 @@
|
||||
/* Test LOOP recognition - short ints*/
|
||||
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-O1 -mloop" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it do-loop will not be
|
||||
run. */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
volatile unsigned short short_12345 = 12345;
|
||||
volatile unsigned short short_0 = 0;
|
||||
volatile unsigned short short_1 = 1;
|
||||
|
||||
unsigned int
|
||||
test_loop_short (unsigned short n)
|
||||
{
|
||||
unsigned short i;
|
||||
volatile unsigned int s = 0;
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
s++;
|
||||
return s;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char** argv)
|
||||
{
|
||||
if (test_loop_short (short_0) != 0)
|
||||
abort();
|
||||
if (test_loop_short (short_1) != 1)
|
||||
abort();
|
||||
if (test_loop_short (short_12345) != 12345)
|
||||
abort();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
17
gcc/testsuite/gcc.target/pru/loop-hi-2.c
Normal file
17
gcc/testsuite/gcc.target/pru/loop-hi-2.c
Normal file
@ -0,0 +1,17 @@
|
||||
/* Test LOOP recognition - short ints*/
|
||||
|
||||
/* { dg-options "-O2 -mloop" } */
|
||||
|
||||
/* -O2 in the options is significant. Without it do-loop will not be
|
||||
run. */
|
||||
|
||||
unsigned int
|
||||
test_loop_short (int x, short n)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* { dg-final { scan-assembler "loop\\t.L\[0-9\]*, r\[0-9w.\]*" } } */
|
||||
for (i = 0; i < n; i++)
|
||||
x <<= 3;
|
||||
return x;
|
||||
}
|
38
gcc/testsuite/gcc.target/pru/loop-qi-1.c
Normal file
38
gcc/testsuite/gcc.target/pru/loop-qi-1.c
Normal file
@ -0,0 +1,38 @@
|
||||
/* Test LOOP recognition */
|
||||
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-O1 -mloop" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it do-loop will not be
|
||||
run. */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
volatile unsigned char char_123 = 123;
|
||||
volatile unsigned char char_0 = 0;
|
||||
volatile unsigned char char_1 = 1;
|
||||
|
||||
unsigned int
|
||||
test_loop_char (unsigned char n)
|
||||
{
|
||||
unsigned char i;
|
||||
volatile unsigned int s = 0;
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
s++;
|
||||
return s;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char** argv)
|
||||
{
|
||||
if (test_loop_char (char_0) != 0)
|
||||
abort();
|
||||
if (test_loop_char (char_1) != 1)
|
||||
abort();
|
||||
if (test_loop_char (char_123) != 123)
|
||||
abort();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
17
gcc/testsuite/gcc.target/pru/loop-qi-2.c
Normal file
17
gcc/testsuite/gcc.target/pru/loop-qi-2.c
Normal file
@ -0,0 +1,17 @@
|
||||
/* Test LOOP recognition */
|
||||
|
||||
/* { dg-options "-O2 -mloop" } */
|
||||
|
||||
/* -O2 in the options is significant. Without it do-loop will not be
|
||||
run. */
|
||||
|
||||
unsigned int
|
||||
test_loop_char (unsigned int x, char n)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* { dg-final { scan-assembler "loop\\t.L\[0-9\]*, r\[0-9b.\]*" } } */
|
||||
for (i = 0; i < n; i++)
|
||||
x <<= 2;
|
||||
return x;
|
||||
}
|
53
gcc/testsuite/gcc.target/pru/loop-short-1.c
Normal file
53
gcc/testsuite/gcc.target/pru/loop-short-1.c
Normal file
@ -0,0 +1,53 @@
|
||||
/* Test LOOP generation for very short loops. */
|
||||
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-O1 -mloop" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it do-loop will not be
|
||||
run. */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
volatile unsigned int int_12345 = 12345;
|
||||
volatile unsigned int int_0 = 0;
|
||||
volatile unsigned int int_1 = 1;
|
||||
|
||||
unsigned int
|
||||
test_loop_sum (unsigned int n)
|
||||
{
|
||||
unsigned i;
|
||||
volatile unsigned int s = 0;
|
||||
for (i = 0; i < n; i++) {
|
||||
s++;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
test_loop_shift20 (unsigned int n)
|
||||
{
|
||||
unsigned i;
|
||||
for (i = 0; i < 10; i++) {
|
||||
n <<= 2;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char** argv)
|
||||
{
|
||||
if (test_loop_sum (int_0) != 0)
|
||||
abort();
|
||||
if (test_loop_sum (int_1) != 1)
|
||||
abort();
|
||||
if (test_loop_sum (int_12345) != 12345)
|
||||
abort();
|
||||
|
||||
if (test_loop_shift20 (int_0) != 0)
|
||||
abort();
|
||||
if (test_loop_shift20 (int_1) != (1u << 20))
|
||||
abort();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
21
gcc/testsuite/gcc.target/pru/loop-short-2.c
Normal file
21
gcc/testsuite/gcc.target/pru/loop-short-2.c
Normal file
@ -0,0 +1,21 @@
|
||||
/* Test LOOP generation for very short loops. */
|
||||
|
||||
/* { dg-options "-O1 -mloop" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it do-loop will not be
|
||||
run. */
|
||||
|
||||
unsigned int
|
||||
test_loop (unsigned int n, unsigned int x)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (n >= 0x10000) return 0;
|
||||
if (!n) return 0;
|
||||
|
||||
/* { dg-final { scan-assembler "loop\\t.L\[0-9\]*, r\[0-9\]*" } } */
|
||||
/* { dg-final { scan-assembler "nop" } } */
|
||||
for (i = 0; i < n; i++)
|
||||
x <<= 2;
|
||||
return x;
|
||||
}
|
41
gcc/testsuite/gcc.target/pru/loop-si-1.c
Normal file
41
gcc/testsuite/gcc.target/pru/loop-si-1.c
Normal file
@ -0,0 +1,41 @@
|
||||
/* Test LOOP recognition */
|
||||
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-O1 -mloop" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it do-loop will not be
|
||||
run. */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
volatile unsigned int int_12345 = 12345;
|
||||
volatile unsigned int int_0 = 0;
|
||||
volatile unsigned int int_1 = 1;
|
||||
|
||||
unsigned int
|
||||
test_loop (unsigned int n)
|
||||
{
|
||||
unsigned int i;
|
||||
volatile unsigned int s = 0;
|
||||
|
||||
if (n >= 0x10000) return 0;
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
s++;
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main (int argc, char** argv)
|
||||
{
|
||||
if (test_loop (int_0) != 0)
|
||||
abort();
|
||||
if (test_loop (int_1) != 1)
|
||||
abort();
|
||||
if (test_loop (int_12345) != 12345)
|
||||
abort();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
20
gcc/testsuite/gcc.target/pru/loop-si-2.c
Normal file
20
gcc/testsuite/gcc.target/pru/loop-si-2.c
Normal file
@ -0,0 +1,20 @@
|
||||
/* Test LOOP recognition */
|
||||
|
||||
/* { dg-options "-O1 -mloop" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it do-loop will not be
|
||||
run. */
|
||||
|
||||
unsigned int
|
||||
test_loop (unsigned int n)
|
||||
{
|
||||
unsigned int i;
|
||||
volatile unsigned int s = 0;
|
||||
|
||||
if (n >= 0x10000) return 0;
|
||||
|
||||
/* { dg-final { scan-assembler "loop\\t.L\[0-9\]*, r\[0-9\]*" } } */
|
||||
for (i = 0; i < n; i++)
|
||||
s++;
|
||||
return s;
|
||||
}
|
42
gcc/testsuite/gcc.target/pru/loop-u8_pcrel_overflow.c
Normal file
42
gcc/testsuite/gcc.target/pru/loop-u8_pcrel_overflow.c
Normal file
@ -0,0 +1,42 @@
|
||||
/* Test large loop bodies where U8_PCREL would overflow */
|
||||
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-O1 -mloop" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it do-loop will not be
|
||||
run. */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
#define OP do { i1 <<= 2; i1 >>= 2; i2 *= 3; i2 /= 2; } while(0)
|
||||
#define OP4 OP; OP; OP; OP
|
||||
#define OP16 OP4; OP4; OP4; OP4
|
||||
#define OP64 OP16; OP16; OP16; OP16
|
||||
#define OP256 OP64; OP64; OP64; OP64
|
||||
|
||||
unsigned int
|
||||
test_loop (unsigned int i1, unsigned i2)
|
||||
{
|
||||
unsigned int i;
|
||||
volatile unsigned int s = 0;
|
||||
|
||||
for (i = 0; i < 100; i++) {
|
||||
/* cannot use ASM NOP because it will prevent
|
||||
GCC from issuing a LOOP instruction. */
|
||||
OP256;
|
||||
s++;
|
||||
}
|
||||
return s + i1 + i2;
|
||||
}
|
||||
|
||||
volatile unsigned int I1 = 0;
|
||||
volatile unsigned int I2 = 0;
|
||||
|
||||
int
|
||||
main (int argc, char** argv)
|
||||
{
|
||||
if (test_loop (I1, I2) != 100)
|
||||
abort();
|
||||
|
||||
return 0;
|
||||
}
|
30
gcc/testsuite/gcc.target/pru/loop-ubyte-1.c
Normal file
30
gcc/testsuite/gcc.target/pru/loop-ubyte-1.c
Normal file
@ -0,0 +1,30 @@
|
||||
/* Test LOOP recognition */
|
||||
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-O1 -mloop" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it do-loop will not be
|
||||
run. */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
unsigned int
|
||||
test_loop_ubyte_101 (void)
|
||||
{
|
||||
unsigned int i;
|
||||
volatile unsigned int s = 0;
|
||||
|
||||
for (i = 0; i < 101; i++)
|
||||
s++;
|
||||
return s;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char** argv)
|
||||
{
|
||||
if (test_loop_ubyte_101 () != 101)
|
||||
abort();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
18
gcc/testsuite/gcc.target/pru/loop-ubyte-2.c
Normal file
18
gcc/testsuite/gcc.target/pru/loop-ubyte-2.c
Normal file
@ -0,0 +1,18 @@
|
||||
/* Test LOOP recognition */
|
||||
|
||||
/* { dg-options "-O1 -mloop" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it do-loop will not be
|
||||
run. */
|
||||
|
||||
unsigned int
|
||||
test_loop_ubyte_101 (void)
|
||||
{
|
||||
unsigned int i;
|
||||
volatile unsigned int s = 0;
|
||||
|
||||
/* { dg-final { scan-assembler "loop\\t.L\[0-9\]*, 101" } } */
|
||||
for (i = 0; i < 101; i++)
|
||||
s++;
|
||||
return s;
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
/* { dg-do assemble } */
|
||||
/* { dg-options "-O1 -fno-omit-frame-pointer" } */
|
||||
#include <stdint.h>
|
||||
|
||||
extern uint64_t global;
|
||||
|
||||
uint64_t __attribute__((noinline)) test(uint64_t a, uint64_t b,
|
||||
uint64_t c, uint64_t d,
|
||||
uint64_t e, uint64_t f,
|
||||
uint64_t g, uint64_t h)
|
||||
{
|
||||
uint64_t l1 = 0x12345678, l2 = 0x87654321, l3 = 1001, l4 = 1002;
|
||||
uint64_t l5 = 1004;
|
||||
uint32_t l6 = 2005;
|
||||
uint8_t c1 = 101, c2 = 102;
|
||||
|
||||
/* The numerous dummy asm input operands create just
|
||||
* enough register pressure to resort to using
|
||||
* FP.b1 (r4.b1).
|
||||
*/
|
||||
|
||||
asm ("nop" /* { dg-error "'asm' operand has impossible constraints" } */
|
||||
: "=r" (l1)
|
||||
: "0" (l1), "r" (a), "r"(b),
|
||||
"r"(c), "r"(d), "r"(e), "r"(f),
|
||||
"r"(g), "r"(h), "r"(l2),
|
||||
"r"(c1), "r"(c2),
|
||||
"r"(l3), "r"(l4), "r"(l5), "r"(l6));
|
||||
|
||||
global = a+b+c+d+e+f+g+h + c1+c2 + l2;
|
||||
|
||||
return l1;
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-O1 -fomit-frame-pointer" } */
|
||||
#include <stdint.h>
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
uint64_t global = 5;
|
||||
|
||||
uint64_t __attribute__((noinline)) test(uint64_t a, uint64_t b,
|
||||
uint64_t c, uint64_t d,
|
||||
uint64_t e, uint64_t f,
|
||||
uint64_t g, uint64_t h)
|
||||
{
|
||||
uint64_t l1 = 0x12345678, l2 = 0x87654321, l3 = 1001, l4 = 1002;
|
||||
uint64_t l5 = 1004;
|
||||
uint32_t l6 = 2005;
|
||||
uint8_t c1 = 101, c2 = 102;
|
||||
|
||||
/* The numerous dummy asm input operands create just
|
||||
* enough register pressure to resort to using FP (r4).
|
||||
*/
|
||||
|
||||
asm ("ldi32 %0, 0x11223344\n\t"
|
||||
"add %0, %0, %2\n\t"
|
||||
"add %0, %0, %3\n\t"
|
||||
"add %0, %0, %4\n\t"
|
||||
"add %0, %0, %5\n\t"
|
||||
"add %0, %0, %6\n\t"
|
||||
"add %0, %0, %7\n\t"
|
||||
"add %0, %0, %8\n\t"
|
||||
"add %0, %0, %9\n\t"
|
||||
"add %0, %0, %10\n\t"
|
||||
"add %0, %0, %11\n\t"
|
||||
"add %0, %0, %12\n\t"
|
||||
"add %0, %0, %13\n\t"
|
||||
"add %0, %0, %14\n\t"
|
||||
"add %0, %0, %15\n\t"
|
||||
"add %0, %0, %16\n\t"
|
||||
: "=r" (l1)
|
||||
: "0" (l1), "r" (a), "r"(b),
|
||||
"r"(c), "r"(d), "r"(e), "r"(f),
|
||||
"r"(g), "r"(h), "r"(c1), "r"(c2),
|
||||
"r"(l2), "r"(l3), "r"(l4), "r"(l5), "r"(l6));
|
||||
|
||||
global = a+b+c+d+e+f+g+h + c1+c2 + l2+l3+l4+l5+l6;
|
||||
|
||||
return l1;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
uint64_t a = test(1, 2, 3, 4, 5, 6, 7, 8);
|
||||
|
||||
if (a != 0x98878ae8) {
|
||||
abort();
|
||||
}
|
||||
if (global != 0x876557a4) {
|
||||
abort();
|
||||
}
|
||||
return 0;
|
||||
}
|
10
gcc/testsuite/gcc.target/pru/mabi-ti-1.c
Normal file
10
gcc/testsuite/gcc.target/pru/mabi-ti-1.c
Normal file
@ -0,0 +1,10 @@
|
||||
/* Test TI ABI unsupported constructs */
|
||||
|
||||
/* { dg-do assemble } */
|
||||
/* { dg-options "-O1 -mabi=ti" } */
|
||||
|
||||
|
||||
int test(int a, int b, void (*fp)(void))
|
||||
{ /* { dg-error "function pointers not supported with '-mabi=ti' option" } */
|
||||
return a+b;
|
||||
}
|
15
gcc/testsuite/gcc.target/pru/mabi-ti-2.c
Normal file
15
gcc/testsuite/gcc.target/pru/mabi-ti-2.c
Normal file
@ -0,0 +1,15 @@
|
||||
/* Test TI ABI unsupported constructs */
|
||||
|
||||
/* { dg-do assemble } */
|
||||
/* { dg-options "-O1 -mabi=ti" } */
|
||||
|
||||
|
||||
struct big {
|
||||
char c[9];
|
||||
};
|
||||
|
||||
struct big test(void)
|
||||
{ /* { dg-error "large return values not supported with '-mabi=ti' option" } */
|
||||
static struct big b;
|
||||
return b;
|
||||
}
|
12
gcc/testsuite/gcc.target/pru/mabi-ti-3.c
Normal file
12
gcc/testsuite/gcc.target/pru/mabi-ti-3.c
Normal file
@ -0,0 +1,12 @@
|
||||
/* Test TI ABI unsupported constructs */
|
||||
|
||||
/* { dg-do assemble } */
|
||||
/* { dg-options "-O1 -mabi=ti" } */
|
||||
|
||||
|
||||
extern void extfunc(void (*fp)(void));
|
||||
|
||||
void test(void)
|
||||
{
|
||||
extfunc(test); /* { dg-error "function pointers not supported with '-mabi=ti' option" } */
|
||||
}
|
14
gcc/testsuite/gcc.target/pru/mabi-ti-4.c
Normal file
14
gcc/testsuite/gcc.target/pru/mabi-ti-4.c
Normal file
@ -0,0 +1,14 @@
|
||||
/* Test TI ABI with supported constructs */
|
||||
|
||||
/* { dg-do assemble } */
|
||||
/* { dg-options "-O1 -mabi=ti" } */
|
||||
|
||||
|
||||
extern void extfunc1(long long);
|
||||
extern long long extfunc2(long long);
|
||||
|
||||
long long test(void)
|
||||
{
|
||||
extfunc1(3);
|
||||
return extfunc2(1);
|
||||
}
|
33
gcc/testsuite/gcc.target/pru/mabi-ti-5.c
Normal file
33
gcc/testsuite/gcc.target/pru/mabi-ti-5.c
Normal file
@ -0,0 +1,33 @@
|
||||
/* Test TI ABI unsupported constructs */
|
||||
|
||||
/* { dg-do assemble } */
|
||||
/* { dg-options "-O1 -mabi=ti" } */
|
||||
|
||||
struct s1 {
|
||||
void (*f)(void);
|
||||
int a;
|
||||
};
|
||||
|
||||
struct s2 {
|
||||
union {
|
||||
void (*f)(void);
|
||||
int a;
|
||||
long b;
|
||||
} u;
|
||||
};
|
||||
|
||||
int test1(struct s1 *p)
|
||||
{
|
||||
return p->a; /* { dg-error "function pointers not supported with '-mabi=ti' option" } */
|
||||
return 1;
|
||||
}
|
||||
|
||||
int test1_unused_arg(struct s1 p, int a)
|
||||
{ /* { dg-error "function pointers not supported with '-mabi=ti' option" } */
|
||||
return a;
|
||||
}
|
||||
|
||||
int test2(struct s2 v)
|
||||
{ /* { dg-error "function pointers not supported with '-mabi=ti' option" } */
|
||||
return 2;
|
||||
}
|
12
gcc/testsuite/gcc.target/pru/mabi-ti-6.c
Normal file
12
gcc/testsuite/gcc.target/pru/mabi-ti-6.c
Normal file
@ -0,0 +1,12 @@
|
||||
/* Test TI ABI unsupported constructs */
|
||||
|
||||
/* { dg-do assemble } */
|
||||
/* { dg-options "-O1 -mabi=ti" } */
|
||||
|
||||
|
||||
extern void (*extfuncp)(int);
|
||||
|
||||
void test(void)
|
||||
{
|
||||
extfuncp(1); /* { dg-error "function pointers not supported with '-mabi=ti' option" } */
|
||||
}
|
21
gcc/testsuite/gcc.target/pru/mabi-ti-7.c
Normal file
21
gcc/testsuite/gcc.target/pru/mabi-ti-7.c
Normal file
@ -0,0 +1,21 @@
|
||||
/* Test TI ABI unsupported constructs */
|
||||
|
||||
/* { dg-do assemble } */
|
||||
/* { dg-options "-O1 -mabi=ti" } */
|
||||
|
||||
struct s1 {
|
||||
int (*f)(void);
|
||||
int a;
|
||||
};
|
||||
|
||||
extern struct s1 s;
|
||||
|
||||
int test1(void)
|
||||
{
|
||||
return s.f(); /* { dg-error "function pointers not supported with '-mabi=ti' option" } */
|
||||
}
|
||||
|
||||
int test2(void)
|
||||
{
|
||||
return s.a; /* { dg-error "function pointers not supported with '-mabi=ti' option" } */
|
||||
}
|
128
gcc/testsuite/gcc.target/pru/pr64366.c
Normal file
128
gcc/testsuite/gcc.target/pru/pr64366.c
Normal file
@ -0,0 +1,128 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2" } */
|
||||
|
||||
typedef int int8_t __attribute__ ((__mode__ (__QI__)));
|
||||
typedef int int16_t __attribute__ ((__mode__ (__HI__)));
|
||||
typedef int int32_t __attribute__ ((__mode__ (__SI__)));
|
||||
typedef int int64_t __attribute__ ((__mode__ (__DI__)));
|
||||
typedef unsigned char uint8_t;
|
||||
typedef unsigned short int uint16_t;
|
||||
typedef unsigned int uint32_t;
|
||||
__extension__ typedef unsigned long long int uint64_t;
|
||||
typedef int intptr_t;
|
||||
typedef struct BigStruct{
|
||||
uint8_t a;
|
||||
int8_t b;
|
||||
uint16_t c;
|
||||
int16_t d;
|
||||
uint32_t e;
|
||||
int32_t f;
|
||||
uint64_t g;
|
||||
int64_t h;
|
||||
float i;
|
||||
double j;
|
||||
long double k;
|
||||
char* l;
|
||||
uint8_t m;
|
||||
int8_t n;
|
||||
uint16_t o;
|
||||
int16_t p;
|
||||
uint32_t q;
|
||||
int32_t r;
|
||||
uint64_t s;
|
||||
int64_t t;
|
||||
float u;
|
||||
double v;
|
||||
long double w;
|
||||
char* x;
|
||||
uint8_t y;
|
||||
int8_t z;
|
||||
uint16_t aa;
|
||||
int16_t bb;
|
||||
uint32_t cc;
|
||||
int32_t dd;
|
||||
uint64_t ee;
|
||||
int64_t ff;
|
||||
float gg;
|
||||
double hh;
|
||||
long double ii;
|
||||
char* jj;
|
||||
uint8_t kk;
|
||||
int8_t ll;
|
||||
uint16_t mm;
|
||||
int16_t nn;
|
||||
uint32_t oo;
|
||||
int32_t pp;
|
||||
uint64_t qq;
|
||||
int64_t rr;
|
||||
float ss;
|
||||
double tt;
|
||||
long double uu;
|
||||
char* vv;
|
||||
uint8_t ww;
|
||||
int8_t xx;
|
||||
} BigStruct;
|
||||
|
||||
extern void foobar();
|
||||
|
||||
void
|
||||
test_large_fn (uint8_t ui8_1, int8_t si8_1, uint16_t ui16_1, int16_t si16_1,
|
||||
uint32_t ui32_1, int32_t si32_1, uint64_t ui64_1, int64_t si64_1,
|
||||
float f_1, double d_1, long double ld_1, char* p_1,
|
||||
uint8_t ui8_2, int8_t si8_2, uint16_t ui16_2, int16_t si16_2,
|
||||
uint32_t ui32_2, int32_t si32_2, uint64_t ui64_2, int64_t si64_2,
|
||||
float f_2, double d_2, long double ld_2, char* p_2,
|
||||
uint8_t ui8_3, int8_t si8_3, uint16_t ui16_3, int16_t si16_3,
|
||||
uint32_t ui32_3, int32_t si32_3, uint64_t ui64_3, int64_t si64_3,
|
||||
float f_3, double d_3, long double ld_3, char* p_3,
|
||||
uint8_t ui8_4, int8_t si8_4, uint16_t ui16_4, int16_t si16_4,
|
||||
uint32_t ui32_4, int32_t si32_4, uint64_t ui64_4, int64_t si64_4,
|
||||
float f_4, double d_4, long double ld_4, char* p_4,
|
||||
uint8_t ui8_5, int8_t si8_5)
|
||||
{
|
||||
BigStruct retVal =
|
||||
{
|
||||
ui8_1 + 1, si8_1 + 1, ui16_1 + 1, si16_1 + 1,
|
||||
ui32_1 + 1, si32_1 + 1, ui64_1 + 1, si64_1 + 1,
|
||||
f_1 + 1, d_1 + 1, ld_1 + 1, (char*)((intptr_t)p_1 + 1),
|
||||
ui8_2 + 2, si8_2 + 2, ui16_2 + 2, si16_2 + 2,
|
||||
ui32_2 + 2, si32_2 + 2, ui64_2 + 2, si64_2 + 2,
|
||||
f_2 + 2, d_2 + 2, ld_2 + 2, (char*)((intptr_t)p_2 + 2),
|
||||
ui8_3 + 3, si8_3 + 3, ui16_3 + 3, si16_3 + 3,
|
||||
ui32_3 + 3, si32_3 + 3, ui64_3 + 3, si64_3 + 3,
|
||||
f_3 + 3, d_3 + 3, ld_3 + 3, (char*)((intptr_t)p_3 + 3),
|
||||
ui8_4 + 4, si8_4 + 4, ui16_4 + 4, si16_4 + 4,
|
||||
ui32_4 + 4, si32_4 + 4, ui64_4 + 4, si64_4 + 4,
|
||||
f_4 + 4, d_4 + 4, ld_4 + 4, (char*)((intptr_t)p_4 + 4),
|
||||
ui8_5 + 5, si8_5 + 5
|
||||
};
|
||||
|
||||
foobar ("%" "u" " %" "d" " %hu %hd %u %d %" "ll" "u" " %" "ll" "d"
|
||||
" %.0f %.0f %.0Lf %#lx " "%" "u" " %" "d" " %hu %hd %u %d %"
|
||||
"ll" "u" " %" "ll" "d" " %.0f %.0f %.0Lf %#lx " "%" "u"
|
||||
" %" "d" " %hu %hd %u %d %" "ll" "u" " %" "ll" "d"
|
||||
" %.0f %.0f %.0Lf %#lx " "%" "u" " %" "d" " %hu %hd %u %d %"
|
||||
"ll" "u" " %" "ll" "d" " %.0f %.0f %.0Lf %#lx %" "u" " %"
|
||||
"d" ": " "%" "u" " %" "d" " %hu %hd %u %d %" "ll" "u" " %"
|
||||
"ll" "d" " %.0f %.0f %.0Lf %#lx " "%" "u" " %" "d"
|
||||
" %hu %hd %u %d %" "ll" "u" " %" "ll" "d" " %.0f %.0f %.0Lf %#lx "
|
||||
"%" "u" " %" "d" " %hu %hd %u %d %" "ll" "u" " %" "ll" "d"
|
||||
" %.0f %.0f %.0Lf %#lx " "%" "u" " %" "d" " %hu %hd %u %d %"
|
||||
"ll" "u" " %" "ll" "d" " %.0f %.0f %.0Lf %#lx %" "u" " %" "d" "\n",
|
||||
ui8_1, si8_1, ui16_1, si16_1, ui32_1, si32_1, ui64_1, si64_1,
|
||||
f_1, d_1, ld_1, (unsigned long)p_1, ui8_2, si8_2, ui16_2, si16_2,
|
||||
ui32_2, si32_2, ui64_2, si64_2, f_2, d_2, ld_2, (unsigned long)p_2,
|
||||
ui8_3, si8_3, ui16_3, si16_3, ui32_3, si32_3, ui64_3, si64_3, f_3,
|
||||
d_3, ld_3, (unsigned long)p_3, ui8_4, si8_4, ui16_4, si16_4, ui32_4,
|
||||
si32_4, ui64_4, si64_4, f_4, d_4, ld_4, (unsigned long)p_4, ui8_5,
|
||||
si8_5, retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f,
|
||||
retVal.g, retVal.h, retVal.i, retVal.j, retVal.k,
|
||||
(unsigned long)retVal.l, retVal.m, retVal.n, retVal.o, retVal.p,
|
||||
retVal.q, retVal.r, retVal.s, retVal.t, retVal.u, retVal.v,
|
||||
retVal.w, (unsigned long)retVal.x, retVal.y, retVal.z, retVal.aa,
|
||||
retVal.bb, retVal.cc, retVal.dd, retVal.ee, retVal.ff, retVal.gg,
|
||||
retVal.hh, retVal.ii, (unsigned long)retVal.jj, retVal.kk,
|
||||
retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp, retVal.qq,
|
||||
retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv,
|
||||
retVal.ww, retVal.xx);
|
||||
}
|
22
gcc/testsuite/gcc.target/pru/pragma-ctable_entry.c
Normal file
22
gcc/testsuite/gcc.target/pru/pragma-ctable_entry.c
Normal file
@ -0,0 +1,22 @@
|
||||
/* Test specification of custom instructions via command-line options. */
|
||||
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O1" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it LBCO/SBCO operations may
|
||||
not be optimized to the respective instructions. */
|
||||
|
||||
|
||||
#pragma ctable_entry 12 0x48040000
|
||||
|
||||
unsigned int
|
||||
test_ctable (unsigned int val1, unsigned int val2)
|
||||
{
|
||||
((volatile unsigned short int *)0x48040000)[0] = val2;
|
||||
((volatile unsigned int *)0x48040000)[val1] = val2;
|
||||
return ((volatile unsigned int *)0x48040000)[4];
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler "sbco\\tr15.b\[012\]?, 12, 0, 2" } } */
|
||||
/* { dg-final { scan-assembler "sbco\\tr15.b0, 12, r14, 4" } } */
|
||||
/* { dg-final { scan-assembler "lbco\\tr14.b0, 12, 16, 4" } } */
|
41
gcc/testsuite/gcc.target/pru/pru.exp
Normal file
41
gcc/testsuite/gcc.target/pru/pru.exp
Normal file
@ -0,0 +1,41 @@
|
||||
# Copyright (C) 2015-2019 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with GCC; see the file COPYING3. If not see
|
||||
# <http://www.gnu.org/licenses/>.
|
||||
|
||||
# GCC testsuite that uses the `dg.exp' driver.
|
||||
|
||||
# Exit immediately if this isn't a PRU target.
|
||||
if ![istarget pru*-*-*] then {
|
||||
return
|
||||
}
|
||||
|
||||
# Load support procs.
|
||||
load_lib gcc-dg.exp
|
||||
|
||||
# If a testcase doesn't have special options, use these.
|
||||
global DEFAULT_CFLAGS
|
||||
if ![info exists DEFAULT_CFLAGS] then {
|
||||
set DEFAULT_CFLAGS " -ansi -pedantic-errors"
|
||||
}
|
||||
|
||||
# Initialize `dg'.
|
||||
dg-init
|
||||
|
||||
# Main loop.
|
||||
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cCS\]]] \
|
||||
"" $DEFAULT_CFLAGS
|
||||
|
||||
# All done.
|
||||
dg-finish
|
29
gcc/testsuite/gcc.target/pru/qbbc-1.c
Normal file
29
gcc/testsuite/gcc.target/pru/qbbc-1.c
Normal file
@ -0,0 +1,29 @@
|
||||
/* Test QBBC recognition */
|
||||
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-O1" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it bit-check-and-branch
|
||||
operation may not be optimized to QBBC. */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
unsigned int
|
||||
test_qbbc_reg (unsigned int a, unsigned int b, unsigned int val)
|
||||
{
|
||||
if (!(val & (1 << 19)))
|
||||
return a;
|
||||
return b;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char** argv)
|
||||
{
|
||||
if (test_qbbc_reg (101, 505, (1u << 19)) != 505)
|
||||
abort();
|
||||
if (test_qbbc_reg (101, 505, (1u << 18)) != 101)
|
||||
abort();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
15
gcc/testsuite/gcc.target/pru/qbbc-2.c
Normal file
15
gcc/testsuite/gcc.target/pru/qbbc-2.c
Normal file
@ -0,0 +1,15 @@
|
||||
/* Test QBBC recognition */
|
||||
|
||||
/* { dg-options "-O1" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it bit-check-and-branch
|
||||
operation may not be optimized to QBBC. */
|
||||
|
||||
unsigned int
|
||||
test_qbbc_reg (unsigned int a, unsigned int b, unsigned int val)
|
||||
{
|
||||
/* { dg-final { scan-assembler "qbbc\\t.L\[0-9\]*, r16, 19" } } */
|
||||
if (!(val & (1 << 19)))
|
||||
return a;
|
||||
return b;
|
||||
}
|
15
gcc/testsuite/gcc.target/pru/qbbc-3.c
Normal file
15
gcc/testsuite/gcc.target/pru/qbbc-3.c
Normal file
@ -0,0 +1,15 @@
|
||||
/* Test QBBC recognition */
|
||||
|
||||
/* { dg-options "-O1" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it bit-check-and-branch
|
||||
operation may not be optimized to QBBC. */
|
||||
|
||||
unsigned int
|
||||
test_qbbc_reg (unsigned int a, unsigned int b, unsigned short val)
|
||||
{
|
||||
/* { dg-final { scan-assembler "qbbc\\t.L\[0-9\]*, r16.w0, 12" } } */
|
||||
if (!(val & (1 << 12)))
|
||||
return a;
|
||||
return b;
|
||||
}
|
29
gcc/testsuite/gcc.target/pru/qbbs-1.c
Normal file
29
gcc/testsuite/gcc.target/pru/qbbs-1.c
Normal file
@ -0,0 +1,29 @@
|
||||
/* Test QBBS recognition */
|
||||
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-O1" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it bit-check-and-branch
|
||||
operation may not be optimized to QBBS. */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
unsigned int
|
||||
test_qbbs_reg (unsigned int a, unsigned int b, unsigned int val)
|
||||
{
|
||||
if (val & (1 << 19))
|
||||
return a;
|
||||
return b;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char** argv)
|
||||
{
|
||||
if (test_qbbs_reg (101, 505, (1u << 19)) != 101)
|
||||
abort();
|
||||
if (test_qbbs_reg (101, 505, (1u << 18)) != 505)
|
||||
abort();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
15
gcc/testsuite/gcc.target/pru/qbbs-2.c
Normal file
15
gcc/testsuite/gcc.target/pru/qbbs-2.c
Normal file
@ -0,0 +1,15 @@
|
||||
/* Test QBBS recognition */
|
||||
|
||||
/* { dg-options "-O1" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it bit-check-and-branch
|
||||
operation may not be optimized to QBBS. */
|
||||
|
||||
unsigned int
|
||||
test_qbbs_reg (unsigned int a, unsigned int b, unsigned int val)
|
||||
{
|
||||
/* { dg-final { scan-assembler "qbbs\\t.L\[0-9\]*, r16, 19" } } */
|
||||
if (val & (1 << 19))
|
||||
return a;
|
||||
return b;
|
||||
}
|
13
gcc/testsuite/gcc.target/pru/setbit.c
Normal file
13
gcc/testsuite/gcc.target/pru/setbit.c
Normal file
@ -0,0 +1,13 @@
|
||||
/* setbit instruction generation */
|
||||
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O1" } */
|
||||
|
||||
unsigned int
|
||||
test_setbit (unsigned int val)
|
||||
{
|
||||
/* { dg-final { scan-assembler "set\\tr14, r14, 31" } } */
|
||||
val |= (1u << 31);
|
||||
return val;
|
||||
}
|
||||
|
16
gcc/testsuite/gcc.target/pru/zero_extend-and-hisi.c
Normal file
16
gcc/testsuite/gcc.target/pru/zero_extend-and-hisi.c
Normal file
@ -0,0 +1,16 @@
|
||||
/* AND with zero extension of operands.
|
||||
It is matched slightly different than rest of ALU ops. */
|
||||
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O1" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it the zero extension might not
|
||||
be coalesced into the ALU instruction. */
|
||||
|
||||
unsigned int
|
||||
test_zext_and_hi (unsigned short val1, unsigned int val2)
|
||||
{
|
||||
/* { dg-final { scan-assembler "and\\tr14, r14.w0, r15" } } */
|
||||
return val1 & val2;
|
||||
}
|
||||
|
16
gcc/testsuite/gcc.target/pru/zero_extend-and-qihi.c
Normal file
16
gcc/testsuite/gcc.target/pru/zero_extend-and-qihi.c
Normal file
@ -0,0 +1,16 @@
|
||||
/* AND with zero extension of operands.
|
||||
It is matched slightly different than rest of ALU ops. */
|
||||
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O1" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it the zero extension might not
|
||||
be coalesced into the ALU instruction. */
|
||||
|
||||
unsigned int
|
||||
test_zext_and_hi (unsigned char val1, unsigned int val2)
|
||||
{
|
||||
/* { dg-final { scan-assembler "and\\tr14, r14.b0, r15" } } */
|
||||
return val1 & val2;
|
||||
}
|
||||
|
16
gcc/testsuite/gcc.target/pru/zero_extend-and-qisi.c
Normal file
16
gcc/testsuite/gcc.target/pru/zero_extend-and-qisi.c
Normal file
@ -0,0 +1,16 @@
|
||||
/* AND with zero extension of operands.
|
||||
It is matched slightly different than rest of ALU ops. */
|
||||
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O1" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it the zero extension might not
|
||||
be coalesced into the ALU instruction. */
|
||||
|
||||
unsigned int
|
||||
test_zext_and_hi (unsigned char val1, unsigned int val2)
|
||||
{
|
||||
/* { dg-final { scan-assembler "and\\tr14, r14.b0, r15" } } */
|
||||
return val1 & val2;
|
||||
}
|
||||
|
43
gcc/testsuite/gcc.target/pru/zero_extend-hisi.c
Normal file
43
gcc/testsuite/gcc.target/pru/zero_extend-hisi.c
Normal file
@ -0,0 +1,43 @@
|
||||
/* ALU operations with zero extended operands. */
|
||||
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O1" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it the zero extension might not
|
||||
be coalesced into the ALU instruction. */
|
||||
|
||||
unsigned int
|
||||
test_zext_plus_hi (unsigned short val1, unsigned int val2)
|
||||
{
|
||||
/* { dg-final { scan-assembler "add\\tr14, r14.w0, r15" } } */
|
||||
return val1 + val2;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
test_zext_minus_hi (unsigned short val1, unsigned int val2)
|
||||
{
|
||||
/* { dg-final { scan-assembler "sub\\tr14, r14.w0, r15" } } */
|
||||
return val1 - val2;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
test_zext_xor_hi (unsigned short val1, unsigned int val2)
|
||||
{
|
||||
/* { dg-final { scan-assembler "xor\\tr14, r14.w0, r15" } } */
|
||||
return val1 ^ val2;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
test_zext_or_hi (unsigned short val1, unsigned int val2)
|
||||
{
|
||||
/* { dg-final { scan-assembler "or\\tr14, r14.w0, r15" } } */
|
||||
return val1 | val2;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
test_zext_ashl_hi (unsigned short val1, unsigned int val2)
|
||||
{
|
||||
/* { dg-final { scan-assembler "lsl\\tr14, r14.w0, r15" } } */
|
||||
return val1 << val2;
|
||||
}
|
||||
|
43
gcc/testsuite/gcc.target/pru/zero_extend-qihi.c
Normal file
43
gcc/testsuite/gcc.target/pru/zero_extend-qihi.c
Normal file
@ -0,0 +1,43 @@
|
||||
/* ALU operations with zero extended operands. */
|
||||
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O1" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it the zero extension might not
|
||||
be coalesced into the ALU instruction. */
|
||||
|
||||
unsigned int
|
||||
test_zext_plus_hi (unsigned char val1, unsigned short val2)
|
||||
{
|
||||
/* { dg-final { scan-assembler "add\\tr14, r14.b0, r14.w1" } } */
|
||||
return val1 + val2;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
test_zext_minus_hi (unsigned char val1, unsigned short val2)
|
||||
{
|
||||
/* { dg-final { scan-assembler "sub\\tr14, r14.b0, r14.w1" } } */
|
||||
return val1 - val2;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
test_zext_xor_hi (unsigned char val1, unsigned short val2)
|
||||
{
|
||||
/* { dg-final { scan-assembler "xor\\tr14, r14.b0, r14.w1" } } */
|
||||
return val1 ^ val2;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
test_zext_or_hi (unsigned char val1, unsigned short val2)
|
||||
{
|
||||
/* { dg-final { scan-assembler "or\\tr14, r14.b0, r14.w1" } } */
|
||||
return val1 | val2;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
test_zext_ashl_hi (unsigned char val1, unsigned short val2)
|
||||
{
|
||||
/* { dg-final { scan-assembler "lsl\\tr14, r14.b0, r14.w1" } } */
|
||||
return val1 << val2;
|
||||
}
|
||||
|
43
gcc/testsuite/gcc.target/pru/zero_extend-qisi.c
Normal file
43
gcc/testsuite/gcc.target/pru/zero_extend-qisi.c
Normal file
@ -0,0 +1,43 @@
|
||||
/* ALU operations with zero extended operands. */
|
||||
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O1" } */
|
||||
|
||||
/* -O1 in the options is significant. Without it the zero extension might not
|
||||
be coalesced into the ALU instruction. */
|
||||
|
||||
unsigned int
|
||||
test_zext_plus_hi (unsigned char val1, unsigned int val2)
|
||||
{
|
||||
/* { dg-final { scan-assembler "add\\tr14, r14.b0, r15" } } */
|
||||
return val1 + val2;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
test_zext_minus_hi (unsigned char val1, unsigned int val2)
|
||||
{
|
||||
/* { dg-final { scan-assembler "sub\\tr14, r14.b0, r15" } } */
|
||||
return val1 - val2;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
test_zext_xor_hi (unsigned char val1, unsigned int val2)
|
||||
{
|
||||
/* { dg-final { scan-assembler "xor\\tr14, r14.b0, r15" } } */
|
||||
return val1 ^ val2;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
test_zext_or_hi (unsigned char val1, unsigned int val2)
|
||||
{
|
||||
/* { dg-final { scan-assembler "or\\tr14, r14.b0, r15" } } */
|
||||
return val1 | val2;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
test_zext_ashl_hi (unsigned char val1, unsigned int val2)
|
||||
{
|
||||
/* { dg-final { scan-assembler "lsl\\tr14, r14.b0, r15" } } */
|
||||
return val1 << val2;
|
||||
}
|
||||
|
@ -513,7 +513,8 @@ proc check_effective_target_trampolines { } {
|
||||
|| [istarget msp430-*-*]
|
||||
|| [istarget nvptx-*-*]
|
||||
|| [istarget hppa2.0w-hp-hpux11.23]
|
||||
|| [istarget hppa64-hp-hpux11.23] } {
|
||||
|| [istarget hppa64-hp-hpux11.23]
|
||||
|| [istarget pru-*-*] } {
|
||||
return 0;
|
||||
}
|
||||
return 1
|
||||
@ -687,6 +688,7 @@ proc check_profiling_available { test_what } {
|
||||
|| [istarget nvptx-*-*]
|
||||
|| [istarget powerpc-*-eabi*]
|
||||
|| [istarget powerpc-*-elf]
|
||||
|| [istarget pru-*-*]
|
||||
|| [istarget rx-*-*]
|
||||
|| [istarget tic6x-*-elf]
|
||||
|| [istarget visium-*-*]
|
||||
|
Loading…
Reference in New Issue
Block a user