summaryrefslogtreecommitdiff
path: root/usr/src/cmd/fps/fptest/fputest.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/fps/fptest/fputest.c')
-rw-r--r--usr/src/cmd/fps/fptest/fputest.c4385
1 files changed, 0 insertions, 4385 deletions
diff --git a/usr/src/cmd/fps/fptest/fputest.c b/usr/src/cmd/fps/fptest/fputest.c
deleted file mode 100644
index 8cd66644f0..0000000000
--- a/usr/src/cmd/fps/fptest/fputest.c
+++ /dev/null
@@ -1,4385 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#include <sys/types.h>
-#include <sys/file.h>
-#include <signal.h>
-#include <ucontext.h>
-#include <stdio.h>
-#include <floatingpoint.h>
-#include <locale.h>
-#include <unistd.h>
-#include <fp.h>
-#include <externs.h>
-#include <fps_ereport.h>
-
-#define FPU_ID_MASK 0xCFF02FFF
-
-extern int FPU_cpu;
-static int check_conv();
-uint_t trap_flag = 0x0;
-unsigned long fsr_at_trap;
-
-extern unsigned long long_float_d(unsigned long);
-extern unsigned long float_long_d(unsigned long);
-int fpu_sysdiag(struct fps_test_ereport *report);
-int restore_signals();
-static int addition_test_dp(struct fps_test_ereport *report);
-static int addition_test_sp(struct fps_test_ereport *report);
-static int branching(struct fps_test_ereport *report);
-static int chain_dp_test(struct fps_test_ereport *report);
-static int chain_sp_test(struct fps_test_ereport *report);
-static int check_conv(struct fps_test_ereport *report);
-static int compare_dp(struct fps_test_ereport *report);
-static int compare_dp_except(struct fps_test_ereport *report);
-static int compare_sp(struct fps_test_ereport *report);
-static int compare_sp_except(struct fps_test_ereport *report);
-static int data_path_dp(struct fps_test_ereport *report);
-static int data_path_sp(struct fps_test_ereport *report);
-static int division_test_dp(struct fps_test_ereport *report);
-static int division_test_sp(struct fps_test_ereport *report);
-static int double_sing(struct fps_test_ereport *report);
-static int fabs_ins_dp(struct fps_test_ereport *report);
-static int fabs_ins_sp(struct fps_test_ereport *report);
-static int float_to_integer_dp(struct fps_test_ereport *report);
-static int float_to_integer_sp(struct fps_test_ereport *report);
-static int float_to_long_dp(struct fps_test_ereport *report);
-static int float_to_long_sp(struct fps_test_ereport *report);
-static int get_negative_value_pn_dp(struct fps_test_ereport *report);
-static int get_negative_value_pn_sp(struct fps_test_ereport *report);
-static int get_negative_value_np_dp(struct fps_test_ereport *report);
-static int get_negative_value_np_sp(struct fps_test_ereport *report);
-static int fmovs_ins(struct fps_test_ereport *report);
-static int integer_to_float_dp(struct fps_test_ereport *report);
-static int integer_to_float_sp(struct fps_test_ereport *report);
-static int long_to_float_dp(struct fps_test_ereport *report);
-static int long_to_float_sp(struct fps_test_ereport *report);
-static int multiplication_test_dp(struct fps_test_ereport *report);
-static int multiplication_test_sp(struct fps_test_ereport *report);
-static int no_branching(struct fps_test_ereport *report);
-static int registers_four(struct fps_test_ereport *report);
-static int registers_four_dp(struct fps_test_ereport *report);
-static int registers_one(struct fps_test_ereport *report);
-static int registers_one_dp(struct fps_test_ereport *report);
-static int registers_two(struct fps_test_ereport *report);
-static int registers_two_dp(struct fps_test_ereport *report);
-static int single_doub(struct fps_test_ereport *report);
-static int squareroot_test_dp(struct fps_test_ereport *report);
-static int squareroot_test_sp(struct fps_test_ereport *report);
-static int subtraction_test_dp(struct fps_test_ereport *report);
-static int subtraction_test_sp(struct fps_test_ereport *report);
-static int timing_test(struct fps_test_ereport *report);
-static void fail_trap(struct fps_test_ereport *report, int flag_num);
-
-/* SIGFPE */
-static void sigfpe_handler(int, siginfo_t *, ucontext_t *);
-static struct sigaction oldfpe, newfpe;
-
-/* SIGSEGV */
-static void sigsegv_handler(int, siginfo_t *, ucontext_t *);
-static struct sigaction oldsegv, newsegv;
-
-/* SIGILL */
-static void sigill_handler(int, siginfo_t *, ucontext_t *);
-static struct sigaction oldill, newill;
-
-/* SIGBUS */
-static void sigbus_handler(int, siginfo_t *, ucontext_t *);
-static struct sigaction oldbus, newbus;
-
-static unsigned int pat[] = {
- 0x00000000,
- 0x55555555,
- 0xAAAAAAAA,
- 0xCCCCCCCC,
- 0x33333333,
- 0xFFFFFFFF,
- 0xA5A5A5A5,
- 0x3C3C3C3C,
- 0xF0F0F0F0,
- 0xEEEEEEEE,
- 0xDDDDDDDD,
- 0xBBBBBBBB,
- 0x77777777,
- 0x11111111,
- 0x22222222,
- 0x44444444,
- 0x88888888,
- 0x66666666,
- 0x99999999,
- 0x00FF00FF,
- 0xFF00FF00,
- 0xFFFF0000,
- 0x0000FFFF,
-
-};
-
-#define PAT_NUM (sizeof (pat)/sizeof (*pat))
-
-/*
- * Double precision patterns
- */
-static uint64_t pat_dp[] = {
- 0x0000000000000000UL,
- 0x5555555555555555UL,
- 0xAAAAAAAAAAAAAAAAUL,
- 0xCCCCCCCCCCCCCCCCUL,
- 0x3333333333333333UL,
- 0xFFFFFFFFFFFFFFFFUL,
- 0xA5A5A5A5A5A5A5A5UL,
- 0x3C3C3C3C3C3C3C3CUL,
- 0xF0F0F0F0F0F0F0F0UL,
- 0xEEEEEEEEEEEEEEEEUL,
- 0xDDDDDDDDDDDDDDDDUL,
- 0xBBBBBBBBBBBBBBBBUL,
- 0x7777777777777777UL,
- 0x1111111111111111UL,
- 0x2222222222222222UL,
- 0x4444444444444444UL,
- 0x8888888888888888UL,
- 0x6666666666666666UL,
- 0x9999999999999999UL,
- 0x00000000FFFFFFFFUL,
- 0xFFFFFFFF00000000UL,
- 0x0000FFFF0000FFFFUL,
- 0xFFFF0000FFFF0000UL
-};
-
-#define PAT_DP_NUM (sizeof (pat_dp)/sizeof (*pat_dp))
-
-struct value {
- unsigned long floatsingle;
- uint64_t floatdouble;
- uint64_t floatquad_u;
- uint64_t floatquad_l;
-};
-
-#define N_VALS (sizeof (val)/sizeof (*val))
-
-static struct value val[] = {
- 0, 0, 0, 0,
- 0x3F800000, 0x3FF0000000000000, 0x3FFF000000000000, 0,
- 0x40000000, 0x4000000000000000, 0x4000000000000000, 0,
- 0x40400000, 0x4008000000000000, 0x4000800000000000, 0,
- 0x40800000, 0x4010000000000000, 0x4001000000000000, 0,
- 0x40A00000, 0x4014000000000000, 0x4001400000000000, 0,
- 0x40C00000, 0x4018000000000000, 0x4001800000000000, 0,
- 0x40E00000, 0x401C000000000000, 0x4001C00000000000, 0,
- 0x41000000, 0x4020000000000000, 0x4002000000000000, 0,
- 0x41100000, 0x4022000000000000, 0x4002200000000000, 0,
- 0x41200000, 0x4024000000000000, 0x4002400000000000, 0,
- 0x41300000, 0x4026000000000000, 0x4002600000000000, 0,
- 0x41400000, 0x4028000000000000, 0x4002800000000000, 0,
- 0x41500000, 0x402A000000000000, 0x4002A00000000000, 0,
- 0x41600000, 0x402C000000000000, 0x4002C00000000000, 0,
- 0x41700000, 0x402E000000000000, 0x4002E00000000000, 0,
- 0x41800000, 0x4030000000000000, 0x4003000000000000, 0,
- 0x41880000, 0x4031000000000000, 0x4003100000000000, 0,
- 0x41900000, 0x4032000000000000, 0x4003200000000000, 0,
- 0x41980000, 0x4033000000000000, 0x4003300000000000, 0,
- 0x41a00000, 0x4034000000000000, 0x4003400000000000, 0,
- 0x41a80000, 0x4035000000000000, 0x4003500000000000, 0,
- 0x41b00000, 0x4036000000000000, 0x4003600000000000, 0,
- 0x41b80000, 0x4037000000000000, 0x4003700000000000, 0,
- 0x41c00000, 0x4038000000000000, 0x4003800000000000, 0,
- 0x41c80000, 0x4039000000000000, 0x4003900000000000, 0,
- 0x41d00000, 0x403a000000000000, 0x4003a00000000000, 0,
- 0x41d80000, 0x403b000000000000, 0x4003b00000000000, 0,
- 0x41e00000, 0x403c000000000000, 0x4003c00000000000, 0,
- 0x41e80000, 0x403d000000000000, 0x4003d00000000000, 0,
- 0x41f00000, 0x403e000000000000, 0x4003e00000000000, 0,
- 0x41f80000, 0x403f000000000000, 0x4003f00000000000, 0,
- 0x42000000, 0x4040000000000000, 0x4004000000000000, 0,
- 0x42040000, 0x4040800000000000, 0x4004080000000000, 0,
- 0x42080000, 0x4041000000000000, 0x4004100000000000, 0,
- 0x420c0000, 0x4041800000000000, 0x4004180000000000, 0,
- 0x42100000, 0x4042000000000000, 0x4004200000000000, 0,
- 0x42140000, 0x4042800000000000, 0x4004280000000000, 0,
- 0x42180000, 0x4043000000000000, 0x4004300000000000, 0,
- 0x421c0000, 0x4043800000000000, 0x4004380000000000, 0,
- 0x42200000, 0x4044000000000000, 0x4004400000000000, 0,
- 0x42240000, 0x4044800000000000, 0x4004480000000000, 0,
- 0x42280000, 0x4045000000000000, 0x4004500000000000, 0,
- 0x422c0000, 0x4045800000000000, 0x4004580000000000, 0,
- 0x42300000, 0x4046000000000000, 0x4004600000000000, 0,
- 0x42340000, 0x4046800000000000, 0x4004680000000000, 0,
- 0x42380000, 0x4047000000000000, 0x4004700000000000, 0,
- 0x423c0000, 0x4047800000000000, 0x4004780000000000, 0,
- 0x42400000, 0x4048000000000000, 0x4004800000000000, 0,
- 0x42440000, 0x4048800000000000, 0x4004880000000000, 0,
- 0x42480000, 0x4049000000000000, 0x4004900000000000, 0,
- 0x424c0000, 0x4049800000000000, 0x4004980000000000, 0,
- 0x42500000, 0x404a000000000000, 0x4004a00000000000, 0,
- 0x42540000, 0x404a800000000000, 0x4004a80000000000, 0,
- 0x42580000, 0x404b000000000000, 0x4004b00000000000, 0,
- 0x425c0000, 0x404b800000000000, 0x4004b80000000000, 0,
- 0x42600000, 0x404c000000000000, 0x4004c00000000000, 0,
- 0x42640000, 0x404c800000000000, 0x4004c80000000000, 0,
- 0x42680000, 0x404d000000000000, 0x4004d00000000000, 0,
- 0x426c0000, 0x404d800000000000, 0x4004d80000000000, 0,
- 0x42700000, 0x404e000000000000, 0x4004e00000000000, 0,
- 0x42740000, 0x404e800000000000, 0x4004e80000000000, 0,
- 0x42780000, 0x404f000000000000, 0x4004f00000000000, 0,
- 0x427c0000, 0x404f800000000000, 0x4004f80000000000, 0,
- 0x42800000, 0x4050000000000000, 0x4005000000000000, 0,
- 0x42820000, 0x4050400000000000, 0x4005040000000000, 0,
- 0x42840000, 0x4050800000000000, 0x4005080000000000, 0,
- 0x42860000, 0x4050c00000000000, 0x40050c0000000000, 0,
- 0x42880000, 0x4051000000000000, 0x4005100000000000, 0,
- 0x428a0000, 0x4051400000000000, 0x4005140000000000, 0,
- 0x428c0000, 0x4051800000000000, 0x4005180000000000, 0,
- 0x428e0000, 0x4051c00000000000, 0x40051c0000000000, 0,
- 0x42900000, 0x4052000000000000, 0x4005200000000000, 0,
- 0x42920000, 0x4052400000000000, 0x4005240000000000, 0,
- 0x42940000, 0x4052800000000000, 0x4005280000000000, 0,
- 0x42960000, 0x4052c00000000000, 0x40052c0000000000, 0,
- 0x42980000, 0x4053000000000000, 0x4005300000000000, 0,
- 0x429a0000, 0x4053400000000000, 0x4005340000000000, 0,
- 0x429c0000, 0x4053800000000000, 0x4005380000000000, 0,
- 0x429e0000, 0x4053c00000000000, 0x40053c0000000000, 0,
- 0x42a00000, 0x4054000000000000, 0x4005400000000000, 0,
- 0x42a20000, 0x4054400000000000, 0x4005440000000000, 0,
- 0x42a40000, 0x4054800000000000, 0x4005480000000000, 0,
- 0x42a60000, 0x4054c00000000000, 0x40054c0000000000, 0,
- 0x42a80000, 0x4055000000000000, 0x4005500000000000, 0,
- 0x42aa0000, 0x4055400000000000, 0x4005540000000000, 0,
- 0x42ac0000, 0x4055800000000000, 0x4005580000000000, 0,
- 0x42ae0000, 0x4055c00000000000, 0x40055c0000000000, 0,
- 0x42b00000, 0x4056000000000000, 0x4005600000000000, 0,
- 0x42b20000, 0x4056400000000000, 0x4005640000000000, 0,
- 0x42b40000, 0x4056800000000000, 0x4005680000000000, 0,
- 0x42b60000, 0x4056c00000000000, 0x40056c0000000000, 0,
- 0x42b80000, 0x4057000000000000, 0x4005700000000000, 0,
- 0x42ba0000, 0x4057400000000000, 0x4005740000000000, 0,
- 0x42bc0000, 0x4057800000000000, 0x4005780000000000, 0,
- 0x42be0000, 0x4057c00000000000, 0x40057c0000000000, 0,
- 0x42c00000, 0x4058000000000000, 0x4005800000000000, 0,
- 0x42c20000, 0x4058400000000000, 0x4005840000000000, 0,
- 0x42c40000, 0x4058800000000000, 0x4005880000000000, 0,
- 0x42c60000, 0x4058c00000000000, 0x40058c0000000000, 0,
- 0x42c80000, 0x4059000000000000, 0x4005900000000000, 0,
- 0x42ca0000, 0x4059400000000000, 0x4005940000000000, 0,
- 0x42cc0000, 0x4059800000000000, 0x4005980000000000, 0,
- 0x42ce0000, 0x4059c00000000000, 0x40059c0000000000, 0,
- 0x42d00000, 0x405a000000000000, 0x4005a00000000000, 0,
- 0x42d20000, 0x405a400000000000, 0x4005a40000000000, 0,
- 0x42d40000, 0x405a800000000000, 0x4005a80000000000, 0,
- 0x42d60000, 0x405ac00000000000, 0x4005ac0000000000, 0,
- 0x42d80000, 0x405b000000000000, 0x4005b00000000000, 0,
- 0x42da0000, 0x405b400000000000, 0x4005b40000000000, 0,
- 0x42dc0000, 0x405b800000000000, 0x4005b80000000000, 0,
- 0x42de0000, 0x405bc00000000000, 0x4005bc0000000000, 0,
- 0x42e00000, 0x405c000000000000, 0x4005c00000000000, 0,
- 0x42e20000, 0x405c400000000000, 0x4005c40000000000, 0,
- 0x42e40000, 0x405c800000000000, 0x4005c80000000000, 0,
- 0x42e60000, 0x405cc00000000000, 0x4005cc0000000000, 0,
- 0x42e80000, 0x405d000000000000, 0x4005d00000000000, 0,
- 0x42ea0000, 0x405d400000000000, 0x4005d40000000000, 0,
- 0x42ec0000, 0x405d800000000000, 0x4005d80000000000, 0,
- 0x42ee0000, 0x405dc00000000000, 0x4005dc0000000000, 0,
- 0x42f00000, 0x405e000000000000, 0x4005e00000000000, 0,
- 0x42f20000, 0x405e400000000000, 0x4005e40000000000, 0,
- 0x42f40000, 0x405e800000000000, 0x4005e80000000000, 0,
- 0x42f60000, 0x405ec00000000000, 0x4005ec0000000000, 0,
- 0x42f80000, 0x405f000000000000, 0x4005f00000000000, 0,
- 0x42fa0000, 0x405f400000000000, 0x4005f40000000000, 0,
- 0x42fc0000, 0x405f800000000000, 0x4005f80000000000, 0,
- 0x42fe0000, 0x405fc00000000000, 0x4005fc0000000000, 0,
- 0x43000000, 0x4060000000000000, 0x4006000000000000, 0,
- 0x43010000, 0x4060200000000000, 0x4006020000000000, 0,
- 0x43020000, 0x4060400000000000, 0x4006040000000000, 0,
- 0x43030000, 0x4060600000000000, 0x4006060000000000, 0,
- 0x43040000, 0x4060800000000000, 0x4006080000000000, 0,
- 0x43050000, 0x4060a00000000000, 0x40060a0000000000, 0,
- 0x43060000, 0x4060c00000000000, 0x40060c0000000000, 0,
- 0x43070000, 0x4060e00000000000, 0x40060e0000000000, 0,
- 0x43080000, 0x4061000000000000, 0x4006100000000000, 0,
- 0x43090000, 0x4061200000000000, 0x4006120000000000, 0,
- 0x430a0000, 0x4061400000000000, 0x4006140000000000, 0,
- 0x430b0000, 0x4061600000000000, 0x4006160000000000, 0,
- 0x430c0000, 0x4061800000000000, 0x4006180000000000, 0,
- 0x430d0000, 0x4061a00000000000, 0x40061a0000000000, 0,
- 0x430e0000, 0x4061c00000000000, 0x40061c0000000000, 0,
- 0x430f0000, 0x4061e00000000000, 0x40061e0000000000, 0,
- 0x43100000, 0x4062000000000000, 0x4006200000000000, 0,
- 0x43110000, 0x4062200000000000, 0x4006220000000000, 0,
- 0x43120000, 0x4062400000000000, 0x4006240000000000, 0,
- 0x43130000, 0x4062600000000000, 0x4006260000000000, 0,
- 0x43140000, 0x4062800000000000, 0x4006280000000000, 0,
- 0x43150000, 0x4062a00000000000, 0x40062a0000000000, 0,
- 0x43160000, 0x4062c00000000000, 0x40062c0000000000, 0,
- 0x43170000, 0x4062e00000000000, 0x40062e0000000000, 0,
- 0x43180000, 0x4063000000000000, 0x4006300000000000, 0,
- 0x43190000, 0x4063200000000000, 0x4006320000000000, 0,
- 0x431a0000, 0x4063400000000000, 0x4006340000000000, 0,
- 0x431b0000, 0x4063600000000000, 0x4006360000000000, 0,
- 0x431c0000, 0x4063800000000000, 0x4006380000000000, 0,
- 0x431d0000, 0x4063a00000000000, 0x40063a0000000000, 0,
- 0x431e0000, 0x4063c00000000000, 0x40063c0000000000, 0,
- 0x431f0000, 0x4063e00000000000, 0x40063e0000000000, 0,
- 0x43200000, 0x4064000000000000, 0x4006400000000000, 0,
- 0x43210000, 0x4064200000000000, 0x4006420000000000, 0,
- 0x43220000, 0x4064400000000000, 0x4006440000000000, 0,
- 0x43230000, 0x4064600000000000, 0x4006460000000000, 0,
- 0x43240000, 0x4064800000000000, 0x4006480000000000, 0,
- 0x43250000, 0x4064a00000000000, 0x40064a0000000000, 0,
- 0x43260000, 0x4064c00000000000, 0x40064c0000000000, 0,
- 0x43270000, 0x4064e00000000000, 0x40064e0000000000, 0,
- 0x43280000, 0x4065000000000000, 0x4006500000000000, 0,
- 0x43290000, 0x4065200000000000, 0x4006520000000000, 0,
- 0x432a0000, 0x4065400000000000, 0x4006540000000000, 0,
- 0x432b0000, 0x4065600000000000, 0x4006560000000000, 0,
- 0x432c0000, 0x4065800000000000, 0x4006580000000000, 0,
- 0x432d0000, 0x4065a00000000000, 0x40065a0000000000, 0,
- 0x432e0000, 0x4065c00000000000, 0x40065c0000000000, 0,
- 0x432f0000, 0x4065e00000000000, 0x40065e0000000000, 0,
- 0x43300000, 0x4066000000000000, 0x4006600000000000, 0,
- 0x43310000, 0x4066200000000000, 0x4006620000000000, 0,
- 0x43320000, 0x4066400000000000, 0x4006640000000000, 0,
- 0x43330000, 0x4066600000000000, 0x4006660000000000, 0,
- 0x43340000, 0x4066800000000000, 0x4006680000000000, 0,
- 0x43350000, 0x4066a00000000000, 0x40066a0000000000, 0,
- 0x43360000, 0x4066c00000000000, 0x40066c0000000000, 0,
- 0x43370000, 0x4066e00000000000, 0x40066e0000000000, 0,
- 0x43380000, 0x4067000000000000, 0x4006700000000000, 0,
- 0x43390000, 0x4067200000000000, 0x4006720000000000, 0,
- 0x433a0000, 0x4067400000000000, 0x4006740000000000, 0,
- 0x433b0000, 0x4067600000000000, 0x4006760000000000, 0,
- 0x433c0000, 0x4067800000000000, 0x4006780000000000, 0,
- 0x433d0000, 0x4067a00000000000, 0x40067a0000000000, 0,
- 0x433e0000, 0x4067c00000000000, 0x40067c0000000000, 0,
- 0x433f0000, 0x4067e00000000000, 0x40067e0000000000, 0,
- 0x43400000, 0x4068000000000000, 0x4006800000000000, 0,
- 0x43410000, 0x4068200000000000, 0x4006820000000000, 0,
- 0x43420000, 0x4068400000000000, 0x4006840000000000, 0,
- 0x43430000, 0x4068600000000000, 0x4006860000000000, 0,
- 0x43440000, 0x4068800000000000, 0x4006880000000000, 0,
- 0x43450000, 0x4068a00000000000, 0x40068a0000000000, 0,
- 0x43460000, 0x4068c00000000000, 0x40068c0000000000, 0,
- 0x43470000, 0x4068e00000000000, 0x40068e0000000000, 0,
- 0x43480000, 0x4069000000000000, 0x4006900000000000, 0,
- 0x43490000, 0x4069200000000000, 0x4006920000000000, 0,
- 0x434a0000, 0x4069400000000000, 0x4006940000000000, 0,
- 0x434b0000, 0x4069600000000000, 0x4006960000000000, 0,
- 0x434c0000, 0x4069800000000000, 0x4006980000000000, 0,
- 0x434d0000, 0x4069a00000000000, 0x40069a0000000000, 0,
- 0x434e0000, 0x4069c00000000000, 0x40069c0000000000, 0,
- 0x434f0000, 0x4069e00000000000, 0x40069e0000000000, 0,
- 0x43500000, 0x406a000000000000, 0x4006a00000000000, 0,
- 0x43510000, 0x406a200000000000, 0x4006a20000000000, 0,
- 0x43520000, 0x406a400000000000, 0x4006a40000000000, 0,
- 0x43530000, 0x406a600000000000, 0x4006a60000000000, 0,
- 0x43540000, 0x406a800000000000, 0x4006a80000000000, 0,
- 0x43550000, 0x406aa00000000000, 0x4006aa0000000000, 0,
- 0x43560000, 0x406ac00000000000, 0x4006ac0000000000, 0,
- 0x43570000, 0x406ae00000000000, 0x4006ae0000000000, 0,
- 0x43580000, 0x406b000000000000, 0x4006b00000000000, 0,
- 0x43590000, 0x406b200000000000, 0x4006b20000000000, 0,
- 0x435a0000, 0x406b400000000000, 0x4006b40000000000, 0,
- 0x435b0000, 0x406b600000000000, 0x4006b60000000000, 0,
- 0x435c0000, 0x406b800000000000, 0x4006b80000000000, 0,
- 0x435d0000, 0x406ba00000000000, 0x4006ba0000000000, 0,
- 0x435e0000, 0x406bc00000000000, 0x4006bc0000000000, 0,
- 0x435f0000, 0x406be00000000000, 0x4006be0000000000, 0,
- 0x43600000, 0x406c000000000000, 0x4006c00000000000, 0,
- 0x43610000, 0x406c200000000000, 0x4006c20000000000, 0,
- 0x43620000, 0x406c400000000000, 0x4006c40000000000, 0,
- 0x43630000, 0x406c600000000000, 0x4006c60000000000, 0,
- 0x43640000, 0x406c800000000000, 0x4006c80000000000, 0,
- 0x43650000, 0x406ca00000000000, 0x4006ca0000000000, 0,
- 0x43660000, 0x406cc00000000000, 0x4006cc0000000000, 0,
- 0x43670000, 0x406ce00000000000, 0x4006ce0000000000, 0,
- 0x43680000, 0x406d000000000000, 0x4006d00000000000, 0,
- 0x43690000, 0x406d200000000000, 0x4006d20000000000, 0,
- 0x436a0000, 0x406d400000000000, 0x4006d40000000000, 0,
- 0x436b0000, 0x406d600000000000, 0x4006d60000000000, 0,
- 0x436c0000, 0x406d800000000000, 0x4006d80000000000, 0,
- 0x436d0000, 0x406da00000000000, 0x4006da0000000000, 0,
- 0x436e0000, 0x406dc00000000000, 0x4006dc0000000000, 0,
- 0x436f0000, 0x406de00000000000, 0x4006de0000000000, 0,
- 0x43700000, 0x406e000000000000, 0x4006e00000000000, 0,
- 0x43710000, 0x406e200000000000, 0x4006e20000000000, 0,
- 0x43720000, 0x406e400000000000, 0x4006e40000000000, 0,
- 0x43730000, 0x406e600000000000, 0x4006e60000000000, 0,
- 0x43740000, 0x406e800000000000, 0x4006e80000000000, 0,
- 0x43750000, 0x406ea00000000000, 0x4006ea0000000000, 0,
- 0x43760000, 0x406ec00000000000, 0x4006ec0000000000, 0,
- 0x43770000, 0x406ee00000000000, 0x4006ee0000000000, 0,
- 0x43780000, 0x406f000000000000, 0x4006f00000000000, 0,
- 0x43790000, 0x406f200000000000, 0x4006f20000000000, 0,
- 0x437a0000, 0x406f400000000000, 0x4006f40000000000, 0,
- 0x437b0000, 0x406f600000000000, 0x4006f60000000000, 0,
- 0x437c0000, 0x406f800000000000, 0x4006f80000000000, 0,
- 0x437d0000, 0x406fa00000000000, 0x4006fa0000000000, 0,
- 0x437e0000, 0x406fc00000000000, 0x4006fc0000000000, 0,
- 0x437f0000, 0x406fe00000000000, 0x4006fe0000000000, 0,
-};
-
-/* -ve of the values in val[] above */
-static unsigned long neg_val_sp[N_VALS];
-static uint64_t neg_val_dp[N_VALS];
-
-/*
- * data_path_sp(struct fps_test_ereport *report)checks the data path
- * between registers and memory, between memory and an floating
- * registers, and between floating registers and the weitek chips.
- * All the bits are covered including the sign bit. If an error is
- * found, all relevant data is stored in report.
- */
-#ifndef i86pc
-static int
-data_path_sp(struct fps_test_ereport *report)
-{
- int i;
- int j;
- int k;
- uint64_t expected;
- uint64_t observed;
- unsigned long prev_fsr;
- unsigned long result;
- unsigned long value;
-
- prev_fsr = get_fsr();
- init_regs(0);
-
- for (i = 0; i < 2; i++) {
- for (j = 1; j < 255; j++) {
- for (k = 0; k < 23; k++) {
- value = (i << 31) | (j << 23) | (1 << k);
-
- if (result = datap_add(value)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- setup_fps_test_struct(
- NO_EREPORT_INFO,
- report, 6217, &observed,
- &expected, 1, 1);
-
- return (-1);
- }
- if (result = datap_mult(value)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- setup_fps_test_struct(
- NO_EREPORT_INFO,
- report, 6218, &observed,
- &expected, 1, 1);
-
- return (-1);
- }
- }
- }
- }
-
- set_fsr(prev_fsr);
-
- return (0);
-}
-
-/*
- * data_path_dp(struct fps_test_ereport *report) performs the
- * same function as data_path_sp except it's double precision
- * instead of single. If an error is found, all relevant data
- * is stored in report.
- */
-static int
-data_path_dp(struct fps_test_ereport *report)
-{
- int i;
- int j;
- int k;
- int l;
- uint64_t observed[2];
- uint64_t expected[2];
- unsigned long prev_fsr;
- unsigned long result_lsw = 0;
- unsigned long result_msw = 0;
- unsigned long value_lsw;
- unsigned long value_msw;
-
- prev_fsr = get_fsr();
- init_regs(0);
-
- for (i = 0; i < 2; i++) {
- for (j = 1; j < 2047; j++) {
- for (k = 0; k < 52; k++) {
- value_lsw = (1 << k);
-
- if (k > 32)
- l = k - 32;
- else
- l = 32;
-
- value_msw = (i << 31) | (j << 20) | (1 << l);
-
- if (datap_add_dp(value_msw, value_lsw)) {
- observed[0] = (uint64_t)result_msw;
- observed[1] = (uint64_t)result_lsw;
- expected[0] = (uint64_t)value_msw;
- expected[1] = (uint64_t)value_lsw;
- setup_fps_test_struct(
- NO_EREPORT_INFO, report,
- 6219, observed, expected,
- 2, 2);
-
- return (-1);
- }
-
- if (datap_mult_dp(value_msw, value_lsw)) {
- observed[0] = (uint64_t)result_msw;
- observed[1] = (uint64_t)result_lsw;
- expected[0] = (uint64_t)value_msw;
- expected[1] = (uint64_t)value_lsw;
- setup_fps_test_struct(
- NO_EREPORT_INFO, report,
- 6220, observed, expected,
- 2, 2);
-
- return (-1);
- }
- }
- }
- }
-
- set_fsr(prev_fsr);
-
- return (0);
-}
-
-/*
- * timing_test(struct fps_test_ereport *report) does 10 add
- * operations continuously and 10 multiply operations
- * continusously. If an error is found, relevant data is
- * stored in report.
- */
-static int
-timing_test(struct fps_test_ereport *report)
-{
- int i;
- uint64_t expected;
- uint64_t observed;
- unsigned long result;
- unsigned long prev_fsr;
-
- prev_fsr = get_fsr();
-
- for (i = 0; i < 1000; i++) {
- init_regs(0);
- if (result = timing_add_sp()) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- setup_fps_test_struct(NO_EREPORT_INFO,
- report, 6221, &observed, &expected, 1, 1);
-
- return (-1);
- }
-
- init_regs(0);
-
- if (result = timing_mult_sp()) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- setup_fps_test_struct(NO_EREPORT_INFO,
- report, 6222, &observed, &expected, 1, 1);
-
- return (-1);
- }
-
- init_regs(0);
-
- if (result = timing_add_dp()) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- setup_fps_test_struct(NO_EREPORT_INFO,
- report, 6223, &observed, &expected, 1, 1);
-
- return (-1);
- }
-
- init_regs(0);
-
- if (result = timing_mult_dp()) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- setup_fps_test_struct(NO_EREPORT_INFO,
- report, 6224, &observed, &expected, 1, 1);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
-
- return (0);
-}
-
-/*
- * chain_sp_test(struct fps_test_ereport *report)
- * performs a series of single precision chaining
- * tests. If an error is found, relevant data is
- * stored in report.
- */
-static int
-chain_sp_test(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- uint64_t result;
- uint64_t expected;
- uint64_t observed;
- unsigned long prev_fsr;
-
- prev_fsr = get_fsr();
- init_regs(0);
- set_fsr(0);
-
- for (i = 1; i < 60; i++) {
- if ((result = chain_sp(i)) != (unsigned long) i) {
- observed = (uint64_t)result;
- expected = (uint64_t)i;
- (void) snprintf(err_data, sizeof (err_data),
- "\nExpected: %d\nObserved: %d", i, result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6225, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
-
- return (0);
-}
-
-/*
- * chain_dp_test(struct fps_test_ereport *report)
- * performs a series of double precision chaining
- * tests. If an error is found, relevant data is
- * stored in report.
- */
-static int
-chain_dp_test(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- uint64_t result;
- uint64_t expected;
- uint64_t observed;
- unsigned long prev_fsr;
-
- prev_fsr = get_fsr();
- init_regs(0);
- set_fsr(0);
-
- for (i = 1; i < 60; i++) {
- if ((result = chain_dp(i)) != (unsigned long) i) {
- observed = (uint64_t)result;
- expected = (uint64_t)i;
- (void) snprintf(err_data, sizeof (err_data),
- "\nExpected: %d\nObserved: %d", i, result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6226, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
-
- return (0);
-}
-
-/*
- * integer_to_float_sp(struct fps_test_ereport *report)
- * does continuous integer to float, single precision
- * conversions. If an error is found, relevant data is stored
- * in report.
- */
-static int
-integer_to_float_sp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- uint64_t expected;
- uint64_t observed;
- unsigned long prev_fsr;
- unsigned long result;
-
- prev_fsr = get_fsr();
- init_regs(0);
-
- for (i = 0; i < N_VALS; i++) {
- result = int_float_s(i);
- if (result != val[i].floatsingle) {
- observed = (uint64_t)result;
- expected = (uint64_t)val[i].floatsingle;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d]\nExpected: %d"
- "\nObserved: %d", i, val[i].floatsingle,
- result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6227, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
-
- return (0);
-}
-
-/*
- * integer_to_float_dp(struct fps_test_ereport *report)
- * does continuous integer to float, double precision
- * conversions. If an error is found, relevant data is stored
- * in report.
- */
-static int
-integer_to_float_dp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- uint64_t expected;
- uint64_t observed;
- unsigned long prev_fsr;
- unsigned long result;
-
- prev_fsr = get_fsr();
- init_regs(0);
-
- for (i = 0; i < N_VALS; i++) {
- result = int_float_d(i);
- if (result != val[i].floatdouble) {
- observed = (uint64_t)result;
- expected = (uint64_t)val[i].floatdouble;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d]\nExpected: %lld"
- "\nObserved: %lld", i, val[i].floatdouble,
- result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6228, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
-
- return (0);
-}
-
-/*
- * long_to_float_sp(struct fps_test_ereport *report)
- * performs continuous, single precision, unsigned
- * long to float conversions. If an error is found,
- * relevant data is stored in report.
- */
-static int
-long_to_float_sp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- uint64_t expected;
- uint64_t observed;
- unsigned long i;
- unsigned long prev_fsr;
- unsigned long result;
-
- prev_fsr = get_fsr();
- init_regs(0);
-
- for (i = 0; i < N_VALS; i++) {
- result = long_float_s(i);
- if (result != val[i].floatsingle) {
- observed = (uint64_t)result;
- expected = (uint64_t)val[i].floatsingle;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d]\nExpected: %d"
- "\nObserved: %d", i, val[i].floatdouble,
- result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6353, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
-
- return (0);
-}
-
-/*
- * long_to_float_dp(struct fps_test_ereport *report)
- * performs continuous, double precision, unsigned
- * long to float conversions. If an error is found,
- * relevant data is stored in report.
- */
-static int
-long_to_float_dp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- uint64_t expected;
- uint64_t observed;
- unsigned long i;
- unsigned long prev_fsr;
- unsigned long res1;
-
- prev_fsr = get_fsr();
- init_regs(0);
-
- for (i = 0; i < N_VALS; i++) {
- res1 = long_float_d(i);
- if (res1 != val[i].floatdouble) {
- observed = (uint64_t)res1;
- expected = (uint64_t)val[i].floatdouble;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d]\nExpected: %lld"
- "\nObserved: %lld", i, val[i].floatdouble,
- res1);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6354, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
-
- return (0);
-}
-
-/*
- * float_to_integer_sp(struct fps_test_ereport *report)
- * performs continuous, single precision float to
- * integer conversions. If an error is found, relevant
- * data is stored in report.
- */
-static int
-float_to_integer_sp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- uint64_t i;
- unsigned long prev_fsr;
- unsigned long result;
- uint64_t observed;
- uint64_t expected;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
-
- for (i = 0; i < N_VALS; i++) {
- result = float_int_s(val[i].floatsingle);
- if (result != i) {
- observed = (uint64_t)result;
- expected = (uint64_t)i;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d]\nExpected: %d"
- "\nObserved: %d", i, i,
- result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6229, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- }
-
- /*
- * Value greater than highest representable value in int has to raise
- * an invalid exception.
- *
- * Highest possible value in int (assume uint) is 2^32; Use 2^33 for a
- * value greater.
- */
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
-
- /* Set trap flag to solicited */
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_int_s(0x50000000);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fstoi max value exception not raised, "
- "fp val=%lx, fsr=%lx",
- 0x50000000, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5307, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
- expected = (uint64_t)FSR_CEXC_NV;
- (void) snprintf(err_data, sizeof (err_data),
- "fstoi max value exception not raised, "
- "fp val=%lx, fsr=%lx",
- 0x50000000, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5308, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- /* NaNs should raise an exception when converted */
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_int_s(nan_sp);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fstoi NaN exception not raised, "
- "fp val=%lx, fsr=%lx",
- nan_sp, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5309, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
- expected = (uint64_t)FSR_CEXC_NV;
- (void) snprintf(err_data, sizeof (err_data),
- "fstoi NaN exception not raised, "
- "fp val=%lx, fsr=%lx",
- nan_sp, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5310, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- /* + infinity exceptions */
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_int_s(PLUS_INF_SP);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fstoi +infinity exception not raised, "
- "fp val=%lx, fsr=%lx",
- PLUS_INF_SP, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5311, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
- expected = (uint64_t)FSR_CEXC_NV;
- (void) snprintf(err_data, sizeof (err_data),
- "fstoi +infinity exception not raised, "
- "fp val=%lx, fsr=%lx",
- PLUS_INF_SP, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5312, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- /* - infinity exceptions */
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_int_s(MINUS_INF_SP);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fstoi -infinity exception not raised, "
- "fp val=%lx, fsr=%lx",
- MINUS_INF_SP, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5313, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
- expected = (uint64_t)FSR_CEXC_NV;
- (void) snprintf(err_data, sizeof (err_data),
- "fstoi -infinity exception not raised, "
- "fp val=%lx, fsr=%lx",
- MINUS_INF_SP, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5314, &observed, &expected, 1, 1, err_data);
-
- return (-1);
- }
-
- /* Check for inexact exception raised because of fractions */
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NX);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_int_s(pi_sp);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fstoi inexact exception not raised, "
- "fp val=%lx, fsr=%lx",
- pi_sp, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5315, &observed, &expected, 1, 1, err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NX) != FSR_CEXC_NX) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NX;
- expected = (uint64_t)FSR_CEXC_NX;
- (void) snprintf(err_data, sizeof (err_data),
- "fstoi inexact exception not raised, "
- "fp val=%lx, fsr=%lx",
- pi_sp, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5316, &observed, &expected, 1, 1, err_data);
-
- return (-1);
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * float_to_integer_dp(struct fps_test_ereport *report)
- * performs continuous, double precision float to
- * integer conversions. If an error is found, relevant
- * data is stored in report.
- */
-static int
-float_to_integer_dp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- uint64_t i;
- uint64_t expected;
- uint64_t observed;
- unsigned long prev_fsr;
- unsigned long res1;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
- for (i = 0; i < N_VALS; i++) {
- res1 = float_int_d(val[i].floatdouble);
-
- if (res1 != i) {
- observed = (uint64_t)res1;
- expected = (uint64_t)i;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d]\nExpected: %d"
- "\nObserved: %d", i, i,
- res1);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6230, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
-
- /*
- * Value greater than highest representable value in int has to raise
- * an invalid exception.
- *
- * Highest possible value in int (assume uint) is 2^32; Use 2^33 for a
- * value greater.
- */
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_int_d(0x4200000000000000);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtoi max value exception not raised, "
- "fp val=%llx, fsr=%lx",
- 0x4200000000000000, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5317, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
- expected = (uint64_t)FSR_CEXC_NV;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtoi max value exception not raised, "
- "fp val=%llx, fsr=%lx",
- 0x4200000000000000, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5318, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- /* NaNs should raise an exception when converted */
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_int_d(nan_dp);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtoi NaN exception not raised, "
- "fp val=%llx, fsr=%lx",
- nan_dp, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5319, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
- expected = (uint64_t)FSR_CEXC_NV;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtoi NaN exception not raised, "
- "fp val=%llx, fsr=%lx",
- nan_dp, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5320, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- /* + infinity exceptions */
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_int_d(PLUS_INF_DP);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtoi +infinity exception not raised, "
- "fp val=%llx, fsr=%lx",
- PLUS_INF_DP, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5321, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
- expected = (uint64_t)FSR_CEXC_NV;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtoi +infinity exception not raised, "
- "fp val=%llx, fsr=%lx",
- PLUS_INF_DP, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5322, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- /* - infinity exceptions */
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_int_d(MINUS_INF_DP);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtoi -infinity exception not raised, "
- "fp val=%llx, fsr=%lx",
- MINUS_INF_DP, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5323, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
- expected = (uint64_t)FSR_CEXC_NV;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtoi -infinity exception not raised, "
- "fp val=%llx, fsr=%lx",
- MINUS_INF_DP, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5324, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- /* Check for inexact exception raised because of fractions */
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NX);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_int_d(pi_dp);
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtoi inexact exception not raised, "
- "fp val=%llx, fsr=%lx",
- pi_dp, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5325, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NX) != FSR_CEXC_NX) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NX;
- expected = (uint64_t)FSR_CEXC_NX;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtoi inexact exception not raised, "
- "fp val=%llx, fsr=%lx",
- pi_dp, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5326, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- set_fsr(prev_fsr);
-
- return (0);
-}
-
-/*
- * float_to_long_sp(struct fps_test_ereport *report)
- * does continuous, single precision, float to long
- * conversions. If an error is found, relevant data
- * is stored in report.
- */
-static int
-float_to_long_sp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- uint64_t i;
- uint64_t expected;
- uint64_t observed;
- unsigned long prev_fsr;
- unsigned long result;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
-
- for (i = 0; i < N_VALS; i++) {
- result = float_long_s(val[i].floatsingle);
-
- if (result != i) {
- observed = (uint64_t)result;
- expected = (uint64_t)i;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d]\nExpected: %d"
- "\nObserved: %d", i, i,
- result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6352, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
-
- /*
- * Value greater than highest representable value in int has to raise
- * an invalid exception.
- *
- * Highest possible value in int (assume uint) is 2^64; Use 2^65 for a
- * value greater.
- */
-
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_long_s(0x60000000);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fstox max value exception not raised, "
- "fp val=%lx, fsr=%lx",
- 0x60000000, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5327, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
- expected = (uint64_t)FSR_CEXC_NV;
- (void) snprintf(err_data, sizeof (err_data),
- "fstox max value exception not raised, "
- "fp val=%lx, fsr=%lx",
- 0x50000000, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5328, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- /* NaNs should raise an exception when converted */
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_long_s(nan_sp);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fstox NaN exception not raised, "
- "fp val=%lx, fsr=%lx",
- nan_sp, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5329, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
- expected = (uint64_t)FSR_CEXC_NV;
- (void) snprintf(err_data, sizeof (err_data),
- "fstox NaN exception not raised, "
- "fp val=%lx, fsr=%lx",
- nan_sp, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5330, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- /* + infinity exceptions */
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_long_s(PLUS_INF_SP);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fstox +infinity exception not raised, "
- "fp val=%lx, fsr=%lx",
- PLUS_INF_SP, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5331, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
- expected = (uint64_t)FSR_CEXC_NV;
- (void) snprintf(err_data, sizeof (err_data),
- "fstox +infinity exception not raised, "
- "fp val=%lx, fsr=%lx",
- PLUS_INF_SP, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5332, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- /* - infinity exceptions */
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_long_s(MINUS_INF_SP);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fstox -infinity exception not raised, "
- "fp val=%lx, fsr=%lx",
- MINUS_INF_SP, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5333, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
- expected = (uint64_t)FSR_CEXC_NV;
- (void) snprintf(err_data, sizeof (err_data),
- "fstox -infinity exception not raised, "
- "fp val=%lx, fsr=%lx",
- MINUS_INF_SP, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5334, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- /* Check for inexact exception raised because of fractions */
-
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NX);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_int_s(pi_sp);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fstox inexact exception not raised, "
- "fp val=%lx, fsr=%lx",
- pi_sp, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5335, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NX) != FSR_CEXC_NX) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NX;
- expected = (uint64_t)FSR_CEXC_NX;
- (void) snprintf(err_data, sizeof (err_data),
- "fstox inexact exception not raised, "
- "fp val=%lx, fsr=%lx",
- pi_sp, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5336, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * float_to_long_dp(struct fps_test_ereport *report)
- * does continuous, double precision, float to long
- * conversions. If an error is found, relevant data
- * is stored in report.
- */
-static int
-float_to_long_dp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- uint64_t i;
- uint64_t expected;
- uint64_t observed;
- unsigned long prev_fsr;
- unsigned long res1;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
-
- for (i = 0; i < N_VALS; i++) {
- res1 = float_long_d(val[i].floatdouble);
-
- if (res1 != i) {
- observed = (uint64_t)res1;
- expected = (uint64_t)i;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d]\nExpected: %d"
- "\nObserved: %d", i, i,
- res1);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6351, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
-
- /*
- * Value greater than highest representable value in long has to
- * raise an invalid exception.
- *
- * Highest possible value in long (assume ulong) is 2^64; Use 2^65 for a
- * value greater.
- */
-
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_long_d(0x4400000000000000);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtox max value exception not raised, "
- "fp val=%lx, fsr=%lx",
- 0x4400000000000000, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5337, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
- expected = (uint64_t)FSR_CEXC_NV;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtox max value exception not raised, "
- "fp val=%lx, fsr=%lx",
- 0x4200000000000000, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5338, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- /* NaNs should raise an exception when converted */
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_long_d(nan_dp);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtox NaN exception not raised, "
- "fp val=%lx, fsr=%lx",
- nan_dp, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5339, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
- expected = (uint64_t)FSR_CEXC_NV;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtox NaN exception not raised, "
- "fp val=%lx, fsr=%lx",
- nan_dp, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5340, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- /* + infinity exceptions */
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_long_d(PLUS_INF_DP);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtox +infinity exception not raised, "
- "fp val=%lx, fsr=%lx",
- PLUS_INF_DP, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5341, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
- expected = (uint64_t)FSR_CEXC_NV;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtox +infinity exception not raised, "
- "fp val=%lx, fsr=%lx",
- PLUS_INF_DP, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5342, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- /* - infinity exceptions */
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NV);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_long_d(MINUS_INF_DP);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtox -infinity exception not raised, "
- "fp val=%lx, fsr=%lx",
- MINUS_INF_DP, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5343, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
- expected = (uint64_t)FSR_CEXC_NV;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtox -infinity exception not raised, "
- "fp val=%lx, fsr=%lx",
- MINUS_INF_DP, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5344, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- /* Check for inexact exception raised because of fractions */
-
- set_fsr(prev_fsr | FSR_ENABLE_TEM_NX);
- trap_flag = trap_flag | TRAP_SOLICITED;
-
- (void) float_long_d(pi_dp);
-
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtox inexact exception not raised, "
- "fp val=%lx, fsr=%lx",
- pi_dp, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5345, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- if ((fsr_at_trap & FSR_CEXC_NX) != FSR_CEXC_NX) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NX;
- expected = (uint64_t)FSR_CEXC_NX;
- (void) snprintf(err_data, sizeof (err_data),
- "fdtox inexact exception not raised, "
- "fp val=%lx, fsr=%lx",
- pi_dp, fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5346, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- set_fsr(prev_fsr);
-
- return (0);
-}
-
-/*
- * single_doub(struct fps_test_ereport *report)
- * does continues single to double conversion.
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-single_doub(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- uint64_t expected;
- uint64_t observed;
- unsigned long prev_fsr;
- unsigned long result;
-
-
- prev_fsr = get_fsr();
-
- init_regs(0);
-
- for (i = 0; i < N_VALS; i++) {
- result = convert_sp_dp(val[i].floatsingle);
-
- if (result != val[i].floatdouble) {
- observed = (uint64_t)result;
- expected = (uint64_t)val[i].floatdouble;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d]\nExpected: %lld"
- "\nObserved: %lld", i,
- val[i].floatdouble, result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6231, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
-
- return (0);
-}
-
-/*
- * double_sing(struct fps_test_ereport *report)
- * does continues double to single conversion.
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-double_sing(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- uint64_t expected;
- uint64_t observed;
- unsigned long result;
- unsigned long prev_fsr;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
-
- for (i = 0; i < N_VALS; i++) {
- result = convert_dp_sp(val[i].floatdouble);
-
- if (result != val[i].floatsingle) {
- observed = (uint64_t)result;
- expected = (uint64_t)val[i].floatsingle;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d]\nExpected: %d"
- "\nObserved: %d", i,
- val[i].floatsingle, result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6232, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * fmovs_ins(struct fps_test_ereport *report)
- * moves a value through the floating point
- * registers. If an error is found, relevant
- * data is stored
- * in report.
- */
-static int
-fmovs_ins(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- uint64_t observed;
- uint64_t expected;
- unsigned long result;
- unsigned long prev_fsr;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
-
- if ((result = move_regs(0x3F800000)) != 0x3F800000) {
- observed = (uint64_t)result;
- expected = (uint64_t)0x3F800000;
- (void) snprintf(err_data, sizeof (err_data),
- "Wrote to f0, read from f31");
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6233, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * get_negative_value_pn_sp(struct fps_test_ereport *report)
- * converts single precision postive to negative values.
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-get_negative_value_pn_sp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- uint64_t observed;
- uint64_t expected;
- unsigned long prev_fsr;
- unsigned long result;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
-
- for (i = 0; i < N_VALS; i++) {
- result = negate_value_sp(val[i].floatsingle);
- if (result != neg_val_sp[i]) {
- observed = (uint64_t)result;
- expected = (uint64_t)neg_val_sp[i];
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d]\nExpected: %d"
- "\nObserved: %d", i, neg_val_sp[i],
- result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6234, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * get_negative_value_pn_dp(struct fps_test_ereport *report)
- * converts double precision postive to negative values.
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-get_negative_value_pn_dp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- uint64_t expected;
- uint64_t observed;
- uint64_t result;
-
- init_regs_dp(0);
-
- for (i = 0; i < N_VALS; i++) {
- result = negate_value_dp(val[i].floatdouble);
- if (result != neg_val_dp[i]) {
- observed = (uint64_t)result;
- expected = (uint64_t)neg_val_dp[i];
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d]\nExpected: %lld"
- "\nObserved: %lld", i, neg_val_dp[i],
- result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6362, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
-
- return (0);
-}
-
-/*
- * get_negative_value_np_sp(struct fps_test_ereport *report)
- * converts single precision negative to positive values.
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-get_negative_value_np_sp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- uint64_t observed;
- uint64_t expected;
- unsigned long result;
- unsigned long prev_fsr;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
-
- for (i = 0; i < N_VALS; i++) {
- result = negate_value_sp(neg_val_sp[i]);
-
- if (result != val[i].floatsingle) {
- observed = (uint64_t)result;
- expected = (uint64_t)val[i].floatsingle;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d]\nExpected: %d"
- "\nObserved: %d", i, val[i].floatsingle,
- result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6235, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * get_negative_value_np_dp(struct fps_test_ereport *report)
- * converts double precision negative to positive values.
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-get_negative_value_np_dp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- uint64_t expected;
- uint64_t observed;
- uint64_t result;
-
- init_regs_dp(0);
-
- for (i = 0; i < N_VALS; i++) {
- result = negate_value_dp(neg_val_dp[i]);
-
- if (result != val[i].floatdouble) {
- observed = (uint64_t)result;
- expected = (uint64_t)val[i].floatdouble;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d]\nExpected: %lld"
- "\nObserved: %lld", i, val[i].floatdouble,
- result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6363, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
-
- return (0);
-}
-
-/*
- * fabs_ins_sp(struct fps_test_ereport *report)
- * does single precision absolute value testing.
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-fabs_ins_sp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- uint64_t expected;
- uint64_t observed;
- unsigned long result;
- unsigned long prev_fsr;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
- for (i = 0; i < N_VALS; i++) {
- result = absolute_value_sp(neg_val_sp[i]);
- if (result != val[i].floatsingle) {
- observed = *(uint64_t *)&result;
- expected = *(uint64_t *)&(val[i].floatsingle);
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d]\nExpected: %d"
- "\nObserved: %d", i, val[i].floatsingle,
- result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6236, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * fabs_ins_dp(struct fps_test_ereport *report)
- * does double precision absolute value testing.
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-fabs_ins_dp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- uint64_t expected;
- uint64_t observed;
- uint64_t result;
-
- init_regs_dp(0);
-
- for (i = 0; i < N_VALS; i++) {
- result = absolute_value_dp(neg_val_dp[i]);
-
- if (result != val[i].floatdouble) {
- observed = (uint64_t)result;
- expected = (uint64_t)val[i].floatdouble;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d]\nExpected: %lld"
- "\nObserved: %lld", i, val[i].floatdouble,
- result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6361, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
-
- return (0);
-}
-
-/*
- * addition_test_sp(struct fps_test_ereport *report)
- * tests single precision addition using floating
- * point registers (f4=f0+f2).
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-addition_test_sp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- unsigned long result;
- unsigned long prev_fsr;
- uint64_t observed;
- uint64_t expected;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
- for (i = 0; i < (N_VALS - 1); i++) {
- result = add_sp(val[i].floatsingle, val[1].floatsingle);
-
- if (result != (val[i + 1].floatsingle)) {
-
- observed = (uint64_t)result;
- expected = (uint64_t)val[i + 1].floatsingle;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d], reg f4=f0+f2"
- "\nExpected: %d\nObserved: %d",
- i, val[i + 1].floatsingle, result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6237, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * addition_test_dp(struct fps_test_ereport *report)
- * tests double precision addition using floating
- * point registers (f4=f0+f2).
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-addition_test_dp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- unsigned long result;
- unsigned long prev_fsr;
- uint64_t observed;
- uint64_t expected;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
-
- for (i = 0; i < (N_VALS - 1); i++) {
- result = add_dp(val[i].floatdouble, val[1].floatdouble);
-
- if (result != (val[i + 1].floatdouble)) {
- observed = (uint64_t)result;
- expected = (uint64_t)val[i + 1].floatdouble;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d], reg f4=f0+f2"
- "\nExpected: %lld\nObserved: %lld",
- i, val[i + 1].floatdouble, result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6238, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * subtraction_test_sp(struct fps_test_ereport *report)
- * tests single precision subtaction using floating
- * point registers (f4=f0-f2).
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-subtraction_test_sp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- unsigned long result;
- unsigned long prev_fsr;
- uint64_t observed;
- uint64_t expected;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
- for (i = 1; i < N_VALS; i++) {
- result = sub_sp(val[i].floatsingle, val[i - 1].floatsingle);
-
- if (result != val[1].floatsingle) {
- observed = (uint64_t)result;
- expected = (uint64_t)val[1].floatsingle;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d], reg f4=f0-f2"
- "\nExpected: %d\nObserved: %d",
- i, val[1].floatsingle, result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6239, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * subtraction_test_dp(struct fps_test_ereport *report)
- * tests double precision subtaction using floating
- * point registers (f4=f0-f2).
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-subtraction_test_dp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- unsigned long result;
- unsigned long prev_fsr;
- uint64_t observed;
- uint64_t expected;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
-
- for (i = 1; i < N_VALS; i++) {
- result = sub_dp(val[i].floatdouble, val[i - 1].floatdouble);
-
- if (result != val[1].floatdouble) {
- observed = (uint64_t)result;
- expected = (uint64_t)val[1].floatdouble;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d], reg f4=f0-f2"
- "\nExpected: %lld\nObserved: %lld",
- i, val[1].floatdouble, result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6240, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * squareroot_test_sp(struct fps_test_ereport *report)
- * tests single precision squareroot.
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-squareroot_test_sp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- uint64_t observed;
- uint64_t expected;
- unsigned long result, workvalue;
- unsigned long prev_fsr;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
-
- for (i = 1; i < N_VALS; i++) {
- workvalue = val[i].floatsingle;
- result = sqrt_sp(mult_sp(workvalue, workvalue));
- if (result != workvalue) {
- observed = (uint64_t)result;
- expected = (uint64_t)workvalue;
- (void) snprintf(err_data, sizeof (err_data),
- "\nExpected: %d\nObserved: %d", workvalue,
- result);
- setup_fps_test_struct(NO_EREPORT_INFO,
- report, 6241, &observed, &expected, 1, 1);
-
- return (-1);
- }
- }
-
- /* fsqrt(x), where x>0, should be positive */
- result = sqrt_sp(half_sp);
-
- if (result & SIGN_FLAG_SP) {
- observed = (uint64_t)result & SIGN_FLAG_SP;
- expected = (uint64_t)0;
- setup_fps_test_struct(NO_EREPORT_INFO,
- report, 8241, &observed, &expected, 1, 1);
-
- return (-1);
- }
-
- /* fsqrt(-0)=-0. */
- result = sqrt_sp(MINUS_ZERO_SP);
-
- if (!(result & MINUS_ZERO_SP)) {
- observed = (uint64_t)0;
- expected = (uint64_t)1;
- setup_fps_test_struct(NO_EREPORT_INFO,
- report, 8242, &observed, &expected, 1, 1);
-
- return (-1);
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * squareroot_test_dp(struct fps_test_ereport *report)
- * tests double precision squareroot.
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-squareroot_test_dp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- uint64_t observed;
- uint64_t expected;
- unsigned long half_dp;
- unsigned long result;
- unsigned long workvalue;
- unsigned long prev_fsr;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
-
- for (i = 1; i < N_VALS; i++) {
- workvalue = val[i].floatdouble;
- result = sqrt_dp(mult_dp(workvalue, workvalue));
-
- if (result != workvalue) {
- observed = (uint64_t)result;
- expected = (uint64_t)workvalue;
- (void) snprintf(err_data, sizeof (err_data),
- "\nExpected: %lld\nObserved: %lld", workvalue,
- result);
- setup_fps_test_struct(NO_EREPORT_INFO,
- report, 6242, &observed, &expected, 1, 1);
-
- return (-1);
- }
- }
-
- /* fsqrt(x), where x>0, should be positive */
- workvalue = half_msw;
- half_dp = workvalue << 32;
- half_dp = half_dp | half_lsw;
- result = sqrt_dp(half_dp);
-
- if (result & SIGN_FLAG_DP) {
- observed = (uint64_t)result & SIGN_FLAG_DP;
- expected = (uint64_t)0;
- setup_fps_test_struct(NO_EREPORT_INFO,
- report, 8243, &observed, &expected, 1, 1);
-
- return (-1);
- }
-
- /* fsqrt(-0)=-0 */
- result = sqrt_dp(MINUS_ZERO_DP);
-
- if (!(result & MINUS_ZERO_DP)) {
- observed = (uint64_t)0;
- expected = (uint64_t)1;
- setup_fps_test_struct(NO_EREPORT_INFO,
- report, 8244, &observed, &expected, 1, 1);
-
- return (-1);
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * division_test_sp(struct fps_test_ereport *report)
- * tests single precision division through registers.
- * (reg f4=f0/f2). If an error is found, relevant data
- * is stored in report.
- */
-static int
-division_test_sp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- unsigned long result;
- unsigned long prev_fsr;
- uint64_t observed;
- uint64_t expected;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
- for (i = 1; i < N_VALS; i++) {
- result = div_sp(val[i].floatsingle, val[1].floatsingle);
-
- if (result != val[i].floatsingle) {
- observed = (uint64_t)result;
- expected = (uint64_t)val[i].floatsingle;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d], reg f4=f0/f2"
- "\nExpected: %d\nObserved: %d",
- i, val[i].floatsingle, result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6243, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * division_test_dp(struct fps_test_ereport *report)
- * tests double precision division through registers.
- * (reg f4=f0/f2). If an error is found, relevant data
- * is stored in report.
- */
-static int
-division_test_dp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- unsigned long result;
- unsigned long prev_fsr;
- uint64_t observed;
- uint64_t expected;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
- for (i = 1; i < N_VALS; i++) {
- result = div_dp(val[i].floatdouble, val[1].floatdouble);
-
- if (result != val[i].floatdouble) {
- observed = (uint64_t)result;
- expected = (uint64_t)val[i].floatdouble;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d], reg f4=f0/f2"
- "\nExpected: %lld\nObserved: %lld",
- i, val[i].floatdouble, result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6244, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * multiplication_test_sp(struct fps_test_ereport *report)
- * tests single precision multiplication through registers.
- * (reg f4=f0*f2). If an error is found, relevant data
- * is stored in report.
- */
-static int
-multiplication_test_sp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- unsigned long result;
- unsigned long prev_fsr;
- uint64_t observed;
- uint64_t expected;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
- for (i = 0; i < N_VALS; i++) {
- result = mult_sp(val[i].floatsingle, val[1].floatsingle);
-
- if (result != val[i].floatsingle) {
- observed = (uint64_t)result;
- expected = (uint64_t)val[i].floatsingle;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d], reg f4=f0*f2"
- "\nExpected: %d\nObserved: %d",
- i, val[i].floatsingle, result);
- setup_fps_test_struct(IS_EREPORT_INFO, report,
- 6245, &observed, &expected, 1, 1, err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * multiplication_test_dp(struct fps_test_ereport *report)
- * tests double precision multiplication through registers.
- * (reg f4=f0*f2). If an error is found, relevant data
- * is stored in report.
- */
-static int
-multiplication_test_dp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- uint64_t observed;
- uint64_t expected;
- unsigned long result;
- unsigned long prev_fsr;
-
- prev_fsr = get_fsr();
-
- init_regs(0);
- for (i = 0; i < N_VALS; i++) {
- result = mult_dp(val[i].floatdouble, val[1].floatdouble);
-
- if (result != val[i].floatdouble) {
- observed = (uint64_t)result;
- expected = (uint64_t)val[i].floatdouble;
- (void) snprintf(err_data, sizeof (err_data),
- "Val Entry[%d], reg f4=f0*f2"
- "\nExpected: %lld\nObserved: %lld",
- i, val[i].floatdouble, result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6246, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * compare_sp(struct fps_test_ereport *report)
- * performs single precision comparison tests.
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-compare_sp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- uint64_t expected;
- uint64_t observed;
- unsigned long prev_fsr;
- unsigned long result = 0;
-
- prev_fsr = get_fsr();
- set_fsr(prev_fsr & FSR_DISABLE_TEM);
- init_regs(0);
-
- for (i = 0; i < (N_VALS - 1); i++) {
-#ifndef __lint
- result = fcmps_fcc(val[i].floatsingle, val[i].floatsingle, 0);
-#endif
-
- if ((result & 0xc00) != 0) {
- observed = (uint64_t)result & 0xc00;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "f0= %d, f2= %d", i, i);
- setup_fps_test_struct(IS_EREPORT_INFO, report,
- 6247, &observed, &expected, 1, 1, err_data);
-
- return (-1);
- }
-
-#ifndef __lint
- result = fcmps_fcc(val[i].floatsingle,
- val[i + 1].floatsingle, 0);
-#endif
- if ((result & 0xc00) != 0x400) {
- observed = (uint64_t)result & 0xc00;
- expected = (uint64_t)0x400;
- (void) snprintf(err_data, sizeof (err_data),
- "f0= %d, f2= %d", i, i+1);
- setup_fps_test_struct(IS_EREPORT_INFO, report,
- 6248, &observed, &expected, 1, 1, err_data);
-
- return (-1);
- }
-
-#ifndef __lint
- result = fcmps_fcc(val[i + 1].floatsingle,
- val[i].floatsingle, 0);
-#endif
-
- if ((result & 0xc00) != 0x800) {
- observed = (uint64_t)result & 0xc00;
- expected = (uint64_t)0x800;
- (void) snprintf(err_data, sizeof (err_data),
- "f0= %d, f2= %d", i+1, i);
- setup_fps_test_struct(IS_EREPORT_INFO, report,
- 6249, &observed, &expected, 1, 1, err_data);
-
- return (-1);
- }
-
- set_fsr(prev_fsr & FSR_DISABLE_TEM);
-#ifndef __lint
- result = fcmps_fcc(val[i].floatsingle, 0x7f800400, 0);
-#endif
-
- if ((result & 0xc00) != 0xc00) {
- observed = (uint64_t)result & 0xc00;
- expected = (uint64_t)0xc00;
- (void) snprintf(err_data, sizeof (err_data),
- "f0= %d, f2= NaN", i);
- setup_fps_test_struct(IS_EREPORT_INFO, report,
- 6250, &observed, &expected, 1, 1, err_data);
-
- return (-1);
- }
- }
-
- /* Compare +/-zero and check if the comparision is okay */
-
- result = fcmps_fcc(MINUS_ZERO_SP, PLUS_ZERO_SP, 0);
-
- if (result & 0xc00) {
- observed = (uint64_t)result & 0xc00;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "f0= %d, f2= %d", +0, -0);
- setup_fps_test_struct(IS_EREPORT_INFO, report,
- 8251, &observed, &expected, 1, 1, err_data);
-
- return (-1);
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * compare_dp(struct fps_test_ereport *report)
- * performs double precision comparison tests.
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-compare_dp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- unsigned long result;
- unsigned long prev_fsr;
- uint64_t observed;
- uint64_t expected;
-
- prev_fsr = get_fsr();
- set_fsr(prev_fsr & FSR_DISABLE_TEM);
-
- init_regs(0);
-
- for (i = 0; i < (N_VALS - 1); i++) {
- result = fcmpd_fcc(val[i].floatdouble, val[i].floatdouble, 0);
- if ((result & 0xc00) != 0) {
- observed = (uint64_t)result & 0xc00;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "f0= %d, f2= %d", i, i);
- setup_fps_test_struct(IS_EREPORT_INFO, report,
- 6251, &observed, &expected, 1, 1, err_data);
-
- return (-1);
- }
-
- result = fcmpd_fcc(val[i].floatdouble,
- val[i + 1].floatdouble, 0);
-
- if ((result & 0xc00) != 0x400) {
- observed = (uint64_t)result & 0xc00;
- expected = (uint64_t)0x400;
- (void) snprintf(err_data, sizeof (err_data),
- "f0= %d, f2= %d", i, i+1);
- setup_fps_test_struct(IS_EREPORT_INFO, report,
- 6252, &observed, &expected, 1, 1, err_data);
-
- return (-1);
- }
-
- result = fcmpd_fcc(val[i + 1].floatdouble,
- val[i].floatdouble, 0);
-
- if ((result & 0xc00) != 0x800) {
- observed = (uint64_t)result & 0xc00;
- expected = (uint64_t)0x800;
- (void) snprintf(err_data, sizeof (err_data),
- "f0= %d, f2= %d", i+1, i);
- setup_fps_test_struct(IS_EREPORT_INFO, report,
- 6253, &observed, &expected, 1, 1, err_data);
-
- return (-1);
- }
-
- set_fsr(prev_fsr & FSR_DISABLE_TEM);
- result = fcmpd_fcc(val[i].floatdouble, 0x7ff0008000000000, 0);
-
- if ((result & 0xc00) != 0xc00) {
- observed = (uint64_t)result & 0xc00;
- expected = (uint64_t)0xc00;
- (void) snprintf(err_data, sizeof (err_data),
- "f0= %d, f2=NaN", i);
- setup_fps_test_struct(IS_EREPORT_INFO, report,
- 6254, &observed, &expected, 1, 1, err_data);
-
- return (-1);
- }
- }
- /* Compare +/-zero and check if the comparision is okay */
-
- result = fcmpd_fcc(MINUS_ZERO_DP, PLUS_ZERO_DP, 0);
-
- if (result & 0xc00) {
- observed = (uint64_t)result & 0xc00;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "f0= %d, f2= %d", +0, -0);
- setup_fps_test_struct(IS_EREPORT_INFO, report,
- 8252, &observed, &expected, 1, 1, err_data);
-
- return (-1);
- }
-
- set_fsr(prev_fsr);
- return (0);
-}
-
-/*
- * branching(struct fps_test_ereport *report)
- * performs branch testing. If an error is found,
- * relevant data is stored in report.
- */
-static int
-branching(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- unsigned long result;
- unsigned long prev_status;
- uint64_t observed;
- uint64_t expected;
-
- prev_status = get_fsr();
- init_regs(0);
- result = get_fsr();
- result = result & 0xC0400000; /* set all exception bits to zero */
- set_fsr(result);
-
- for (i = 0; i < 64; i++) {
- if (result = branches(0, val[i].floatsingle, 0x7f800400)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- setup_fps_test_struct(NO_EREPORT_INFO,
- report, 6255, &observed, &expected, 1, 1);
-
- return (-1);
- }
-
- if (result = branches(1, val[i + 1].floatsingle,
- val[i].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d ", i+1, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6256, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (result = branches(2, val[i].floatsingle, 0x7f800400)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- setup_fps_test_struct(NO_EREPORT_INFO,
- report, 6257, &observed, &expected, 1, 1);
-
- return (-1);
- }
-
- if (result = branches(2, val[i + 1].floatsingle,
- val[i].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d ", i+1, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6258, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (result = branches(3, val[i].floatsingle,
- val[i + 1].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d and f2= %d ", i, i+1);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6259, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (result = branches(4, val[i].floatsingle, 0x7f800400)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- setup_fps_test_struct(NO_EREPORT_INFO,
- report, 6260, &observed, &expected, 1, 1);
-
- return (-1);
- }
-
- if (result = branches(4, val[i].floatsingle,
- val[i + 1].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d ", i, i+1);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6261, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (result = branches(5, val[i].floatsingle,
- val[i + 1].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d ", i, i+1);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6262, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (result = branches(5, val[i + 1].floatsingle,
- val[i].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d ", i+1, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6263, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (result = branches(6, val[i].floatsingle,
- val[i + 1].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d ", i, i+1);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6264, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (result = branches(7, val[i].floatsingle,
- val[i].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d ", i, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6265, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (result = branches(8, val[i].floatsingle, 0x7f800400)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- setup_fps_test_struct(NO_EREPORT_INFO,
- report, 6266, &observed, &expected, 1, 1);
-
- return (-1);
- }
-
- if (result = branches(8, val[i].floatsingle,
- val[i].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d ", i, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6267, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- if (result = branches(9, val[i].floatsingle,
- val[i].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d ", i, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6268, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- if (result = branches(9, val[i + 1].floatsingle,
- val[i].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d ", i+1, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6269, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (result = branches(10, val[i].floatsingle, 0x7f800400)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- setup_fps_test_struct(NO_EREPORT_INFO,
- report, 6270, &observed, &expected, 1, 1);
-
- return (-1);
- }
-
- if (result = branches(10, val[i].floatsingle,
- val[i].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6271, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (result = branches(10, val[i + 1].floatsingle,
- val[i].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i+1, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6272, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (result = branches(11, val[i].floatsingle,
- val[i + 1].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i, i+1);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6273, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (result = branches(11, val[i].floatsingle,
- val[i].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6274, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (result = branches(12, val[i].floatsingle, 0x7f800400)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- setup_fps_test_struct(NO_EREPORT_INFO,
- report, 6275, &observed, &expected, 1, 1);
-
- return (-1);
- }
-
- if (result = branches(12, val[i].floatsingle,
- val[i + 1].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i, i+1);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6276, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (result = branches(12, val[i].floatsingle,
- val[i].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6277, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (result = branches(13, val[i].floatsingle,
- val[i + 1].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i, i+1);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6278, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (result = branches(14, val[i].floatsingle,
- val[i + 1].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i, i+1);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6279, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (result = branches(15, val[i].floatsingle,
- val[i + 1].floatsingle)) {
- observed = (uint64_t)result;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d ", i, i+1);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6280, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_status);
- return (0);
-
-}
-
-/*
- * branching(struct fps_test_ereport *report)
- * performs negative branch testing. If an error is found,
- * relevant data is stored in report.
- */
-static int
-no_branching(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- uint64_t observed;
- uint64_t expected;
- unsigned long result;
- unsigned long prev_status;
-
- prev_status = get_fsr();
- init_regs(0);
- result = get_fsr();
- result = result & 0xC0400000; /* set all exception bits to zero */
- set_fsr(result);
-
- for (i = 0; i < 64; i++) {
- if (!(branches(0, val[i].floatsingle,
- val[i].floatsingle))) {
- observed = (uint64_t)0;
- expected = (uint64_t)1;
- setup_fps_test_struct(NO_EREPORT_INFO,
- report, 6281, &observed, &expected, 1, 1);
-
- return (-1);
- }
-
- if (!(branches(1, val[i].floatsingle,
- val[i].floatsingle))) {
- observed = (uint64_t)0;
- expected = (uint64_t)1;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6282, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (!(branches(2, val[i].floatsingle,
- val[i].floatsingle))) {
- observed = (uint64_t)0;
- expected = (uint64_t)1;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6283, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (!(branches(3, val[i].floatsingle,
- val[i].floatsingle))) {
- observed = (uint64_t)0;
- expected = (uint64_t)1;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6284, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (!(branches(4, val[i].floatsingle,
- val[i].floatsingle))) {
- observed = (uint64_t)0;
- expected = (uint64_t)1;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6285, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (!(branches(5, val[i].floatsingle,
- val[i].floatsingle))) {
- observed = (uint64_t)0;
- expected = (uint64_t)1;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6286, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (!(branches(6, val[i].floatsingle,
- val[i].floatsingle))) {
- observed = (uint64_t)0;
- expected = (uint64_t)1;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6287, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (!(branches(7, val[i + 1].floatsingle,
- val[i].floatsingle))) {
- observed = (uint64_t)0;
- expected = (uint64_t)1;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i+1, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6288, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (!(branches(8, val[i + 1].floatsingle,
- val[i].floatsingle))) {
- observed = (uint64_t)0;
- expected = (uint64_t)1;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i+1, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6289, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (!(branches(9, val[i].floatsingle,
- val[i + 1].floatsingle))) {
- observed = (uint64_t)0;
- expected = (uint64_t)1;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i, i+1);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6290, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (!(branches(10, val[i].floatsingle,
- val[i + 1].floatsingle))) {
- observed = (uint64_t)0;
- expected = (uint64_t)1;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i, i+1);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6291, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (!(branches(11, val[i + 1].floatsingle,
- val[i].floatsingle))) {
- observed = (uint64_t)0;
- expected = (uint64_t)1;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i+1, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6292, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (!(branches(12, val[i + 1].floatsingle,
- val[i].floatsingle))) {
- observed = (uint64_t)0;
- expected = (uint64_t)1;
- (void) snprintf(err_data, sizeof (err_data),
- "reg f0= %d, f2= %d", i+1, i);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6293, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
-
- if (!(result = branches(13, val[i].floatsingle, 0x7f800400))) {
- observed = (uint64_t)0;
- expected = (uint64_t)1;
- setup_fps_test_struct(NO_EREPORT_INFO,
- report, 6294, &observed, &expected, 1, 1);
-
- return (-1);
- }
-
- }
-
- set_fsr(prev_status);
-
- return (0);
-}
-
-/*
- * compare_sp_except(struct fps_test_ereport *report)
- * does single precision exception testing.
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-compare_sp_except(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- unsigned long result;
- unsigned long prev_status;
- uint64_t observed;
- uint64_t expected;
-
- prev_status = get_fsr();
- init_regs(0);
- result = get_fsr();
- result = result | FSR_ENABLE_TEM_NV;
-
- set_fsr(result);
-
- for (i = 0; i < N_VALS; i++) {
-
- trap_flag = trap_flag | TRAP_SOLICITED;
- result = cmp_s_ex(val[i].floatsingle, 0x7fbfffff);
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fcmpxs exception did not occur, fsr=%lo",
- fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6295, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
- expected = (uint64_t)FSR_CEXC_NV;
- (void) snprintf(err_data, sizeof (err_data),
- "fcmpxs exception did not occur, fsr=%lo",
- fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6296, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_status);
- return (0);
-}
-
-/*
- * compare_dp_except(struct fps_test_ereport *report)
- * does double precision exception testing.
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-compare_dp_except(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- unsigned long result;
- unsigned long prev_status;
- uint64_t observed;
- uint64_t expected;
-
- prev_status = get_fsr();
- init_regs(0);
- result = get_fsr();
- result = result | FSR_ENABLE_TEM_NV;
- set_fsr(result);
-
- for (i = 0; i < 199; i++) {
-
- trap_flag = trap_flag | TRAP_SOLICITED;
- result = cmp_d_ex(val[i].floatdouble, 0x7ff0008000000000);
- if (trap_flag) {
- observed = (uint64_t)trap_flag;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "fcmpxd exception did not occur, fsr=%lo",
- fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6297, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- if ((fsr_at_trap & FSR_CEXC_NV) != FSR_CEXC_NV) {
- observed = (uint64_t)fsr_at_trap & FSR_CEXC_NV;
- expected = (uint64_t)FSR_CEXC_NV;
- (void) snprintf(err_data, sizeof (err_data),
- "fcmpxd exception did not occur, fsr=%lo",
- fsr_at_trap);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6298, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- }
-
- set_fsr(prev_status);
- return (0);
-}
-
-/*
- * Patterns used in the registers functions that are.
- * loaded into all registers.
- */
-
-#define ALLZEROES_DP 0x0000000000000000UL
-#define ALLZEROES_SP 0x00000000U
-#define ALLONES_DP 0xFFFFFFFFFFFFFFFFUL
-#define ALLONES_SP 0xFFFFFFFFU
-
-/*
- * registers_four(struct fps_test_ereport *report)
- * loads each nibble with 0xf on all the available FP
- * registers in single precision.
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-registers_four(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- unsigned int result = 0;
- uint64_t observed;
- uint64_t expected;
-
-#define ARB_VAL 4
-
- for (i = 0; i < ARB_VAL; i++) {
- init_regs(ALLZEROES_SP);
- init_regs(ALLONES_SP);
- }
-
- init_regs(ALLZEROES_SP);
- for (i = 0; i < 32; i++) {
- read_fpreg(&result, i);
- if (result != ALLZEROES_SP) {
- observed = (uint64_t)result;
- expected = (uint64_t)ALLZEROES_SP;
- (void) snprintf(err_data, sizeof (err_data),
- "Reg: %d\nExpected: %d\nObserved: %d",
- i, ALLZEROES_SP, result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6345, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- }
-
- init_regs(ALLONES_SP);
-
- for (i = 0; i < 32; i++) {
- read_fpreg(&result, i);
- if (result != ALLONES_SP) {
- observed = (uint64_t)result;
- expected = (uint64_t)ALLONES_SP;
- (void) snprintf(err_data, sizeof (err_data),
- "Reg: %d\nExpected: %d\nObserved: %d",
- i, ALLONES_SP, result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 8345, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- }
-
- return (0);
-}
-
-/*
- * registers_four_dp(struct fps_test_ereport *report)
- * loads each nibble with 0xf on all the available FP
- * registers in double precision.
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-registers_four_dp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- uint64_t expected;
- uint64_t observed;
- unsigned long result;
-
-#define ARB_VAL 4
-
- for (i = 0; i < ARB_VAL; i++) {
- init_regs_dp(ALLZEROES_DP);
- init_regs_dp(ALLONES_DP);
- }
-
- init_regs_dp(16);
- read_fpreg_dp(&result, 2);
- init_regs_dp(ALLZEROES_DP);
- for (i = 0; i < 64; i = i + 2) {
- result = ALLONES_DP;
- read_fpreg_dp(&result, i);
- if (result != ALLZEROES_DP) {
- observed = (uint64_t)result;
- expected = (uint64_t)ALLZEROES_DP;
- (void) snprintf(err_data, sizeof (err_data),
- "Reg: %d\nExpected: %lld\nObserved: %lld",
- i, ALLZEROES_DP, result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6346, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- }
-
- init_regs_dp(ALLONES_DP);
-
- for (i = 30; i < 64; i = i + 2) {
- read_fpreg_dp(&result, i);
- if (result != ALLONES_DP) {
- observed = (uint64_t)result;
- expected = (uint64_t)ALLONES_DP;
- (void) snprintf(err_data, sizeof (err_data),
- "Reg: %d\nExpected: %lld\nObserved: %lld",
- i, ALLONES_DP, result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 8346, &observed, &expected, 1, 1,
- err_data);
-
- return (-1);
- }
- }
-
- return (0);
-}
-
-/*
- * registers_two(struct fps_test_ereport *report)
- * tests single precision rotating ones through the
- * floating point registers. If an error is found,
- * relevant data is stored in report.
- */
-static int
-registers_two(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- int j;
- uint64_t expected;
- uint64_t observed;
- unsigned int result;
- unsigned int value;
-
- for (j = 0; j < 32; j++) {
- for (i = 0; i < 32; i++) {
- value = (1 << i);
- if ((result = register_test(j, value)) != value) {
- observed = (uint64_t)result;
- expected = (uint64_t)value;
- (void) snprintf(err_data, sizeof (err_data),
- "Reg: %d\nExpected: %d\nObserved: %d",
- j, value, result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6301, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
- }
-
- return (0);
-}
-
-/*
- * registers_two_dp(struct fps_test_ereport *report)
- * tests double precision rotating ones through the
- * floating point registers. If an error is found,
- * relevant data is stored in report.
- */
-static int
-registers_two_dp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- int j;
- uint64_t observed;
- uint64_t expected;
- unsigned long result;
- unsigned long value;
-
- for (j = 0; j < 32; j = j + 2) {
- for (i = 0; i < 64; i++) {
- value = (1 << i);
- result = register_test_dp(j, value);
-
- if (result != value) {
- observed = (*(uint64_t *)&result);
- expected = (*(uint64_t *)&value);
- (void) snprintf(err_data, sizeof (err_data),
- "Reg: %d\nExpected: %lld\nObserved: %lld",
- j, value, result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5301, &observed, &expected, 1,
- 1, err_data);
- return (-1);
- }
- }
- }
-
- return (0);
-}
-
-/*
- * registers_one(struct fps_test_ereport *report)
- * passes a single precision pattern through the
- * floating point registers. If an error is found,
- * relevant data is stored in report.
- */
-static int
-registers_one(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- int j;
- unsigned int result;
-
- uint64_t observed;
- uint64_t expected;
-
- for (i = 0; i < 32; i++) {
- for (j = 0; j < PAT_NUM; j++) {
- result = register_test(i, pat[j]);
- if (result != pat[j]) {
- observed = (uint64_t)result;
- expected = (uint64_t)pat[j];
- (void) snprintf(err_data, sizeof (err_data),
- "Reg: %d\nExpected: %d\nObserved: %d",
- i, pat[j], result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 6302, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
- }
-
- return (0);
-}
-
-/*
- * registers_one_dp(struct fps_test_ereport *report)
- * passes a double precision pattern through the
- * floating point registers. If an error is found,
- * relevant data is stored in report.
- */
-static int
-registers_one_dp(struct fps_test_ereport *report)
-{
- char err_data[MAX_INFO_SIZE];
- int i;
- int j;
- unsigned long result;
-
- uint64_t observed;
- uint64_t expected;
-
- for (i = 0; i < 64; i = i + 2) {
- for (j = 0; j < PAT_DP_NUM; j++) {
- result = register_test_dp(i, pat_dp[j]);
- if (result != pat_dp[j]) {
- observed = (uint64_t)result;
- expected = (uint64_t)pat[j];
- (void) snprintf(err_data, sizeof (err_data),
- "Reg: %d\nExpected: %lld"
- "\nObserved: %lld",
- i, pat[j], result);
- setup_fps_test_struct(IS_EREPORT_INFO,
- report, 5302, &observed, &expected, 1,
- 1, err_data);
-
- return (-1);
- }
- }
- }
-
- return (0);
-}
-
-/*
- * sigsegv_handler(int sig, siginfo_t *sip, ucontext_t *ucp)
- * sets up the sigsegv signal handler. If reached during
- * non-negative testing, application exits.
- */
-/* ARGSUSED */
-static void
-sigsegv_handler(int sig, siginfo_t *sip, ucontext_t *ucp)
-{
- ucp->uc_mcontext.fpregs.fpu_qcnt = 0;
-
- fsr_at_trap = ucp->uc_mcontext.fpregs.fpu_fsr;
- if (trap_flag == (trap_flag | TRAP_SOLICITED)) {
- trap_flag = trap_flag & (~TRAP_SOLICITED);
- return;
- }
- trap_flag = trap_flag | TRAP_UNSOLICITED;
-
- _exit(FPU_SIG_SEGV);
-}
-
-/*
- * sigbus_handler(int sig, siginfo_t *sip, ucontext_t *ucp)
- * sets up the sigbus signal handler. If reached during
- * non-negative testing, application exits.
- */
-/* ARGSUSED */
-static void
-sigbus_handler(int sig, siginfo_t *sip, ucontext_t *ucp)
-{
- ucp->uc_mcontext.fpregs.fpu_qcnt = 0;
-
- fsr_at_trap = ucp->uc_mcontext.fpregs.fpu_fsr;
- if (trap_flag == (trap_flag | TRAP_SOLICITED)) {
- trap_flag = trap_flag & (~TRAP_SOLICITED);
- return;
- }
- trap_flag = trap_flag | TRAP_UNSOLICITED;
-
- _exit(FPU_SIG_BUS);
-
-}
-
-/*
- * sigfpe_handler(int sig, siginfo_t *sip, ucontext_t *ucp)
- * sets up the sigfpe signal handler. If reached during
- * non-negative testing, application exits.
- */
-/* ARGSUSED */
-static void
-sigfpe_handler(int sig, siginfo_t *sip, ucontext_t *ucp)
-{
- ucp->uc_mcontext.fpregs.fpu_qcnt = 0;
-
- fsr_at_trap = ucp->uc_mcontext.fpregs.fpu_fsr;
- if (trap_flag == (trap_flag | TRAP_SOLICITED)) {
- trap_flag = trap_flag & (~TRAP_SOLICITED);
- return;
- }
- trap_flag = trap_flag | TRAP_UNSOLICITED;
-
- _exit(FPU_SIG_FPE);
-}
-
-/*
- * sigill_handler(int sig, siginfo_t *sip, ucontext_t *ucp)
- * sets up the sigill signal handler. If reached during
- * non-negative testing, application exits.
- */
-/* ARGSUSED */
-static void
-sigill_handler(int sig, siginfo_t *sip, ucontext_t *ucp)
-{
- ucp->uc_mcontext.fpregs.fpu_qcnt = 0;
-
- fsr_at_trap = ucp->uc_mcontext.fpregs.fpu_fsr;
- if (trap_flag == (trap_flag | TRAP_SOLICITED)) {
- trap_flag = trap_flag & (~TRAP_SOLICITED);
- return;
- }
- trap_flag = trap_flag | TRAP_UNSOLICITED;
-
- _exit(FPU_SIG_ILL);
-}
-
-/*
- * winitfp() sets the signal handlers used
- * for negative testing. If sigaction fails,
- * the program exits.
- */
-int
-winitfp()
-{
- (void) sigemptyset(&newfpe.sa_mask);
- newfpe.sa_flags = SA_SIGINFO;
- newfpe.sa_handler = sigfpe_handler;
- if (sigaction(SIGFPE, &newfpe, &oldfpe)) {
- _exit(FPU_SYSCALL_FAIL);
- }
-
- (void) sigemptyset(&newill.sa_mask);
- newill.sa_flags = SA_SIGINFO;
- newill.sa_handler = sigill_handler;
- if (sigaction(SIGILL, &newill, &oldill)) {
- _exit(FPU_SYSCALL_FAIL);
- }
-
- (void) sigemptyset(&newbus.sa_mask);
- newbus.sa_flags = SA_SIGINFO;
- newbus.sa_handler = sigbus_handler;
- if (sigaction(SIGBUS, &newbus, &oldbus)) {
- _exit(FPU_SYSCALL_FAIL);
- }
-
- (void) sigemptyset(&newsegv.sa_mask);
- newsegv.sa_flags = SA_SIGINFO;
- newsegv.sa_handler = sigsegv_handler;
- if (sigaction(SIGSEGV, &newsegv, &oldsegv)) {
- _exit(FPU_SYSCALL_FAIL);
- }
-
- return (0);
-}
-#endif
-
-/*
- * restore_signals() turns off the signal
- * handlers used by restoring the original
- * values. If sigaction fails, the program
- * exits.
- */
-int
-restore_signals()
-{
- if (sigaction(SIGSEGV, &oldsegv, &newsegv)) {
- _exit(FPU_SYSCALL_FAIL);
- }
-
- if (sigaction(SIGBUS, &oldbus, &newbus)) {
- _exit(FPU_SYSCALL_FAIL);
- }
-
- if (sigaction(SIGILL, &oldill, &newill)) {
- _exit(FPU_SYSCALL_FAIL);
- }
-
- if (sigaction(SIGFPE, &oldfpe, &newfpe)) {
- _exit(FPU_SYSCALL_FAIL);
- }
-
- return (0);
-
-}
-
-/*
- * fpu_sysdiag(struct fps_test_ereport *report)
- * is the main caller of all fpu subtests. It
- * does the following tests: normal registers, fsr,
- * moving instructions, conversion instructions,
- * absolute values, compare, branching, arithmatic,
- * chain, datapath, and timing.
- * If an error is found, relevant data is stored
- * in report.
- */
-int
-fpu_sysdiag(struct fps_test_ereport *report)
-{
-
- int i;
-
-#ifndef i86pc
-
- /*
- * Initialize neg_val_sp[] and neg_val_dp[] with the -ve versions of
- * the values in val[]
- */
- for (i = 0; i < N_VALS; i++) {
- neg_val_sp[i] = val[i].floatsingle |
- ((uint32_t)1) << 31;
-
- neg_val_dp[i] = val[i].floatdouble |
- ((uint64_t)1) << 63;
- }
-
- /* Register Testing */
- if (registers_four(report)) {
- return (-1);
- }
-
- if (trap_flag) {
- fail_trap(report, 7001);
- return (-1);
- }
-
- if (registers_four_dp(report)) {
- return (-1);
- }
-
- if (trap_flag) {
- fail_trap(report, 7002);
- }
-
- if (registers_two(report)) {
- return (-1);
- }
-
- if (trap_flag) {
- fail_trap(report, 7003);
- }
-
- if (registers_two_dp(report)) {
- return (-1);
- }
-
- if (trap_flag) {
- fail_trap(report, 7004);
- return (-1);
- }
-
- if (registers_one(report)) {
- return (-1);
- }
-
- if (trap_flag) {
- fail_trap(report, 7005);
- return (-1);
- }
-
- if (registers_one_dp(report)) {
- return (-1);
- }
-
- if (trap_flag) {
- fail_trap(report, 7006);
- return (-1);
- }
-
- /* FSR testing */
- if (fsr_test(report)) {
- return (-1);
-
- }
-
- if (trap_flag) {
- fail_trap(report, 7007);
- return (-1);
- }
-
- if (fmovs_ins(report)) {
- return (-1);
- }
-
- if (trap_flag) {
- fail_trap(report, 7008);
- return (-1);
- }
-
- /* Conversion routines */
- if (integer_to_float_sp(report)) {
- return (-1);
- }
-
- if (trap_flag) {
- fail_trap(report, 7009);
- return (-1);
- }
-
- if (integer_to_float_dp(report)) {
- return (-1);
- }
-
- if (trap_flag) {
- fail_trap(report, 7010);
- return (-1);
- }
-
- if (long_to_float_sp(report)) {
- return (-1);
- }
-
- if (trap_flag) {
- fail_trap(report, 7011);
- return (-1);
- }
-
- if (long_to_float_dp(report)) {
- return (-1);
- }
-
- if (trap_flag) {
- fail_trap(report, 7012);
- return (-1);
- }
-
- if (float_to_integer_sp(report)) {
- return (-1);
- }
-
- if (trap_flag) {
- fail_trap(report, 7013);
- return (-1);
- }
-
- if (float_to_integer_dp(report)) {
- return (-1);
- }
-
- if (trap_flag) {
- fail_trap(report, 7014);
- return (-1);
- }
-
- if (float_to_long_dp(report)) {
- return (-1);
- }
-
- if (trap_flag) {
- fail_trap(report, 7015);
- return (-1);
- }
-
- if (float_to_long_sp(report)) {
- return (-1);
- }
-
- if (trap_flag) {
- fail_trap(report, 7016);
- return (-1);
- }
-
- if (single_doub(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7017);
- return (-1);
- }
- if (double_sing(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7018);
- return (-1);
- }
- /* Absolute, -ve instructions */
- if (fabs_ins_sp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7019);
- return (-1);
- }
- if (fabs_ins_dp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7020);
- return (-1);
- }
- if (get_negative_value_pn_sp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7021);
- return (-1);
- }
- if (get_negative_value_pn_dp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7022);
- return (-1);
- }
- if (get_negative_value_np_sp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7023);
- return (-1);
- }
- if (get_negative_value_np_dp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7024);
- return (-1);
- }
- /* Compare and branch instructions */
- if (compare_sp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7025);
- return (-1);
- }
- if (compare_dp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7026);
- return (-1);
- }
- if (compare_sp_except(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7027);
- return (-1);
- }
- if (compare_dp_except(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7028);
- return (-1);
- }
- if (branching(report)) {
- return (-1);
-
- }
- if (trap_flag) {
- fail_trap(report, 7029);
- return (-1);
- }
- if (no_branching(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7030);
- return (-1);
- }
- /* Arithmetic instructions */
- if (addition_test_sp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7031);
- return (-1);
- }
- if (addition_test_dp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7032);
- return (-1);
- }
- if (subtraction_test_sp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7033);
- return (-1);
- }
- if (subtraction_test_dp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7034);
- return (-1);
- }
- if (multiplication_test_sp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7035);
- return (-1);
- }
- if (multiplication_test_dp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7036);
- return (-1);
- }
- if (squareroot_test_sp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7037);
- return (-1);
- }
- if (squareroot_test_dp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7038);
- return (-1);
- }
- if (division_test_sp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7039);
- return (-1);
- }
- if (division_test_dp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7040);
- return (-1);
- }
- /* chain, datapath, timing tests */
- if (chain_sp_test(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7041);
- return (-1);
- }
- if (chain_dp_test(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7042);
- return (-1);
- }
- if (data_path_sp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7043);
- return (-1);
- }
- if (data_path_dp(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7044);
- return (-1);
- }
- if (timing_test(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7045);
- return (-1);
- }
- if (check_conv(report)) {
- return (-1);
- }
- if (trap_flag) {
- fail_trap(report, 7046);
- return (-1);
- }
-#endif /* i86pc */
-
-return (0);
-}
-
-#define LLL 64
-#define REP_RXd "1104199269.000000"
-#define REP_RXc "1104199269,000000"
-#define REP_GCONd "4.5"
-#define REP_GCONc "4,5"
-
-/*
- * check_conv(struct fps_test_ereport *report)
- * does a series of conversion testing.
- * If an error is found, relevant data is stored
- * in report.
- */
-static int
-check_conv(struct fps_test_ereport *report)
-{
- char dec_point;
- char err_data[MAX_INFO_SIZE];
- double gcon;
- char l_buf[LLL];
- char *pREP_RX;
- char *pREP_GCON;
- double rx;
- long double qgcon;
- struct lconv *lconv2;
- uint64_t observed;
- uint64_t expected;
-
- (void) memset(l_buf, 0, LLL);
-
- lconv2 = localeconv();
- if (NULL == lconv2)
- return (0);
- if (NULL == lconv2->decimal_point)
- return (0);
-
- /* expect "." or ",". if not than return */
- if (1 == strlen(lconv2->decimal_point))
- dec_point = lconv2->decimal_point[0];
- else
- return (0);
-
- if (',' == dec_point) {
- pREP_RX = REP_RXc;
- pREP_GCON = REP_GCONc;
- } else if ('.' == dec_point) {
- pREP_RX = REP_RXd;
- pREP_GCON = REP_GCONd;
- } else
- return (0);
-
- rx = 1104199269;
-
- (void) snprintf(l_buf, LLL - 1, "%f", rx);
- if (strncmp(l_buf, pREP_RX, strlen(pREP_RX)) != 0) {
- observed = (uint64_t)1;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "\nObserved: %s\nExpected: %s", l_buf, pREP_RX);
- setup_fps_test_struct(IS_EREPORT_INFO, report,
- 6326, &observed, &expected, 1, 1, err_data);
-
- return (-1);
- }
-
- gcon = 4.5;
- (void) memset(l_buf, 0, LLL);
- (void) gconvert(gcon, 15, 0, l_buf);
- if (strncmp(l_buf, pREP_GCON, strlen(pREP_GCON)) != 0) {
- observed = (uint64_t)1;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "\nObserved: %s\nExpected: %s", l_buf, pREP_GCON);
- setup_fps_test_struct(IS_EREPORT_INFO, report,
- 6327, &observed, &expected, 1, 1, err_data);
-
- return (-2);
- }
-
- qgcon = 4.5;
- (void) memset(l_buf, 0, LLL);
- (void) qgconvert(&qgcon, 15, 0, l_buf);
- if (strncmp(l_buf, pREP_GCON, strlen(pREP_GCON)) != 0) {
- observed = (uint64_t)1;
- expected = (uint64_t)0;
- (void) snprintf(err_data, sizeof (err_data),
- "\nObserved: %s\nExpected: %s", l_buf, pREP_GCON);
- setup_fps_test_struct(IS_EREPORT_INFO, report,
- 6328, &observed, &expected, 1, 1, err_data);
-
- return (-3);
- }
-
- return (0);
-}
-
-/*
- * fail_trap(struct fps_test_ereport *report, int flag_num)
- * creates the ereport data if a trap flag is set after a
- * successful test when it shouldn't be.
- */
-static void
-fail_trap(struct fps_test_ereport *report, int flag_num)
-{
- uint64_t observed = 1;
- uint64_t expected = 0;
-
- setup_fps_test_struct(NO_EREPORT_INFO, report,
- flag_num, &observed, &expected, 1, 1);
-}