Home | History | Annotate | Download | only in fptest
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     28 
     29 #include <sys/types.h>
     30 #include <sys/file.h>
     31 #include <signal.h>
     32 #include <ucontext.h>
     33 #include <stdio.h>
     34 #include <floatingpoint.h>
     35 #include <locale.h>
     36 #include <unistd.h>
     37 #include <fp.h>
     38 #include <externs.h>
     39 #include <fps_ereport.h>
     40 
     41 #define	FPU_ID_MASK 0xCFF02FFF
     42 
     43 extern int FPU_cpu;
     44 static int check_conv();
     45 uint_t trap_flag = 0x0;
     46 unsigned long fsr_at_trap;
     47 
     48 extern unsigned long long_float_d(unsigned long);
     49 extern unsigned long float_long_d(unsigned long);
     50 int fpu_sysdiag(struct fps_test_ereport *report);
     51 int restore_signals();
     52 static int addition_test_dp(struct fps_test_ereport *report);
     53 static int addition_test_sp(struct fps_test_ereport *report);
     54 static int branching(struct fps_test_ereport *report);
     55 static int chain_dp_test(struct fps_test_ereport *report);
     56 static int chain_sp_test(struct fps_test_ereport *report);
     57 static int check_conv(struct fps_test_ereport *report);
     58 static int compare_dp(struct fps_test_ereport *report);
     59 static int compare_dp_except(struct fps_test_ereport *report);
     60 static int compare_sp(struct fps_test_ereport *report);
     61 static int compare_sp_except(struct fps_test_ereport *report);
     62 static int data_path_dp(struct fps_test_ereport *report);
     63 static int data_path_sp(struct fps_test_ereport *report);
     64 static int division_test_dp(struct fps_test_ereport *report);
     65 static int division_test_sp(struct fps_test_ereport *report);
     66 static int double_sing(struct fps_test_ereport *report);
     67 static int fabs_ins_dp(struct fps_test_ereport *report);
     68 static int fabs_ins_sp(struct fps_test_ereport *report);
     69 static int float_to_integer_dp(struct fps_test_ereport *report);
     70 static int float_to_integer_sp(struct fps_test_ereport *report);
     71 static int float_to_long_dp(struct fps_test_ereport *report);
     72 static int float_to_long_sp(struct fps_test_ereport *report);
     73 static int get_negative_value_pn_dp(struct fps_test_ereport *report);
     74 static int get_negative_value_pn_sp(struct fps_test_ereport *report);
     75 static int get_negative_value_np_dp(struct fps_test_ereport *report);
     76 static int get_negative_value_np_sp(struct fps_test_ereport *report);
     77 static int fmovs_ins(struct fps_test_ereport *report);
     78 static int integer_to_float_dp(struct fps_test_ereport *report);
     79 static int integer_to_float_sp(struct fps_test_ereport *report);
     80 static int long_to_float_dp(struct fps_test_ereport *report);
     81 static int long_to_float_sp(struct fps_test_ereport *report);
     82 static int multiplication_test_dp(struct fps_test_ereport *report);
     83 static int multiplication_test_sp(struct fps_test_ereport *report);
     84 static int no_branching(struct fps_test_ereport *report);
     85 static int registers_four(struct fps_test_ereport *report);
     86 static int registers_four_dp(struct fps_test_ereport *report);
     87 static int registers_one(struct fps_test_ereport *report);
     88 static int registers_one_dp(struct fps_test_ereport *report);
     89 static int registers_two(struct fps_test_ereport *report);
     90 static int registers_two_dp(struct fps_test_ereport *report);
     91 static int single_doub(struct fps_test_ereport *report);
     92 static int squareroot_test_dp(struct fps_test_ereport *report);
     93 static int squareroot_test_sp(struct fps_test_ereport *report);
     94 static int subtraction_test_dp(struct fps_test_ereport *report);
     95 static int subtraction_test_sp(struct fps_test_ereport *report);
     96 static int timing_test(struct fps_test_ereport *report);
     97 static void fail_trap(struct fps_test_ereport *report, int flag_num);
     98 
     99 /* SIGFPE */
    100 static void	 sigfpe_handler(int, siginfo_t *, ucontext_t *);
    101 static struct sigaction oldfpe, newfpe;
    102 
    103 /* SIGSEGV */
    104 static void	 sigsegv_handler(int, siginfo_t *, ucontext_t *);
    105 static struct sigaction oldsegv, newsegv;
    106 
    107 /* SIGILL */
    108 static void	 sigill_handler(int, siginfo_t *, ucontext_t *);
    109 static struct sigaction oldill, newill;
    110 
    111 /* SIGBUS */
    112 static void	 sigbus_handler(int, siginfo_t *, ucontext_t *);
    113 static struct sigaction oldbus, newbus;
    114 
    115 static unsigned int pat[] = {
    116 	0x00000000,
    117 	0x55555555,
    118 	0xAAAAAAAA,
    119 	0xCCCCCCCC,
    120 	0x33333333,
    121 	0xFFFFFFFF,
    122 	0xA5A5A5A5,
    123 	0x3C3C3C3C,
    124 	0xF0F0F0F0,
    125 	0xEEEEEEEE,
    126 	0xDDDDDDDD,
    127 	0xBBBBBBBB,
    128 	0x77777777,
    129 	0x11111111,
    130 	0x22222222,
    131 	0x44444444,
    132 	0x88888888,
    133 	0x66666666,
    134 	0x99999999,
    135 	0x00FF00FF,
    136 	0xFF00FF00,
    137 	0xFFFF0000,
    138 	0x0000FFFF,
    139 
    140 };
    141 
    142 #define	PAT_NUM	(sizeof (pat)/sizeof (*pat))
    143 
    144 /*
    145  * Double precision patterns
    146  */
    147 static uint64_t pat_dp[] = {
    148 	0x0000000000000000UL,
    149 	0x5555555555555555UL,
    150 	0xAAAAAAAAAAAAAAAAUL,
    151 	0xCCCCCCCCCCCCCCCCUL,
    152 	0x3333333333333333UL,
    153 	0xFFFFFFFFFFFFFFFFUL,
    154 	0xA5A5A5A5A5A5A5A5UL,
    155 	0x3C3C3C3C3C3C3C3CUL,
    156 	0xF0F0F0F0F0F0F0F0UL,
    157 	0xEEEEEEEEEEEEEEEEUL,
    158 	0xDDDDDDDDDDDDDDDDUL,
    159 	0xBBBBBBBBBBBBBBBBUL,
    160 	0x7777777777777777UL,
    161 	0x1111111111111111UL,
    162 	0x2222222222222222UL,
    163 	0x4444444444444444UL,
    164 	0x8888888888888888UL,
    165 	0x6666666666666666UL,
    166 	0x9999999999999999UL,
    167 	0x00000000FFFFFFFFUL,
    168 	0xFFFFFFFF00000000UL,
    169 	0x0000FFFF0000FFFFUL,
    170 	0xFFFF0000FFFF0000UL
    171 };
    172 
    173 #define	PAT_DP_NUM	(sizeof (pat_dp)/sizeof (*pat_dp))
    174 
    175 struct value {
    176 	unsigned long floatsingle;
    177 	uint64_t floatdouble;
    178 	uint64_t floatquad_u;
    179 	uint64_t floatquad_l;
    180 };
    181 
    182 #define	N_VALS	(sizeof (val)/sizeof (*val))
    183 
    184 static struct value val[] = {
    185 	0, 0, 0, 0,
    186 	0x3F800000, 0x3FF0000000000000, 0x3FFF000000000000, 0,
    187 	0x40000000, 0x4000000000000000, 0x4000000000000000, 0,
    188 	0x40400000, 0x4008000000000000, 0x4000800000000000, 0,
    189 	0x40800000, 0x4010000000000000, 0x4001000000000000, 0,
    190 	0x40A00000, 0x4014000000000000, 0x4001400000000000, 0,
    191 	0x40C00000, 0x4018000000000000, 0x4001800000000000, 0,
    192 	0x40E00000, 0x401C000000000000, 0x4001C00000000000, 0,
    193 	0x41000000, 0x4020000000000000, 0x4002000000000000, 0,
    194 	0x41100000, 0x4022000000000000, 0x4002200000000000, 0,
    195 	0x41200000, 0x4024000000000000, 0x4002400000000000, 0,
    196 	0x41300000, 0x4026000000000000, 0x4002600000000000, 0,
    197 	0x41400000, 0x4028000000000000, 0x4002800000000000, 0,
    198 	0x41500000, 0x402A000000000000, 0x4002A00000000000, 0,
    199 	0x41600000, 0x402C000000000000, 0x4002C00000000000, 0,
    200 	0x41700000, 0x402E000000000000, 0x4002E00000000000, 0,
    201 	0x41800000, 0x4030000000000000, 0x4003000000000000, 0,
    202 	0x41880000, 0x4031000000000000, 0x4003100000000000, 0,
    203 	0x41900000, 0x4032000000000000, 0x4003200000000000, 0,
    204 	0x41980000, 0x4033000000000000, 0x4003300000000000, 0,
    205 	0x41a00000, 0x4034000000000000, 0x4003400000000000, 0,
    206 	0x41a80000, 0x4035000000000000, 0x4003500000000000, 0,
    207 	0x41b00000, 0x4036000000000000, 0x4003600000000000, 0,
    208 	0x41b80000, 0x4037000000000000, 0x4003700000000000, 0,
    209 	0x41c00000, 0x4038000000000000, 0x4003800000000000, 0,
    210 	0x41c80000, 0x4039000000000000, 0x4003900000000000, 0,
    211 	0x41d00000, 0x403a000000000000, 0x4003a00000000000, 0,
    212 	0x41d80000, 0x403b000000000000, 0x4003b00000000000, 0,
    213 	0x41e00000, 0x403c000000000000, 0x4003c00000000000, 0,
    214 	0x41e80000, 0x403d000000000000, 0x4003d00000000000, 0,
    215 	0x41f00000, 0x403e000000000000, 0x4003e00000000000, 0,
    216 	0x41f80000, 0x403f000000000000, 0x4003f00000000000, 0,
    217 	0x42000000, 0x4040000000000000, 0x4004000000000000, 0,
    218 	0x42040000, 0x4040800000000000, 0x4004080000000000, 0,
    219 	0x42080000, 0x4041000000000000, 0x4004100000000000, 0,
    220 	0x420c0000, 0x4041800000000000, 0x4004180000000000, 0,
    221 	0x42100000, 0x4042000000000000, 0x4004200000000000, 0,
    222 	0x42140000, 0x4042800000000000, 0x4004280000000000, 0,
    223 	0x42180000, 0x4043000000000000, 0x4004300000000000, 0,
    224 	0x421c0000, 0x4043800000000000, 0x4004380000000000, 0,
    225 	0x42200000, 0x4044000000000000, 0x4004400000000000, 0,
    226 	0x42240000, 0x4044800000000000, 0x4004480000000000, 0,
    227 	0x42280000, 0x4045000000000000, 0x4004500000000000, 0,
    228 	0x422c0000, 0x4045800000000000, 0x4004580000000000, 0,
    229 	0x42300000, 0x4046000000000000, 0x4004600000000000, 0,
    230 	0x42340000, 0x4046800000000000, 0x4004680000000000, 0,
    231 	0x42380000, 0x4047000000000000, 0x4004700000000000, 0,
    232 	0x423c0000, 0x4047800000000000, 0x4004780000000000, 0,
    233 	0x42400000, 0x4048000000000000, 0x4004800000000000, 0,
    234 	0x42440000, 0x4048800000000000, 0x4004880000000000, 0,
    235 	0x42480000, 0x4049000000000000, 0x4004900000000000, 0,
    236 	0x424c0000, 0x4049800000000000, 0x4004980000000000, 0,
    237 	0x42500000, 0x404a000000000000, 0x4004a00000000000, 0,
    238 	0x42540000, 0x404a800000000000, 0x4004a80000000000, 0,
    239 	0x42580000, 0x404b000000000000, 0x4004b00000000000, 0,
    240 	0x425c0000, 0x404b800000000000, 0x4004b80000000000, 0,
    241 	0x42600000, 0x404c000000000000, 0x4004c00000000000, 0,
    242 	0x42640000, 0x404c800000000000, 0x4004c80000000000, 0,
    243 	0x42680000, 0x404d000000000000, 0x4004d00000000000, 0,
    244 	0x426c0000, 0x404d800000000000, 0x4004d80000000000, 0,
    245 	0x42700000, 0x404e000000000000, 0x4004e00000000000, 0,
    246 	0x42740000, 0x404e800000000000, 0x4004e80000000000, 0,
    247 	0x42780000, 0x404f000000000000, 0x4004f00000000000, 0,
    248 	0x427c0000, 0x404f800000000000, 0x4004f80000000000, 0,
    249 	0x42800000, 0x4050000000000000, 0x4005000000000000, 0,
    250 	0x42820000, 0x4050400000000000, 0x4005040000000000, 0,
    251 	0x42840000, 0x4050800000000000, 0x4005080000000000, 0,
    252 	0x42860000, 0x4050c00000000000, 0x40050c0000000000, 0,
    253 	0x42880000, 0x4051000000000000, 0x4005100000000000, 0,
    254 	0x428a0000, 0x4051400000000000, 0x4005140000000000, 0,
    255 	0x428c0000, 0x4051800000000000, 0x4005180000000000, 0,
    256 	0x428e0000, 0x4051c00000000000, 0x40051c0000000000, 0,
    257 	0x42900000, 0x4052000000000000, 0x4005200000000000, 0,
    258 	0x42920000, 0x4052400000000000, 0x4005240000000000, 0,
    259 	0x42940000, 0x4052800000000000, 0x4005280000000000, 0,
    260 	0x42960000, 0x4052c00000000000, 0x40052c0000000000, 0,
    261 	0x42980000, 0x4053000000000000, 0x4005300000000000, 0,
    262 	0x429a0000, 0x4053400000000000, 0x4005340000000000, 0,
    263 	0x429c0000, 0x4053800000000000, 0x4005380000000000, 0,
    264 	0x429e0000, 0x4053c00000000000, 0x40053c0000000000, 0,
    265 	0x42a00000, 0x4054000000000000, 0x4005400000000000, 0,
    266 	0x42a20000, 0x4054400000000000, 0x4005440000000000, 0,
    267 	0x42a40000, 0x4054800000000000, 0x4005480000000000, 0,
    268 	0x42a60000, 0x4054c00000000000, 0x40054c0000000000, 0,
    269 	0x42a80000, 0x4055000000000000, 0x4005500000000000, 0,
    270 	0x42aa0000, 0x4055400000000000, 0x4005540000000000, 0,
    271 	0x42ac0000, 0x4055800000000000, 0x4005580000000000, 0,
    272 	0x42ae0000, 0x4055c00000000000, 0x40055c0000000000, 0,
    273 	0x42b00000, 0x4056000000000000, 0x4005600000000000, 0,
    274 	0x42b20000, 0x4056400000000000, 0x4005640000000000, 0,
    275 	0x42b40000, 0x4056800000000000, 0x4005680000000000, 0,
    276 	0x42b60000, 0x4056c00000000000, 0x40056c0000000000, 0,
    277 	0x42b80000, 0x4057000000000000, 0x4005700000000000, 0,
    278 	0x42ba0000, 0x4057400000000000, 0x4005740000000000, 0,
    279 	0x42bc0000, 0x4057800000000000, 0x4005780000000000, 0,
    280 	0x42be0000, 0x4057c00000000000, 0x40057c0000000000, 0,
    281 	0x42c00000, 0x4058000000000000, 0x4005800000000000, 0,
    282 	0x42c20000, 0x4058400000000000, 0x4005840000000000, 0,
    283 	0x42c40000, 0x4058800000000000, 0x4005880000000000, 0,
    284 	0x42c60000, 0x4058c00000000000, 0x40058c0000000000, 0,
    285 	0x42c80000, 0x4059000000000000, 0x4005900000000000, 0,
    286 	0x42ca0000, 0x4059400000000000, 0x4005940000000000, 0,
    287 	0x42cc0000, 0x4059800000000000, 0x4005980000000000, 0,
    288 	0x42ce0000, 0x4059c00000000000, 0x40059c0000000000, 0,
    289 	0x42d00000, 0x405a000000000000, 0x4005a00000000000, 0,
    290 	0x42d20000, 0x405a400000000000, 0x4005a40000000000, 0,
    291 	0x42d40000, 0x405a800000000000, 0x4005a80000000000, 0,
    292 	0x42d60000, 0x405ac00000000000, 0x4005ac0000000000, 0,
    293 	0x42d80000, 0x405b000000000000, 0x4005b00000000000, 0,
    294 	0x42da0000, 0x405b400000000000, 0x4005b40000000000, 0,
    295 	0x42dc0000, 0x405b800000000000, 0x4005b80000000000, 0,
    296 	0x42de0000, 0x405bc00000000000, 0x4005bc0000000000, 0,
    297 	0x42e00000, 0x405c000000000000, 0x4005c00000000000, 0,
    298 	0x42e20000, 0x405c400000000000, 0x4005c40000000000, 0,
    299 	0x42e40000, 0x405c800000000000, 0x4005c80000000000, 0,
    300 	0x42e60000, 0x405cc00000000000, 0x4005cc0000000000, 0,
    301 	0x42e80000, 0x405d000000000000, 0x4005d00000000000, 0,
    302 	0x42ea0000, 0x405d400000000000, 0x4005d40000000000, 0,
    303 	0x42ec0000, 0x405d800000000000, 0x4005d80000000000, 0,
    304 	0x42ee0000, 0x405dc00000000000, 0x4005dc0000000000, 0,
    305 	0x42f00000, 0x405e000000000000, 0x4005e00000000000, 0,
    306 	0x42f20000, 0x405e400000000000, 0x4005e40000000000, 0,
    307 	0x42f40000, 0x405e800000000000, 0x4005e80000000000, 0,
    308 	0x42f60000, 0x405ec00000000000, 0x4005ec0000000000, 0,
    309 	0x42f80000, 0x405f000000000000, 0x4005f00000000000, 0,
    310 	0x42fa0000, 0x405f400000000000, 0x4005f40000000000, 0,
    311 	0x42fc0000, 0x405f800000000000, 0x4005f80000000000, 0,
    312 	0x42fe0000, 0x405fc00000000000, 0x4005fc0000000000, 0,
    313 	0x43000000, 0x4060000000000000, 0x4006000000000000, 0,
    314 	0x43010000, 0x4060200000000000, 0x4006020000000000, 0,
    315 	0x43020000, 0x4060400000000000, 0x4006040000000000, 0,
    316 	0x43030000, 0x4060600000000000, 0x4006060000000000, 0,
    317 	0x43040000, 0x4060800000000000, 0x4006080000000000, 0,
    318 	0x43050000, 0x4060a00000000000, 0x40060a0000000000, 0,
    319 	0x43060000, 0x4060c00000000000, 0x40060c0000000000, 0,
    320 	0x43070000, 0x4060e00000000000, 0x40060e0000000000, 0,
    321 	0x43080000, 0x4061000000000000, 0x4006100000000000, 0,
    322 	0x43090000, 0x4061200000000000, 0x4006120000000000, 0,
    323 	0x430a0000, 0x4061400000000000, 0x4006140000000000, 0,
    324 	0x430b0000, 0x4061600000000000, 0x4006160000000000, 0,
    325 	0x430c0000, 0x4061800000000000, 0x4006180000000000, 0,
    326 	0x430d0000, 0x4061a00000000000, 0x40061a0000000000, 0,
    327 	0x430e0000, 0x4061c00000000000, 0x40061c0000000000, 0,
    328 	0x430f0000, 0x4061e00000000000, 0x40061e0000000000, 0,
    329 	0x43100000, 0x4062000000000000, 0x4006200000000000, 0,
    330 	0x43110000, 0x4062200000000000, 0x4006220000000000, 0,
    331 	0x43120000, 0x4062400000000000, 0x4006240000000000, 0,
    332 	0x43130000, 0x4062600000000000, 0x4006260000000000, 0,
    333 	0x43140000, 0x4062800000000000, 0x4006280000000000, 0,
    334 	0x43150000, 0x4062a00000000000, 0x40062a0000000000, 0,
    335 	0x43160000, 0x4062c00000000000, 0x40062c0000000000, 0,
    336 	0x43170000, 0x4062e00000000000, 0x40062e0000000000, 0,
    337 	0x43180000, 0x4063000000000000, 0x4006300000000000, 0,
    338 	0x43190000, 0x4063200000000000, 0x4006320000000000, 0,
    339 	0x431a0000, 0x4063400000000000, 0x4006340000000000, 0,
    340 	0x431b0000, 0x4063600000000000, 0x4006360000000000, 0,
    341 	0x431c0000, 0x4063800000000000, 0x4006380000000000, 0,
    342 	0x431d0000, 0x4063a00000000000, 0x40063a0000000000, 0,
    343 	0x431e0000, 0x4063c00000000000, 0x40063c0000000000, 0,
    344 	0x431f0000, 0x4063e00000000000, 0x40063e0000000000, 0,
    345 	0x43200000, 0x4064000000000000, 0x4006400000000000, 0,
    346 	0x43210000, 0x4064200000000000, 0x4006420000000000, 0,
    347 	0x43220000, 0x4064400000000000, 0x4006440000000000, 0,
    348 	0x43230000, 0x4064600000000000, 0x4006460000000000, 0,
    349 	0x43240000, 0x4064800000000000, 0x4006480000000000, 0,
    350 	0x43250000, 0x4064a00000000000, 0x40064a0000000000, 0,
    351 	0x43260000, 0x4064c00000000000, 0x40064c0000000000, 0,
    352 	0x43270000, 0x4064e00000000000, 0x40064e0000000000, 0,
    353 	0x43280000, 0x4065000000000000, 0x4006500000000000, 0,
    354 	0x43290000, 0x4065200000000000, 0x4006520000000000, 0,
    355 	0x432a0000, 0x4065400000000000, 0x4006540000000000, 0,
    356 	0x432b0000, 0x4065600000000000, 0x4006560000000000, 0,
    357 	0x432c0000, 0x4065800000000000, 0x4006580000000000, 0,
    358 	0x432d0000, 0x4065a00000000000, 0x40065a0000000000, 0,
    359 	0x432e0000, 0x4065c00000000000, 0x40065c0000000000, 0,
    360 	0x432f0000, 0x4065e00000000000, 0x40065e0000000000, 0,
    361 	0x43300000, 0x4066000000000000, 0x4006600000000000, 0,
    362 	0x43310000, 0x4066200000000000, 0x4006620000000000, 0,
    363 	0x43320000, 0x4066400000000000, 0x4006640000000000, 0,
    364 	0x43330000, 0x4066600000000000, 0x4006660000000000, 0,
    365 	0x43340000, 0x4066800000000000, 0x4006680000000000, 0,
    366 	0x43350000, 0x4066a00000000000, 0x40066a0000000000, 0,
    367 	0x43360000, 0x4066c00000000000, 0x40066c0000000000, 0,
    368 	0x43370000, 0x4066e00000000000, 0x40066e0000000000, 0,
    369 	0x43380000, 0x4067000000000000, 0x4006700000000000, 0,
    370 	0x43390000, 0x4067200000000000, 0x4006720000000000, 0,
    371 	0x433a0000, 0x4067400000000000, 0x4006740000000000, 0,
    372 	0x433b0000, 0x4067600000000000, 0x4006760000000000, 0,
    373 	0x433c0000, 0x4067800000000000, 0x4006780000000000, 0,
    374 	0x433d0000, 0x4067a00000000000, 0x40067a0000000000, 0,
    375 	0x433e0000, 0x4067c00000000000, 0x40067c0000000000, 0,
    376 	0x433f0000, 0x4067e00000000000, 0x40067e0000000000, 0,
    377 	0x43400000, 0x4068000000000000, 0x4006800000000000, 0,
    378 	0x43410000, 0x4068200000000000, 0x4006820000000000, 0,
    379 	0x43420000, 0x4068400000000000, 0x4006840000000000, 0,
    380 	0x43430000, 0x4068600000000000, 0x4006860000000000, 0,
    381 	0x43440000, 0x4068800000000000, 0x4006880000000000, 0,
    382 	0x43450000, 0x4068a00000000000, 0x40068a0000000000, 0,
    383 	0x43460000, 0x4068c00000000000, 0x40068c0000000000, 0,
    384 	0x43470000, 0x4068e00000000000, 0x40068e0000000000, 0,
    385 	0x43480000, 0x4069000000000000, 0x4006900000000000, 0,
    386 	0x43490000, 0x4069200000000000, 0x4006920000000000, 0,
    387 	0x434a0000, 0x4069400000000000, 0x4006940000000000, 0,
    388 	0x434b0000, 0x4069600000000000, 0x4006960000000000, 0,
    389 	0x434c0000, 0x4069800000000000, 0x4006980000000000, 0,
    390 	0x434d0000, 0x4069a00000000000, 0x40069a0000000000, 0,
    391 	0x434e0000, 0x4069c00000000000, 0x40069c0000000000, 0,
    392 	0x434f0000, 0x4069e00000000000, 0x40069e0000000000, 0,
    393 	0x43500000, 0x406a000000000000, 0x4006a00000000000, 0,
    394 	0x43510000, 0x406a200000000000, 0x4006a20000000000, 0,
    395 	0x43520000, 0x406a400000000000, 0x4006a40000000000, 0,
    396 	0x43530000, 0x406a600000000000, 0x4006a60000000000, 0,
    397 	0x43540000, 0x406a800000000000, 0x4006a80000000000, 0,
    398 	0x43550000, 0x406aa00000000000, 0x4006aa0000000000, 0,
    399 	0x43560000, 0x406ac00000000000, 0x4006ac0000000000, 0,
    400 	0x43570000, 0x406ae00000000000, 0x4006ae0000000000, 0,
    401 	0x43580000, 0x406b000000000000, 0x4006b00000000000, 0,
    402 	0x43590000, 0x406b200000000000, 0x4006b20000000000, 0,
    403 	0x435a0000, 0x406b400000000000, 0x4006b40000000000, 0,
    404 	0x435b0000, 0x406b600000000000, 0x4006b60000000000, 0,
    405 	0x435c0000, 0x406b800000000000, 0x4006b80000000000, 0,
    406 	0x435d0000, 0x406ba00000000000, 0x4006ba0000000000, 0,
    407 	0x435e0000, 0x406bc00000000000, 0x4006bc0000000000, 0,
    408 	0x435f0000, 0x406be00000000000, 0x4006be0000000000, 0,
    409 	0x43600000, 0x406c000000000000, 0x4006c00000000000, 0,
    410 	0x43610000, 0x406c200000000000, 0x4006c20000000000, 0,
    411 	0x43620000, 0x406c400000000000, 0x4006c40000000000, 0,
    412 	0x43630000, 0x406c600000000000, 0x4006c60000000000, 0,
    413 	0x43640000, 0x406c800000000000, 0x4006c80000000000, 0,
    414 	0x43650000, 0x406ca00000000000, 0x4006ca0000000000, 0,
    415 	0x43660000, 0x406cc00000000000, 0x4006cc0000000000, 0,
    416 	0x43670000, 0x406ce00000000000, 0x4006ce0000000000, 0,
    417 	0x43680000, 0x406d000000000000, 0x4006d00000000000, 0,
    418 	0x43690000, 0x406d200000000000, 0x4006d20000000000, 0,
    419 	0x436a0000, 0x406d400000000000, 0x4006d40000000000, 0,
    420 	0x436b0000, 0x406d600000000000, 0x4006d60000000000, 0,
    421 	0x436c0000, 0x406d800000000000, 0x4006d80000000000, 0,
    422 	0x436d0000, 0x406da00000000000, 0x4006da0000000000, 0,
    423 	0x436e0000, 0x406dc00000000000, 0x4006dc0000000000, 0,
    424 	0x436f0000, 0x406de00000000000, 0x4006de0000000000, 0,
    425 	0x43700000, 0x406e000000000000, 0x4006e00000000000, 0,
    426 	0x43710000, 0x406e200000000000, 0x4006e20000000000, 0,
    427 	0x43720000, 0x406e400000000000, 0x4006e40000000000, 0,
    428 	0x43730000, 0x406e600000000000, 0x4006e60000000000, 0,
    429 	0x43740000, 0x406e800000000000, 0x4006e80000000000, 0,
    430 	0x43750000, 0x406ea00000000000, 0x4006ea0000000000, 0,
    431 	0x43760000, 0x406ec00000000000, 0x4006ec0000000000, 0,
    432 	0x43770000, 0x406ee00000000000, 0x4006ee0000000000, 0,
    433 	0x43780000, 0x406f000000000000, 0x4006f00000000000, 0,
    434 	0x43790000, 0x406f200000000000, 0x4006f20000000000, 0,
    435 	0x437a0000, 0x406f400000000000, 0x4006f40000000000, 0,
    436 	0x437b0000, 0x406f600000000000, 0x4006f60000000000, 0,
    437 	0x437c0000, 0x406f800000000000, 0x4006f80000000000, 0,
    438 	0x437d0000, 0x406fa00000000000, 0x4006fa0000000000, 0,
    439 	0x437e0000, 0x406fc00000000000, 0x4006fc0000000000, 0,
    440 	0x437f0000, 0x406fe00000000000, 0x4006fe0000000000, 0,
    441 };
    442 
    443 /* -ve of the values in val[] above */
    444 static unsigned long neg_val_sp[N_VALS];
    445 static uint64_t neg_val_dp[N_VALS];
    446 
    447 /*
    448  * data_path_sp(struct fps_test_ereport *report)checks the data path
    449  * between registers and memory, between memory and an floating
    450  * registers, and between floating registers and the weitek chips.
    451  * All the bits are covered including the sign bit. If an error is
    452  * found, all relevant data is stored in report.
    453  */
    454 #ifndef i86pc
    455 static int
    456 data_path_sp(struct fps_test_ereport *report)
    457 {
    458 	int i;
    459 	int j;
    460 	int k;
    461 	uint64_t expected;
    462 	uint64_t observed;
    463 	unsigned long prev_fsr;
    464 	unsigned long result;
    465 	unsigned long value;
    466 
    467 	prev_fsr = get_fsr();
    468 	init_regs(0);
    469 
    470 	for (i = 0; i < 2; i++) {
    471 		for (j = 1; j < 255; j++) {
    472 			for (k = 0; k < 23; k++) {
    473 				value = (i << 31) | (j << 23) | (1 << k);
    474 
    475 				if (result = datap_add(value)) {
    476 					observed = (uint64_t)result;
    477 					expected = (uint64_t)0;
    478 					setup_fps_test_struct(
    479 					    NO_EREPORT_INFO,
    480 					    report, 6217, &observed,
    481 					    &expected, 1, 1);
    482 
    483 					return (-1);
    484 				}
    485 				if (result = datap_mult(value)) {
    486 					observed = (uint64_t)result;
    487 					expected = (uint64_t)0;
    488 					setup_fps_test_struct(
    489 					    NO_EREPORT_INFO,
    490 					    report, 6218, &observed,
    491 					    &expected, 1, 1);
    492 
    493 					return (-1);
    494 				}
    495 			}
    496 		}
    497 	}
    498 
    499 	set_fsr(prev_fsr);
    500 
    501 	return (0);
    502 }
    503 
    504 /*
    505  * data_path_dp(struct fps_test_ereport *report) performs the
    506  * same function as data_path_sp except it's double precision
    507  * instead of single. If an error is found, all relevant data
    508  * is stored in report.
    509  */
    510 static int
    511 data_path_dp(struct fps_test_ereport *report)
    512 {
    513 	int i;
    514 	int j;
    515 	int k;
    516 	int l;
    517 	uint64_t observed[2];
    518 	uint64_t expected[2];
    519 	unsigned long prev_fsr;
    520 	unsigned long result_lsw = 0;
    521 	unsigned long result_msw = 0;
    522 	unsigned long value_lsw;
    523 	unsigned long value_msw;
    524 
    525 	prev_fsr = get_fsr();
    526 	init_regs(0);
    527 
    528 	for (i = 0; i < 2; i++) {
    529 		for (j = 1; j < 2047; j++) {
    530 			for (k = 0; k < 52; k++) {
    531 				value_lsw = (1 << k);
    532 
    533 				if (k > 32)
    534 					l = k - 32;
    535 				else
    536 					l = 32;
    537 
    538 				value_msw = (i << 31) | (j << 20) | (1 << l);
    539 
    540 				if (datap_add_dp(value_msw, value_lsw)) {
    541 					observed[0] = (uint64_t)result_msw;
    542 					observed[1] = (uint64_t)result_lsw;
    543 					expected[0] = (uint64_t)value_msw;
    544 					expected[1] = (uint64_t)value_lsw;
    545 					setup_fps_test_struct(
    546 					    NO_EREPORT_INFO, report,
    547 					    6219, observed, expected,
    548 					    2, 2);
    549 
    550 					return (-1);
    551 				}
    552 
    553 				if (datap_mult_dp(value_msw, value_lsw)) {
    554 					observed[0] = (uint64_t)result_msw;
    555 					observed[1] = (uint64_t)result_lsw;
    556 					expected[0] = (uint64_t)value_msw;
    557 					expected[1] = (uint64_t)value_lsw;
    558 					setup_fps_test_struct(
    559 					    NO_EREPORT_INFO, report,
    560 					    6220, observed, expected,
    561 					    2, 2);
    562 
    563 					return (-1);
    564 				}
    565 			}
    566 		}
    567 	}
    568 
    569 	set_fsr(prev_fsr);
    570 
    571 	return (0);
    572 }
    573 
    574 /*
    575  * timing_test(struct fps_test_ereport *report) does 10 add
    576  * operations continuously and 10 multiply operations
    577  * continusously. If an error is found, relevant data is
    578  * stored in report.
    579  */
    580 static int
    581 timing_test(struct fps_test_ereport *report)
    582 {
    583 	int i;
    584 	uint64_t expected;
    585 	uint64_t observed;
    586 	unsigned long result;
    587 	unsigned long prev_fsr;
    588 
    589 	prev_fsr = get_fsr();
    590 
    591 	for (i = 0; i < 1000; i++) {
    592 		init_regs(0);
    593 		if (result = timing_add_sp()) {
    594 			observed = (uint64_t)result;
    595 			expected = (uint64_t)0;
    596 			setup_fps_test_struct(NO_EREPORT_INFO,
    597 			    report, 6221, &observed, &expected, 1, 1);
    598 
    599 			return (-1);
    600 		}
    601 
    602 		init_regs(0);
    603 
    604 		if (result = timing_mult_sp()) {
    605 			observed = (uint64_t)result;
    606 			expected = (uint64_t)0;
    607 			setup_fps_test_struct(NO_EREPORT_INFO,
    608 			    report, 6222, &observed, &expected, 1, 1);
    609 
    610 			return (-1);
    611 		}
    612 
    613 		init_regs(0);
    614 
    615 		if (result = timing_add_dp()) {
    616 			observed = (uint64_t)result;
    617 			expected = (uint64_t)0;
    618 			setup_fps_test_struct(NO_EREPORT_INFO,
    619 			    report, 6223, &observed, &expected, 1, 1);
    620 
    621 			return (-1);
    622 		}
    623 
    624 		init_regs(0);
    625 
    626 		if (result = timing_mult_dp()) {
    627 			observed = (uint64_t)result;
    628 			expected = (uint64_t)0;
    629 			setup_fps_test_struct(NO_EREPORT_INFO,
    630 			    report, 6224, &observed, &expected, 1, 1);
    631 
    632 			return (-1);
    633 		}
    634 	}
    635 
    636 	set_fsr(prev_fsr);
    637 
    638 	return (0);
    639 }
    640 
    641 /*
    642  * chain_sp_test(struct fps_test_ereport *report)
    643  * performs a series of single precision chaining
    644  * tests. If an error is found, relevant data is
    645  * stored in report.
    646  */
    647 static int
    648 chain_sp_test(struct fps_test_ereport *report)
    649 {
    650 	char err_data[MAX_INFO_SIZE];
    651 	int i;
    652 	uint64_t result;
    653 	uint64_t expected;
    654 	uint64_t observed;
    655 	unsigned long prev_fsr;
    656 
    657 	prev_fsr = get_fsr();
    658 	init_regs(0);
    659 	set_fsr(0);
    660 
    661 	for (i = 1; i < 60; i++) {
    662 		if ((result = chain_sp(i)) != (unsigned long) i) {
    663 			observed = (uint64_t)result;
    664 			expected = (uint64_t)i;
    665 			(void) snprintf(err_data, sizeof (err_data),
    666 			    "\nExpected: %d\nObserved: %d", i, result);
    667 			setup_fps_test_struct(IS_EREPORT_INFO,
    668 			    report, 6225, &observed, &expected, 1, 1,
    669 			    err_data);
    670 
    671 			return (-1);
    672 		}
    673 	}
    674 
    675 	set_fsr(prev_fsr);
    676 
    677 	return (0);
    678 }
    679 
    680 /*
    681  * chain_dp_test(struct fps_test_ereport *report)
    682  * performs a series of double precision chaining
    683  * tests. If an error is found, relevant data is
    684  * stored in report.
    685  */
    686 static int
    687 chain_dp_test(struct fps_test_ereport *report)
    688 {
    689 	char err_data[MAX_INFO_SIZE];
    690 	int i;
    691 	uint64_t result;
    692 	uint64_t expected;
    693 	uint64_t observed;
    694 	unsigned long prev_fsr;
    695 
    696 	prev_fsr = get_fsr();
    697 	init_regs(0);
    698 	set_fsr(0);
    699 
    700 	for (i = 1; i < 60; i++) {
    701 		if ((result = chain_dp(i)) != (unsigned long) i) {
    702 			observed = (uint64_t)result;
    703 			expected = (uint64_t)i;
    704 			(void) snprintf(err_data, sizeof (err_data),
    705 			    "\nExpected: %d\nObserved: %d", i, result);
    706 			setup_fps_test_struct(IS_EREPORT_INFO,
    707 			    report, 6226, &observed, &expected, 1, 1,
    708 			    err_data);
    709 
    710 			return (-1);
    711 		}
    712 	}
    713 
    714 	set_fsr(prev_fsr);
    715 
    716 	return (0);
    717 }
    718 
    719 /*
    720  * integer_to_float_sp(struct fps_test_ereport *report)
    721  * does continuous integer to float, single precision
    722  * conversions. If an error is found, relevant data is stored
    723  * in report.
    724  */
    725 static int
    726 integer_to_float_sp(struct fps_test_ereport *report)
    727 {
    728 	char err_data[MAX_INFO_SIZE];
    729 	int i;
    730 	uint64_t expected;
    731 	uint64_t observed;
    732 	unsigned long prev_fsr;
    733 	unsigned long result;
    734 
    735 	prev_fsr = get_fsr();
    736 	init_regs(0);
    737 
    738 	for (i = 0; i < N_VALS; i++) {
    739 		result = int_float_s(i);
    740 		if (result != val[i].floatsingle) {
    741 			observed = (uint64_t)result;
    742 			expected = (uint64_t)val[i].floatsingle;
    743 			(void) snprintf(err_data, sizeof (err_data),
    744 			    "Val Entry[%d]\nExpected: %d"
    745 			    "\nObserved: %d", i, val[i].floatsingle,
    746 			    result);
    747 			setup_fps_test_struct(IS_EREPORT_INFO,
    748 			    report, 6227, &observed, &expected, 1, 1,
    749 			    err_data);
    750 
    751 			return (-1);
    752 		}
    753 	}
    754 
    755 	set_fsr(prev_fsr);
    756 
    757 	return (0);
    758 }
    759 
    760 /*
    761  * integer_to_float_dp(struct fps_test_ereport *report)
    762  * does continuous integer to float, double precision
    763  * conversions. If an error is found, relevant data is stored
    764  * in report.
    765  */
    766 static int
    767 integer_to_float_dp(struct fps_test_ereport *report)
    768 {
    769 	char err_data[MAX_INFO_SIZE];
    770 	int i;
    771 	uint64_t expected;
    772 	uint64_t observed;
    773 	unsigned long prev_fsr;
    774 	unsigned long result;
    775 
    776 	prev_fsr = get_fsr();
    777 	init_regs(0);
    778 
    779 	for (i = 0; i < N_VALS; i++) {
    780 		result = int_float_d(i);
    781 		if (result != val[i].floatdouble) {
    782 			observed = (uint64_t)result;
    783 			expected = (uint64_t)val[i].floatdouble;
    784 			(void) snprintf(err_data, sizeof (err_data),
    785 			    "Val Entry[%d]\nExpected: %lld"
    786 			    "\nObserved: %lld", i, val[i].floatdouble,
    787 			    result);
    788 			setup_fps_test_struct(IS_EREPORT_INFO,
    789 			    report, 6228, &observed, &expected, 1, 1,
    790 			    err_data);
    791 
    792 			return (-1);
    793 		}
    794 	}
    795 
    796 	set_fsr(prev_fsr);
    797 
    798 	return (0);
    799 }
    800 
    801 /*
    802  * long_to_float_sp(struct fps_test_ereport *report)
    803  * performs continuous, single precision, unsigned
    804  * long to float conversions. If an error is found,
    805  * relevant data is stored in report.
    806  */
    807 static int
    808 long_to_float_sp(struct fps_test_ereport *report)
    809 {
    810 	char err_data[MAX_INFO_SIZE];
    811 	uint64_t expected;
    812 	uint64_t observed;
    813 	unsigned long i;
    814 	unsigned long prev_fsr;
    815 	unsigned long result;
    816 
    817 	prev_fsr = get_fsr();
    818 	init_regs(0);
    819 
    820 	for (i = 0; i < N_VALS; i++) {
    821 		result = long_float_s(i);
    822 		if (result != val[i].floatsingle) {
    823 			observed = (uint64_t)result;
    824 			expected = (uint64_t)val[i].floatsingle;
    825 			(void) snprintf(err_data, sizeof (err_data),
    826 			    "Val Entry[%d]\nExpected: %d"
    827 			    "\nObserved: %d", i, val[i].floatdouble,
    828 			    result);
    829 			setup_fps_test_struct(IS_EREPORT_INFO,
    830 			    report, 6353, &observed, &expected, 1, 1,
    831 			    err_data);
    832 
    833 			return (-1);
    834 		}
    835 	}
    836 
    837 	set_fsr(prev_fsr);
    838 
    839 	return (0);
    840 }
    841 
    842 /*
    843  * long_to_float_dp(struct fps_test_ereport *report)
    844  * performs continuous, double precision, unsigned
    845  * long to float conversions. If an error is found,
    846  * relevant data is stored in report.
    847  */
    848 static int
    849 long_to_float_dp(struct fps_test_ereport *report)
    850 {
    851 	char err_data[MAX_INFO_SIZE];
    852 	uint64_t expected;
    853 	uint64_t observed;
    854 	unsigned long i;
    855 	unsigned long prev_fsr;
    856 	unsigned long res1;
    857 
    858 	prev_fsr = get_fsr();
    859 	init_regs(0);
    860 
    861 	for (i = 0; i < N_VALS; i++) {
    862 		res1 = long_float_d(i);
    863 		if (res1 != val[i].floatdouble) {
    864 			observed = (uint64_t)res1;
    865 			expected = (uint64_t)val[i].floatdouble;
    866 			(void) snprintf(err_data, sizeof (err_data),
    867 			    "Val Entry[%d]\nExpected: %lld"
    868 			    "\nObserved: %lld", i, val[i].floatdouble,
    869 			    res1);
    870 			setup_fps_test_struct(IS_EREPORT_INFO,
    871 			    report, 6354, &observed, &expected, 1, 1,
    872 			    err_data);
    873 
    874 			return (-1);
    875 		}
    876 	}
    877 
    878 	set_fsr(prev_fsr);
    879 
    880 	return (0);
    881 }
    882 
    883 /*
    884  * float_to_integer_sp(struct fps_test_ereport *report)
    885  * performs continuous, single precision float to
    886  * integer conversions. If an error is found, relevant
    887  * data is stored in report.
    888  */
    889 static int
    890 float_to_integer_sp(struct fps_test_ereport *report)
    891 {
    892 	char err_data[MAX_INFO_SIZE];
    893 	uint64_t i;
    894 	unsigned long prev_fsr;
    895 	unsigned long result;
    896 	uint64_t observed;
    897 	uint64_t expected;
    898 
    899 	prev_fsr = get_fsr();
    900 
    901 	init_regs(0);
    902 
    903 	for (i = 0; i < N_VALS; i++) {
    904 		result = float_int_s(val[i].floatsingle);
    905 		if (result != i) {
    906 			observed = (uint64_t)result;
    907 			expected = (uint64_t)i;
    908 			(void) snprintf(err_data, sizeof (err_data),
    909 			    "Val Entry[%d]\nExpected: %d"
    910 			    "\nObserved: %d", i, i,
    911 			    result);
    912 			setup_fps_test_struct(IS_EREPORT_INFO,
    913 			    report, 6229, &observed, &expected, 1, 1,
    914 			    err_data);
    915 
    916 			return (-1);
    917 		}
    918 	}
    919 
    920 	/*
    921 	 * Value greater than highest representable value in int has to raise
    922 	 * an invalid exception.
    923 	 *
    924 	 * Highest possible value in int (assume uint) is 2^32; Use 2^33 for a
    925 	 * value greater.
    926 	 */
    927 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
    928 
    929 	/* Set trap flag to solicited */
    930 	trap_flag = trap_flag | TRAP_SOLICITED;
    931 
    932 	(void) float_int_s(0x50000000);
    933 
    934 	if (trap_flag) {
    935 		observed = (uint64_t)trap_flag;
    936 		expected = (uint64_t)0;
    937 		(void) snprintf(err_data, sizeof (err_data),
    938 		    "fstoi max value exception not raised, "
    939 		    "fp val=%lx, fsr=%lx",
    940 		    0x50000000, fsr_at_trap);
    941 		setup_fps_test_struct(IS_EREPORT_INFO,
    942 		    report, 5307, &observed, &expected, 1, 1,
    943 		    err_data);
    944 
    945 		return (-1);
    946 	}
    947 
    948 	if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
    949 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
    950 		expected = (uint64_t)FSR_CEXC_NV;
    951 		(void) snprintf(err_data, sizeof (err_data),
    952 		    "fstoi max value exception not raised, "
    953 		    "fp val=%lx, fsr=%lx",
    954 		    0x50000000, fsr_at_trap);
    955 		setup_fps_test_struct(IS_EREPORT_INFO,
    956 		    report, 5308, &observed, &expected, 1, 1,
    957 		    err_data);
    958 
    959 		return (-1);
    960 	}
    961 
    962 	/* NaNs should raise an exception when converted */
    963 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
    964 	trap_flag = trap_flag | TRAP_SOLICITED;
    965 
    966 	(void) float_int_s(nan_sp);
    967 
    968 	if (trap_flag) {
    969 		observed = (uint64_t)trap_flag;
    970 		expected = (uint64_t)0;
    971 		(void) snprintf(err_data, sizeof (err_data),
    972 		    "fstoi NaN exception not raised, "
    973 		    "fp val=%lx, fsr=%lx",
    974 		    nan_sp, fsr_at_trap);
    975 		setup_fps_test_struct(IS_EREPORT_INFO,
    976 		    report, 5309, &observed, &expected, 1, 1,
    977 		    err_data);
    978 
    979 		return (-1);
    980 	}
    981 
    982 	if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
    983 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
    984 		expected = (uint64_t)FSR_CEXC_NV;
    985 		(void) snprintf(err_data, sizeof (err_data),
    986 		    "fstoi NaN exception not raised, "
    987 		    "fp val=%lx, fsr=%lx",
    988 		    nan_sp, fsr_at_trap);
    989 		setup_fps_test_struct(IS_EREPORT_INFO,
    990 		    report, 5310, &observed, &expected, 1, 1,
    991 		    err_data);
    992 
    993 		return (-1);
    994 	}
    995 
    996 	/* + infinity exceptions */
    997 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
    998 	trap_flag = trap_flag | TRAP_SOLICITED;
    999 
   1000 	(void) float_int_s(PLUS_INF_SP);
   1001 
   1002 	if (trap_flag) {
   1003 		observed = (uint64_t)trap_flag;
   1004 		expected = (uint64_t)0;
   1005 		(void) snprintf(err_data, sizeof (err_data),
   1006 		    "fstoi +infinity exception not raised, "
   1007 		    "fp val=%lx, fsr=%lx",
   1008 		    PLUS_INF_SP, fsr_at_trap);
   1009 		setup_fps_test_struct(IS_EREPORT_INFO,
   1010 		    report, 5311, &observed, &expected, 1, 1,
   1011 		    err_data);
   1012 
   1013 		return (-1);
   1014 	}
   1015 
   1016 	if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
   1017 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
   1018 		expected = (uint64_t)FSR_CEXC_NV;
   1019 		(void) snprintf(err_data, sizeof (err_data),
   1020 		    "fstoi +infinity exception not raised, "
   1021 		    "fp val=%lx, fsr=%lx",
   1022 		    PLUS_INF_SP, fsr_at_trap);
   1023 		setup_fps_test_struct(IS_EREPORT_INFO,
   1024 		    report, 5312, &observed, &expected, 1, 1,
   1025 		    err_data);
   1026 
   1027 		return (-1);
   1028 	}
   1029 
   1030 	/* - infinity exceptions */
   1031 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
   1032 	trap_flag = trap_flag | TRAP_SOLICITED;
   1033 
   1034 	(void) float_int_s(MINUS_INF_SP);
   1035 
   1036 	if (trap_flag) {
   1037 		observed = (uint64_t)trap_flag;
   1038 		expected = (uint64_t)0;
   1039 		(void) snprintf(err_data, sizeof (err_data),
   1040 		    "fstoi -infinity exception not raised, "
   1041 		    "fp val=%lx, fsr=%lx",
   1042 		    MINUS_INF_SP, fsr_at_trap);
   1043 		setup_fps_test_struct(IS_EREPORT_INFO,
   1044 		    report, 5313, &observed, &expected, 1, 1,
   1045 		    err_data);
   1046 
   1047 		return (-1);
   1048 	}
   1049 
   1050 	if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
   1051 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
   1052 		expected = (uint64_t)FSR_CEXC_NV;
   1053 		(void) snprintf(err_data, sizeof (err_data),
   1054 		    "fstoi -infinity exception not raised, "
   1055 		    "fp val=%lx, fsr=%lx",
   1056 		    MINUS_INF_SP, fsr_at_trap);
   1057 		setup_fps_test_struct(IS_EREPORT_INFO,
   1058 		    report, 5314, &observed, &expected, 1, 1, err_data);
   1059 
   1060 		return (-1);
   1061 	}
   1062 
   1063 	/* Check for inexact exception raised because of fractions */
   1064 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NX);
   1065 	trap_flag = trap_flag | TRAP_SOLICITED;
   1066 
   1067 	(void) float_int_s(pi_sp);
   1068 
   1069 	if (trap_flag) {
   1070 		observed = (uint64_t)trap_flag;
   1071 		expected = (uint64_t)0;
   1072 		(void) snprintf(err_data, sizeof (err_data),
   1073 		    "fstoi inexact exception not raised, "
   1074 		    "fp val=%lx, fsr=%lx",
   1075 		    pi_sp, fsr_at_trap);
   1076 		setup_fps_test_struct(IS_EREPORT_INFO,
   1077 		    report, 5315, &observed, &expected, 1, 1, err_data);
   1078 
   1079 		return (-1);
   1080 	}
   1081 
   1082 	if ((fsr_at_trap & FSR_CEXC_NX) != FSR_CEXC_NX) {
   1083 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NX;
   1084 		expected = (uint64_t)FSR_CEXC_NX;
   1085 		(void) snprintf(err_data, sizeof (err_data),
   1086 		    "fstoi inexact exception not raised, "
   1087 		    "fp val=%lx, fsr=%lx",
   1088 		    pi_sp, fsr_at_trap);
   1089 		setup_fps_test_struct(IS_EREPORT_INFO,
   1090 		    report, 5316, &observed, &expected, 1, 1, err_data);
   1091 
   1092 		return (-1);
   1093 	}
   1094 
   1095 	set_fsr(prev_fsr);
   1096 	return (0);
   1097 }
   1098 
   1099 /*
   1100  * float_to_integer_dp(struct fps_test_ereport *report)
   1101  * performs continuous, double precision float to
   1102  * integer conversions. If an error is found, relevant
   1103  * data is stored in report.
   1104  */
   1105 static int
   1106 float_to_integer_dp(struct fps_test_ereport *report)
   1107 {
   1108 	char err_data[MAX_INFO_SIZE];
   1109 	uint64_t i;
   1110 	uint64_t expected;
   1111 	uint64_t observed;
   1112 	unsigned long prev_fsr;
   1113 	unsigned long res1;
   1114 
   1115 	prev_fsr = get_fsr();
   1116 
   1117 	init_regs(0);
   1118 	for (i = 0; i < N_VALS; i++) {
   1119 		res1 = float_int_d(val[i].floatdouble);
   1120 
   1121 		if (res1 != i) {
   1122 			observed = (uint64_t)res1;
   1123 			expected = (uint64_t)i;
   1124 			(void) snprintf(err_data, sizeof (err_data),
   1125 			    "Val Entry[%d]\nExpected: %d"
   1126 			    "\nObserved: %d", i, i,
   1127 			    res1);
   1128 			setup_fps_test_struct(IS_EREPORT_INFO,
   1129 			    report, 6230, &observed, &expected, 1,
   1130 			    1, err_data);
   1131 
   1132 			return (-1);
   1133 		}
   1134 	}
   1135 
   1136 	/*
   1137 	 * Value greater than highest representable value in int has to raise
   1138 	 * an invalid exception.
   1139 	 *
   1140 	 * Highest possible value in int (assume uint) is 2^32; Use 2^33 for a
   1141 	 * value greater.
   1142 	 */
   1143 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
   1144 	trap_flag = trap_flag | TRAP_SOLICITED;
   1145 
   1146 	(void) float_int_d(0x4200000000000000);
   1147 
   1148 	if (trap_flag) {
   1149 		observed = (uint64_t)trap_flag;
   1150 		expected = (uint64_t)0;
   1151 		(void) snprintf(err_data, sizeof (err_data),
   1152 		    "fdtoi max value exception not raised, "
   1153 		    "fp val=%llx, fsr=%lx",
   1154 		    0x4200000000000000, fsr_at_trap);
   1155 		setup_fps_test_struct(IS_EREPORT_INFO,
   1156 		    report, 5317, &observed, &expected, 1,
   1157 		    1, err_data);
   1158 
   1159 		return (-1);
   1160 	}
   1161 
   1162 	if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
   1163 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
   1164 		expected = (uint64_t)FSR_CEXC_NV;
   1165 		(void) snprintf(err_data, sizeof (err_data),
   1166 		    "fdtoi max value exception not raised, "
   1167 		    "fp val=%llx, fsr=%lx",
   1168 		    0x4200000000000000, fsr_at_trap);
   1169 		setup_fps_test_struct(IS_EREPORT_INFO,
   1170 		    report, 5318, &observed, &expected, 1,
   1171 		    1, err_data);
   1172 
   1173 		return (-1);
   1174 	}
   1175 
   1176 	/* NaNs should raise an exception when converted */
   1177 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
   1178 	trap_flag = trap_flag | TRAP_SOLICITED;
   1179 
   1180 	(void) float_int_d(nan_dp);
   1181 
   1182 	if (trap_flag) {
   1183 		observed = (uint64_t)trap_flag;
   1184 		expected = (uint64_t)0;
   1185 		(void) snprintf(err_data, sizeof (err_data),
   1186 		    "fdtoi NaN exception not raised, "
   1187 		    "fp val=%llx, fsr=%lx",
   1188 		    nan_dp, fsr_at_trap);
   1189 		setup_fps_test_struct(IS_EREPORT_INFO,
   1190 		    report, 5319, &observed, &expected, 1,
   1191 		    1, err_data);
   1192 
   1193 		return (-1);
   1194 	}
   1195 
   1196 	if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
   1197 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
   1198 		expected = (uint64_t)FSR_CEXC_NV;
   1199 		(void) snprintf(err_data, sizeof (err_data),
   1200 		    "fdtoi NaN exception not raised, "
   1201 		    "fp val=%llx, fsr=%lx",
   1202 		    nan_dp, fsr_at_trap);
   1203 		setup_fps_test_struct(IS_EREPORT_INFO,
   1204 		    report, 5320, &observed, &expected, 1,
   1205 		    1, err_data);
   1206 
   1207 		return (-1);
   1208 	}
   1209 
   1210 	/* + infinity exceptions */
   1211 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
   1212 	trap_flag = trap_flag | TRAP_SOLICITED;
   1213 
   1214 	(void) float_int_d(PLUS_INF_DP);
   1215 
   1216 	if (trap_flag) {
   1217 		observed = (uint64_t)trap_flag;
   1218 		expected = (uint64_t)0;
   1219 		(void) snprintf(err_data, sizeof (err_data),
   1220 		    "fdtoi +infinity exception not raised, "
   1221 		    "fp val=%llx, fsr=%lx",
   1222 		    PLUS_INF_DP, fsr_at_trap);
   1223 		setup_fps_test_struct(IS_EREPORT_INFO,
   1224 		    report, 5321, &observed, &expected, 1,
   1225 		    1, err_data);
   1226 
   1227 		return (-1);
   1228 	}
   1229 
   1230 	if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
   1231 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
   1232 		expected = (uint64_t)FSR_CEXC_NV;
   1233 		(void) snprintf(err_data, sizeof (err_data),
   1234 		    "fdtoi +infinity exception not raised, "
   1235 		    "fp val=%llx, fsr=%lx",
   1236 		    PLUS_INF_DP, fsr_at_trap);
   1237 		setup_fps_test_struct(IS_EREPORT_INFO,
   1238 		    report, 5322, &observed, &expected, 1,
   1239 		    1, err_data);
   1240 
   1241 		return (-1);
   1242 	}
   1243 
   1244 	/* - infinity exceptions */
   1245 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
   1246 	trap_flag = trap_flag | TRAP_SOLICITED;
   1247 
   1248 	(void) float_int_d(MINUS_INF_DP);
   1249 
   1250 	if (trap_flag) {
   1251 		observed = (uint64_t)trap_flag;
   1252 		expected = (uint64_t)0;
   1253 		(void) snprintf(err_data, sizeof (err_data),
   1254 		    "fdtoi -infinity exception not raised, "
   1255 		    "fp val=%llx, fsr=%lx",
   1256 		    MINUS_INF_DP, fsr_at_trap);
   1257 		setup_fps_test_struct(IS_EREPORT_INFO,
   1258 		    report, 5323, &observed, &expected, 1,
   1259 		    1, err_data);
   1260 
   1261 		return (-1);
   1262 	}
   1263 
   1264 	if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
   1265 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
   1266 		expected = (uint64_t)FSR_CEXC_NV;
   1267 		(void) snprintf(err_data, sizeof (err_data),
   1268 		    "fdtoi -infinity exception not raised, "
   1269 		    "fp val=%llx, fsr=%lx",
   1270 		    MINUS_INF_DP, fsr_at_trap);
   1271 		setup_fps_test_struct(IS_EREPORT_INFO,
   1272 		    report, 5324, &observed, &expected, 1,
   1273 		    1, err_data);
   1274 
   1275 		return (-1);
   1276 	}
   1277 
   1278 	/* Check for inexact exception raised because of fractions */
   1279 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NX);
   1280 	trap_flag = trap_flag | TRAP_SOLICITED;
   1281 
   1282 	(void) float_int_d(pi_dp);
   1283 	if (trap_flag) {
   1284 		observed = (uint64_t)trap_flag;
   1285 		expected = (uint64_t)0;
   1286 		(void) snprintf(err_data, sizeof (err_data),
   1287 		    "fdtoi inexact exception not raised, "
   1288 		    "fp val=%llx, fsr=%lx",
   1289 		    pi_dp, fsr_at_trap);
   1290 		setup_fps_test_struct(IS_EREPORT_INFO,
   1291 		    report, 5325, &observed, &expected, 1,
   1292 		    1, err_data);
   1293 
   1294 		return (-1);
   1295 	}
   1296 
   1297 	if ((fsr_at_trap & FSR_CEXC_NX) != FSR_CEXC_NX) {
   1298 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NX;
   1299 		expected = (uint64_t)FSR_CEXC_NX;
   1300 		(void) snprintf(err_data, sizeof (err_data),
   1301 		    "fdtoi inexact exception not raised, "
   1302 		    "fp val=%llx, fsr=%lx",
   1303 		    pi_dp, fsr_at_trap);
   1304 		setup_fps_test_struct(IS_EREPORT_INFO,
   1305 		    report, 5326, &observed, &expected, 1,
   1306 		    1, err_data);
   1307 
   1308 		return (-1);
   1309 	}
   1310 
   1311 	set_fsr(prev_fsr);
   1312 
   1313 	return (0);
   1314 }
   1315 
   1316 /*
   1317  * float_to_long_sp(struct fps_test_ereport *report)
   1318  * does continuous, single precision, float to long
   1319  * conversions. If an error is found, relevant data
   1320  * is stored in report.
   1321  */
   1322 static int
   1323 float_to_long_sp(struct fps_test_ereport *report)
   1324 {
   1325 	char err_data[MAX_INFO_SIZE];
   1326 	uint64_t i;
   1327 	uint64_t expected;
   1328 	uint64_t observed;
   1329 	unsigned long prev_fsr;
   1330 	unsigned long result;
   1331 
   1332 	prev_fsr = get_fsr();
   1333 
   1334 	init_regs(0);
   1335 
   1336 	for (i = 0; i < N_VALS; i++) {
   1337 		result = float_long_s(val[i].floatsingle);
   1338 
   1339 		if (result != i) {
   1340 			observed = (uint64_t)result;
   1341 			expected = (uint64_t)i;
   1342 			(void) snprintf(err_data, sizeof (err_data),
   1343 			    "Val Entry[%d]\nExpected: %d"
   1344 			    "\nObserved: %d", i, i,
   1345 			    result);
   1346 			setup_fps_test_struct(IS_EREPORT_INFO,
   1347 			    report, 6352, &observed, &expected, 1,
   1348 			    1, err_data);
   1349 
   1350 			return (-1);
   1351 		}
   1352 	}
   1353 
   1354 	/*
   1355 	 * Value greater than highest representable value in int has to raise
   1356 	 * an invalid exception.
   1357 	 *
   1358 	 * Highest possible value in int (assume uint) is 2^64; Use 2^65 for a
   1359 	 * value greater.
   1360 	 */
   1361 
   1362 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
   1363 	trap_flag = trap_flag | TRAP_SOLICITED;
   1364 
   1365 	(void) float_long_s(0x60000000);
   1366 
   1367 	if (trap_flag) {
   1368 		observed = (uint64_t)trap_flag;
   1369 		expected = (uint64_t)0;
   1370 		(void) snprintf(err_data, sizeof (err_data),
   1371 		    "fstox max value exception not raised, "
   1372 		    "fp val=%lx, fsr=%lx",
   1373 		    0x60000000, fsr_at_trap);
   1374 		setup_fps_test_struct(IS_EREPORT_INFO,
   1375 		    report, 5327, &observed, &expected, 1,
   1376 		    1, err_data);
   1377 
   1378 		return (-1);
   1379 	}
   1380 
   1381 	if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
   1382 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
   1383 		expected = (uint64_t)FSR_CEXC_NV;
   1384 		(void) snprintf(err_data, sizeof (err_data),
   1385 		    "fstox max value exception not raised, "
   1386 		    "fp val=%lx, fsr=%lx",
   1387 		    0x50000000, fsr_at_trap);
   1388 		setup_fps_test_struct(IS_EREPORT_INFO,
   1389 		    report, 5328, &observed, &expected, 1,
   1390 		    1, err_data);
   1391 
   1392 		return (-1);
   1393 	}
   1394 
   1395 	/* NaNs should raise an exception when converted */
   1396 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
   1397 	trap_flag = trap_flag | TRAP_SOLICITED;
   1398 
   1399 	(void) float_long_s(nan_sp);
   1400 
   1401 	if (trap_flag) {
   1402 		observed = (uint64_t)trap_flag;
   1403 		expected = (uint64_t)0;
   1404 		(void) snprintf(err_data, sizeof (err_data),
   1405 		    "fstox NaN exception not raised, "
   1406 		    "fp val=%lx, fsr=%lx",
   1407 		    nan_sp, fsr_at_trap);
   1408 		setup_fps_test_struct(IS_EREPORT_INFO,
   1409 		    report, 5329, &observed, &expected, 1, 1,
   1410 		    err_data);
   1411 
   1412 		return (-1);
   1413 	}
   1414 
   1415 	if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
   1416 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
   1417 		expected = (uint64_t)FSR_CEXC_NV;
   1418 		(void) snprintf(err_data, sizeof (err_data),
   1419 		    "fstox NaN exception not raised, "
   1420 		    "fp val=%lx, fsr=%lx",
   1421 		    nan_sp, fsr_at_trap);
   1422 		setup_fps_test_struct(IS_EREPORT_INFO,
   1423 		    report, 5330, &observed, &expected, 1, 1,
   1424 		    err_data);
   1425 
   1426 		return (-1);
   1427 	}
   1428 
   1429 	/* + infinity exceptions */
   1430 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
   1431 	trap_flag = trap_flag | TRAP_SOLICITED;
   1432 
   1433 	(void) float_long_s(PLUS_INF_SP);
   1434 
   1435 	if (trap_flag) {
   1436 		observed = (uint64_t)trap_flag;
   1437 		expected = (uint64_t)0;
   1438 		(void) snprintf(err_data, sizeof (err_data),
   1439 		    "fstox +infinity exception not raised, "
   1440 		    "fp val=%lx, fsr=%lx",
   1441 		    PLUS_INF_SP, fsr_at_trap);
   1442 		setup_fps_test_struct(IS_EREPORT_INFO,
   1443 		    report, 5331, &observed, &expected, 1,
   1444 		    1, err_data);
   1445 
   1446 		return (-1);
   1447 	}
   1448 
   1449 	if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
   1450 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
   1451 		expected = (uint64_t)FSR_CEXC_NV;
   1452 		(void) snprintf(err_data, sizeof (err_data),
   1453 		    "fstox +infinity exception not raised, "
   1454 		    "fp val=%lx, fsr=%lx",
   1455 		    PLUS_INF_SP, fsr_at_trap);
   1456 		setup_fps_test_struct(IS_EREPORT_INFO,
   1457 		    report, 5332, &observed, &expected, 1,
   1458 		    1, err_data);
   1459 
   1460 		return (-1);
   1461 	}
   1462 
   1463 	/* - infinity exceptions */
   1464 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
   1465 	trap_flag = trap_flag | TRAP_SOLICITED;
   1466 
   1467 	(void) float_long_s(MINUS_INF_SP);
   1468 
   1469 	if (trap_flag) {
   1470 		observed = (uint64_t)trap_flag;
   1471 		expected = (uint64_t)0;
   1472 		(void) snprintf(err_data, sizeof (err_data),
   1473 		    "fstox -infinity exception not raised, "
   1474 		    "fp val=%lx, fsr=%lx",
   1475 		    MINUS_INF_SP, fsr_at_trap);
   1476 		setup_fps_test_struct(IS_EREPORT_INFO,
   1477 		    report, 5333, &observed, &expected, 1,
   1478 		    1, err_data);
   1479 
   1480 		return (-1);
   1481 	}
   1482 
   1483 	if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
   1484 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
   1485 		expected = (uint64_t)FSR_CEXC_NV;
   1486 		(void) snprintf(err_data, sizeof (err_data),
   1487 		    "fstox -infinity exception not raised, "
   1488 		    "fp val=%lx, fsr=%lx",
   1489 		    MINUS_INF_SP, fsr_at_trap);
   1490 		setup_fps_test_struct(IS_EREPORT_INFO,
   1491 		    report, 5334, &observed, &expected, 1,
   1492 		    1, err_data);
   1493 
   1494 		return (-1);
   1495 	}
   1496 
   1497 	/* Check for inexact exception raised because of fractions */
   1498 
   1499 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NX);
   1500 	trap_flag = trap_flag | TRAP_SOLICITED;
   1501 
   1502 	(void) float_int_s(pi_sp);
   1503 
   1504 	if (trap_flag) {
   1505 		observed = (uint64_t)trap_flag;
   1506 		expected = (uint64_t)0;
   1507 		(void) snprintf(err_data, sizeof (err_data),
   1508 		    "fstox inexact exception not raised, "
   1509 		    "fp val=%lx, fsr=%lx",
   1510 		    pi_sp, fsr_at_trap);
   1511 		setup_fps_test_struct(IS_EREPORT_INFO,
   1512 		    report, 5335, &observed, &expected, 1,
   1513 		    1, err_data);
   1514 
   1515 		return (-1);
   1516 	}
   1517 
   1518 	if ((fsr_at_trap & FSR_CEXC_NX) != FSR_CEXC_NX) {
   1519 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NX;
   1520 		expected = (uint64_t)FSR_CEXC_NX;
   1521 		(void) snprintf(err_data, sizeof (err_data),
   1522 		    "fstox inexact exception not raised, "
   1523 		    "fp val=%lx, fsr=%lx",
   1524 		    pi_sp, fsr_at_trap);
   1525 		setup_fps_test_struct(IS_EREPORT_INFO,
   1526 		    report, 5336, &observed, &expected, 1,
   1527 		    1, err_data);
   1528 
   1529 		return (-1);
   1530 	}
   1531 
   1532 	set_fsr(prev_fsr);
   1533 	return (0);
   1534 }
   1535 
   1536 /*
   1537  * float_to_long_dp(struct fps_test_ereport *report)
   1538  * does continuous, double precision, float to long
   1539  * conversions. If an error is found, relevant data
   1540  * is stored in report.
   1541  */
   1542 static int
   1543 float_to_long_dp(struct fps_test_ereport *report)
   1544 {
   1545 	char err_data[MAX_INFO_SIZE];
   1546 	uint64_t i;
   1547 	uint64_t expected;
   1548 	uint64_t observed;
   1549 	unsigned long prev_fsr;
   1550 	unsigned long res1;
   1551 
   1552 	prev_fsr = get_fsr();
   1553 
   1554 	init_regs(0);
   1555 
   1556 	for (i = 0; i < N_VALS; i++) {
   1557 		res1 = float_long_d(val[i].floatdouble);
   1558 
   1559 		if (res1 != i) {
   1560 			observed = (uint64_t)res1;
   1561 			expected = (uint64_t)i;
   1562 			(void) snprintf(err_data, sizeof (err_data),
   1563 			    "Val Entry[%d]\nExpected: %d"
   1564 			    "\nObserved: %d", i, i,
   1565 			    res1);
   1566 			setup_fps_test_struct(IS_EREPORT_INFO,
   1567 			    report, 6351, &observed, &expected, 1,
   1568 			    1, err_data);
   1569 
   1570 			return (-1);
   1571 		}
   1572 	}
   1573 
   1574 	/*
   1575 	 * Value greater than highest representable value in long has to
   1576 	 * raise an invalid exception.
   1577 	 *
   1578 	 * Highest possible value in long (assume ulong) is 2^64; Use 2^65 for a
   1579 	 * value greater.
   1580 	 */
   1581 
   1582 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
   1583 	trap_flag = trap_flag | TRAP_SOLICITED;
   1584 
   1585 	(void) float_long_d(0x4400000000000000);
   1586 
   1587 	if (trap_flag) {
   1588 		observed = (uint64_t)trap_flag;
   1589 		expected = (uint64_t)0;
   1590 		(void) snprintf(err_data, sizeof (err_data),
   1591 		    "fdtox max value exception not raised, "
   1592 		    "fp val=%lx, fsr=%lx",
   1593 		    0x4400000000000000, fsr_at_trap);
   1594 		setup_fps_test_struct(IS_EREPORT_INFO,
   1595 		    report, 5337, &observed, &expected, 1,
   1596 		    1, err_data);
   1597 
   1598 		return (-1);
   1599 	}
   1600 
   1601 	if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
   1602 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
   1603 		expected = (uint64_t)FSR_CEXC_NV;
   1604 		(void) snprintf(err_data, sizeof (err_data),
   1605 		    "fdtox max value exception not raised, "
   1606 		    "fp val=%lx, fsr=%lx",
   1607 		    0x4200000000000000, fsr_at_trap);
   1608 		setup_fps_test_struct(IS_EREPORT_INFO,
   1609 		    report, 5338, &observed, &expected, 1,
   1610 		    1, err_data);
   1611 
   1612 		return (-1);
   1613 	}
   1614 
   1615 	/* NaNs should raise an exception when converted */
   1616 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
   1617 	trap_flag = trap_flag | TRAP_SOLICITED;
   1618 
   1619 	(void) float_long_d(nan_dp);
   1620 
   1621 	if (trap_flag) {
   1622 		observed = (uint64_t)trap_flag;
   1623 		expected = (uint64_t)0;
   1624 		(void) snprintf(err_data, sizeof (err_data),
   1625 		    "fdtox NaN exception not raised, "
   1626 		    "fp val=%lx, fsr=%lx",
   1627 		    nan_dp, fsr_at_trap);
   1628 		setup_fps_test_struct(IS_EREPORT_INFO,
   1629 		    report, 5339, &observed, &expected, 1,
   1630 		    1, err_data);
   1631 
   1632 		return (-1);
   1633 	}
   1634 
   1635 	if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
   1636 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
   1637 		expected = (uint64_t)FSR_CEXC_NV;
   1638 		(void) snprintf(err_data, sizeof (err_data),
   1639 		    "fdtox NaN exception not raised, "
   1640 		    "fp val=%lx, fsr=%lx",
   1641 		    nan_dp, fsr_at_trap);
   1642 		setup_fps_test_struct(IS_EREPORT_INFO,
   1643 		    report, 5340, &observed, &expected, 1,
   1644 		    1, err_data);
   1645 
   1646 		return (-1);
   1647 	}
   1648 
   1649 	/* + infinity exceptions */
   1650 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
   1651 	trap_flag = trap_flag | TRAP_SOLICITED;
   1652 
   1653 	(void) float_long_d(PLUS_INF_DP);
   1654 
   1655 	if (trap_flag) {
   1656 		observed = (uint64_t)trap_flag;
   1657 		expected = (uint64_t)0;
   1658 		(void) snprintf(err_data, sizeof (err_data),
   1659 		    "fdtox +infinity exception not raised, "
   1660 		    "fp val=%lx, fsr=%lx",
   1661 		    PLUS_INF_DP, fsr_at_trap);
   1662 		setup_fps_test_struct(IS_EREPORT_INFO,
   1663 		    report, 5341, &observed, &expected, 1,
   1664 		    1, err_data);
   1665 
   1666 		return (-1);
   1667 	}
   1668 
   1669 	if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
   1670 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
   1671 		expected = (uint64_t)FSR_CEXC_NV;
   1672 		(void) snprintf(err_data, sizeof (err_data),
   1673 		    "fdtox +infinity exception not raised, "
   1674 		    "fp val=%lx, fsr=%lx",
   1675 		    PLUS_INF_DP, fsr_at_trap);
   1676 		setup_fps_test_struct(IS_EREPORT_INFO,
   1677 		    report, 5342, &observed, &expected, 1,
   1678 		    1, err_data);
   1679 
   1680 		return (-1);
   1681 	}
   1682 
   1683 	/* - infinity exceptions */
   1684 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
   1685 	trap_flag = trap_flag | TRAP_SOLICITED;
   1686 
   1687 	(void) float_long_d(MINUS_INF_DP);
   1688 
   1689 	if (trap_flag) {
   1690 		observed = (uint64_t)trap_flag;
   1691 		expected = (uint64_t)0;
   1692 		(void) snprintf(err_data, sizeof (err_data),
   1693 		    "fdtox -infinity exception not raised, "
   1694 		    "fp val=%lx, fsr=%lx",
   1695 		    MINUS_INF_DP, fsr_at_trap);
   1696 		setup_fps_test_struct(IS_EREPORT_INFO,
   1697 		    report, 5343, &observed, &expected, 1,
   1698 		    1, err_data);
   1699 
   1700 		return (-1);
   1701 	}
   1702 
   1703 	if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
   1704 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
   1705 		expected = (uint64_t)FSR_CEXC_NV;
   1706 		(void) snprintf(err_data, sizeof (err_data),
   1707 		    "fdtox -infinity exception not raised, "
   1708 		    "fp val=%lx, fsr=%lx",
   1709 		    MINUS_INF_DP, fsr_at_trap);
   1710 		setup_fps_test_struct(IS_EREPORT_INFO,
   1711 		    report, 5344, &observed, &expected, 1,
   1712 		    1, err_data);
   1713 
   1714 		return (-1);
   1715 	}
   1716 
   1717 	/* Check for inexact exception raised because of fractions */
   1718 
   1719 	set_fsr(prev_fsr | FSR_ENABLE_TEM_NX);
   1720 	trap_flag = trap_flag | TRAP_SOLICITED;
   1721 
   1722 	(void) float_long_d(pi_dp);
   1723 
   1724 	if (trap_flag) {
   1725 		observed = (uint64_t)trap_flag;
   1726 		expected = (uint64_t)0;
   1727 		(void) snprintf(err_data, sizeof (err_data),
   1728 		    "fdtox inexact exception not raised, "
   1729 		    "fp val=%lx, fsr=%lx",
   1730 		    pi_dp, fsr_at_trap);
   1731 		setup_fps_test_struct(IS_EREPORT_INFO,
   1732 		    report, 5345, &observed, &expected, 1,
   1733 		    1, err_data);
   1734 
   1735 		return (-1);
   1736 	}
   1737 
   1738 	if ((fsr_at_trap & FSR_CEXC_NX) != FSR_CEXC_NX) {
   1739 		observed = (uint64_t)fsr_at_trap & FSR_CEXC_NX;
   1740 		expected = (uint64_t)FSR_CEXC_NX;
   1741 		(void) snprintf(err_data, sizeof (err_data),
   1742 		    "fdtox inexact exception not raised, "
   1743 		    "fp val=%lx, fsr=%lx",
   1744 		    pi_dp, fsr_at_trap);
   1745 		setup_fps_test_struct(IS_EREPORT_INFO,
   1746 		    report, 5346, &observed, &expected, 1,
   1747 		    1, err_data);
   1748 
   1749 		return (-1);
   1750 	}
   1751 
   1752 	set_fsr(prev_fsr);
   1753 
   1754 	return (0);
   1755 }
   1756 
   1757 /*
   1758  * single_doub(struct fps_test_ereport *report)
   1759  * does continues single to double conversion.
   1760  * If an error is found, relevant data is stored
   1761  * in report.
   1762  */
   1763 static int
   1764 single_doub(struct fps_test_ereport *report)
   1765 {
   1766 	char err_data[MAX_INFO_SIZE];
   1767 	int i;
   1768 	uint64_t expected;
   1769 	uint64_t observed;
   1770 	unsigned long prev_fsr;
   1771 	unsigned long result;
   1772 
   1773 
   1774 	prev_fsr = get_fsr();
   1775 
   1776 	init_regs(0);
   1777 
   1778 	for (i = 0; i < N_VALS; i++) {
   1779 		result = convert_sp_dp(val[i].floatsingle);
   1780 
   1781 		if (result != val[i].floatdouble) {
   1782 			observed = (uint64_t)result;
   1783 			expected = (uint64_t)val[i].floatdouble;
   1784 			(void) snprintf(err_data, sizeof (err_data),
   1785 			    "Val Entry[%d]\nExpected: %lld"
   1786 			    "\nObserved: %lld", i,
   1787 			    val[i].floatdouble, result);
   1788 			setup_fps_test_struct(IS_EREPORT_INFO,
   1789 			    report, 6231, &observed, &expected, 1,
   1790 			    1, err_data);
   1791 
   1792 			return (-1);
   1793 		}
   1794 	}
   1795 
   1796 	set_fsr(prev_fsr);
   1797 
   1798 	return (0);
   1799 }
   1800 
   1801 /*
   1802  * double_sing(struct fps_test_ereport *report)
   1803  * does continues double to single conversion.
   1804  * If an error is found, relevant data is stored
   1805  * in report.
   1806  */
   1807 static int
   1808 double_sing(struct fps_test_ereport *report)
   1809 {
   1810 	char err_data[MAX_INFO_SIZE];
   1811 	int i;
   1812 	uint64_t expected;
   1813 	uint64_t observed;
   1814 	unsigned long result;
   1815 	unsigned long prev_fsr;
   1816 
   1817 	prev_fsr = get_fsr();
   1818 
   1819 	init_regs(0);
   1820 
   1821 	for (i = 0; i < N_VALS; i++) {
   1822 		result = convert_dp_sp(val[i].floatdouble);
   1823 
   1824 		if (result != val[i].floatsingle) {
   1825 			observed = (uint64_t)result;
   1826 			expected = (uint64_t)val[i].floatsingle;
   1827 			(void) snprintf(err_data, sizeof (err_data),
   1828 			    "Val Entry[%d]\nExpected: %d"
   1829 			    "\nObserved: %d", i,
   1830 			    val[i].floatsingle, result);
   1831 			setup_fps_test_struct(IS_EREPORT_INFO,
   1832 			    report, 6232, &observed, &expected, 1,
   1833 			    1, err_data);
   1834 
   1835 			return (-1);
   1836 		}
   1837 	}
   1838 
   1839 	set_fsr(prev_fsr);
   1840 	return (0);
   1841 }
   1842 
   1843 /*
   1844  * fmovs_ins(struct fps_test_ereport *report)
   1845  * moves a value through the floating point
   1846  * registers. If an error is found, relevant
   1847  * data is stored
   1848  * in report.
   1849  */
   1850 static int
   1851 fmovs_ins(struct fps_test_ereport *report)
   1852 {
   1853 	char err_data[MAX_INFO_SIZE];
   1854 	uint64_t observed;
   1855 	uint64_t expected;
   1856 	unsigned long result;
   1857 	unsigned long prev_fsr;
   1858 
   1859 	prev_fsr = get_fsr();
   1860 
   1861 	init_regs(0);
   1862 
   1863 	if ((result = move_regs(0x3F800000)) != 0x3F800000) {
   1864 		observed = (uint64_t)result;
   1865 		expected = (uint64_t)0x3F800000;
   1866 		(void) snprintf(err_data, sizeof (err_data),
   1867 		    "Wrote to f0, read from f31");
   1868 		setup_fps_test_struct(IS_EREPORT_INFO,
   1869 		    report, 6233, &observed, &expected, 1,
   1870 		    1, err_data);
   1871 
   1872 		return (-1);
   1873 	}
   1874 
   1875 	set_fsr(prev_fsr);
   1876 	return (0);
   1877 }
   1878 
   1879 /*
   1880  * get_negative_value_pn_sp(struct fps_test_ereport *report)
   1881  * converts single precision postive to negative values.
   1882  * If an error is found, relevant data is stored
   1883  * in report.
   1884  */
   1885 static int
   1886 get_negative_value_pn_sp(struct fps_test_ereport *report)
   1887 {
   1888 	char err_data[MAX_INFO_SIZE];
   1889 	int i;
   1890 	uint64_t observed;
   1891 	uint64_t expected;
   1892 	unsigned long prev_fsr;
   1893 	unsigned long result;
   1894 
   1895 	prev_fsr = get_fsr();
   1896 
   1897 	init_regs(0);
   1898 
   1899 	for (i = 0; i < N_VALS; i++) {
   1900 		result = negate_value_sp(val[i].floatsingle);
   1901 		if (result != neg_val_sp[i]) {
   1902 			observed = (uint64_t)result;
   1903 			expected = (uint64_t)neg_val_sp[i];
   1904 			(void) snprintf(err_data, sizeof (err_data),
   1905 			    "Val Entry[%d]\nExpected: %d"
   1906 			    "\nObserved: %d", i, neg_val_sp[i],
   1907 			    result);
   1908 			setup_fps_test_struct(IS_EREPORT_INFO,
   1909 			    report, 6234, &observed, &expected, 1,
   1910 			    1, err_data);
   1911 
   1912 			return (-1);
   1913 		}
   1914 	}
   1915 
   1916 	set_fsr(prev_fsr);
   1917 	return (0);
   1918 }
   1919 
   1920 /*
   1921  * get_negative_value_pn_dp(struct fps_test_ereport *report)
   1922  * converts double precision postive to negative values.
   1923  * If an error is found, relevant data is stored
   1924  * in report.
   1925  */
   1926 static int
   1927 get_negative_value_pn_dp(struct fps_test_ereport *report)
   1928 {
   1929 	char err_data[MAX_INFO_SIZE];
   1930 	int i;
   1931 	uint64_t expected;
   1932 	uint64_t observed;
   1933 	uint64_t result;
   1934 
   1935 	init_regs_dp(0);
   1936 
   1937 	for (i = 0; i < N_VALS; i++) {
   1938 		result = negate_value_dp(val[i].floatdouble);
   1939 		if (result != neg_val_dp[i]) {
   1940 			observed = (uint64_t)result;
   1941 			expected = (uint64_t)neg_val_dp[i];
   1942 			(void) snprintf(err_data, sizeof (err_data),
   1943 			    "Val Entry[%d]\nExpected: %lld"
   1944 			    "\nObserved: %lld", i, neg_val_dp[i],
   1945 			    result);
   1946 			setup_fps_test_struct(IS_EREPORT_INFO,
   1947 			    report, 6362, &observed, &expected, 1,
   1948 			    1, err_data);
   1949 
   1950 			return (-1);
   1951 		}
   1952 	}
   1953 
   1954 	return (0);
   1955 }
   1956 
   1957 /*
   1958  * get_negative_value_np_sp(struct fps_test_ereport *report)
   1959  * converts single precision negative to positive values.
   1960  * If an error is found, relevant data is stored
   1961  * in report.
   1962  */
   1963 static int
   1964 get_negative_value_np_sp(struct fps_test_ereport *report)
   1965 {
   1966 	char err_data[MAX_INFO_SIZE];
   1967 	int i;
   1968 	uint64_t observed;
   1969 	uint64_t expected;
   1970 	unsigned long result;
   1971 	unsigned long prev_fsr;
   1972 
   1973 	prev_fsr = get_fsr();
   1974 
   1975 	init_regs(0);
   1976 
   1977 	for (i = 0; i < N_VALS; i++) {
   1978 		result = negate_value_sp(neg_val_sp[i]);
   1979 
   1980 		if (result != val[i].floatsingle) {
   1981 			observed = (uint64_t)result;
   1982 			expected = (uint64_t)val[i].floatsingle;
   1983 			(void) snprintf(err_data, sizeof (err_data),
   1984 			    "Val Entry[%d]\nExpected: %d"
   1985 			    "\nObserved: %d", i, val[i].floatsingle,
   1986 			    result);
   1987 			setup_fps_test_struct(IS_EREPORT_INFO,
   1988 			    report, 6235, &observed, &expected, 1,
   1989 			    1, err_data);
   1990 
   1991 			return (-1);
   1992 		}
   1993 	}
   1994 
   1995 	set_fsr(prev_fsr);
   1996 	return (0);
   1997 }
   1998 
   1999 /*
   2000  * get_negative_value_np_dp(struct fps_test_ereport *report)
   2001  * converts double precision negative to positive values.
   2002  * If an error is found, relevant data is stored
   2003  * in report.
   2004  */
   2005 static int
   2006 get_negative_value_np_dp(struct fps_test_ereport *report)
   2007 {
   2008 	char err_data[MAX_INFO_SIZE];
   2009 	int i;
   2010 	uint64_t expected;
   2011 	uint64_t observed;
   2012 	uint64_t result;
   2013 
   2014 	init_regs_dp(0);
   2015 
   2016 	for (i = 0; i < N_VALS; i++) {
   2017 		result = negate_value_dp(neg_val_dp[i]);
   2018 
   2019 		if (result != val[i].floatdouble) {
   2020 			observed = (uint64_t)result;
   2021 			expected = (uint64_t)val[i].floatdouble;
   2022 			(void) snprintf(err_data, sizeof (err_data),
   2023 			    "Val Entry[%d]\nExpected: %lld"
   2024 			    "\nObserved: %lld", i, val[i].floatdouble,
   2025 			    result);
   2026 			setup_fps_test_struct(IS_EREPORT_INFO,
   2027 			    report, 6363, &observed, &expected, 1,
   2028 			    1, err_data);
   2029 
   2030 			return (-1);
   2031 		}
   2032 	}
   2033 
   2034 	return (0);
   2035 }
   2036 
   2037 /*
   2038  * fabs_ins_sp(struct fps_test_ereport *report)
   2039  * does single precision absolute value testing.
   2040  * If an error is found, relevant data is stored
   2041  * in report.
   2042  */
   2043 static int
   2044 fabs_ins_sp(struct fps_test_ereport *report)
   2045 {
   2046 	char err_data[MAX_INFO_SIZE];
   2047 	int i;
   2048 	uint64_t expected;
   2049 	uint64_t observed;
   2050 	unsigned long result;
   2051 	unsigned long prev_fsr;
   2052 
   2053 	prev_fsr = get_fsr();
   2054 
   2055 	init_regs(0);
   2056 	for (i = 0; i < N_VALS; i++) {
   2057 		result = absolute_value_sp(neg_val_sp[i]);
   2058 		if (result != val[i].floatsingle) {
   2059 			observed = *(uint64_t *)&result;
   2060 			expected = *(uint64_t *)&(val[i].floatsingle);
   2061 			(void) snprintf(err_data, sizeof (err_data),
   2062 			    "Val Entry[%d]\nExpected: %d"
   2063 			    "\nObserved: %d", i, val[i].floatsingle,
   2064 			    result);
   2065 			setup_fps_test_struct(IS_EREPORT_INFO,
   2066 			    report, 6236, &observed, &expected, 1,
   2067 			    1, err_data);
   2068 
   2069 			return (-1);
   2070 		}
   2071 	}
   2072 
   2073 	set_fsr(prev_fsr);
   2074 	return (0);
   2075 }
   2076 
   2077 /*
   2078  * fabs_ins_dp(struct fps_test_ereport *report)
   2079  * does double precision absolute value testing.
   2080  * If an error is found, relevant data is stored
   2081  * in report.
   2082  */
   2083 static int
   2084 fabs_ins_dp(struct fps_test_ereport *report)
   2085 {
   2086 	char err_data[MAX_INFO_SIZE];
   2087 	int i;
   2088 	uint64_t expected;
   2089 	uint64_t observed;
   2090 	uint64_t result;
   2091 
   2092 	init_regs_dp(0);
   2093 
   2094 	for (i = 0; i < N_VALS; i++) {
   2095 		result = absolute_value_dp(neg_val_dp[i]);
   2096 
   2097 		if (result != val[i].floatdouble) {
   2098 			observed = (uint64_t)result;
   2099 			expected = (uint64_t)val[i].floatdouble;
   2100 			(void) snprintf(err_data, sizeof (err_data),
   2101 			    "Val Entry[%d]\nExpected: %lld"
   2102 			    "\nObserved: %lld", i, val[i].floatdouble,
   2103 			    result);
   2104 			setup_fps_test_struct(IS_EREPORT_INFO,
   2105 			    report, 6361, &observed, &expected, 1,
   2106 			    1, err_data);
   2107 
   2108 			return (-1);
   2109 		}
   2110 	}
   2111 
   2112 	return (0);
   2113 }
   2114 
   2115 /*
   2116  * addition_test_sp(struct fps_test_ereport *report)
   2117  * tests single precision addition using floating
   2118  * point registers (f4=f0+f2).
   2119  * If an error is found, relevant data is stored
   2120  * in report.
   2121  */
   2122 static int
   2123 addition_test_sp(struct fps_test_ereport *report)
   2124 {
   2125 	char err_data[MAX_INFO_SIZE];
   2126 	int i;
   2127 	unsigned long result;
   2128 	unsigned long prev_fsr;
   2129 	uint64_t observed;
   2130 	uint64_t expected;
   2131 
   2132 	prev_fsr = get_fsr();
   2133 
   2134 	init_regs(0);
   2135 	for (i = 0; i < (N_VALS - 1); i++) {
   2136 		result = add_sp(val[i].floatsingle, val[1].floatsingle);
   2137 
   2138 		if (result != (val[i + 1].floatsingle)) {
   2139 
   2140 			observed = (uint64_t)result;
   2141 			expected = (uint64_t)val[i + 1].floatsingle;
   2142 			(void) snprintf(err_data, sizeof (err_data),
   2143 			    "Val Entry[%d], reg f4=f0+f2"
   2144 			    "\nExpected: %d\nObserved: %d",
   2145 			    i, val[i + 1].floatsingle, result);
   2146 			setup_fps_test_struct(IS_EREPORT_INFO,
   2147 			    report, 6237, &observed, &expected, 1,
   2148 			    1, err_data);
   2149 
   2150 			return (-1);
   2151 		}
   2152 	}
   2153 
   2154 	set_fsr(prev_fsr);
   2155 	return (0);
   2156 }
   2157 
   2158 /*
   2159  * addition_test_dp(struct fps_test_ereport *report)
   2160  * tests double precision addition using floating
   2161  * point registers (f4=f0+f2).
   2162  * If an error is found, relevant data is stored
   2163  * in report.
   2164  */
   2165 static int
   2166 addition_test_dp(struct fps_test_ereport *report)
   2167 {
   2168 	char err_data[MAX_INFO_SIZE];
   2169 	int i;
   2170 	unsigned long result;
   2171 	unsigned long prev_fsr;
   2172 	uint64_t observed;
   2173 	uint64_t expected;
   2174 
   2175 	prev_fsr = get_fsr();
   2176 
   2177 	init_regs(0);
   2178 
   2179 	for (i = 0; i < (N_VALS - 1); i++) {
   2180 		result = add_dp(val[i].floatdouble, val[1].floatdouble);
   2181 
   2182 		if (result != (val[i + 1].floatdouble)) {
   2183 			observed = (uint64_t)result;
   2184 			expected = (uint64_t)val[i + 1].floatdouble;
   2185 			(void) snprintf(err_data, sizeof (err_data),
   2186 			    "Val Entry[%d], reg f4=f0+f2"
   2187 			    "\nExpected: %lld\nObserved: %lld",
   2188 			    i, val[i + 1].floatdouble, result);
   2189 			setup_fps_test_struct(IS_EREPORT_INFO,
   2190 			    report, 6238, &observed, &expected, 1,
   2191 			    1, err_data);
   2192 
   2193 			return (-1);
   2194 		}
   2195 	}
   2196 
   2197 	set_fsr(prev_fsr);
   2198 	return (0);
   2199 }
   2200 
   2201 /*
   2202  * subtraction_test_sp(struct fps_test_ereport *report)
   2203  * tests single precision subtaction using floating
   2204  * point registers (f4=f0-f2).
   2205  * If an error is found, relevant data is stored
   2206  * in report.
   2207  */
   2208 static int
   2209 subtraction_test_sp(struct fps_test_ereport *report)
   2210 {
   2211 	char err_data[MAX_INFO_SIZE];
   2212 	int i;
   2213 	unsigned long result;
   2214 	unsigned long prev_fsr;
   2215 	uint64_t observed;
   2216 	uint64_t expected;
   2217 
   2218 	prev_fsr = get_fsr();
   2219 
   2220 	init_regs(0);
   2221 	for (i = 1; i < N_VALS; i++) {
   2222 		result = sub_sp(val[i].floatsingle, val[i - 1].floatsingle);
   2223 
   2224 		if (result != val[1].floatsingle) {
   2225 			observed = (uint64_t)result;
   2226 			expected = (uint64_t)val[1].floatsingle;
   2227 			(void) snprintf(err_data, sizeof (err_data),
   2228 			    "Val Entry[%d], reg f4=f0-f2"
   2229 			    "\nExpected: %d\nObserved: %d",
   2230 			    i, val[1].floatsingle, result);
   2231 			setup_fps_test_struct(IS_EREPORT_INFO,
   2232 			    report, 6239, &observed, &expected, 1,
   2233 			    1, err_data);
   2234 
   2235 			return (-1);
   2236 		}
   2237 	}
   2238 
   2239 	set_fsr(prev_fsr);
   2240 	return (0);
   2241 }
   2242 
   2243 /*
   2244  * subtraction_test_dp(struct fps_test_ereport *report)
   2245  * tests double precision subtaction using floating
   2246  * point registers (f4=f0-f2).
   2247  * If an error is found, relevant data is stored
   2248  * in report.
   2249  */
   2250 static int
   2251 subtraction_test_dp(struct fps_test_ereport *report)
   2252 {
   2253 	char err_data[MAX_INFO_SIZE];
   2254 	int i;
   2255 	unsigned long result;
   2256 	unsigned long prev_fsr;
   2257 	uint64_t observed;
   2258 	uint64_t expected;
   2259 
   2260 	prev_fsr = get_fsr();
   2261 
   2262 	init_regs(0);
   2263 
   2264 	for (i = 1; i < N_VALS; i++) {
   2265 		result = sub_dp(val[i].floatdouble, val[i - 1].floatdouble);
   2266 
   2267 		if (result != val[1].floatdouble) {
   2268 			observed = (uint64_t)result;
   2269 			expected = (uint64_t)val[1].floatdouble;
   2270 			(void) snprintf(err_data, sizeof (err_data),
   2271 			    "Val Entry[%d], reg f4=f0-f2"
   2272 			    "\nExpected: %lld\nObserved: %lld",
   2273 			    i, val[1].floatdouble, result);
   2274 			setup_fps_test_struct(IS_EREPORT_INFO,
   2275 			    report, 6240, &observed, &expected, 1,
   2276 			    1, err_data);
   2277 
   2278 			return (-1);
   2279 		}
   2280 	}
   2281 
   2282 	set_fsr(prev_fsr);
   2283 	return (0);
   2284 }
   2285 
   2286 /*
   2287  * squareroot_test_sp(struct fps_test_ereport *report)
   2288  * tests single precision squareroot.
   2289  * If an error is found, relevant data is stored
   2290  * in report.
   2291  */
   2292 static int
   2293 squareroot_test_sp(struct fps_test_ereport *report)
   2294 {
   2295 	char err_data[MAX_INFO_SIZE];
   2296 	int i;
   2297 	uint64_t observed;
   2298 	uint64_t expected;
   2299 	unsigned long result, workvalue;
   2300 	unsigned long prev_fsr;
   2301 
   2302 	prev_fsr = get_fsr();
   2303 
   2304 	init_regs(0);
   2305 
   2306 	for (i = 1; i < N_VALS; i++) {
   2307 		workvalue = val[i].floatsingle;
   2308 		result = sqrt_sp(mult_sp(workvalue, workvalue));
   2309 		if (result != workvalue) {
   2310 			observed = (uint64_t)result;
   2311 			expected = (uint64_t)workvalue;
   2312 			(void) snprintf(err_data, sizeof (err_data),
   2313 			    "\nExpected: %d\nObserved: %d", workvalue,
   2314 			    result);
   2315 			setup_fps_test_struct(NO_EREPORT_INFO,
   2316 			    report, 6241, &observed, &expected, 1, 1);
   2317 
   2318 			return (-1);
   2319 		}
   2320 	}
   2321 
   2322 	/* fsqrt(x), where x>0, should be positive */
   2323 	result = sqrt_sp(half_sp);
   2324 
   2325 	if (result & SIGN_FLAG_SP) {
   2326 		observed = (uint64_t)result & SIGN_FLAG_SP;
   2327 		expected = (uint64_t)0;
   2328 		setup_fps_test_struct(NO_EREPORT_INFO,
   2329 		    report, 8241, &observed, &expected, 1, 1);
   2330 
   2331 		return (-1);
   2332 	}
   2333 
   2334 	/* fsqrt(-0)=-0. */
   2335 	result = sqrt_sp(MINUS_ZERO_SP);
   2336 
   2337 	if (!(result & MINUS_ZERO_SP)) {
   2338 		observed = (uint64_t)0;
   2339 		expected = (uint64_t)1;
   2340 		setup_fps_test_struct(NO_EREPORT_INFO,
   2341 		    report, 8242, &observed, &expected, 1, 1);
   2342 
   2343 		return (-1);
   2344 	}
   2345 
   2346 	set_fsr(prev_fsr);
   2347 	return (0);
   2348 }
   2349 
   2350 /*
   2351  * squareroot_test_dp(struct fps_test_ereport *report)
   2352  * tests double precision squareroot.
   2353  * If an error is found, relevant data is stored
   2354  * in report.
   2355  */
   2356 static int
   2357 squareroot_test_dp(struct fps_test_ereport *report)
   2358 {
   2359 	char err_data[MAX_INFO_SIZE];
   2360 	int i;
   2361 	uint64_t observed;
   2362 	uint64_t expected;
   2363 	unsigned long half_dp;
   2364 	unsigned long result;
   2365 	unsigned long workvalue;
   2366 	unsigned long prev_fsr;
   2367 
   2368 	prev_fsr = get_fsr();
   2369 
   2370 	init_regs(0);
   2371 
   2372 	for (i = 1; i < N_VALS; i++) {
   2373 		workvalue = val[i].floatdouble;
   2374 		result = sqrt_dp(mult_dp(workvalue, workvalue));
   2375 
   2376 		if (result != workvalue) {
   2377 			observed = (uint64_t)result;
   2378 			expected = (uint64_t)workvalue;
   2379 			(void) snprintf(err_data, sizeof (err_data),
   2380 			    "\nExpected: %lld\nObserved: %lld", workvalue,
   2381 			    result);
   2382 			setup_fps_test_struct(NO_EREPORT_INFO,
   2383 			    report, 6242, &observed, &expected, 1, 1);
   2384 
   2385 			return (-1);
   2386 		}
   2387 	}
   2388 
   2389 	/* fsqrt(x), where x>0, should be positive */
   2390 	workvalue = half_msw;
   2391 	half_dp = workvalue << 32;
   2392 	half_dp = half_dp | half_lsw;
   2393 	result = sqrt_dp(half_dp);
   2394 
   2395 	if (result & SIGN_FLAG_DP) {
   2396 		observed = (uint64_t)result & SIGN_FLAG_DP;
   2397 		expected = (uint64_t)0;
   2398 		setup_fps_test_struct(NO_EREPORT_INFO,
   2399 		    report, 8243, &observed, &expected, 1, 1);
   2400 
   2401 		return (-1);
   2402 	}
   2403 
   2404 	/* fsqrt(-0)=-0 */
   2405 	result = sqrt_dp(MINUS_ZERO_DP);
   2406 
   2407 	if (!(result & MINUS_ZERO_DP)) {
   2408 		observed = (uint64_t)0;
   2409 		expected = (uint64_t)1;
   2410 		setup_fps_test_struct(NO_EREPORT_INFO,
   2411 		    report, 8244, &observed, &expected, 1, 1);
   2412 
   2413 		return (-1);
   2414 	}
   2415 
   2416 	set_fsr(prev_fsr);
   2417 	return (0);
   2418 }
   2419 
   2420 /*
   2421  * division_test_sp(struct fps_test_ereport *report)
   2422  * tests single precision division through registers.
   2423  * (reg f4=f0/f2). If an error is found, relevant data
   2424  * is stored in report.
   2425  */
   2426 static int
   2427 division_test_sp(struct fps_test_ereport *report)
   2428 {
   2429 	char err_data[MAX_INFO_SIZE];
   2430 	int i;
   2431 	unsigned long result;
   2432 	unsigned long prev_fsr;
   2433 	uint64_t observed;
   2434 	uint64_t expected;
   2435 
   2436 	prev_fsr = get_fsr();
   2437 
   2438 	init_regs(0);
   2439 	for (i = 1; i < N_VALS; i++) {
   2440 		result = div_sp(val[i].floatsingle, val[1].floatsingle);
   2441 
   2442 		if (result != val[i].floatsingle) {
   2443 			observed = (uint64_t)result;
   2444 			expected = (uint64_t)val[i].floatsingle;
   2445 			(void) snprintf(err_data, sizeof (err_data),
   2446 			    "Val Entry[%d], reg f4=f0/f2"
   2447 			    "\nExpected: %d\nObserved: %d",
   2448 			    i, val[i].floatsingle, result);
   2449 			setup_fps_test_struct(IS_EREPORT_INFO,
   2450 			    report, 6243, &observed, &expected, 1,
   2451 			    1, err_data);
   2452 
   2453 			return (-1);
   2454 		}
   2455 	}
   2456 
   2457 	set_fsr(prev_fsr);
   2458 	return (0);
   2459 }
   2460 
   2461 /*
   2462  * division_test_dp(struct fps_test_ereport *report)
   2463  * tests double precision division through registers.
   2464  * (reg f4=f0/f2). If an error is found, relevant data
   2465  * is stored in report.
   2466  */
   2467 static int
   2468 division_test_dp(struct fps_test_ereport *report)
   2469 {
   2470 	char err_data[MAX_INFO_SIZE];
   2471 	int i;
   2472 	unsigned long result;
   2473 	unsigned long prev_fsr;
   2474 	uint64_t observed;
   2475 	uint64_t expected;
   2476 
   2477 	prev_fsr = get_fsr();
   2478 
   2479 	init_regs(0);
   2480 	for (i = 1; i < N_VALS; i++) {
   2481 		result = div_dp(val[i].floatdouble, val[1].floatdouble);
   2482 
   2483 		if (result != val[i].floatdouble) {
   2484 			observed = (uint64_t)result;
   2485 			expected = (uint64_t)val[i].floatdouble;
   2486 			(void) snprintf(err_data, sizeof (err_data),
   2487 			    "Val Entry[%d], reg f4=f0/f2"
   2488 			    "\nExpected: %lld\nObserved: %lld",
   2489 			    i, val[i].floatdouble, result);
   2490 			setup_fps_test_struct(IS_EREPORT_INFO,
   2491 			    report, 6244, &observed, &expected, 1, 1,
   2492 			    err_data);
   2493 
   2494 			return (-1);
   2495 		}
   2496 	}
   2497 
   2498 	set_fsr(prev_fsr);
   2499 	return (0);
   2500 }
   2501 
   2502 /*
   2503  * multiplication_test_sp(struct fps_test_ereport *report)
   2504  * tests single precision multiplication through registers.
   2505  * (reg f4=f0*f2). If an error is found, relevant data
   2506  * is stored in report.
   2507  */
   2508 static int
   2509 multiplication_test_sp(struct fps_test_ereport *report)
   2510 {
   2511 	char err_data[MAX_INFO_SIZE];
   2512 	int i;
   2513 	unsigned long result;
   2514 	unsigned long prev_fsr;
   2515 	uint64_t observed;
   2516 	uint64_t expected;
   2517 
   2518 	prev_fsr = get_fsr();
   2519 
   2520 	init_regs(0);
   2521 	for (i = 0; i < N_VALS; i++) {
   2522 		result = mult_sp(val[i].floatsingle, val[1].floatsingle);
   2523 
   2524 		if (result != val[i].floatsingle) {
   2525 			observed = (uint64_t)result;
   2526 			expected = (uint64_t)val[i].floatsingle;
   2527 			(void) snprintf(err_data, sizeof (err_data),
   2528 			    "Val Entry[%d], reg f4=f0*f2"
   2529 			    "\nExpected: %d\nObserved: %d",
   2530 			    i, val[i].floatsingle, result);
   2531 			setup_fps_test_struct(IS_EREPORT_INFO, report,
   2532 			    6245, &observed, &expected, 1, 1, err_data);
   2533 
   2534 			return (-1);
   2535 		}
   2536 	}
   2537 
   2538 	set_fsr(prev_fsr);
   2539 	return (0);
   2540 }
   2541 
   2542 /*
   2543  * multiplication_test_dp(struct fps_test_ereport *report)
   2544  * tests double precision multiplication through registers.
   2545  * (reg f4=f0*f2). If an error is found, relevant data
   2546  * is stored in report.
   2547  */
   2548 static int
   2549 multiplication_test_dp(struct fps_test_ereport *report)
   2550 {
   2551 	char err_data[MAX_INFO_SIZE];
   2552 	int i;
   2553 	uint64_t observed;
   2554 	uint64_t expected;
   2555 	unsigned long result;
   2556 	unsigned long prev_fsr;
   2557 
   2558 	prev_fsr = get_fsr();
   2559 
   2560 	init_regs(0);
   2561 	for (i = 0; i < N_VALS; i++) {
   2562 		result = mult_dp(val[i].floatdouble, val[1].floatdouble);
   2563 
   2564 		if (result != val[i].floatdouble) {
   2565 			observed = (uint64_t)result;
   2566 			expected = (uint64_t)val[i].floatdouble;
   2567 			(void) snprintf(err_data, sizeof (err_data),
   2568 			    "Val Entry[%d], reg f4=f0*f2"
   2569 			    "\nExpected: %lld\nObserved: %lld",
   2570 			    i, val[i].floatdouble, result);
   2571 			setup_fps_test_struct(IS_EREPORT_INFO,
   2572 			    report, 6246, &observed, &expected, 1, 1,
   2573 			    err_data);
   2574 
   2575 			return (-1);
   2576 		}
   2577 	}
   2578 
   2579 	set_fsr(prev_fsr);
   2580 	return (0);
   2581 }
   2582 
   2583 /*
   2584  * compare_sp(struct fps_test_ereport *report)
   2585  * performs single precision comparison tests.
   2586  * If an error is found, relevant data is stored
   2587  * in report.
   2588  */
   2589 static int
   2590 compare_sp(struct fps_test_ereport *report)
   2591 {
   2592 	char err_data[MAX_INFO_SIZE];
   2593 	int i;
   2594 	uint64_t expected;
   2595 	uint64_t observed;
   2596 	unsigned long prev_fsr;
   2597 	unsigned long result = 0;
   2598 
   2599 	prev_fsr = get_fsr();
   2600 	set_fsr(prev_fsr & FSR_DISABLE_TEM);
   2601 	init_regs(0);
   2602 
   2603 	for (i = 0; i < (N_VALS - 1); i++) {
   2604 #ifndef __lint
   2605 		result = fcmps_fcc(val[i].floatsingle, val[i].floatsingle, 0);
   2606 #endif
   2607 
   2608 		if ((result & 0xc00) != 0) {
   2609 			observed = (uint64_t)result & 0xc00;
   2610 			expected = (uint64_t)0;
   2611 			(void) snprintf(err_data, sizeof (err_data),
   2612 			    "f0= %d, f2= %d", i, i);
   2613 			setup_fps_test_struct(IS_EREPORT_INFO, report,
   2614 			    6247, &observed, &expected, 1, 1, err_data);
   2615 
   2616 			return (-1);
   2617 		}
   2618 
   2619 #ifndef __lint
   2620 		result = fcmps_fcc(val[i].floatsingle,
   2621 		    val[i + 1].floatsingle, 0);
   2622 #endif
   2623 		if ((result & 0xc00) != 0x400) {
   2624 			observed = (uint64_t)result & 0xc00;
   2625 			expected = (uint64_t)0x400;
   2626 			(void) snprintf(err_data, sizeof (err_data),
   2627 			    "f0= %d, f2= %d", i, i+1);
   2628 			setup_fps_test_struct(IS_EREPORT_INFO, report,
   2629 			    6248, &observed, &expected, 1, 1, err_data);
   2630 
   2631 			return (-1);
   2632 		}
   2633 
   2634 #ifndef __lint
   2635 		result = fcmps_fcc(val[i + 1].floatsingle,
   2636 		    val[i].floatsingle, 0);
   2637 #endif
   2638 
   2639 		if ((result & 0xc00) != 0x800) {
   2640 			observed = (uint64_t)result & 0xc00;
   2641 			expected = (uint64_t)0x800;
   2642 			(void) snprintf(err_data, sizeof (err_data),
   2643 			    "f0= %d, f2= %d", i+1, i);
   2644 			setup_fps_test_struct(IS_EREPORT_INFO, report,
   2645 			    6249, &observed, &expected, 1, 1, err_data);
   2646 
   2647 			return (-1);
   2648 		}
   2649 
   2650 		set_fsr(prev_fsr & FSR_DISABLE_TEM);
   2651 #ifndef __lint
   2652 		result = fcmps_fcc(val[i].floatsingle, 0x7f800400, 0);
   2653 #endif
   2654 
   2655 		if ((result & 0xc00) != 0xc00) {
   2656 			observed = (uint64_t)result & 0xc00;
   2657 			expected = (uint64_t)0xc00;
   2658 			(void) snprintf(err_data, sizeof (err_data),
   2659 			    "f0= %d, f2= NaN", i);
   2660 			setup_fps_test_struct(IS_EREPORT_INFO, report,
   2661 			    6250, &observed, &expected, 1, 1, err_data);
   2662 
   2663 			return (-1);
   2664 		}
   2665 	}
   2666 
   2667 	/* Compare +/-zero and check if the comparision is okay */
   2668 
   2669 	result = fcmps_fcc(MINUS_ZERO_SP, PLUS_ZERO_SP, 0);
   2670 
   2671 	if (result & 0xc00) {
   2672 		observed = (uint64_t)result & 0xc00;
   2673 		expected = (uint64_t)0;
   2674 		(void) snprintf(err_data, sizeof (err_data),
   2675 		    "f0= %d, f2= %d", +0, -0);
   2676 		setup_fps_test_struct(IS_EREPORT_INFO, report,
   2677 		    8251, &observed, &expected, 1, 1, err_data);
   2678 
   2679 		return (-1);
   2680 	}
   2681 
   2682 	set_fsr(prev_fsr);
   2683 	return (0);
   2684 }
   2685 
   2686 /*
   2687  * compare_dp(struct fps_test_ereport *report)
   2688  * performs double precision comparison tests.
   2689  * If an error is found, relevant data is stored
   2690  * in report.
   2691  */
   2692 static int
   2693 compare_dp(struct fps_test_ereport *report)
   2694 {
   2695 	char err_data[MAX_INFO_SIZE];
   2696 	int i;
   2697 	unsigned long result;
   2698 	unsigned long prev_fsr;
   2699 	uint64_t observed;
   2700 	uint64_t expected;
   2701 
   2702 	prev_fsr = get_fsr();
   2703 	set_fsr(prev_fsr & FSR_DISABLE_TEM);
   2704 
   2705 	init_regs(0);
   2706 
   2707 	for (i = 0; i < (N_VALS - 1); i++) {
   2708 		result = fcmpd_fcc(val[i].floatdouble, val[i].floatdouble, 0);
   2709 		if ((result & 0xc00) != 0) {
   2710 			observed = (uint64_t)result & 0xc00;
   2711 			expected = (uint64_t)0;
   2712 			(void) snprintf(err_data, sizeof (err_data),
   2713 			    "f0= %d, f2= %d", i, i);
   2714 			setup_fps_test_struct(IS_EREPORT_INFO, report,
   2715 			    6251, &observed, &expected, 1, 1, err_data);
   2716 
   2717 			return (-1);
   2718 		}
   2719 
   2720 		result = fcmpd_fcc(val[i].floatdouble,
   2721 		    val[i + 1].floatdouble, 0);
   2722 
   2723 		if ((result & 0xc00) != 0x400) {
   2724 			observed = (uint64_t)result & 0xc00;
   2725 			expected = (uint64_t)0x400;
   2726 			(void) snprintf(err_data, sizeof (err_data),
   2727 			    "f0= %d, f2= %d", i, i+1);
   2728 			setup_fps_test_struct(IS_EREPORT_INFO, report,
   2729 			    6252, &observed, &expected, 1, 1, err_data);
   2730 
   2731 			return (-1);
   2732 		}
   2733 
   2734 		result = fcmpd_fcc(val[i + 1].floatdouble,
   2735 		    val[i].floatdouble, 0);
   2736 
   2737 		if ((result & 0xc00) != 0x800) {
   2738 			observed = (uint64_t)result & 0xc00;
   2739 			expected = (uint64_t)0x800;
   2740 			(void) snprintf(err_data, sizeof (err_data),
   2741 			    "f0= %d, f2= %d", i+1, i);
   2742 			setup_fps_test_struct(IS_EREPORT_INFO, report,
   2743 			    6253, &observed, &expected, 1, 1, err_data);
   2744 
   2745 			return (-1);
   2746 		}
   2747 
   2748 		set_fsr(prev_fsr & FSR_DISABLE_TEM);
   2749 		result = fcmpd_fcc(val[i].floatdouble, 0x7ff0008000000000, 0);
   2750 
   2751 		if ((result & 0xc00) != 0xc00) {
   2752 			observed = (uint64_t)result & 0xc00;
   2753 			expected = (uint64_t)0xc00;
   2754 			(void) snprintf(err_data, sizeof (err_data),
   2755 			    "f0= %d, f2=NaN", i);
   2756 			setup_fps_test_struct(IS_EREPORT_INFO, report,
   2757 			    6254, &observed, &expected, 1, 1, err_data);
   2758 
   2759 			return (-1);
   2760 		}
   2761 	}
   2762 	/* Compare +/-zero and check if the comparision is okay */
   2763 
   2764 	result = fcmpd_fcc(MINUS_ZERO_DP, PLUS_ZERO_DP, 0);
   2765 
   2766 	if (result & 0xc00) {
   2767 		observed = (uint64_t)result & 0xc00;
   2768 		expected = (uint64_t)0;
   2769 		(void) snprintf(err_data, sizeof (err_data),
   2770 		    "f0= %d, f2= %d", +0, -0);
   2771 		setup_fps_test_struct(IS_EREPORT_INFO, report,
   2772 		    8252, &observed, &expected, 1, 1, err_data);
   2773 
   2774 		return (-1);
   2775 	}
   2776 
   2777 	set_fsr(prev_fsr);
   2778 	return (0);
   2779 }
   2780 
   2781 /*
   2782  * branching(struct fps_test_ereport *report)
   2783  * performs branch testing. If an error is found,
   2784  * relevant data is stored in report.
   2785  */
   2786 static int
   2787 branching(struct fps_test_ereport *report)
   2788 {
   2789 	char err_data[MAX_INFO_SIZE];
   2790 	int i;
   2791 	unsigned long result;
   2792 	unsigned long prev_status;
   2793 	uint64_t observed;
   2794 	uint64_t expected;
   2795 
   2796 	prev_status = get_fsr();
   2797 	init_regs(0);
   2798 	result = get_fsr();
   2799 	result = result & 0xC0400000;	/* set all exception bits to zero */
   2800 	set_fsr(result);
   2801 
   2802 	for (i = 0; i < 64; i++) {
   2803 		if (result = branches(0, val[i].floatsingle, 0x7f800400)) {
   2804 			observed = (uint64_t)result;
   2805 			expected = (uint64_t)0;
   2806 			setup_fps_test_struct(NO_EREPORT_INFO,
   2807 			    report, 6255, &observed, &expected, 1, 1);
   2808 
   2809 			return (-1);
   2810 		}
   2811 
   2812 		if (result = branches(1, val[i + 1].floatsingle,
   2813 		    val[i].floatsingle)) {
   2814 			observed = (uint64_t)result;
   2815 			expected = (uint64_t)0;
   2816 			(void) snprintf(err_data, sizeof (err_data),
   2817 			    "reg f0= %d, f2= %d ", i+1, i);
   2818 			setup_fps_test_struct(IS_EREPORT_INFO,
   2819 			    report, 6256, &observed, &expected, 1, 1,
   2820 			    err_data);
   2821 
   2822 			return (-1);
   2823 		}
   2824 
   2825 		if (result = branches(2, val[i].floatsingle, 0x7f800400)) {
   2826 			observed = (uint64_t)result;
   2827 			expected = (uint64_t)0;
   2828 			setup_fps_test_struct(NO_EREPORT_INFO,
   2829 			    report, 6257, &observed, &expected, 1, 1);
   2830 
   2831 			return (-1);
   2832 		}
   2833 
   2834 		if (result = branches(2, val[i + 1].floatsingle,
   2835 		    val[i].floatsingle)) {
   2836 			observed = (uint64_t)result;
   2837 			expected = (uint64_t)0;
   2838 			(void) snprintf(err_data, sizeof (err_data),
   2839 			    "reg f0= %d, f2= %d ", i+1, i);
   2840 			setup_fps_test_struct(IS_EREPORT_INFO,
   2841 			    report, 6258, &observed, &expected, 1, 1,
   2842 			    err_data);
   2843 
   2844 			return (-1);
   2845 		}
   2846 
   2847 		if (result = branches(3, val[i].floatsingle,
   2848 		    val[i + 1].floatsingle)) {
   2849 			observed = (uint64_t)result;
   2850 			expected = (uint64_t)0;
   2851 			(void) snprintf(err_data, sizeof (err_data),
   2852 			    "reg f0= %d and f2= %d ", i, i+1);
   2853 			setup_fps_test_struct(IS_EREPORT_INFO,
   2854 			    report, 6259, &observed, &expected, 1, 1,
   2855 			    err_data);
   2856 
   2857 			return (-1);
   2858 		}
   2859 
   2860 		if (result = branches(4, val[i].floatsingle, 0x7f800400)) {
   2861 			observed = (uint64_t)result;
   2862 			expected = (uint64_t)0;
   2863 			setup_fps_test_struct(NO_EREPORT_INFO,
   2864 			    report, 6260, &observed, &expected, 1, 1);
   2865 
   2866 			return (-1);
   2867 		}
   2868 
   2869 		if (result = branches(4, val[i].floatsingle,
   2870 		    val[i + 1].floatsingle)) {
   2871 			observed = (uint64_t)result;
   2872 			expected = (uint64_t)0;
   2873 			(void) snprintf(err_data, sizeof (err_data),
   2874 			    "reg f0= %d, f2= %d ", i, i+1);
   2875 			setup_fps_test_struct(IS_EREPORT_INFO,
   2876 			    report, 6261, &observed, &expected, 1, 1,
   2877 			    err_data);
   2878 
   2879 			return (-1);
   2880 		}
   2881 
   2882 		if (result = branches(5, val[i].floatsingle,
   2883 		    val[i + 1].floatsingle)) {
   2884 			observed = (uint64_t)result;
   2885 			expected = (uint64_t)0;
   2886 			(void) snprintf(err_data, sizeof (err_data),
   2887 			    "reg f0= %d, f2= %d ", i, i+1);
   2888 			setup_fps_test_struct(IS_EREPORT_INFO,
   2889 			    report, 6262, &observed, &expected, 1, 1,
   2890 			    err_data);
   2891 
   2892 			return (-1);
   2893 		}
   2894 
   2895 		if (result = branches(5, val[i + 1].floatsingle,
   2896 		    val[i].floatsingle)) {
   2897 			observed = (uint64_t)result;
   2898 			expected = (uint64_t)0;
   2899 			(void) snprintf(err_data, sizeof (err_data),
   2900 			    "reg f0= %d, f2= %d ", i+1, i);
   2901 			setup_fps_test_struct(IS_EREPORT_INFO,
   2902 			    report, 6263, &observed, &expected, 1, 1,
   2903 			    err_data);
   2904 
   2905 			return (-1);
   2906 		}
   2907 
   2908 		if (result = branches(6, val[i].floatsingle,
   2909 		    val[i + 1].floatsingle)) {
   2910 			observed = (uint64_t)result;
   2911 			expected = (uint64_t)0;
   2912 			(void) snprintf(err_data, sizeof (err_data),
   2913 			    "reg f0= %d, f2= %d ", i, i+1);
   2914 			setup_fps_test_struct(IS_EREPORT_INFO,
   2915 			    report, 6264, &observed, &expected, 1, 1,
   2916 			    err_data);
   2917 
   2918 			return (-1);
   2919 		}
   2920 
   2921 		if (result = branches(7, val[i].floatsingle,
   2922 		    val[i].floatsingle)) {
   2923 			observed = (uint64_t)result;
   2924 			expected = (uint64_t)0;
   2925 			(void) snprintf(err_data, sizeof (err_data),
   2926 			    "reg f0= %d, f2= %d ", i, i);
   2927 			setup_fps_test_struct(IS_EREPORT_INFO,
   2928 			    report, 6265, &observed, &expected, 1, 1,
   2929 			    err_data);
   2930 
   2931 			return (-1);
   2932 		}
   2933 
   2934 		if (result = branches(8, val[i].floatsingle, 0x7f800400)) {
   2935 			observed = (uint64_t)result;
   2936 			expected = (uint64_t)0;
   2937 			setup_fps_test_struct(NO_EREPORT_INFO,
   2938 			    report, 6266, &observed, &expected, 1, 1);
   2939 
   2940 			return (-1);
   2941 		}
   2942 
   2943 		if (result = branches(8, val[i].floatsingle,
   2944 		    val[i].floatsingle)) {
   2945 			observed = (uint64_t)result;
   2946 			expected = (uint64_t)0;
   2947 			(void) snprintf(err_data, sizeof (err_data),
   2948 			    "reg f0= %d, f2= %d ", i, i);
   2949 			setup_fps_test_struct(IS_EREPORT_INFO,
   2950 			    report, 6267, &observed, &expected, 1, 1,
   2951 			    err_data);
   2952 
   2953 			return (-1);
   2954 		}
   2955 		if (result = branches(9, val[i].floatsingle,
   2956 		    val[i].floatsingle)) {
   2957 			observed = (uint64_t)result;
   2958 			expected = (uint64_t)0;
   2959 			(void) snprintf(err_data, sizeof (err_data),
   2960 			    "reg f0= %d, f2= %d ", i, i);
   2961 			setup_fps_test_struct(IS_EREPORT_INFO,
   2962 			    report, 6268, &observed, &expected, 1, 1,
   2963 			    err_data);
   2964 
   2965 			return (-1);
   2966 		}
   2967 		if (result = branches(9, val[i + 1].floatsingle,
   2968 		    val[i].floatsingle)) {
   2969 			observed = (uint64_t)result;
   2970 			expected = (uint64_t)0;
   2971 			(void) snprintf(err_data, sizeof (err_data),
   2972 			    "reg f0= %d, f2= %d ", i+1, i);
   2973 			setup_fps_test_struct(IS_EREPORT_INFO,
   2974 			    report, 6269, &observed, &expected, 1, 1,
   2975 			    err_data);
   2976 
   2977 			return (-1);
   2978 		}
   2979 
   2980 		if (result = branches(10, val[i].floatsingle, 0x7f800400)) {
   2981 			observed = (uint64_t)result;
   2982 			expected = (uint64_t)0;
   2983 			setup_fps_test_struct(NO_EREPORT_INFO,
   2984 			    report, 6270, &observed, &expected, 1, 1);
   2985 
   2986 			return (-1);
   2987 		}
   2988 
   2989 		if (result = branches(10, val[i].floatsingle,
   2990 		    val[i].floatsingle)) {
   2991 			observed = (uint64_t)result;
   2992 			expected = (uint64_t)0;
   2993 			(void) snprintf(err_data, sizeof (err_data),
   2994 			    "reg f0= %d, f2= %d", i, i);
   2995 			setup_fps_test_struct(IS_EREPORT_INFO,
   2996 			    report, 6271, &observed, &expected, 1, 1,
   2997 			    err_data);
   2998 
   2999 			return (-1);
   3000 		}
   3001 
   3002 		if (result = branches(10, val[i + 1].floatsingle,
   3003 		    val[i].floatsingle)) {
   3004 			observed = (uint64_t)result;
   3005 			expected = (uint64_t)0;
   3006 			(void) snprintf(err_data, sizeof (err_data),
   3007 			    "reg f0= %d, f2= %d", i+1, i);
   3008 			setup_fps_test_struct(IS_EREPORT_INFO,
   3009 			    report, 6272, &observed, &expected, 1, 1,
   3010 			    err_data);
   3011 
   3012 			return (-1);
   3013 		}
   3014 
   3015 		if (result = branches(11, val[i].floatsingle,
   3016 		    val[i + 1].floatsingle)) {
   3017 			observed = (uint64_t)result;
   3018 			expected = (uint64_t)0;
   3019 			(void) snprintf(err_data, sizeof (err_data),
   3020 			    "reg f0= %d, f2= %d", i, i+1);
   3021 			setup_fps_test_struct(IS_EREPORT_INFO,
   3022 			    report, 6273, &observed, &expected, 1, 1,
   3023 			    err_data);
   3024 
   3025 			return (-1);
   3026 		}
   3027 
   3028 		if (result = branches(11, val[i].floatsingle,
   3029 		    val[i].floatsingle)) {
   3030 			observed = (uint64_t)result;
   3031 			expected = (uint64_t)0;
   3032 			(void) snprintf(err_data, sizeof (err_data),
   3033 			    "reg f0= %d, f2= %d", i, i);
   3034 			setup_fps_test_struct(IS_EREPORT_INFO,
   3035 			    report, 6274, &observed, &expected, 1, 1,
   3036 			    err_data);
   3037 
   3038 			return (-1);
   3039 		}
   3040 
   3041 		if (result = branches(12, val[i].floatsingle, 0x7f800400)) {
   3042 			observed = (uint64_t)result;
   3043 			expected = (uint64_t)0;
   3044 			setup_fps_test_struct(NO_EREPORT_INFO,
   3045 			    report, 6275, &observed, &expected, 1, 1);
   3046 
   3047 			return (-1);
   3048 		}
   3049 
   3050 		if (result = branches(12, val[i].floatsingle,
   3051 		    val[i + 1].floatsingle)) {
   3052 			observed = (uint64_t)result;
   3053 			expected = (uint64_t)0;
   3054 			(void) snprintf(err_data, sizeof (err_data),
   3055 			    "reg f0= %d, f2= %d", i, i+1);
   3056 			setup_fps_test_struct(IS_EREPORT_INFO,
   3057 			    report, 6276, &observed, &expected, 1, 1,
   3058 			    err_data);
   3059 
   3060 			return (-1);
   3061 		}
   3062 
   3063 		if (result = branches(12, val[i].floatsingle,
   3064 		    val[i].floatsingle)) {
   3065 			observed = (uint64_t)result;
   3066 			expected = (uint64_t)0;
   3067 			(void) snprintf(err_data, sizeof (err_data),
   3068 			    "reg f0= %d, f2= %d", i, i);
   3069 			setup_fps_test_struct(IS_EREPORT_INFO,
   3070 			    report, 6277, &observed, &expected, 1, 1,
   3071 			    err_data);
   3072 
   3073 			return (-1);
   3074 		}
   3075 
   3076 		if (result = branches(13, val[i].floatsingle,
   3077 		    val[i + 1].floatsingle)) {
   3078 			observed = (uint64_t)result;
   3079 			expected = (uint64_t)0;
   3080 			(void) snprintf(err_data, sizeof (err_data),
   3081 			    "reg f0= %d, f2= %d", i, i+1);
   3082 			setup_fps_test_struct(IS_EREPORT_INFO,
   3083 			    report, 6278, &observed, &expected, 1, 1,
   3084 			    err_data);
   3085 
   3086 			return (-1);
   3087 		}
   3088 
   3089 		if (result = branches(14, val[i].floatsingle,
   3090 		    val[i + 1].floatsingle)) {
   3091 			observed = (uint64_t)result;
   3092 			expected = (uint64_t)0;
   3093 			(void) snprintf(err_data, sizeof (err_data),
   3094 			    "reg f0= %d, f2= %d", i, i+1);
   3095 			setup_fps_test_struct(IS_EREPORT_INFO,
   3096 			    report, 6279, &observed, &expected, 1, 1,
   3097 			    err_data);
   3098 
   3099 			return (-1);
   3100 		}
   3101 
   3102 		if (result = branches(15, val[i].floatsingle,
   3103 		    val[i + 1].floatsingle)) {
   3104 			observed = (uint64_t)result;
   3105 			expected = (uint64_t)0;
   3106 			(void) snprintf(err_data, sizeof (err_data),
   3107 			    "reg f0= %d, f2= %d ", i, i+1);
   3108 			setup_fps_test_struct(IS_EREPORT_INFO,
   3109 			    report, 6280, &observed, &expected, 1, 1,
   3110 			    err_data);
   3111 
   3112 			return (-1);
   3113 		}
   3114 	}
   3115 
   3116 	set_fsr(prev_status);
   3117 	return (0);
   3118 
   3119 }
   3120 
   3121 /*
   3122  * branching(struct fps_test_ereport *report)
   3123  * performs negative branch testing. If an error is found,
   3124  * relevant data is stored in report.
   3125  */
   3126 static int
   3127 no_branching(struct fps_test_ereport *report)
   3128 {
   3129 	char err_data[MAX_INFO_SIZE];
   3130 	int i;
   3131 	uint64_t observed;
   3132 	uint64_t expected;
   3133 	unsigned long result;
   3134 	unsigned long prev_status;
   3135 
   3136 	prev_status = get_fsr();
   3137 	init_regs(0);
   3138 	result = get_fsr();
   3139 	result = result & 0xC0400000;	/* set all exception bits to zero */
   3140 	set_fsr(result);
   3141 
   3142 	for (i = 0; i < 64; i++) {
   3143 		if (!(branches(0, val[i].floatsingle,
   3144 		    val[i].floatsingle))) {
   3145 			observed = (uint64_t)0;
   3146 			expected = (uint64_t)1;
   3147 			setup_fps_test_struct(NO_EREPORT_INFO,
   3148 			    report, 6281, &observed, &expected, 1, 1);
   3149 
   3150 			return (-1);
   3151 		}
   3152 
   3153 		if (!(branches(1, val[i].floatsingle,
   3154 		    val[i].floatsingle))) {
   3155 			observed = (uint64_t)0;
   3156 			expected = (uint64_t)1;
   3157 			(void) snprintf(err_data, sizeof (err_data),
   3158 			    "reg f0= %d, f2= %d", i, i);
   3159 			setup_fps_test_struct(IS_EREPORT_INFO,
   3160 			    report, 6282, &observed, &expected, 1, 1,
   3161 			    err_data);
   3162 
   3163 			return (-1);
   3164 		}
   3165 
   3166 		if (!(branches(2, val[i].floatsingle,
   3167 		    val[i].floatsingle))) {
   3168 			observed = (uint64_t)0;
   3169 			expected = (uint64_t)1;
   3170 			(void) snprintf(err_data, sizeof (err_data),
   3171 			    "reg f0= %d, f2= %d", i, i);
   3172 			setup_fps_test_struct(IS_EREPORT_INFO,
   3173 			    report, 6283, &observed, &expected, 1, 1,
   3174 			    err_data);
   3175 
   3176 			return (-1);
   3177 		}
   3178 
   3179 		if (!(branches(3, val[i].floatsingle,
   3180 		    val[i].floatsingle))) {
   3181 			observed = (uint64_t)0;
   3182 			expected = (uint64_t)1;
   3183 			(void) snprintf(err_data, sizeof (err_data),
   3184 			    "reg f0= %d, f2= %d", i, i);
   3185 			setup_fps_test_struct(IS_EREPORT_INFO,
   3186 			    report, 6284, &observed, &expected, 1, 1,
   3187 			    err_data);
   3188 
   3189 			return (-1);
   3190 		}
   3191 
   3192 		if (!(branches(4, val[i].floatsingle,
   3193 		    val[i].floatsingle))) {
   3194 			observed = (uint64_t)0;
   3195 			expected = (uint64_t)1;
   3196 			(void) snprintf(err_data, sizeof (err_data),
   3197 			    "reg f0= %d, f2= %d", i, i);
   3198 			setup_fps_test_struct(IS_EREPORT_INFO,
   3199 			    report, 6285, &observed, &expected, 1, 1,
   3200 			    err_data);
   3201 
   3202 			return (-1);
   3203 		}
   3204 
   3205 		if (!(branches(5, val[i].floatsingle,
   3206 		    val[i].floatsingle))) {
   3207 			observed = (uint64_t)0;
   3208 			expected = (uint64_t)1;
   3209 			(void) snprintf(err_data, sizeof (err_data),
   3210 			    "reg f0= %d, f2= %d", i, i);
   3211 			setup_fps_test_struct(IS_EREPORT_INFO,
   3212 			    report, 6286, &observed, &expected, 1, 1,
   3213 			    err_data);
   3214 
   3215 			return (-1);
   3216 		}
   3217 
   3218 		if (!(branches(6, val[i].floatsingle,
   3219 		    val[i].floatsingle))) {
   3220 			observed = (uint64_t)0;
   3221 			expected = (uint64_t)1;
   3222 			(void) snprintf(err_data, sizeof (err_data),
   3223 			    "reg f0= %d, f2= %d", i, i);
   3224 			setup_fps_test_struct(IS_EREPORT_INFO,
   3225 			    report, 6287, &observed, &expected, 1, 1,
   3226 			    err_data);
   3227 
   3228 			return (-1);
   3229 		}
   3230 
   3231 		if (!(branches(7, val[i + 1].floatsingle,
   3232 		    val[i].floatsingle))) {
   3233 			observed = (uint64_t)0;
   3234 			expected = (uint64_t)1;
   3235 			(void) snprintf(err_data, sizeof (err_data),
   3236 			    "reg f0= %d, f2= %d", i+1, i);
   3237 			setup_fps_test_struct(IS_EREPORT_INFO,
   3238 			    report, 6288, &observed, &expected, 1, 1,
   3239 			    err_data);
   3240 
   3241 			return (-1);
   3242 		}
   3243 
   3244 		if (!(branches(8, val[i + 1].floatsingle,
   3245 		    val[i].floatsingle))) {
   3246 			observed = (uint64_t)0;
   3247 			expected = (uint64_t)1;
   3248 			(void) snprintf(err_data, sizeof (err_data),
   3249 			    "reg f0= %d, f2= %d", i+1, i);
   3250 			setup_fps_test_struct(IS_EREPORT_INFO,
   3251 			    report, 6289, &observed, &expected, 1, 1,
   3252 			    err_data);
   3253 
   3254 			return (-1);
   3255 		}
   3256 
   3257 		if (!(branches(9, val[i].floatsingle,
   3258 		    val[i + 1].floatsingle))) {
   3259 			observed = (uint64_t)0;
   3260 			expected = (uint64_t)1;
   3261 			(void) snprintf(err_data, sizeof (err_data),
   3262 			    "reg f0= %d, f2= %d", i, i+1);
   3263 			setup_fps_test_struct(IS_EREPORT_INFO,
   3264 			    report, 6290, &observed, &expected, 1, 1,
   3265 			    err_data);
   3266 
   3267 			return (-1);
   3268 		}
   3269 
   3270 		if (!(branches(10, val[i].floatsingle,
   3271 		    val[i + 1].floatsingle))) {
   3272 			observed = (uint64_t)0;
   3273 			expected = (uint64_t)1;
   3274 			(void) snprintf(err_data, sizeof (err_data),
   3275 			    "reg f0= %d, f2= %d", i, i+1);
   3276 			setup_fps_test_struct(IS_EREPORT_INFO,
   3277 			    report, 6291, &observed, &expected, 1, 1,
   3278 			    err_data);
   3279 
   3280 			return (-1);
   3281 		}
   3282 
   3283 		if (!(branches(11, val[i + 1].floatsingle,
   3284 		    val[i].floatsingle))) {
   3285 			observed = (uint64_t)0;
   3286 			expected = (uint64_t)1;
   3287 			(void) snprintf(err_data, sizeof (err_data),
   3288 			    "reg f0= %d, f2= %d", i+1, i);
   3289 			setup_fps_test_struct(IS_EREPORT_INFO,
   3290 			    report, 6292, &observed, &expected, 1, 1,
   3291 			    err_data);
   3292 
   3293 			return (-1);
   3294 		}
   3295 
   3296 		if (!(branches(12, val[i + 1].floatsingle,
   3297 		    val[i].floatsingle))) {
   3298 			observed = (uint64_t)0;
   3299 			expected = (uint64_t)1;
   3300 			(void) snprintf(err_data, sizeof (err_data),
   3301 			    "reg f0= %d, f2= %d", i+1, i);
   3302 			setup_fps_test_struct(IS_EREPORT_INFO,
   3303 			    report, 6293, &observed, &expected, 1, 1,
   3304 			    err_data);
   3305 
   3306 			return (-1);
   3307 		}
   3308 
   3309 		if (!(result = branches(13, val[i].floatsingle, 0x7f800400))) {
   3310 			observed = (uint64_t)0;
   3311 			expected = (uint64_t)1;
   3312 			setup_fps_test_struct(NO_EREPORT_INFO,
   3313 			    report, 6294, &observed, &expected, 1, 1);
   3314 
   3315 			return (-1);
   3316 		}
   3317 
   3318 	}
   3319 
   3320 	set_fsr(prev_status);
   3321 
   3322 	return (0);
   3323 }
   3324 
   3325 /*
   3326  * compare_sp_except(struct fps_test_ereport *report)
   3327  * does single precision exception testing.
   3328  * If an error is found, relevant data is stored
   3329  * in report.
   3330  */
   3331 static int
   3332 compare_sp_except(struct fps_test_ereport *report)
   3333 {
   3334 	char err_data[MAX_INFO_SIZE];
   3335 	int i;
   3336 	unsigned long result;
   3337 	unsigned long prev_status;
   3338 	uint64_t observed;
   3339 	uint64_t expected;
   3340 
   3341 	prev_status = get_fsr();
   3342 	init_regs(0);
   3343 	result = get_fsr();
   3344 	result = result | FSR_ENABLE_TEM_NV;
   3345 
   3346 	set_fsr(result);
   3347 
   3348 	for (i = 0; i < N_VALS; i++) {
   3349 
   3350 		trap_flag = trap_flag | TRAP_SOLICITED;
   3351 		result = cmp_s_ex(val[i].floatsingle, 0x7fbfffff);
   3352 		if (trap_flag) {
   3353 			observed = (uint64_t)trap_flag;
   3354 			expected = (uint64_t)0;
   3355 			(void) snprintf(err_data, sizeof (err_data),
   3356 			    "fcmpxs exception did not occur, fsr=%lo",
   3357 			    fsr_at_trap);
   3358 			setup_fps_test_struct(IS_EREPORT_INFO,
   3359 			    report, 6295, &observed, &expected, 1, 1,
   3360 			    err_data);
   3361 
   3362 			return (-1);
   3363 		}
   3364 		if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
   3365 			observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
   3366 			expected = (uint64_t)FSR_CEXC_NV;
   3367 			(void) snprintf(err_data, sizeof (err_data),
   3368 			    "fcmpxs exception did not occur, fsr=%lo",
   3369 			    fsr_at_trap);
   3370 			setup_fps_test_struct(IS_EREPORT_INFO,
   3371 			    report, 6296, &observed, &expected, 1, 1,
   3372 			    err_data);
   3373 
   3374 			return (-1);
   3375 		}
   3376 	}
   3377 
   3378 	set_fsr(prev_status);
   3379 	return (0);
   3380 }
   3381 
   3382 /*
   3383  * compare_dp_except(struct fps_test_ereport *report)
   3384  * does double precision exception testing.
   3385  * If an error is found, relevant data is stored
   3386  * in report.
   3387  */
   3388 static int
   3389 compare_dp_except(struct fps_test_ereport *report)
   3390 {
   3391 	char err_data[MAX_INFO_SIZE];
   3392 	int i;
   3393 	unsigned long result;
   3394 	unsigned long prev_status;
   3395 	uint64_t observed;
   3396 	uint64_t expected;
   3397 
   3398 	prev_status = get_fsr();
   3399 	init_regs(0);
   3400 	result = get_fsr();
   3401 	result = result | FSR_ENABLE_TEM_NV;
   3402 	set_fsr(result);
   3403 
   3404 	for (i = 0; i < 199; i++) {
   3405 
   3406 		trap_flag = trap_flag | TRAP_SOLICITED;
   3407 		result = cmp_d_ex(val[i].floatdouble, 0x7ff0008000000000);
   3408 		if (trap_flag) {
   3409 			observed = (uint64_t)trap_flag;
   3410 			expected = (uint64_t)0;
   3411 			(void) snprintf(err_data, sizeof (err_data),
   3412 			    "fcmpxd exception did not occur, fsr=%lo",
   3413 			    fsr_at_trap);
   3414 			setup_fps_test_struct(IS_EREPORT_INFO,
   3415 			    report, 6297, &observed, &expected, 1, 1,
   3416 			    err_data);
   3417 
   3418 			return (-1);
   3419 		}
   3420 		if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
   3421 			observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
   3422 			expected = (uint64_t)FSR_CEXC_NV;
   3423 			(void) snprintf(err_data, sizeof (err_data),
   3424 			    "fcmpxd exception did not occur, fsr=%lo",
   3425 			    fsr_at_trap);
   3426 			setup_fps_test_struct(IS_EREPORT_INFO,
   3427 			    report, 6298, &observed, &expected, 1, 1,
   3428 			    err_data);
   3429 
   3430 			return (-1);
   3431 		}
   3432 	}
   3433 
   3434 	set_fsr(prev_status);
   3435 	return (0);
   3436 }
   3437 
   3438 /*
   3439  * Patterns used in the registers functions that are.
   3440  * loaded into all registers.
   3441  */
   3442 
   3443 #define	ALLZEROES_DP	0x0000000000000000UL
   3444 #define	ALLZEROES_SP 	0x00000000U
   3445 #define	ALLONES_DP		0xFFFFFFFFFFFFFFFFUL
   3446 #define	ALLONES_SP		0xFFFFFFFFU
   3447 
   3448 /*
   3449  * registers_four(struct fps_test_ereport *report)
   3450  * loads each nibble with 0xf on all the available FP
   3451  * registers in single precision.
   3452  * If an error is found, relevant data is stored
   3453  * in report.
   3454  */
   3455 static int
   3456 registers_four(struct fps_test_ereport *report)
   3457 {
   3458 	char err_data[MAX_INFO_SIZE];
   3459 	int i;
   3460 	unsigned int result = 0;
   3461 	uint64_t observed;
   3462 	uint64_t expected;
   3463 
   3464 #define	ARB_VAL 4
   3465 
   3466 	for (i = 0; i < ARB_VAL; i++) {
   3467 		init_regs(ALLZEROES_SP);
   3468 		init_regs(ALLONES_SP);
   3469 	}
   3470 
   3471 	init_regs(ALLZEROES_SP);
   3472 	for (i = 0; i < 32; i++) {
   3473 		read_fpreg(&result, i);
   3474 		if (result != ALLZEROES_SP) {
   3475 			observed = (uint64_t)result;
   3476 			expected = (uint64_t)ALLZEROES_SP;
   3477 			(void) snprintf(err_data, sizeof (err_data),
   3478 			    "Reg: %d\nExpected: %d\nObserved: %d",
   3479 			    i, ALLZEROES_SP, result);
   3480 			setup_fps_test_struct(IS_EREPORT_INFO,
   3481 			    report, 6345, &observed, &expected, 1, 1,
   3482 			    err_data);
   3483 
   3484 			return (-1);
   3485 		}
   3486 	}
   3487 
   3488 	init_regs(ALLONES_SP);
   3489 
   3490 	for (i = 0; i < 32; i++) {
   3491 		read_fpreg(&result, i);
   3492 		if (result != ALLONES_SP) {
   3493 			observed = (uint64_t)result;
   3494 			expected = (uint64_t)ALLONES_SP;
   3495 			(void) snprintf(err_data, sizeof (err_data),
   3496 			    "Reg: %d\nExpected: %d\nObserved: %d",
   3497 			    i, ALLONES_SP, result);
   3498 			setup_fps_test_struct(IS_EREPORT_INFO,
   3499 			    report, 8345, &observed, &expected, 1, 1,
   3500 			    err_data);
   3501 
   3502 			return (-1);
   3503 		}
   3504 	}
   3505 
   3506 	return (0);
   3507 }
   3508 
   3509 /*
   3510  * registers_four_dp(struct fps_test_ereport *report)
   3511  * loads each nibble with 0xf on all the available FP
   3512  * registers in double precision.
   3513  * If an error is found, relevant data is stored
   3514  * in report.
   3515  */
   3516 static int
   3517 registers_four_dp(struct fps_test_ereport *report)
   3518 {
   3519 	char err_data[MAX_INFO_SIZE];
   3520 	int i;
   3521 	uint64_t expected;
   3522 	uint64_t observed;
   3523 	unsigned long result;
   3524 
   3525 #define	ARB_VAL 4
   3526 
   3527 	for (i = 0; i < ARB_VAL; i++) {
   3528 		init_regs_dp(ALLZEROES_DP);
   3529 		init_regs_dp(ALLONES_DP);
   3530 	}
   3531 
   3532 	init_regs_dp(16);
   3533 	read_fpreg_dp(&result, 2);
   3534 	init_regs_dp(ALLZEROES_DP);
   3535 	for (i = 0; i < 64; i = i + 2) {
   3536 		result = ALLONES_DP;
   3537 		read_fpreg_dp(&result, i);
   3538 		if (result != ALLZEROES_DP) {
   3539 			observed = (uint64_t)result;
   3540 			expected = (uint64_t)ALLZEROES_DP;
   3541 			(void) snprintf(err_data, sizeof (err_data),
   3542 			    "Reg: %d\nExpected: %lld\nObserved: %lld",
   3543 			    i, ALLZEROES_DP, result);
   3544 			setup_fps_test_struct(IS_EREPORT_INFO,
   3545 			    report, 6346, &observed, &expected, 1, 1,
   3546 			    err_data);
   3547 
   3548 			return (-1);
   3549 		}
   3550 	}
   3551 
   3552 	init_regs_dp(ALLONES_DP);
   3553 
   3554 	for (i = 30; i < 64; i = i + 2) {
   3555 		read_fpreg_dp(&result, i);
   3556 		if (result != ALLONES_DP) {
   3557 			observed = (uint64_t)result;
   3558 			expected = (uint64_t)ALLONES_DP;
   3559 			(void) snprintf(err_data, sizeof (err_data),
   3560 			    "Reg: %d\nExpected: %lld\nObserved: %lld",
   3561 			    i, ALLONES_DP, result);
   3562 			setup_fps_test_struct(IS_EREPORT_INFO,
   3563 			    report, 8346, &observed, &expected, 1, 1,
   3564 			    err_data);
   3565 
   3566 			return (-1);
   3567 		}
   3568 	}
   3569 
   3570 	return (0);
   3571 }
   3572 
   3573 /*
   3574  * registers_two(struct fps_test_ereport *report)
   3575  * tests single precision rotating ones through the
   3576  * floating point registers. If an error is found,
   3577  * relevant data is stored in report.
   3578  */
   3579 static int
   3580 registers_two(struct fps_test_ereport *report)
   3581 {
   3582 	char err_data[MAX_INFO_SIZE];
   3583 	int i;
   3584 	int j;
   3585 	uint64_t expected;
   3586 	uint64_t observed;
   3587 	unsigned int result;
   3588 	unsigned int value;
   3589 
   3590 	for (j = 0; j < 32; j++) {
   3591 		for (i = 0; i < 32; i++) {
   3592 			value = (1 << i);
   3593 			if ((result = register_test(j, value)) != value) {
   3594 				observed = (uint64_t)result;
   3595 				expected = (uint64_t)value;
   3596 				(void) snprintf(err_data, sizeof (err_data),
   3597 				    "Reg: %d\nExpected: %d\nObserved: %d",
   3598 				    j, value, result);
   3599 				setup_fps_test_struct(IS_EREPORT_INFO,
   3600 				    report, 6301, &observed, &expected, 1,
   3601 				    1, err_data);
   3602 
   3603 				return (-1);
   3604 			}
   3605 		}
   3606 	}
   3607 
   3608 	return (0);
   3609 }
   3610 
   3611 /*
   3612  * registers_two_dp(struct fps_test_ereport *report)
   3613  * tests double precision rotating ones through the
   3614  * floating point registers. If an error is found,
   3615  * relevant data is stored in report.
   3616  */
   3617 static int
   3618 registers_two_dp(struct fps_test_ereport *report)
   3619 {
   3620 	char err_data[MAX_INFO_SIZE];
   3621 	int i;
   3622 	int j;
   3623 	uint64_t observed;
   3624 	uint64_t expected;
   3625 	unsigned long result;
   3626 	unsigned long value;
   3627 
   3628 	for (j = 0; j < 32; j = j + 2) {
   3629 		for (i = 0; i < 64; i++) {
   3630 			value = (1 << i);
   3631 			result = register_test_dp(j, value);
   3632 
   3633 			if (result != value) {
   3634 				observed = (*(uint64_t *)&result);
   3635 				expected = (*(uint64_t *)&value);
   3636 				(void) snprintf(err_data, sizeof (err_data),
   3637 				    "Reg: %d\nExpected: %lld\nObserved: %lld",
   3638 				    j, value, result);
   3639 				setup_fps_test_struct(IS_EREPORT_INFO,
   3640 				    report, 5301, &observed, &expected, 1,
   3641 				    1, err_data);
   3642 				return (-1);
   3643 			}
   3644 		}
   3645 	}
   3646 
   3647 	return (0);
   3648 }
   3649 
   3650 /*
   3651  * registers_one(struct fps_test_ereport *report)
   3652  * passes a single precision pattern through the
   3653  * floating point registers. If an error is found,
   3654  * relevant data is stored in report.
   3655  */
   3656 static int
   3657 registers_one(struct fps_test_ereport *report)
   3658 {
   3659 	char err_data[MAX_INFO_SIZE];
   3660 	int i;
   3661 	int j;
   3662 	unsigned int	result;
   3663 
   3664 	uint64_t observed;
   3665 	uint64_t expected;
   3666 
   3667 	for (i = 0; i < 32; i++) {
   3668 		for (j = 0; j < PAT_NUM; j++) {
   3669 			result = register_test(i, pat[j]);
   3670 			if (result != pat[j]) {
   3671 				observed = (uint64_t)result;
   3672 				expected = (uint64_t)pat[j];
   3673 				(void) snprintf(err_data, sizeof (err_data),
   3674 				    "Reg: %d\nExpected: %d\nObserved: %d",
   3675 				    i, pat[j], result);
   3676 				setup_fps_test_struct(IS_EREPORT_INFO,
   3677 				    report, 6302, &observed, &expected, 1,
   3678 				    1, err_data);
   3679 
   3680 				return (-1);
   3681 			}
   3682 		}
   3683 	}
   3684 
   3685 	return (0);
   3686 }
   3687 
   3688 /*
   3689  * registers_one_dp(struct fps_test_ereport *report)
   3690  * passes a double precision pattern through the
   3691  * floating point registers. If an error is found,
   3692  * relevant data is stored in report.
   3693  */
   3694 static int
   3695 registers_one_dp(struct fps_test_ereport *report)
   3696 {
   3697 	char err_data[MAX_INFO_SIZE];
   3698 	int i;
   3699 	int j;
   3700 	unsigned long result;
   3701 
   3702 	uint64_t observed;
   3703 	uint64_t expected;
   3704 
   3705 	for (i = 0; i < 64; i = i + 2) {
   3706 		for (j = 0; j < PAT_DP_NUM; j++) {
   3707 			result = register_test_dp(i, pat_dp[j]);
   3708 			if (result != pat_dp[j]) {
   3709 				observed = (uint64_t)result;
   3710 				expected = (uint64_t)pat[j];
   3711 				(void) snprintf(err_data, sizeof (err_data),
   3712 				    "Reg: %d\nExpected: %lld"
   3713 				    "\nObserved: %lld",
   3714 				    i, pat[j], result);
   3715 				setup_fps_test_struct(IS_EREPORT_INFO,
   3716 				    report, 5302, &observed, &expected, 1,
   3717 				    1, err_data);
   3718 
   3719 				return (-1);
   3720 			}
   3721 		}
   3722 	}
   3723 
   3724 	return (0);
   3725 }
   3726 
   3727 /*
   3728  * sigsegv_handler(int sig, siginfo_t *sip, ucontext_t *ucp)
   3729  * sets up the sigsegv signal handler. If reached during
   3730  * non-negative testing, application exits.
   3731  */
   3732 /* ARGSUSED */
   3733 static void
   3734 sigsegv_handler(int sig, siginfo_t *sip, ucontext_t *ucp)
   3735 {
   3736 	ucp->uc_mcontext.fpregs.fpu_qcnt = 0;
   3737 
   3738 	fsr_at_trap = ucp->uc_mcontext.fpregs.fpu_fsr;
   3739 	if (trap_flag == (trap_flag | TRAP_SOLICITED)) {
   3740 		trap_flag = trap_flag & (~TRAP_SOLICITED);
   3741 		return;
   3742 	}
   3743 	trap_flag = trap_flag | TRAP_UNSOLICITED;
   3744 
   3745 	_exit(FPU_SIG_SEGV);
   3746 }
   3747 
   3748 /*
   3749  * sigbus_handler(int sig, siginfo_t *sip, ucontext_t *ucp)
   3750  * sets up the sigbus signal handler. If reached during
   3751  * non-negative testing, application exits.
   3752  */
   3753 /* ARGSUSED */
   3754 static void
   3755 sigbus_handler(int sig, siginfo_t *sip, ucontext_t *ucp)
   3756 {
   3757 	ucp->uc_mcontext.fpregs.fpu_qcnt = 0;
   3758 
   3759 	fsr_at_trap = ucp->uc_mcontext.fpregs.fpu_fsr;
   3760 	if (trap_flag == (trap_flag | TRAP_SOLICITED)) {
   3761 		trap_flag = trap_flag & (~TRAP_SOLICITED);
   3762 		return;
   3763 	}
   3764 	trap_flag = trap_flag | TRAP_UNSOLICITED;
   3765 
   3766 	_exit(FPU_SIG_BUS);
   3767 
   3768 }
   3769 
   3770 /*
   3771  * sigfpe_handler(int sig, siginfo_t *sip, ucontext_t *ucp)
   3772  * sets up the sigfpe signal handler. If reached during
   3773  * non-negative testing, application exits.
   3774  */
   3775 /* ARGSUSED */
   3776 static void
   3777 sigfpe_handler(int sig, siginfo_t *sip, ucontext_t *ucp)
   3778 {
   3779 	ucp->uc_mcontext.fpregs.fpu_qcnt = 0;
   3780 
   3781 	fsr_at_trap = ucp->uc_mcontext.fpregs.fpu_fsr;
   3782 	if (trap_flag == (trap_flag | TRAP_SOLICITED)) {
   3783 		trap_flag = trap_flag & (~TRAP_SOLICITED);
   3784 		return;
   3785 	}
   3786 	trap_flag = trap_flag | TRAP_UNSOLICITED;
   3787 
   3788 	_exit(FPU_SIG_FPE);
   3789 }
   3790 
   3791 /*
   3792  * sigill_handler(int sig, siginfo_t *sip, ucontext_t *ucp)
   3793  * sets up the sigill signal handler. If reached during
   3794  * non-negative testing, application exits.
   3795  */
   3796 /* ARGSUSED */
   3797 static void
   3798 sigill_handler(int sig, siginfo_t *sip, ucontext_t *ucp)
   3799 {
   3800 	ucp->uc_mcontext.fpregs.fpu_qcnt = 0;
   3801 
   3802 	fsr_at_trap = ucp->uc_mcontext.fpregs.fpu_fsr;
   3803 	if (trap_flag == (trap_flag | TRAP_SOLICITED)) {
   3804 		trap_flag = trap_flag & (~TRAP_SOLICITED);
   3805 		return;
   3806 	}
   3807 	trap_flag = trap_flag | TRAP_UNSOLICITED;
   3808 
   3809 	_exit(FPU_SIG_ILL);
   3810 }
   3811 
   3812 /*
   3813  * winitfp() sets the signal handlers used
   3814  * for negative testing. If sigaction fails,
   3815  * the program exits.
   3816  */
   3817 int
   3818 winitfp()
   3819 {
   3820 	(void) sigemptyset(&newfpe.sa_mask);
   3821 	newfpe.sa_flags = SA_SIGINFO;
   3822 	newfpe.sa_handler = sigfpe_handler;
   3823 	if (sigaction(SIGFPE, &newfpe, &oldfpe)) {
   3824 		_exit(FPU_SYSCALL_FAIL);
   3825 	}
   3826 
   3827 	(void) sigemptyset(&newill.sa_mask);
   3828 	newill.sa_flags = SA_SIGINFO;
   3829 	newill.sa_handler = sigill_handler;
   3830 	if (sigaction(SIGILL, &newill, &oldill)) {
   3831 		_exit(FPU_SYSCALL_FAIL);
   3832 	}
   3833 
   3834 	(void) sigemptyset(&newbus.sa_mask);
   3835 	newbus.sa_flags = SA_SIGINFO;
   3836 	newbus.sa_handler = sigbus_handler;
   3837 	if (sigaction(SIGBUS, &newbus, &oldbus)) {
   3838 		_exit(FPU_SYSCALL_FAIL);
   3839 	}
   3840 
   3841 	(void) sigemptyset(&newsegv.sa_mask);
   3842 	newsegv.sa_flags = SA_SIGINFO;
   3843 	newsegv.sa_handler = sigsegv_handler;
   3844 	if (sigaction(SIGSEGV, &newsegv, &oldsegv)) {
   3845 		_exit(FPU_SYSCALL_FAIL);
   3846 	}
   3847 
   3848 	return (0);
   3849 }
   3850 #endif
   3851 
   3852 /*
   3853  * restore_signals() turns off the signal
   3854  * handlers used by restoring the original
   3855  * values. If sigaction fails, the program
   3856  * exits.
   3857  */
   3858 int
   3859 restore_signals()
   3860 {
   3861 	if (sigaction(SIGSEGV, &oldsegv, &newsegv)) {
   3862 		_exit(FPU_SYSCALL_FAIL);
   3863 	}
   3864 
   3865 	if (sigaction(SIGBUS, &oldbus, &newbus)) {
   3866 		_exit(FPU_SYSCALL_FAIL);
   3867 	}
   3868 
   3869 	if (sigaction(SIGILL, &oldill, &newill)) {
   3870 		_exit(FPU_SYSCALL_FAIL);
   3871 	}
   3872 
   3873 	if (sigaction(SIGFPE, &oldfpe, &newfpe)) {
   3874 		_exit(FPU_SYSCALL_FAIL);
   3875 	}
   3876 
   3877 	return (0);
   3878 
   3879 }
   3880 
   3881 /*
   3882  * fpu_sysdiag(struct fps_test_ereport *report)
   3883  * is the main caller of all fpu subtests. It
   3884  * does the following tests: normal registers, fsr,
   3885  * moving instructions, conversion instructions,
   3886  * absolute values, compare, branching, arithmatic,
   3887  * chain, datapath, and timing.
   3888  * If an error is found, relevant data is stored
   3889  * in report.
   3890  */
   3891 int
   3892 fpu_sysdiag(struct fps_test_ereport *report)
   3893 {
   3894 
   3895 	int i;
   3896 
   3897 #ifndef i86pc
   3898 
   3899 	/*
   3900 	 * Initialize neg_val_sp[] and neg_val_dp[] with the -ve versions of
   3901 	 * the values in val[]
   3902 	 */
   3903 	for (i = 0; i < N_VALS; i++) {
   3904 		neg_val_sp[i] = val[i].floatsingle |
   3905 		    ((uint32_t)1) << 31;
   3906 
   3907 		neg_val_dp[i] = val[i].floatdouble |
   3908 		    ((uint64_t)1) << 63;
   3909 	}
   3910 
   3911 	/* Register Testing */
   3912 	if (registers_four(report)) {
   3913 		return (-1);
   3914 	}
   3915 
   3916 	if (trap_flag) {
   3917 		fail_trap(report, 7001);
   3918 		return (-1);
   3919 	}
   3920 
   3921 	if (registers_four_dp(report)) {
   3922 		return (-1);
   3923 	}
   3924 
   3925 	if (trap_flag) {
   3926 		fail_trap(report, 7002);
   3927 	}
   3928 
   3929 	if (registers_two(report)) {
   3930 		return (-1);
   3931 	}
   3932 
   3933 	if (trap_flag) {
   3934 		fail_trap(report, 7003);
   3935 	}
   3936 
   3937 	if (registers_two_dp(report)) {
   3938 		return (-1);
   3939 	}
   3940 
   3941 	if (trap_flag) {
   3942 		fail_trap(report, 7004);
   3943 	return (-1);
   3944 	}
   3945 
   3946 	if (registers_one(report)) {
   3947 		return (-1);
   3948 	}
   3949 
   3950 	if (trap_flag) {
   3951 		fail_trap(report, 7005);
   3952 		return (-1);
   3953 	}
   3954 
   3955 	if (registers_one_dp(report)) {
   3956 		return (-1);
   3957 	}
   3958 
   3959 	if (trap_flag) {
   3960 		fail_trap(report, 7006);
   3961 		return (-1);
   3962 	}
   3963 
   3964 	/* FSR testing */
   3965 	if (fsr_test(report)) {
   3966 		return (-1);
   3967 
   3968 	}
   3969 
   3970 	if (trap_flag) {
   3971 		fail_trap(report, 7007);
   3972 		return (-1);
   3973 	}
   3974 
   3975 	if (fmovs_ins(report)) {
   3976 		return (-1);
   3977 	}
   3978 
   3979 	if (trap_flag) {
   3980 		fail_trap(report, 7008);
   3981 		return (-1);
   3982 	}
   3983 
   3984 	/* Conversion routines */
   3985 	if (integer_to_float_sp(report)) {
   3986 		return (-1);
   3987 	}
   3988 
   3989 	if (trap_flag) {
   3990 		fail_trap(report, 7009);
   3991 		return (-1);
   3992 	}
   3993 
   3994 	if (integer_to_float_dp(report)) {
   3995 		return (-1);
   3996 	}
   3997 
   3998 	if (trap_flag) {
   3999 		fail_trap(report, 7010);
   4000 		return (-1);
   4001 	}
   4002 
   4003 	if (long_to_float_sp(report)) {
   4004 		return (-1);
   4005 	}
   4006 
   4007 	if (trap_flag) {
   4008 		fail_trap(report, 7011);
   4009 		return (-1);
   4010 	}
   4011 
   4012 	if (long_to_float_dp(report)) {
   4013 		return (-1);
   4014 	}
   4015 
   4016 	if (trap_flag) {
   4017 		fail_trap(report, 7012);
   4018 		return (-1);
   4019 	}
   4020 
   4021 	if (float_to_integer_sp(report)) {
   4022 		return (-1);
   4023 	}
   4024 
   4025 	if (trap_flag) {
   4026 		fail_trap(report, 7013);
   4027 		return (-1);
   4028 	}
   4029 
   4030 	if (float_to_integer_dp(report)) {
   4031 		return (-1);
   4032 	}
   4033 
   4034 	if (trap_flag) {
   4035 		fail_trap(report, 7014);
   4036 		return (-1);
   4037 	}
   4038 
   4039 	if (float_to_long_dp(report)) {
   4040 		return (-1);
   4041 	}
   4042 
   4043 	if (trap_flag) {
   4044 		fail_trap(report, 7015);
   4045 		return (-1);
   4046 	}
   4047 
   4048 	if (float_to_long_sp(report)) {
   4049 		return (-1);
   4050 	}
   4051 
   4052 	if (trap_flag) {
   4053 		fail_trap(report, 7016);
   4054 		return (-1);
   4055 	}
   4056 
   4057 	if (single_doub(report)) {
   4058 		return (-1);
   4059 	}
   4060 	if (trap_flag) {
   4061 		fail_trap(report, 7017);
   4062 		return (-1);
   4063 	}
   4064 	if (double_sing(report)) {
   4065 		return (-1);
   4066 	}
   4067 	if (trap_flag) {
   4068 		fail_trap(report, 7018);
   4069 		return (-1);
   4070 	}
   4071 	/* Absolute, -ve instructions */
   4072 	if (fabs_ins_sp(report)) {
   4073 		return (-1);
   4074 	}
   4075 	if (trap_flag) {
   4076 		fail_trap(report, 7019);
   4077 		return (-1);
   4078 	}
   4079 	if (fabs_ins_dp(report)) {
   4080 		return (-1);
   4081 	}
   4082 	if (trap_flag) {
   4083 		fail_trap(report, 7020);
   4084 		return (-1);
   4085 	}
   4086 	if (get_negative_value_pn_sp(report)) {
   4087 		return (-1);
   4088 	}
   4089 	if (trap_flag) {
   4090 		fail_trap(report, 7021);
   4091 		return (-1);
   4092 	}
   4093 	if (get_negative_value_pn_dp(report)) {
   4094 		return (-1);
   4095 	}
   4096 	if (trap_flag) {
   4097 		fail_trap(report, 7022);
   4098 		return (-1);
   4099 	}
   4100 	if (get_negative_value_np_sp(report)) {
   4101 		return (-1);
   4102 	}
   4103 	if (trap_flag) {
   4104 		fail_trap(report, 7023);
   4105 		return (-1);
   4106 	}
   4107 	if (get_negative_value_np_dp(report)) {
   4108 		return (-1);
   4109 	}
   4110 	if (trap_flag) {
   4111 		fail_trap(report, 7024);
   4112 		return (-1);
   4113 	}
   4114 	/* Compare and branch instructions */
   4115 	if (compare_sp(report)) {
   4116 		return (-1);
   4117 	}
   4118 	if (trap_flag) {
   4119 		fail_trap(report, 7025);
   4120 		return (-1);
   4121 	}
   4122 	if (compare_dp(report)) {
   4123 		return (-1);
   4124 	}
   4125 	if (trap_flag) {
   4126 		fail_trap(report, 7026);
   4127 		return (-1);
   4128 	}
   4129 	if (compare_sp_except(report)) {
   4130 		return (-1);
   4131 	}
   4132 	if (trap_flag) {
   4133 		fail_trap(report, 7027);
   4134 		return (-1);
   4135 	}
   4136 	if (compare_dp_except(report)) {
   4137 		return (-1);
   4138 	}
   4139 	if (trap_flag) {
   4140 		fail_trap(report, 7028);
   4141 		return (-1);
   4142 	}
   4143 	if (branching(report)) {
   4144 		return (-1);
   4145 
   4146 	}
   4147 	if (trap_flag) {
   4148 		fail_trap(report, 7029);
   4149 		return (-1);
   4150 	}
   4151 	if (no_branching(report)) {
   4152 		return (-1);
   4153 	}
   4154 	if (trap_flag) {
   4155 		fail_trap(report, 7030);
   4156 		return (-1);
   4157 	}
   4158 	/* Arithmetic instructions */
   4159 	if (addition_test_sp(report)) {
   4160 		return (-1);
   4161 	}
   4162 	if (trap_flag) {
   4163 		fail_trap(report, 7031);
   4164 		return (-1);
   4165 	}
   4166 	if (addition_test_dp(report)) {
   4167 		return (-1);
   4168 	}
   4169 	if (trap_flag) {
   4170 		fail_trap(report, 7032);
   4171 		return (-1);
   4172 	}
   4173 	if (subtraction_test_sp(report)) {
   4174 		return (-1);
   4175 	}
   4176 	if (trap_flag) {
   4177 		fail_trap(report, 7033);
   4178 		return (-1);
   4179 	}
   4180 	if (subtraction_test_dp(report)) {
   4181 		return (-1);
   4182 	}
   4183 	if (trap_flag) {
   4184 		fail_trap(report, 7034);
   4185 		return (-1);
   4186 	}
   4187 	if (multiplication_test_sp(report)) {
   4188 		return (-1);
   4189 	}
   4190 	if (trap_flag) {
   4191 		fail_trap(report, 7035);
   4192 		return (-1);
   4193 	}
   4194 	if (multiplication_test_dp(report)) {
   4195 		return (-1);
   4196 	}
   4197 	if (trap_flag) {
   4198 		fail_trap(report, 7036);
   4199 		return (-1);
   4200 	}
   4201 	if (squareroot_test_sp(report)) {
   4202 		return (-1);
   4203 	}
   4204 	if (trap_flag) {
   4205 		fail_trap(report, 7037);
   4206 		return (-1);
   4207 	}
   4208 	if (squareroot_test_dp(report)) {
   4209 		return (-1);
   4210 	}
   4211 	if (trap_flag) {
   4212 		fail_trap(report, 7038);
   4213 		return (-1);
   4214 	}
   4215 	if (division_test_sp(report)) {
   4216 		return (-1);
   4217 	}
   4218 	if (trap_flag) {
   4219 		fail_trap(report, 7039);
   4220 		return (-1);
   4221 	}
   4222 	if (division_test_dp(report)) {
   4223 		return (-1);
   4224 	}
   4225 	if (trap_flag) {
   4226 		fail_trap(report, 7040);
   4227 		return (-1);
   4228 	}
   4229 	/* chain, datapath, timing tests */
   4230 	if (chain_sp_test(report)) {
   4231 		return (-1);
   4232 	}
   4233 	if (trap_flag) {
   4234 		fail_trap(report, 7041);
   4235 		return (-1);
   4236 	}
   4237 	if (chain_dp_test(report)) {
   4238 		return (-1);
   4239 	}
   4240 	if (trap_flag) {
   4241 		fail_trap(report, 7042);
   4242 		return (-1);
   4243 	}
   4244 	if (data_path_sp(report)) {
   4245 		return (-1);
   4246 	}
   4247 	if (trap_flag) {
   4248 		fail_trap(report, 7043);
   4249 		return (-1);
   4250 	}
   4251 	if (data_path_dp(report)) {
   4252 		return (-1);
   4253 	}
   4254 	if (trap_flag) {
   4255 		fail_trap(report, 7044);
   4256 		return (-1);
   4257 	}
   4258 	if (timing_test(report)) {
   4259 		return (-1);
   4260 	}
   4261 	if (trap_flag) {
   4262 		fail_trap(report, 7045);
   4263 		return (-1);
   4264 	}
   4265 	if (check_conv(report)) {
   4266 		return (-1);
   4267 	}
   4268 	if (trap_flag) {
   4269 		fail_trap(report, 7046);
   4270 		return (-1);
   4271 	}
   4272 #endif				/* i86pc */
   4273 
   4274 return (0);
   4275 }
   4276 
   4277 #define	LLL 64
   4278 #define	REP_RXd "1104199269.000000"
   4279 #define	REP_RXc "1104199269,000000"
   4280 #define	REP_GCONd "4.5"
   4281 #define	REP_GCONc "4,5"
   4282 
   4283 /*
   4284  * check_conv(struct fps_test_ereport *report)
   4285  * does a series of conversion testing.
   4286  * If an error is found, relevant data is stored
   4287  * in report.
   4288  */
   4289 static int
   4290 check_conv(struct fps_test_ereport *report)
   4291 {
   4292 	char dec_point;
   4293 	char err_data[MAX_INFO_SIZE];
   4294 	double gcon;
   4295 	char l_buf[LLL];
   4296 	char *pREP_RX;
   4297 	char *pREP_GCON;
   4298 	double rx;
   4299 	long double qgcon;
   4300 	struct lconv *lconv2;
   4301 	uint64_t observed;
   4302 	uint64_t expected;
   4303 
   4304 	(void) memset(l_buf, 0, LLL);
   4305 
   4306 	lconv2 = localeconv();
   4307 	if (NULL == lconv2)
   4308 		return (0);
   4309 	if (NULL == lconv2->decimal_point)
   4310 		return (0);
   4311 
   4312 	/* expect "." or ",". if not than return */
   4313 	if (1 == strlen(lconv2->decimal_point))
   4314 		dec_point = lconv2->decimal_point[0];
   4315 	else
   4316 		return (0);
   4317 
   4318 	if (',' == dec_point) {
   4319 		pREP_RX = REP_RXc;
   4320 		pREP_GCON = REP_GCONc;
   4321 	} else if ('.' == dec_point) {
   4322 		pREP_RX = REP_RXd;
   4323 		pREP_GCON = REP_GCONd;
   4324 	} else
   4325 		return (0);
   4326 
   4327 	rx = 1104199269;
   4328 
   4329 	(void) snprintf(l_buf, LLL - 1, "%f", rx);
   4330 	if (strncmp(l_buf, pREP_RX, strlen(pREP_RX)) != 0) {
   4331 		observed = (uint64_t)1;
   4332 		expected = (uint64_t)0;
   4333 		(void) snprintf(err_data, sizeof (err_data),
   4334 		    "\nObserved: %s\nExpected: %s", l_buf, pREP_RX);
   4335 		setup_fps_test_struct(IS_EREPORT_INFO,	report,
   4336 		    6326, &observed, &expected, 1, 1, err_data);
   4337 
   4338 		return (-1);
   4339 	}
   4340 
   4341 	gcon = 4.5;
   4342 	(void) memset(l_buf, 0, LLL);
   4343 	(void) gconvert(gcon, 15, 0, l_buf);
   4344 	if (strncmp(l_buf, pREP_GCON, strlen(pREP_GCON)) != 0) {
   4345 		observed = (uint64_t)1;
   4346 		expected = (uint64_t)0;
   4347 		(void) snprintf(err_data, sizeof (err_data),
   4348 		    "\nObserved: %s\nExpected: %s", l_buf, pREP_GCON);
   4349 		setup_fps_test_struct(IS_EREPORT_INFO, report,
   4350 		    6327, &observed, &expected, 1, 1, err_data);
   4351 
   4352 		return (-2);
   4353 	}
   4354 
   4355 	qgcon = 4.5;
   4356 	(void) memset(l_buf, 0, LLL);
   4357 	(void) qgconvert(&qgcon, 15, 0, l_buf);
   4358 	if (strncmp(l_buf, pREP_GCON, strlen(pREP_GCON)) != 0) {
   4359 		observed = (uint64_t)1;
   4360 		expected = (uint64_t)0;
   4361 		(void) snprintf(err_data, sizeof (err_data),
   4362 		    "\nObserved: %s\nExpected: %s", l_buf, pREP_GCON);
   4363 		setup_fps_test_struct(IS_EREPORT_INFO, report,
   4364 		    6328, &observed, &expected, 1, 1, err_data);
   4365 
   4366 		return (-3);
   4367 	}
   4368 
   4369 	return (0);
   4370 }
   4371 
   4372 /*
   4373  * fail_trap(struct fps_test_ereport *report, int flag_num)
   4374  * creates the ereport data if a trap flag is set after a
   4375  * successful test when it shouldn't be.
   4376  */
   4377 static void
   4378 fail_trap(struct fps_test_ereport *report, int flag_num)
   4379 {
   4380 	uint64_t observed = 1;
   4381 	uint64_t expected = 0;
   4382 
   4383 	setup_fps_test_struct(NO_EREPORT_INFO, report,
   4384 	    flag_num, &observed, &expected, 1, 1);
   4385 }
   4386