diff options
Diffstat (limited to 'gcc/testsuite/gcc.target/mips/inter')
4 files changed, 391 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.target/mips/inter/mips16-inter.exp b/gcc/testsuite/gcc.target/mips/inter/mips16-inter.exp new file mode 100644 index 000000000..e6ed6b9bc --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/inter/mips16-inter.exp @@ -0,0 +1,72 @@ +# Copyright (C) 2007 Free Software Foundation, Inc. +# +# This file is part of GCC. +# +# GCC 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, or (at your option) +# any later version. +# +# GCC 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/>. + +# Run compatibility tests in which the "alt" compiler tries to force +# MIPS16 mode. + +# We can only guarantee MIPS16 runtime support for certain targets. +if { ![istarget mipsisa*-*-elf*] && ![istarget mips64vr*-*-elf*] } { + return +} + +load_lib gcc-dg.exp + +# Check whether the flags are compatible with MIPS16 code generation. +if { ![check_effective_target_mips16_attribute] } { + return +} + +# Save the old value of CFLAGS_FOR_TARGET, if any. +global saved_CFLAGS_FOR_TARGET +if { [info exists CFLAGS_FOR_TARGET] } { + set saved_CFLAGS_FOR_TARGET $CFLAGS_FOR_TARGET +} else { + unset -nocomplain saved_CFLAGS_FOR_TARGET +} + +# The "alt" compiler is the normal compiler with an extra "-mips16" argument. +proc compat-use-alt-compiler { } { + global saved_CFLAGS_FOR_TARGET CFLAGS_FOR_TARGET + + if { [info exists saved_CFLAGS_FOR_TARGET] } { + set CFLAGS_FOR_TARGET [concat $saved_CFLAGS_FOR_TARGET "-mips16"] + } else { + set CFLAGS_FOR_TARGET "-mips16" + } +} + +# Make the compiler under test the default. +proc compat-use-tst-compiler { } { + global saved_CFLAGS_FOR_TARGET CFLAGS_FOR_TARGET + + if { [info exists saved_CFLAGS_FOR_TARGET] } { + set CFLAGS_FOR_TARGET $saved_CFLAGS_FOR_TARGET + } else { + unset -nocomplain CFLAGS_FOR_TARGET + } +} + +load_lib compat.exp + +gcc_init +foreach src [lsort [find $srcdir/$subdir mips16_*_main.c]] { + if { [runtest_file_p $runtests $src] } { + compat-execute $src "mips16_inter" 1 + } +} +compat-use-tst-compiler diff --git a/gcc/testsuite/gcc.target/mips/inter/mips16_stubs_1_main.c b/gcc/testsuite/gcc.target/mips/inter/mips16_stubs_1_main.c new file mode 100644 index 000000000..df18c7670 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/inter/mips16_stubs_1_main.c @@ -0,0 +1,10 @@ +extern void init (void); +extern void test (void); + +int +main (void) +{ + init (); + test (); + return 0; +} diff --git a/gcc/testsuite/gcc.target/mips/inter/mips16_stubs_1_x.c b/gcc/testsuite/gcc.target/mips/inter/mips16_stubs_1_x.c new file mode 100644 index 000000000..076b399a3 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/inter/mips16_stubs_1_x.c @@ -0,0 +1,176 @@ +#include <stdlib.h> + +/* All the function pointers are declared and initialized in + mips16-stubs-2.c. */ + +extern double the_result; + +extern void v0 (void); +extern void v1 (float); +extern void v5 (float, float); +extern void v9 (float, double); +extern void v2 (double); +extern void v6 (double, float); +extern void v10 (double, double); + +extern float f0 (void); +extern float f1 (float); +extern float f5 (float, float); +extern float f9 (float, double); +extern float f2 (double); +extern float f6 (double, float); +extern float f10 (double, double); + +extern double d0 (void); +extern double d1 (float); +extern double d5 (float, float); +extern double d9 (float, double); +extern double d2 (double); +extern double d6 (double, float); +extern double d10 (double, double); + +extern _Complex float cf0 (void); +extern _Complex float cf1 (float); +extern _Complex float cf5 (float, float); +extern _Complex float cf9 (float, double); +extern _Complex float cf2 (double); +extern _Complex float cf6 (double, float); +extern _Complex float cf10 (double, double); + +extern _Complex double cd0 (void); +extern _Complex double cd1 (float); +extern _Complex double cd5 (float, float); +extern _Complex double cd9 (float, double); +extern _Complex double cd2 (double); +extern _Complex double cd6 (double, float); +extern _Complex double cd10 (double, double); + +extern void (*pv0) (void); +extern void (*pv1) (float); +extern void (*pv5) (float, float); +extern void (*pv9) (float, double); +extern void (*pv2) (double); +extern void (*pv6) (double, float); +extern void (*pv10) (double, double); + +extern float (*pf0) (void); +extern float (*pf1) (float); +extern float (*pf5) (float, float); +extern float (*pf9) (float, double); +extern float (*pf2) (double); +extern float (*pf6) (double, float); +extern float (*pf10) (double, double); + +extern double (*pd0) (void); +extern double (*pd1) (float); +extern double (*pd5) (float, float); +extern double (*pd9) (float, double); +extern double (*pd2) (double); +extern double (*pd6) (double, float); +extern double (*pd10) (double, double); + +extern _Complex float (*pcf0) (void); +extern _Complex float (*pcf1) (float); +extern _Complex float (*pcf5) (float, float); +extern _Complex float (*pcf9) (float, double); +extern _Complex float (*pcf2) (double); +extern _Complex float (*pcf6) (double, float); +extern _Complex float (*pcf10) (double, double); + +extern _Complex double (*pcd0) (void); +extern _Complex double (*pcd1) (float); +extern _Complex double (*pcd5) (float, float); +extern _Complex double (*pcd9) (float, double); +extern _Complex double (*pcd2) (double); +extern _Complex double (*pcd6) (double, float); +extern _Complex double (*pcd10) (double, double); + +/* Macros for results checking. */ +#define CHECK_RESULT(x, y) if ((x) != (y)) abort () +#define CHECK_VOID_RESULT(x, y) CHECK_RESULT (((x), the_result), y) + +/* Call functions through pointers and and check against expected results. */ +void +test (void) +{ + + CHECK_VOID_RESULT (v0 (), 1.0); + CHECK_VOID_RESULT (v1 (1.0), 2.0); + CHECK_VOID_RESULT (v5 (5.0, 6.0), 12.0); + CHECK_VOID_RESULT (v9 (9.0, 10.0), 20.0); + CHECK_VOID_RESULT (v2 (2.0), 3.0); + CHECK_VOID_RESULT (v6 (6.0, 7.0), 14.0); + CHECK_VOID_RESULT (v10 (10.0, 11.0), 22.0); + + CHECK_RESULT (f0 (), 1.0); + CHECK_RESULT (f1 (1.0), 2.0); + CHECK_RESULT (f5 (5.0, 6.0), 12.0); + CHECK_RESULT (f9 (9.0, 10.0), 20.0); + CHECK_RESULT (f2 (2.0), 3.0); + CHECK_RESULT (f6 (6.0, 7.0), 14.0); + CHECK_RESULT (f10 (10.0, 11.0), 22.0); + + CHECK_RESULT (d0 (), 1.0); + CHECK_RESULT (d1 (1.0), 2.0); + CHECK_RESULT (d5 (5.0, 6.0), 12.0); + CHECK_RESULT (d9 (9.0, 10.0), 20.0); + CHECK_RESULT (d2 (2.0), 3.0); + CHECK_RESULT (d6 (6.0, 7.0), 14.0); + CHECK_RESULT (d10 (10.0, 11.0), 22.0); + + CHECK_RESULT (cf0 (), 1.0 + 0.0i); + CHECK_RESULT (cf1 (1.0), 2.0 + 1.0i); + CHECK_RESULT (cf5 (5.0, 6.0), 12.0 + 5.0i); + CHECK_RESULT (cf9 (9.0, 10.0), 20.0 + 9.0i); + CHECK_RESULT (cf2 (2.0), 3.0 + 2.0i); + CHECK_RESULT (cf6 (6.0, 7.0), 14.0 + 6.0i); + CHECK_RESULT (cf10 (10.0, 11.0), 22.0 + 10.0i); + + CHECK_RESULT (cd0 (), 1.0 + 0.0i); + CHECK_RESULT (cd1 (1.0), 2.0 + 1.0i); + CHECK_RESULT (cd5 (5.0, 6.0), 12.0 + 5.0i); + CHECK_RESULT (cd9 (9.0, 10.0), 20.0 + 9.0i); + CHECK_RESULT (cd2 (2.0), 3.0 + 2.0i); + CHECK_RESULT (cd6 (6.0, 7.0), 14.0 + 6.0i); + CHECK_RESULT (cd10 (10.0, 11.0), 22.0 + 10.0i); + + CHECK_VOID_RESULT ((*pv0) (), 1.0); + CHECK_VOID_RESULT ((*pv1) (1.0), 2.0); + CHECK_VOID_RESULT ((*pv5) (5.0, 6.0), 12.0); + CHECK_VOID_RESULT ((*pv9) (9.0, 10.0), 20.0); + CHECK_VOID_RESULT ((*pv2) (2.0), 3.0); + CHECK_VOID_RESULT ((*pv6) (6.0, 7.0), 14.0); + CHECK_VOID_RESULT ((*pv10) (10.0, 11.0), 22.0); + + CHECK_RESULT ((*pf0) (), 1.0); + CHECK_RESULT ((*pf1) (1.0), 2.0); + CHECK_RESULT ((*pf5) (5.0, 6.0), 12.0); + CHECK_RESULT ((*pf9) (9.0, 10.0), 20.0); + CHECK_RESULT ((*pf2) (2.0), 3.0); + CHECK_RESULT ((*pf6) (6.0, 7.0), 14.0); + CHECK_RESULT ((*pf10) (10.0, 11.0), 22.0); + + CHECK_RESULT ((*pd0) (), 1.0); + CHECK_RESULT ((*pd1) (1.0), 2.0); + CHECK_RESULT ((*pd5) (5.0, 6.0), 12.0); + CHECK_RESULT ((*pd9) (9.0, 10.0), 20.0); + CHECK_RESULT ((*pd2) (2.0), 3.0); + CHECK_RESULT ((*pd6) (6.0, 7.0), 14.0); + CHECK_RESULT ((*pd10) (10.0, 11.0), 22.0); + + CHECK_RESULT ((*pcf0) (), 1.0 + 0.0i); + CHECK_RESULT ((*pcf1) (1.0), 2.0 + 1.0i); + CHECK_RESULT ((*pcf5) (5.0, 6.0), 12.0 + 5.0i); + CHECK_RESULT ((*pcf9) (9.0, 10.0), 20.0 + 9.0i); + CHECK_RESULT ((*pcf2) (2.0), 3.0 + 2.0i); + CHECK_RESULT ((*pcf6) (6.0, 7.0), 14.0 + 6.0i); + CHECK_RESULT ((*pcf10) (10.0, 11.0), 22.0 + 10.0i); + + CHECK_RESULT ((*pcd0) (), 1.0 + 0.0i); + CHECK_RESULT ((*pcd1) (1.0), 2.0 + 1.0i); + CHECK_RESULT ((*pcd5) (5.0, 6.0), 12.0 + 5.0i); + CHECK_RESULT ((*pcd9) (9.0, 10.0), 20.0 + 9.0i); + CHECK_RESULT ((*pcd2) (2.0), 3.0 + 2.0i); + CHECK_RESULT ((*pcd6) (6.0, 7.0), 14.0 + 6.0i); + CHECK_RESULT ((*pcd10) (10.0, 11.0), 22.0 + 10.0i); +} diff --git a/gcc/testsuite/gcc.target/mips/inter/mips16_stubs_1_y.c b/gcc/testsuite/gcc.target/mips/inter/mips16_stubs_1_y.c new file mode 100644 index 000000000..b7a4d7f32 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/inter/mips16_stubs_1_y.c @@ -0,0 +1,133 @@ +/* All test functions return the sum of arguments, plus 1. + Void-returning functions put the result in the_result. + Complex-returning functions return their signature number as the + (constant) imaginary part of the result. */ + +double the_result; + +void v0 (void) { the_result = 1.0; } +void v1 (float x) { the_result = 1.0 + x; } +void v5 (float x, float y) { the_result = 1.0 + x + y; } +void v9 (float x, double y) { the_result = 1.0 + x + y; } +void v2 (double x) { the_result = 1.0 + x; } +void v6 (double x, float y) { the_result = 1.0 + x + y; } +void v10 (double x, double y) { the_result = 1.0 + x + y; } + +float f0 (void) { return 1.0; } +float f1 (float x) { return 1.0 + x; } +float f5 (float x, float y) { return 1.0 + x + y; } +float f9 (float x, double y) { return 1.0 + x + y; } +float f2 (double x) { return 1.0 + x; } +float f6 (double x, float y) { return 1.0 + x + y; } +float f10 (double x, double y) { return 1.0 + x + y; } + +double d0 (void) { return 1.0; } +double d1 (float x) { return 1.0 + x; } +double d5 (float x, float y) { return 1.0 + x + y; } +double d9 (float x, double y) { return 1.0 + x + y; } +double d2 (double x) { return 1.0 + x; } +double d6 (double x, float y) { return 1.0 + x + y; } +double d10 (double x, double y) { return 1.0 + x + y; } + +_Complex float cf0 (void) { return 1.0 + 0.0i; } +_Complex float cf1 (float x) { return 1.0 + x + 1.0i; } +_Complex float cf5 (float x, float y) { return 1.0 + x + y + 5.0i; } +_Complex float cf9 (float x, double y) { return 1.0 + x + y + 9.0i; } +_Complex float cf2 (double x) { return 1.0 + x + 2.0i; } +_Complex float cf6 (double x, float y) { return 1.0 + x + y + 6.0i; } +_Complex float cf10 (double x, double y) { return 1.0 + x + y + 10.0i; } + +_Complex double cd0 (void) { return 1.0 + 0.0i; } +_Complex double cd1 (float x) { return 1.0 + x + 1.0i; } +_Complex double cd5 (float x, float y) { return 1.0 + x + y + 5.0i; } +_Complex double cd9 (float x, double y) { return 1.0 + x + y + 9.0i; } +_Complex double cd2 (double x) { return 1.0 + x + 2.0i; } +_Complex double cd6 (double x, float y) { return 1.0 + x + y + 6.0i; } +_Complex double cd10 (double x, double y) { return 1.0 + x + y + 10.0i; } + + +/* Declare and initialize all the pointer-to-function variables. */ + +void (*pv0) (void); +void (*pv1) (float); +void (*pv5) (float, float); +void (*pv9) (float, double); +void (*pv2) (double); +void (*pv6) (double, float); +void (*pv10) (double, double); + +float (*pf0) (void); +float (*pf1) (float); +float (*pf5) (float, float); +float (*pf9) (float, double); +float (*pf2) (double); +float (*pf6) (double, float); +float (*pf10) (double, double); + +double (*pd0) (void); +double (*pd1) (float); +double (*pd5) (float, float); +double (*pd9) (float, double); +double (*pd2) (double); +double (*pd6) (double, float); +double (*pd10) (double, double); + +_Complex float (*pcf0) (void); +_Complex float (*pcf1) (float); +_Complex float (*pcf5) (float, float); +_Complex float (*pcf9) (float, double); +_Complex float (*pcf2) (double); +_Complex float (*pcf6) (double, float); +_Complex float (*pcf10) (double, double); + +_Complex double (*pcd0) (void); +_Complex double (*pcd1) (float); +_Complex double (*pcd5) (float, float); +_Complex double (*pcd9) (float, double); +_Complex double (*pcd2) (double); +_Complex double (*pcd6) (double, float); +_Complex double (*pcd10) (double, double); + +void +init (void) +{ + pv0 = v0; + pv1 = v1; + pv5 = v5; + pv9 = v9; + pv2 = v2; + pv6 = v6; + pv10 = v10; + + pf0 = f0; + pf1 = f1; + pf5 = f5; + pf9 = f9; + pf2 = f2; + pf6 = f6; + pf10 = f10; + + pd0 = d0; + pd1 = d1; + pd5 = d5; + pd9 = d9; + pd2 = d2; + pd6 = d6; + pd10 = d10; + + pcf0 = cf0; + pcf1 = cf1; + pcf5 = cf5; + pcf9 = cf9; + pcf2 = cf2; + pcf6 = cf6; + pcf10 = cf10; + + pcd0 = cd0; + pcd1 = cd1; + pcd5 = cd5; + pcd9 = cd9; + pcd2 = cd2; + pcd6 = cd6; + pcd10 = cd10; +} |