1/* { dg-do run } */ 2/* { dg-options "-mips3d" } */ 3 4/* Test MIPS-3D builtin functions */ 5#include <stdlib.h> 6#include <stdio.h> 7 8typedef float v2sf __attribute__ ((vector_size(8))); 9 10NOMIPS16 int main () 11{ 12 int little_endian; 13 v2sf a, b, c, d; 14 float f1, f2, f3, f4, f5, f6; 15 double d1, d2, d3, d4, d5, d6, d7, d8, d9; 16 v2sf ps1, ps2, ps3, ps4, ps5, ps6; 17 18 union { long long ll; int i[2]; } endianness_test; 19 endianness_test.ll = 1; 20 little_endian = endianness_test.i[0]; 21 22 /* addr.ps */ 23 a = (v2sf) {12, 34}; 24 b = (v2sf) {45, 67}; 25 c = __builtin_mips_addr_ps (a, b); 26 if (little_endian) 27 d = (v2sf) {112, 46}; 28 else 29 d = (v2sf) {46, 112}; 30 31 if (!__builtin_mips_all_c_eq_ps(c, d)) 32 abort (); 33 34 /* mulr.ps */ 35 a = (v2sf) {12, 34}; 36 b = (v2sf) {45, 67}; 37 c = __builtin_mips_mulr_ps (a, b); 38 if (little_endian) 39 d = (v2sf) {3015, 408}; 40 else 41 d = (v2sf) {408, 3015}; 42 43 if (!__builtin_mips_all_c_eq_ps(c, d)) 44 abort (); 45 46 /* cvt.pw.ps */ 47 a = (v2sf) {12345.34, 67890.45}; 48 b = __builtin_mips_cvt_pw_ps (a); 49 50 /* cvt.ps.pw */ 51 c = __builtin_mips_cvt_ps_pw (b); 52 d = (v2sf) {12345.0, 67890.0}; 53 54 if (!__builtin_mips_all_c_eq_ps(c, d)) 55 abort (); 56 57 /* recip1.s recip2.s */ 58 f1 = 40; 59 f2 = __builtin_mips_recip1_s (f1); 60 f3 = __builtin_mips_recip2_s (f2, f1); 61 f4 = f2 + f2 * f3; 62 f5 = 0.025; 63 64 if (f4 != f5) 65 abort (); 66 67 /* recip1.d recip2.d */ 68 d1 = 80; 69 d2 = __builtin_mips_recip1_d (d1); 70 d3 = __builtin_mips_recip2_d (d2, d1); 71 d4 = d2 + d2 * d3; 72 d5 = __builtin_mips_recip2_d (d4, d1); 73 d6 = d4 + d4 * d5; 74 d7 = 0.0125; 75 76 if (d6 != d7) 77 abort (); 78 79 /* recip1.ps recip2.ps */ 80 ps1 = (v2sf) {100, 200}; 81 ps2 = __builtin_mips_recip1_ps (ps1); 82 ps3 = __builtin_mips_recip2_ps (ps2, ps1); 83 ps4 = ps2 + ps2 * ps3; 84 ps5 = (v2sf) {0.01, 0.005}; 85 86 if (!__builtin_mips_all_c_eq_ps(ps4, ps5)) 87 abort (); 88 89 /* rsqrt1.s rsqrt2.s */ 90 f1 = 400; 91 f2 = __builtin_mips_rsqrt1_s (f1); 92 f3 = f2 * f1; 93 f4 = __builtin_mips_rsqrt2_s (f3, f2); 94 f5 = f2 + f2 * f4; 95 f6 = 0.05; 96 97 if (f5 != f6) 98 abort (); 99 100 /* rsqrt1.d rsqrt2.d */ 101 d1 = 1600; 102 d2 = __builtin_mips_rsqrt1_d (d1); 103 d3 = d2 * d1; 104 d4 = __builtin_mips_rsqrt2_d (d3, d2); 105 d5 = d2 + d2 * d4; 106 d6 = d1 * d5; 107 d7 = __builtin_mips_rsqrt2_d (d6, d5); 108 d8 = d5 + d5 * d7; 109 d9 = 0.025; 110 111 if (d8 != d9) 112 abort (); 113 114 /* rsqrt1.ps rsqrt2.ps */ 115 ps1 = (v2sf) {400, 100}; 116 ps2 = __builtin_mips_rsqrt1_ps (ps1); 117 ps3 = ps2 * ps1; 118 ps4 = __builtin_mips_rsqrt2_ps (ps3, ps2); 119 ps5 = ps2 + ps2 * ps4; 120 ps6 = (v2sf) {0.05, 0.1}; 121 122 if (!__builtin_mips_all_c_eq_ps(ps5, ps6)) 123 abort (); 124 125 printf ("Test Passes\n"); 126 exit (0); 127} 128