Commit 6cbc6f0d by Chao-ying Fu Committed by Jim Wilson

Add MIPS-3D and MIPS PS testcases from Chao-ying Fu.

From-SVN: r86982
parent 98599ff8
2004-09-02 Chao-ying Fu <fu@mips.com>
* gcc.target/mips/mips-3d-1.c: New test.
* gcc.target/mips/mips-3d-2.c: New test.
* gcc.target/mips/mips-3d-3.c: New test.
* gcc.target/mips/mips-3d-4.c: New test.
* gcc.target/mips/mips-3d-5.c: New test.
* gcc.target/mips/mips-3d-6.c: New test.
* gcc.target/mips/mips-3d-7.c: New test.
* gcc.target/mips/mips-3d-8.c: New test.
* gcc.target/mips/mips-3d-9.c: New test.
* gcc.target/mips/mips-ps-1.c: New test.
* gcc.target/mips/mips-ps-2.c: New test.
* gcc.target/mips/mips-ps-3.c: New test.
* gcc.target/mips/mips-ps-4.c: New test.
* gcc.target/mips/mips-ps-type.c: New test.
2004-09-02 Paul Brook <paul@codesourcery.com> 2004-09-02 Paul Brook <paul@codesourcery.com>
* gfortran.dg/edit_real_1.f90: Add new tests. * gfortran.dg/edit_real_1.f90: Add new tests.
......
/* { dg-do run { target mipsisa64*-*-* } } */
/* { dg-options "-mips64 -O2 -mips3d -mhard-float -mfp64" } */
/* Test MIPS-3D builtin functions */
#include <stdlib.h>
#include <stdio.h>
typedef float v2sf __attribute__ ((vector_size(8)));
int main ()
{
int little_endian;
v2sf a, b, c, d;
float f1, f2, f3, f4, f5, f6;
double d1, d2, d3, d4, d5, d6, d7, d8, d9;
v2sf ps1, ps2, ps3, ps4, ps5, ps6;
union { long long ll; int i[2]; } endianness_test;
endianness_test.ll = 1;
little_endian = endianness_test.i[0];
/* addr.ps */
a = (v2sf) {12, 34};
b = (v2sf) {45, 67};
c = __builtin_mips_addr_ps (a, b);
if (little_endian)
d = (v2sf) {112, 46};
else
d = (v2sf) {46, 112};
if (!__builtin_mips_all_c_eq_ps(c, d))
abort ();
/* mulr.ps */
a = (v2sf) {12, 34};
b = (v2sf) {45, 67};
c = __builtin_mips_mulr_ps (a, b);
if (little_endian)
d = (v2sf) {3015, 408};
else
d = (v2sf) {408, 3015};
if (!__builtin_mips_all_c_eq_ps(c, d))
abort ();
/* cvt.pw.ps */
a = (v2sf) {12345.34, 67890.45};
b = __builtin_mips_cvt_pw_ps (a);
/* cvt.ps.pw */
c = __builtin_mips_cvt_ps_pw (b);
d = (v2sf) {12345.0, 67890.0};
if (!__builtin_mips_all_c_eq_ps(c, d))
abort ();
/* recip1.s recip2.s */
f1 = 40;
f2 = __builtin_mips_recip1_s (f1);
f3 = __builtin_mips_recip2_s (f2, f1);
f4 = f2 + f2 * f3;
f5 = 0.025;
if (f4 != f5)
abort ();
/* recip1.d recip2.d */
d1 = 80;
d2 = __builtin_mips_recip1_d (d1);
d3 = __builtin_mips_recip2_d (d2, d1);
d4 = d2 + d2 * d3;
d5 = __builtin_mips_recip2_d (d4, d1);
d6 = d4 + d4 * d5;
d7 = 0.0125;
if (d6 != d7)
abort ();
/* recip1.ps recip2.ps */
ps1 = (v2sf) {100, 200};
ps2 = __builtin_mips_recip1_ps (ps1);
ps3 = __builtin_mips_recip2_ps (ps2, ps1);
ps4 = ps2 + ps2 * ps3;
ps5 = (v2sf) {0.01, 0.005};
if (!__builtin_mips_all_c_eq_ps(ps4, ps5))
abort ();
/* rsqrt1.s rsqrt2.s */
f1 = 400;
f2 = __builtin_mips_rsqrt1_s (f1);
f3 = f2 * f1;
f4 = __builtin_mips_rsqrt2_s (f3, f2);
f5 = f2 + f2 * f4;
f6 = 0.05;
if (f5 != f6)
abort ();
/* rsqrt1.d rsqrt2.d */
d1 = 1600;
d2 = __builtin_mips_rsqrt1_d (d1);
d3 = d2 * d1;
d4 = __builtin_mips_rsqrt2_d (d3, d2);
d5 = d2 + d2 * d4;
d6 = d1 * d5;
d7 = __builtin_mips_rsqrt2_d (d6, d5);
d8 = d5 + d5 * d7;
d9 = 0.025;
if (d8 != d9)
abort ();
/* rsqrt1.ps rsqrt2.ps */
ps1 = (v2sf) {400, 100};
ps2 = __builtin_mips_rsqrt1_ps (ps1);
ps3 = ps2 * ps1;
ps4 = __builtin_mips_rsqrt2_ps (ps3, ps2);
ps5 = ps2 + ps2 * ps4;
ps6 = (v2sf) {0.05, 0.1};
if (!__builtin_mips_all_c_eq_ps(ps5, ps6))
abort ();
printf ("Test Passes\n");
exit (0);
}
/* { dg-do run { target mipsisa64*-*-* } } */
/* { dg-options "-mips64 -O2 -mips3d -mhard-float -mfp64" } */
/* Test MIPS-3D branch-if-any-two builtin functions */
#include <stdlib.h>
#include <stdio.h>
typedef float v2sf __attribute__ ((vector_size(8)));
int test0 (v2sf a, v2sf b);
int test1 (v2sf a, v2sf b);
int test2 (v2sf a, v2sf b);
int test3 (v2sf a, v2sf b);
int test4 (v2sf a, v2sf b);
int test5 (v2sf a, v2sf b);
int test6 (v2sf a, v2sf b);
int test7 (v2sf a, v2sf b);
int test8 (v2sf a, v2sf b);
int test9 (v2sf a, v2sf b);
int test10 (v2sf a, v2sf b);
int test11 (v2sf a, v2sf b);
int test12 (v2sf a, v2sf b);
int test13 (v2sf a, v2sf b);
int test14 (v2sf a, v2sf b);
int test15 (v2sf a, v2sf b);
int test16 (v2sf a, v2sf b);
int test17 (v2sf a, v2sf b);
int test18 (v2sf a, v2sf b);
int test19 (v2sf a, v2sf b);
int test20 (v2sf a, v2sf b);
int test21 (v2sf a, v2sf b);
int test22 (v2sf a, v2sf b);
int test23 (v2sf a, v2sf b);
int test24 (v2sf a, v2sf b);
int test25 (v2sf a, v2sf b);
int test26 (v2sf a, v2sf b);
int test27 (v2sf a, v2sf b);
int test28 (v2sf a, v2sf b);
int test29 (v2sf a, v2sf b);
int test30 (v2sf a, v2sf b);
int test31 (v2sf a, v2sf b);
float qnan = 1.0f/0.0f - 1.0f/0.0f;
int main ()
{
v2sf a, b, c, d;
int i, j;
/* c.eq.ps */
a = (v2sf) {12, 34};
b = (v2sf) {56, 78};
i = 0;
j = 0;
if (__builtin_mips_any_c_eq_ps(a, b) != i)
abort ();
if (__builtin_mips_all_c_eq_ps(a, b) != j)
abort ();
/* c.eq.ps */
a = (v2sf) {12, 34};
b = (v2sf) {12, 78};
i = 1;
j = 0;
if (__builtin_mips_any_c_eq_ps(a, b) != i)
abort ();
if (__builtin_mips_all_c_eq_ps(a, b) != j)
abort ();
/* c.eq.ps */
a = (v2sf) {12, 34};
b = (v2sf) {56, 34};
i = 1;
j = 0;
if (__builtin_mips_any_c_eq_ps(a, b) != i)
abort ();
if (__builtin_mips_all_c_eq_ps(a, b) != j)
abort ();
/* c.eq.ps */
a = (v2sf) {12, 34};
b = (v2sf) {12, 34};
i = 1;
j = 1;
if (__builtin_mips_any_c_eq_ps(a, b) != i)
abort ();
if (__builtin_mips_all_c_eq_ps(a, b) != j)
abort ();
/* Test with 16 operators */
a = (v2sf) {10.58, 1984.0};
b = (v2sf) {567.345, 1984.0};
i = test0 (a, b);
if (i != 0)
abort ();
i = test1 (a, b);
if (i != 0)
abort ();
i = test2 (a, b);
if (i != 0)
abort ();
i = test3 (a, b);
if (i != 0)
abort ();
i = test4 (a, b);
if (i != 1)
abort ();
i = test5 (a, b);
if (i != 0)
abort ();
i = test6 (a, b);
if (i != 1)
abort ();
i = test7 (a, b);
if (i != 0)
abort ();
i = test8 (a, b);
if (i != 1)
abort ();
i = test9 (a, b);
if (i != 0)
abort ();
i = test10 (a, b);
if (i != 1)
abort ();
i = test11 (a, b);
if (i != 0)
abort ();
i = test12 (a, b);
if (i != 1)
abort ();
i = test13 (a, b);
if (i != 1)
abort ();
i = test14 (a, b);
if (i != 1)
abort ();
i = test15 (a, b);
if (i != 1)
abort ();
i = test16 (a, b);
if (i != 0)
abort ();
i = test17 (a, b);
if (i != 0)
abort ();
i = test18 (a, b);
if (i != 0)
abort ();
i = test19 (a, b);
if (i != 0)
abort ();
i = test20 (a, b);
if (i != 1)
abort ();
i = test21 (a, b);
if (i != 0)
abort ();
i = test22 (a, b);
if (i != 1)
abort ();
i = test23 (a, b);
if (i != 0)
abort ();
i = test24 (a, b);
if (i != 1)
abort ();
i = test25 (a, b);
if (i != 0)
abort ();
i = test26 (a, b);
if (i != 1)
abort ();
i = test27 (a, b);
if (i != 0)
abort ();
i = test28 (a, b);
if (i != 1)
abort ();
i = test29 (a, b);
if (i != 1)
abort ();
i = test30 (a, b);
if (i != 1)
abort ();
i = test31 (a, b);
if (i != 1)
abort ();
/* Reverse arguments */
i = test0 (b, a);
if (i != 0)
abort ();
i = test1 (b, a);
if (i != 0)
abort ();
i = test2 (b, a);
if (i != 0)
abort ();
i = test3 (b, a);
if (i != 0)
abort ();
i = test4 (b, a);
if (i != 1)
abort ();
i = test5 (b, a);
if (i != 0)
abort ();
i = test6 (b, a);
if (i != 1)
abort ();
i = test7 (b, a);
if (i != 0)
abort ();
i = test8 (b, a);
if (i != 0)
abort ();
i = test9 (b, a);
if (i != 0)
abort ();
i = test10 (b, a);
if (i != 0)
abort ();
i = test11 (b, a);
if (i != 0)
abort ();
i = test12 (b, a);
if (i != 1)
abort ();
i = test13 (b, a);
if (i != 0)
abort ();
i = test14 (b, a);
if (i != 1)
abort ();
i = test15 (b, a);
if (i != 0)
abort ();
i = test16 (b, a);
if (i != 0)
abort ();
i = test17 (b, a);
if (i != 0)
abort ();
i = test18 (b, a);
if (i != 0)
abort ();
i = test19 (b, a);
if (i != 0)
abort ();
i = test20 (b, a);
if (i != 1)
abort ();
i = test21 (b, a);
if (i != 0)
abort ();
i = test22 (b, a);
if (i != 1)
abort ();
i = test23 (b, a);
if (i != 0)
abort ();
i = test24 (b, a);
if (i != 0)
abort ();
i = test25 (b, a);
if (i != 0)
abort ();
i = test26 (b, a);
if (i != 0)
abort ();
i = test27 (b, a);
if (i != 0)
abort ();
i = test28 (b, a);
if (i != 1)
abort ();
i = test29 (b, a);
if (i != 0)
abort ();
i = test30 (b, a);
if (i != 1)
abort ();
i = test31 (b, a);
if (i != 0)
abort ();
#ifndef __FAST_MATH__
/* Test with 16 operators */
a = (v2sf) {qnan, qnan};
b = (v2sf) {567.345, 1984.0};
i = test0 (a, b);
if (i != 0)
abort ();
i = test1 (a, b);
if (i != 0)
abort ();
i = test2 (a, b);
if (i != 1)
abort ();
i = test3 (a, b);
if (i != 1)
abort ();
i = test4 (a, b);
if (i != 0)
abort ();
i = test5 (a, b);
if (i != 0)
abort ();
i = test6 (a, b);
if (i != 1)
abort ();
i = test7 (a, b);
if (i != 1)
abort ();
i = test8 (a, b);
if (i != 0)
abort ();
i = test9 (a, b);
if (i != 0)
abort ();
i = test10 (a, b);
if (i != 1)
abort ();
i = test11 (a, b);
if (i != 1)
abort ();
i = test12 (a, b);
if (i != 0)
abort ();
i = test13 (a, b);
if (i != 0)
abort ();
i = test14 (a, b);
if (i != 1)
abort ();
i = test15 (a, b);
if (i != 1)
abort ();
i = test16 (a, b);
if (i != 0)
abort ();
i = test17 (a, b);
if (i != 0)
abort ();
i = test18 (a, b);
if (i != 1)
abort ();
i = test19 (a, b);
if (i != 1)
abort ();
i = test20 (a, b);
if (i != 0)
abort ();
i = test21 (a, b);
if (i != 0)
abort ();
i = test22 (a, b);
if (i != 1)
abort ();
i = test23 (a, b);
if (i != 1)
abort ();
i = test24 (a, b);
if (i != 0)
abort ();
i = test25 (a, b);
if (i != 0)
abort ();
i = test26 (a, b);
if (i != 1)
abort ();
i = test27 (a, b);
if (i != 1)
abort ();
i = test28 (a, b);
if (i != 0)
abort ();
i = test29 (a, b);
if (i != 0)
abort ();
i = test30 (a, b);
if (i != 1)
abort ();
i = test31 (a, b);
if (i != 1)
abort ();
#endif
printf ("Test Passes\n");
exit (0);
}
int test0 (v2sf a, v2sf b)
{
return __builtin_mips_any_c_f_ps (a, b);
}
int test1 (v2sf a, v2sf b)
{
return __builtin_mips_all_c_f_ps (a, b);
}
int test2 (v2sf a, v2sf b)
{
return __builtin_mips_any_c_un_ps (a, b);
}
int test3 (v2sf a, v2sf b)
{
return __builtin_mips_all_c_un_ps (a, b);
}
int test4 (v2sf a, v2sf b)
{
return __builtin_mips_any_c_eq_ps (a, b);
}
int test5 (v2sf a, v2sf b)
{
return __builtin_mips_all_c_eq_ps (a, b);
}
int test6 (v2sf a, v2sf b)
{
return __builtin_mips_any_c_ueq_ps (a, b);
}
int test7 (v2sf a, v2sf b)
{
return __builtin_mips_all_c_ueq_ps (a, b);
}
int test8 (v2sf a, v2sf b)
{
return __builtin_mips_any_c_olt_ps (a, b);
}
int test9 (v2sf a, v2sf b)
{
return __builtin_mips_all_c_olt_ps (a, b);
}
int test10 (v2sf a, v2sf b)
{
return __builtin_mips_any_c_ult_ps (a, b);
}
int test11 (v2sf a, v2sf b)
{
return __builtin_mips_all_c_ult_ps (a, b);
}
int test12 (v2sf a, v2sf b)
{
return __builtin_mips_any_c_ole_ps (a, b);
}
int test13 (v2sf a, v2sf b)
{
return __builtin_mips_all_c_ole_ps (a, b);
}
int test14 (v2sf a, v2sf b)
{
return __builtin_mips_any_c_ule_ps (a, b);
}
int test15 (v2sf a, v2sf b)
{
return __builtin_mips_all_c_ule_ps (a, b);
}
int test16 (v2sf a, v2sf b)
{
return __builtin_mips_any_c_sf_ps (a, b);
}
int test17 (v2sf a, v2sf b)
{
return __builtin_mips_all_c_sf_ps (a, b);
}
int test18 (v2sf a, v2sf b)
{
return __builtin_mips_any_c_ngle_ps (a, b);
}
int test19 (v2sf a, v2sf b)
{
return __builtin_mips_all_c_ngle_ps (a, b);
}
int test20 (v2sf a, v2sf b)
{
return __builtin_mips_any_c_seq_ps (a, b);
}
int test21 (v2sf a, v2sf b)
{
return __builtin_mips_all_c_seq_ps (a, b);
}
int test22 (v2sf a, v2sf b)
{
return __builtin_mips_any_c_ngl_ps (a, b);
}
int test23 (v2sf a, v2sf b)
{
return __builtin_mips_all_c_ngl_ps (a, b);
}
int test24 (v2sf a, v2sf b)
{
return __builtin_mips_any_c_lt_ps (a, b);
}
int test25 (v2sf a, v2sf b)
{
return __builtin_mips_all_c_lt_ps (a, b);
}
int test26 (v2sf a, v2sf b)
{
return __builtin_mips_any_c_nge_ps (a, b);
}
int test27 (v2sf a, v2sf b)
{
return __builtin_mips_all_c_nge_ps (a, b);
}
int test28 (v2sf a, v2sf b)
{
return __builtin_mips_any_c_le_ps (a, b);
}
int test29 (v2sf a, v2sf b)
{
return __builtin_mips_all_c_le_ps (a, b);
}
int test30 (v2sf a, v2sf b)
{
return __builtin_mips_any_c_ngt_ps (a, b);
}
int test31 (v2sf a, v2sf b)
{
return __builtin_mips_all_c_ngt_ps (a, b);
}
/* { dg-do run { target mipsisa64*-*-* } } */
/* { dg-options "-mips64 -O2 -mips3d -mhard-float -mfp64" } */
/* Test MIPS-3D absolute compare (floats) builtin functions */
#include <stdlib.h>
#include <stdio.h>
int test0 (float a, float b);
int test1 (float a, float b);
int test2 (float a, float b);
int test3 (float a, float b);
int test4 (float a, float b);
int test5 (float a, float b);
int test6 (float a, float b);
int test7 (float a, float b);
int test8 (float a, float b);
int test9 (float a, float b);
int test10 (float a, float b);
int test11 (float a, float b);
int test12 (float a, float b);
int test13 (float a, float b);
int test14 (float a, float b);
int test15 (float a, float b);
int main ()
{
float a, b;
int i;
/* cabs.eq.s */
a = 12;
b = -56;
i = 0;
if (__builtin_mips_cabs_eq_s(a, b) != i)
abort ();
/* cabs.eq.s */
a = 12;
b = -12;
i = 1;
if (__builtin_mips_cabs_eq_s(a, b) != i)
abort ();
/* Test all comparisons */
a = 10.58;
b = 567.345;
i = test0 (a, b);
if (i != 0)
abort ();
i = test1 (a, b);
if (i != 0)
abort ();
i = test2 (a, b);
if (i != 0)
abort ();
i = test3 (a, b);
if (i != 0)
abort ();
i = test4 (a, b);
if (i != 1)
abort ();
i = test5 (a, b);
if (i != 1)
abort ();
i = test6 (a, b);
if (i != 1)
abort ();
i = test7 (a, b);
if (i != 1)
abort ();
i = test8 (a, b);
if (i != 0)
abort ();
i = test9 (a, b);
if (i != 0)
abort ();
i = test10 (a, b);
if (i != 0)
abort ();
i = test11 (a, b);
if (i != 0)
abort ();
i = test12 (a, b);
if (i != 1)
abort ();
i = test13 (a, b);
if (i != 1)
abort ();
i = test14 (a, b);
if (i != 1)
abort ();
i = test15 (a, b);
if (i != 1)
abort ();
/* Reversed arguments */
i = test0 (b, a);
if (i != 0)
abort ();
i = test1 (b, a);
if (i != 0)
abort ();
i = test2 (b, a);
if (i != 0)
abort ();
i = test3 (b, a);
if (i != 0)
abort ();
i = test4 (b, a);
if (i != 0)
abort ();
i = test5 (b, a);
if (i != 0)
abort ();
i = test6 (b, a);
if (i != 0)
abort ();
i = test7 (b, a);
if (i != 0)
abort ();
i = test8 (b, a);
if (i != 0)
abort ();
i = test9 (b, a);
if (i != 0)
abort ();
i = test10 (b, a);
if (i != 0)
abort ();
i = test11 (b, a);
if (i != 0)
abort ();
i = test12 (b, a);
if (i != 0)
abort ();
i = test13 (b, a);
if (i != 0)
abort ();
i = test14 (b, a);
if (i != 0)
abort ();
i = test15 (b, a);
if (i != 0)
abort ();
#ifndef __FAST_MATH__
/* Test all comparisons */
a = 1.0f/0.0f - 1.0f/0.0f; // QNaN
b = 567.345;
i = test0 (a, b);
if (i != 0)
abort ();
i = test1 (a, b);
if (i != 1)
abort ();
i = test2 (a, b);
if (i != 0)
abort ();
i = test3 (a, b);
if (i != 1)
abort ();
i = test4 (a, b);
if (i != 0)
abort ();
i = test5 (a, b);
if (i != 1)
abort ();
i = test6 (a, b);
if (i != 0)
abort ();
i = test7 (a, b);
if (i != 1)
abort ();
i = test8 (a, b);
if (i != 0)
abort ();
i = test9 (a, b);
if (i != 1)
abort ();
i = test10 (a, b);
if (i != 0)
abort ();
i = test11 (a, b);
if (i != 1)
abort ();
i = test12 (a, b);
if (i != 0)
abort ();
i = test13 (a, b);
if (i != 1)
abort ();
i = test14 (a, b);
if (i != 0)
abort ();
i = test15 (a, b);
if (i != 1)
abort ();
#endif
printf ("Test Passes\n");
exit (0);
}
int test0 (float a, float b)
{
return __builtin_mips_cabs_f_s (a, b);
}
int test1 (float a, float b)
{
return __builtin_mips_cabs_un_s (a, b);
}
int test2 (float a, float b)
{
return __builtin_mips_cabs_eq_s (a, b);
}
int test3 (float a, float b)
{
return __builtin_mips_cabs_ueq_s (a, b);
}
int test4 (float a, float b)
{
return __builtin_mips_cabs_olt_s (a, b);
}
int test5 (float a, float b)
{
return __builtin_mips_cabs_ult_s (a, b);
}
int test6 (float a, float b)
{
return __builtin_mips_cabs_ole_s (a, b);
}
int test7 (float a, float b)
{
return __builtin_mips_cabs_ule_s (a, b);
}
int test8 (float a, float b)
{
return __builtin_mips_cabs_sf_s (a, b);
}
int test9 (float a, float b)
{
return __builtin_mips_cabs_ngle_s (a, b);
}
int test10 (float a, float b)
{
return __builtin_mips_cabs_seq_s (a, b);
}
int test11 (float a, float b)
{
return __builtin_mips_cabs_ngl_s (a, b);
}
int test12 (float a, float b)
{
return __builtin_mips_cabs_lt_s (a, b);
}
int test13 (float a, float b)
{
return __builtin_mips_cabs_nge_s (a, b);
}
int test14 (float a, float b)
{
return __builtin_mips_cabs_le_s (a, b);
}
int test15 (float a, float b)
{
return __builtin_mips_cabs_ngt_s (a, b);
}
/* { dg-do run { target mipsisa64*-*-* } } */
/* { dg-options "-mips64 -O2 -mips3d -mhard-float -mfp64" } */
/* Test MIPS-3D absolute compare (doubles) builtin functions */
#include <stdlib.h>
#include <stdio.h>
int test0 (double a, double b);
int test1 (double a, double b);
int test2 (double a, double b);
int test3 (double a, double b);
int test4 (double a, double b);
int test5 (double a, double b);
int test6 (double a, double b);
int test7 (double a, double b);
int test8 (double a, double b);
int test9 (double a, double b);
int test10 (double a, double b);
int test11 (double a, double b);
int test12 (double a, double b);
int test13 (double a, double b);
int test14 (double a, double b);
int test15 (double a, double b);
int main ()
{
double a, b;
int i;
/* cabs.eq.d */
a = 12;
b = -56;
i = 0;
if (__builtin_mips_cabs_eq_d(a, b) != i)
abort ();
/* cabs.eq.d */
a = 12;
b = -12;
i = 1;
if (__builtin_mips_cabs_eq_d(a, b) != i)
abort ();
/* Test all operators */
a = 1984.0;
b = 1984.0;
i = test0 (a, b);
if (i != 0)
abort ();
i = test1 (a, b);
if (i != 0)
abort ();
i = test2 (a, b);
if (i != 1)
abort ();
i = test3 (a, b);
if (i != 1)
abort ();
i = test4 (a, b);
if (i != 0)
abort ();
i = test5 (a, b);
if (i != 0)
abort ();
i = test6 (a, b);
if (i != 1)
abort ();
i = test7 (a, b);
if (i != 1)
abort ();
i = test8 (a, b);
if (i != 0)
abort ();
i = test9 (a, b);
if (i != 0)
abort ();
i = test10 (a, b);
if (i != 1)
abort ();
i = test11 (a, b);
if (i != 1)
abort ();
i = test12 (a, b);
if (i != 0)
abort ();
i = test13 (a, b);
if (i != 0)
abort ();
i = test14 (a, b);
if (i != 1)
abort ();
i = test15 (a, b);
if (i != 1)
abort ();
/* Reverse arguments */
i = test0 (b, a);
if (i != 0)
abort ();
i = test1 (b, a);
if (i != 0)
abort ();
i = test2 (b, a);
if (i != 1)
abort ();
i = test3 (b, a);
if (i != 1)
abort ();
i = test4 (b, a);
if (i != 0)
abort ();
i = test5 (b, a);
if (i != 0)
abort ();
i = test6 (b, a);
if (i != 1)
abort ();
i = test7 (b, a);
if (i != 1)
abort ();
i = test8 (b, a);
if (i != 0)
abort ();
i = test9 (b, a);
if (i != 0)
abort ();
i = test10 (b, a);
if (i != 1)
abort ();
i = test11 (b, a);
if (i != 1)
abort ();
i = test12 (b, a);
if (i != 0)
abort ();
i = test13 (b, a);
if (i != 0)
abort ();
i = test14 (b, a);
if (i != 1)
abort ();
i = test15 (b, a);
if (i != 1)
abort ();
#ifndef __FAST_MATH__
/* Test all operators */
a = 1.0/0.0 - 1.0/0.0; // QNaN
b = 1.0/0.0 - 1.0/0.0; // QNaN
i = test0 (a, b);
if (i != 0)
abort ();
i = test1 (a, b);
if (i != 1)
abort ();
i = test2 (a, b);
if (i != 0)
abort ();
i = test3 (a, b);
if (i != 1)
abort ();
i = test4 (a, b);
if (i != 0)
abort ();
i = test5 (a, b);
if (i != 1)
abort ();
i = test6 (a, b);
if (i != 0)
abort ();
i = test7 (a, b);
if (i != 1)
abort ();
i = test8 (a, b);
if (i != 0)
abort ();
i = test9 (a, b);
if (i != 1)
abort ();
i = test10 (a, b);
if (i != 0)
abort ();
i = test11 (a, b);
if (i != 1)
abort ();
i = test12 (a, b);
if (i != 0)
abort ();
i = test13 (a, b);
if (i != 1)
abort ();
i = test14 (a, b);
if (i != 0)
abort ();
i = test15 (a, b);
if (i != 1)
abort ();
#endif
printf ("Test Passes\n");
exit (0);
}
int test0 (double a, double b)
{
return __builtin_mips_cabs_f_d (a, b);
}
int test1 (double a, double b)
{
return __builtin_mips_cabs_un_d (a, b);
}
int test2 (double a, double b)
{
return __builtin_mips_cabs_eq_d (a, b);
}
int test3 (double a, double b)
{
return __builtin_mips_cabs_ueq_d (a, b);
}
int test4 (double a, double b)
{
return __builtin_mips_cabs_olt_d (a, b);
}
int test5 (double a, double b)
{
return __builtin_mips_cabs_ult_d (a, b);
}
int test6 (double a, double b)
{
return __builtin_mips_cabs_ole_d (a, b);
}
int test7 (double a, double b)
{
return __builtin_mips_cabs_ule_d (a, b);
}
int test8 (double a, double b)
{
return __builtin_mips_cabs_sf_d (a, b);
}
int test9 (double a, double b)
{
return __builtin_mips_cabs_ngle_d (a, b);
}
int test10 (double a, double b)
{
return __builtin_mips_cabs_seq_d (a, b);
}
int test11 (double a, double b)
{
return __builtin_mips_cabs_ngl_d (a, b);
}
int test12 (double a, double b)
{
return __builtin_mips_cabs_lt_d (a, b);
}
int test13 (double a, double b)
{
return __builtin_mips_cabs_nge_d (a, b);
}
int test14 (double a, double b)
{
return __builtin_mips_cabs_le_d (a, b);
}
int test15 (double a, double b)
{
return __builtin_mips_cabs_ngt_d (a, b);
}
/* { dg-do run { target mipsisa64*-*-* } } */
/* { dg-options "-mips64 -O2 -mips3d -mhard-float -mfp64" } */
/* Matrix Multiplications */
#include <stdlib.h>
#include <stdio.h>
typedef float v2sf __attribute__((vector_size(8)));
float a[4] = {1.1, 2.2, 3.3, 4.4};
float b[4][4] = {{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}};
float c[4]; /* Result for matrix_multiply1() */
float d[4]; /* Result for matrix_multiply2() */
float e[4]; /* Result for matrix_multiply3() */
float f[4]; /* Result for matrix_multiply4() */
void matrix_multiply1();
void matrix_multiply2();
void matrix_multiply3();
void matrix_multiply4();
int main ()
{
int i;
/* Version 1. Use float calculations */
matrix_multiply1();
/* Version 2. Use paired-single instructions inside the inner loop*/
matrix_multiply2();
for (i = 0; i < 4; i++)
if (d[i] != c[i])
abort();
/* Version 3. Use paired-single instructions and unroll the inner loop */
matrix_multiply3();
for (i = 0; i < 4; i++)
if (e[i] != c[i])
abort();
/* Version 4. Use paired-single instructions and unroll all loops */
matrix_multiply4();
for (i = 0; i < 4; i++)
if (f[i] != c[i])
abort();
printf ("Test Passes\n");
exit (0);
}
void matrix_multiply1()
{
int i, j;
for (i = 0; i < 4; i++)
{
c[i] = 0.0;
for (j = 0; j < 4; j ++)
c[i] += a[j] * b[j][i];
}
}
void matrix_multiply2()
{
int i, j;
v2sf m1, m2;
v2sf result, temp;
for (i = 0; i < 4; i++)
{
result = (v2sf) {0.0, 0.0};
for (j = 0; j < 4; j+=2)
{
/* Load two float values into m1 */
m1 = (v2sf) {a[j], a[j+1]};
m2 = (v2sf) {b[j][i], b[j+1][i]};
/* Multiply and add */
result += m1 * m2;
}
/* Reduction add at the end */
temp = __builtin_mips_addr_ps (result, result);
d[i] = __builtin_mips_cvt_s_pl (temp);
}
}
void matrix_multiply3()
{
int i;
v2sf m1, m2, n1, n2;
v2sf result, temp;
m1 = (v2sf) {a[0], a[1]};
m2 = (v2sf) {a[2], a[3]};
for (i = 0; i < 4; i++)
{
n1 = (v2sf) {b[0][i], b[1][i]};
n2 = (v2sf) {b[2][i], b[3][i]};
/* Multiply and add */
result = m1 * n1 + m2 * n2;
/* Reduction add at the end */
temp = __builtin_mips_addr_ps (result, result);
e[i] = __builtin_mips_cvt_s_pl (temp);
}
}
void matrix_multiply4()
{
v2sf m1, m2;
v2sf n1, n2, n3, n4, n5, n6, n7, n8;
v2sf temp1, temp2, temp3, temp4;
v2sf result1, result2;
/* Load a[0] a[1] values into m1
Load a[2] a[3] values into m2 */
m1 = (v2sf) {a[0], a[1]};
m2 = (v2sf) {a[2], a[3]};
/* Load b[0][0] b[1][0] values into n1
Load b[2][0] b[3][0] values into n2
Load b[0][1] b[1][1] values into n3
Load b[2][1] b[3][1] values into n4
Load b[0][2] b[1][2] values into n5
Load b[2][2] b[3][2] values into n6
Load b[0][3] b[1][3] values into n7
Load b[2][3] b[3][3] values into n8 */
n1 = (v2sf) {b[0][0], b[1][0]};
n2 = (v2sf) {b[2][0], b[3][0]};
n3 = (v2sf) {b[0][1], b[1][1]};
n4 = (v2sf) {b[2][1], b[3][1]};
n5 = (v2sf) {b[0][2], b[1][2]};
n6 = (v2sf) {b[2][2], b[3][2]};
n7 = (v2sf) {b[0][3], b[1][3]};
n8 = (v2sf) {b[2][3], b[3][3]};
temp1 = m1 * n1 + m2 * n2;
temp2 = m1 * n3 + m2 * n4;
temp3 = m1 * n5 + m2 * n6;
temp4 = m1 * n7 + m2 * n8;
result1 = __builtin_mips_addr_ps (temp1, temp2);
result2 = __builtin_mips_addr_ps (temp3, temp4);
f[0] = __builtin_mips_cvt_s_pu (result1);
f[1] = __builtin_mips_cvt_s_pl (result1);
f[2] = __builtin_mips_cvt_s_pu (result2);
f[3] = __builtin_mips_cvt_s_pl (result2);
}
/* { dg-do run { target mipsisa64*-*-* } } */
/* { dg-options "-mips64 -O2 -mpaired-single -mhard-float -mfp64" } */
/* Test v2sf calculations */
#include <stdlib.h>
#include <stdio.h>
typedef float v2sf __attribute__ ((vector_size (8)));
v2sf A = {100, 200};
/* Init from float */
v2sf init (float a, float b)
{
return (v2sf) {a, b};
}
/* Move between registers */
v2sf move (v2sf a)
{
return a;
}
/* Load from memory */
v2sf load ()
{
return A;
}
/* Store to memory */
void store (v2sf a)
{
A = a;
}
/* Add */
v2sf add (v2sf a, v2sf b)
{
return a + b;
}
/* Subtract */
v2sf sub (v2sf a, v2sf b)
{
return a - b;
}
/* Negate */
v2sf neg (v2sf a)
{
return - a;
}
/* Multiply */
v2sf mul (v2sf a, v2sf b)
{
return a * b;
}
/* Multiply and add */
v2sf madd (v2sf a, v2sf b, v2sf c)
{
return a * b + c;
}
/* Multiply and subtract */
v2sf msub (v2sf a, v2sf b, v2sf c)
{
return a * b - c;
}
/* Negate Multiply and add */
v2sf nmadd (v2sf a, v2sf b, v2sf c)
{
return - (a * b + c);
}
/* Negate Multiply and subtract */
v2sf nmsub (v2sf a, v2sf b, v2sf c)
{
return - (a * b - c);
}
/* Conditional Move */
v2sf cond_move1 (v2sf a, v2sf b, long i)
{
if (i > 0)
return a;
else
return b;
}
/* Conditional Move */
v2sf cond_move2 (v2sf a, v2sf b, int i)
{
if (i > 0)
return a;
else
return b;
}
/* Conditional Move */
v2sf cond_move3 (v2sf a, v2sf b, float i)
{
if (i > 0.0)
return a;
else
return b;
}
/* Conditional Move */
v2sf cond_move4 (v2sf a, v2sf b, double i)
{
if (i > 0.0)
return a;
else
return b;
}
int main()
{
v2sf a, b, c, d, e, f;
float f1, f2;
f1 = 1.2;
f2 = 3.4;
a = init (f1, f2);
b = (v2sf) {1.2, 3.4};
if (!__builtin_mips_upper_c_eq_ps (a, b) ||
!__builtin_mips_lower_c_eq_ps (a, b))
abort ();
a = (v2sf) {1.2, 2.3};
b = (v2sf) {5.3, 6.1};
b = move (a);
if (!__builtin_mips_upper_c_eq_ps (a, b) ||
!__builtin_mips_lower_c_eq_ps (a, b))
abort ();
a = (v2sf) {1.2, 2.3};
b = (v2sf) {5.3, 6.1};
c = add (a, b);
d = (v2sf) {6.5, 8.4};
if (!__builtin_mips_upper_c_eq_ps (c, d) ||
!__builtin_mips_lower_c_eq_ps (c, d))
abort ();
a = (v2sf) {1, 12};
b = (v2sf) {5, 6};
c = sub (a, b);
d = (v2sf) {-4, 6};
if (!__builtin_mips_upper_c_eq_ps (c, d) ||
!__builtin_mips_lower_c_eq_ps (c, d))
abort ();
a = (v2sf) {1, 12};
b = (v2sf) {5, 6};
c = mul (a, b);
d = (v2sf) {5, 72};
if (!__builtin_mips_upper_c_eq_ps (c, d) ||
!__builtin_mips_lower_c_eq_ps (c, d))
abort ();
a = (v2sf) {1, 12};
b = (v2sf) {5, 6};
c = (v2sf) {5, 6};
d = madd (a, b, c);
e = (v2sf) {10, 78};
if (!__builtin_mips_upper_c_eq_ps (d, e) ||
!__builtin_mips_lower_c_eq_ps (d, e))
abort ();
a = (v2sf) {1, 12};
b = (v2sf) {5, 6};
c = (v2sf) {5, 6};
d = msub (a, b, c);
e = (v2sf) {0, 66};
if (!__builtin_mips_upper_c_eq_ps (d, e) ||
!__builtin_mips_lower_c_eq_ps (d, e))
abort ();
a = (v2sf) {1, 12};
b = (v2sf) {5, 6};
c = (v2sf) {5, 6};
d = nmadd (a, b, c);
e = (v2sf) {-10, -78};
if (!__builtin_mips_upper_c_eq_ps (d, e) ||
!__builtin_mips_lower_c_eq_ps (d, e))
abort ();
a = (v2sf) {1, 12};
b = (v2sf) {5, 6};
c = (v2sf) {5, 6};
d = nmsub (a, b, c);
e = (v2sf) {0, -66};
if (!__builtin_mips_upper_c_eq_ps (d, e) ||
!__builtin_mips_lower_c_eq_ps (d, e))
abort ();
a = (v2sf) {98, 12};
b = neg (a);
c = (v2sf) {-98, -12};
if (!__builtin_mips_upper_c_eq_ps (b, c) ||
!__builtin_mips_lower_c_eq_ps (b, c))
abort ();
a = (v2sf) {1, 12};
b = (v2sf) {5, 6};
c = cond_move1 (a, b, 1000);
if (!__builtin_mips_upper_c_eq_ps (c, a) ||
!__builtin_mips_lower_c_eq_ps (c, a))
abort ();
a = (v2sf) {1, 12};
b = (v2sf) {5, 6};
c = cond_move2 (a, b, -1000);
if (!__builtin_mips_upper_c_eq_ps (c, b) ||
!__builtin_mips_lower_c_eq_ps (c, b))
abort ();
a = (v2sf) {1, 12};
b = (v2sf) {5, 6};
c = cond_move3 (a, b, 9.0);
if (!__builtin_mips_upper_c_eq_ps (c, a) ||
!__builtin_mips_lower_c_eq_ps (c, a))
abort ();
a = (v2sf) {1, 12};
b = (v2sf) {5, 6};
c = cond_move4 (a, b, -10.0);
if (!__builtin_mips_upper_c_eq_ps (c, b) ||
!__builtin_mips_lower_c_eq_ps (c, b))
abort ();
a = (v2sf) {5, 12};
b = (v2sf) {5, 6};
c = (v2sf) {33, 123};
d = (v2sf) {8, 78};
e = __builtin_mips_movt_c_eq_ps (a, b, c, d);
f = (v2sf) {8, 123};
if (!__builtin_mips_upper_c_eq_ps (e, f) ||
!__builtin_mips_lower_c_eq_ps (e, f))
abort ();
a = (v2sf) {5, 12};
b = (v2sf) {5, 6};
c = (v2sf) {33, 123};
d = (v2sf) {8, 78};
e = __builtin_mips_movf_c_eq_ps (a, b, c, d);
f = (v2sf) {33, 78};
if (!__builtin_mips_upper_c_eq_ps (e, f) ||
!__builtin_mips_lower_c_eq_ps (e, f))
abort ();
a = load();
b = (v2sf) {100, 200};
if (!__builtin_mips_upper_c_eq_ps (a, b) ||
!__builtin_mips_lower_c_eq_ps (a, b))
abort ();
a = (v2sf) {123, 321};
store (a);
b = load();
if (!__builtin_mips_upper_c_eq_ps (a, b) ||
!__builtin_mips_lower_c_eq_ps (a, b))
abort ();
printf ("Test Passes\n");
exit (0);
}
/* { dg-do run { target mipsisa64*-*-* } } */
/* { dg-options "-mips64 -O2 -mpaired-single -mhard-float -mfp64" } */
/* Test MIPS paired-single builtin functions */
#include <stdlib.h>
#include <stdio.h>
typedef float v2sf __attribute__ ((vector_size(8)));
int main ()
{
int little_endian;
v2sf a, b, c, d;
float e,f;
int i;
union { long long ll; int i[2]; } endianness_test;
endianness_test.ll = 1;
little_endian = endianness_test.i[0];
/* pll.ps */
a = (v2sf) {1, 2};
b = (v2sf) {3, 4};
c = __builtin_mips_pll_ps (a, b);
if (little_endian) // little endian
d = (v2sf) {3, 1};
else // big endian
d = (v2sf) {2, 4};
if (!__builtin_mips_upper_c_eq_ps (c, d) ||
!__builtin_mips_lower_c_eq_ps (c, d))
abort ();
/* pul.ps */
a = (v2sf) {1, 2};
b = (v2sf) {3, 4};
c = __builtin_mips_pul_ps (a, b);
if (little_endian) // little endian
d = (v2sf) {3, 2};
else // big endian
d = (v2sf) {1, 4};
if (!__builtin_mips_upper_c_eq_ps (c, d) ||
!__builtin_mips_lower_c_eq_ps (c, d))
abort ();
/* plu.ps */
a = (v2sf) {1, 2};
b = (v2sf) {3, 4};
c = __builtin_mips_plu_ps (a, b);
if (little_endian) // little endian
d = (v2sf) {4, 1};
else // big endian
d = (v2sf) {2, 3};
if (!__builtin_mips_upper_c_eq_ps (c, d) ||
!__builtin_mips_lower_c_eq_ps (c, d))
abort ();
/* puu.ps */
a = (v2sf) {1, 2};
b = (v2sf) {3, 4};
c = __builtin_mips_puu_ps (a, b);
if (little_endian) // little endian
d = (v2sf) {4, 2};
else // big endian
d = (v2sf) {1, 3};
if (!__builtin_mips_upper_c_eq_ps (c, d) ||
!__builtin_mips_lower_c_eq_ps (c, d))
abort ();
/* cvt.ps.s */
e = 3.4;
f = 4.5;
a = __builtin_mips_cvt_ps_s (e, f);
if (little_endian) // little endian
b = (v2sf) {4.5, 3.4};
else // big endian
b = (v2sf) {3.4, 4.5};
if (!__builtin_mips_upper_c_eq_ps (a, b) ||
!__builtin_mips_lower_c_eq_ps (a, b))
abort ();
/* cvt.s.pl */
a = (v2sf) {35.1, 120.2};
e = __builtin_mips_cvt_s_pl (a);
if (little_endian) // little endian
f = 35.1;
else // big endian
f = 120.2;
if (e != f)
abort ();
/* cvt.s.pu */
a = (v2sf) {30.0, 100.0};
e = __builtin_mips_cvt_s_pu (a);
if (little_endian) // little endian
f = 100.0;
else // big endian
f = 30.0;
if (e != f)
abort ();
/* abs.ps */
a = (v2sf) {-3.4, -5.8};
b = __builtin_mips_abs_ps (a);
c = (v2sf) {3.4, 5.8};
if (!__builtin_mips_upper_c_eq_ps (b, c) ||
!__builtin_mips_lower_c_eq_ps (b, c))
abort ();
/* alnv.ps with rs = 4*/
a = (v2sf) {1, 2};
b = (v2sf) {3, 4};
i = 4;
c = __builtin_mips_alnv_ps (a, b, i);
d = (v2sf) {2, 3};
if (!__builtin_mips_upper_c_eq_ps (c, d) ||
!__builtin_mips_lower_c_eq_ps (c, d))
abort ();
/* alnv.ps with rs = 0 */
a = (v2sf) {5, 6};
b = (v2sf) {7, 8};
i = 0;
c = __builtin_mips_alnv_ps (a, b, i);
d = (v2sf) {5, 6};
if (!__builtin_mips_upper_c_eq_ps (c, d) ||
!__builtin_mips_lower_c_eq_ps (c, d))
abort ();
printf ("Test Passes\n");
exit (0);
}
/* Test v2sf calculations */
/* { dg-do compile { target mipsisa64*-*-* } } */
/* { dg-options "-mips64 -O2 -mpaired-single -mhard-float -mfp64" } */
/* { dg-final { scan-assembler "cvt.ps.s" } } */
/* { dg-final { scan-assembler "mov.ps" } } */
/* { dg-final { scan-assembler "ldc1" } } */
/* { dg-final { scan-assembler "sdc1" } } */
/* { dg-final { scan-assembler "add.ps" } } */
/* { dg-final { scan-assembler "sub.ps" } } */
/* { dg-final { scan-assembler "neg.ps" } } */
/* { dg-final { scan-assembler "mul.ps" } } */
/* { dg-final { scan-assembler "madd.ps" } } */
/* { dg-final { scan-assembler "msub.ps" } } */
/* { dg-final { scan-assembler "nmadd.ps" } } */
/* { dg-final { scan-assembler "nmsub.ps" } } */
/* { dg-final { scan-assembler "mov(n|z).ps" } } */
typedef float v2sf __attribute__ ((vector_size(8)));
v2sf A = {100, 200};
/* Init from floats */
v2sf init (float a, float b)
{
return (v2sf) {a, b};
}
/* Move between registers */
v2sf move (v2sf a)
{
return a;
}
/* Load from memory */
v2sf load ()
{
return A;
}
/* Store to memory */
void store (v2sf a)
{
A = a;
}
/* Add */
v2sf add (v2sf a, v2sf b)
{
return a + b;
}
/* Subtract */
v2sf sub (v2sf a, v2sf b)
{
return a - b;
}
/* Negate */
v2sf neg (v2sf a)
{
return - a;
}
/* Multiply */
v2sf mul (v2sf a, v2sf b)
{
return a * b;
}
/* Multiply and add */
v2sf madd (v2sf a, v2sf b, v2sf c)
{
return a * b + c;
}
/* Multiply and subtract */
v2sf msub (v2sf a, v2sf b, v2sf c)
{
return a * b - c;
}
/* Negate Multiply and add */
v2sf nmadd (v2sf a, v2sf b, v2sf c)
{
return - (a * b + c);
}
/* Negate Multiply and subtract */
v2sf nmsub (v2sf a, v2sf b, v2sf c)
{
return - (a * b - c);
}
/* Conditional Move */
v2sf cond_move1 (v2sf a, v2sf b, long i)
{
if (i > 0)
return a;
else
return b;
}
/* Conditional Move */
v2sf cond_move2 (v2sf a, v2sf b, int i)
{
if (i > 0)
return a;
else
return b;
}
# Copyright (C) 1997 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 2 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 this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# GCC testsuite that uses the `dg.exp' driver.
# Exit immediately if this isn't a MIPS target.
if ![istarget mips*-*-*] 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/*.\[cS\]]] \
"" $DEFAULT_CFLAGS
# All done.
dg-finish
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment