Home | History | Annotate | Download | only in fptest
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     28 
     29 #include <sys/asm_linkage.h>
     30 #include "cheetah_sdc.h"
     31 
     32 /*
     33  * TARGET_REG and TEMP_REG are macros defined in cheetah_sdc.h
     34  * They are set based on some compile time values
     35  * for eg.
     36  * as -xarch=v8 -P -D_ASM -DLOCALS -DL0 cheetah_sdc.s -o ch_sdc_l0.o
     37  * ch_sdc_l0.o will contain code to test %l0 register
     38  * The functions are named after the register it is testing (l1(), l2() etc)
     39  *
     40  * Algorithm
     41  * Use TARGET_REGISTER
     42  * Do some random stuff on TEMP_REGISTER
     43  * Do some operations on TARGET_REGISTER
     44  * Test
     45  *
     46  * TARGET_REG(unsigned long, unsigned long*, unsigned long*)
     47  * Registers :
     48  * i0 = contains the pattern
     49  * i1 = location for the observed value
     50  * i2 = location for the expected value
     51  */
     52 
     53 #ifdef __lint
     54 
     55 /*ARGSUSED*/
     56 int
     57 g1(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
     58 {
     59 	return (0);
     60 }
     61 
     62 /*ARGSUSED*/
     63 int
     64 g2(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
     65 {
     66 	return (0);
     67 }
     68 
     69 /*ARGSUSED*/
     70 int
     71 g3(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
     72 {
     73 	return (0);
     74 }
     75 
     76 /*ARGSUSED*/
     77 int
     78 g4(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
     79 {
     80 	return (0);
     81 }
     82 
     83 /*ARGSUSED*/
     84 int
     85 l0(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
     86 {
     87 	return (0);
     88 }
     89 
     90 /*ARGSUSED*/
     91 int
     92 l1(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
     93 {
     94 	return (0);
     95 }
     96 
     97 /*ARGSUSED*/
     98 int
     99 l2(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
    100 {
    101 	return (0);
    102 }
    103 
    104 /*ARGSUSED*/
    105 int
    106 l3(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
    107 {
    108 	return (0);
    109 }
    110 
    111 /*ARGSUSED*/
    112 int
    113 l4(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
    114 {
    115 	return (0);
    116 }
    117 
    118 /*ARGSUSED*/
    119 int
    120 l5(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
    121 {
    122 	return (0);
    123 }
    124 
    125 /*ARGSUSED*/
    126 int
    127 l6(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
    128 {
    129 	return (0);
    130 }
    131 
    132 /*ARGSUSED*/
    133 int
    134 l7(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
    135 {
    136 	return (0);
    137 }
    138 
    139 /*ARGSUSED*/
    140 int
    141 o0(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
    142 {
    143 	return (0);
    144 }
    145 
    146 /*ARGSUSED*/
    147 int
    148 o1(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
    149 {
    150 	return (0);
    151 }
    152 
    153 /*ARGSUSED*/
    154 int
    155 o2(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
    156 {
    157 	return (0);
    158 }
    159 
    160 /*ARGSUSED*/
    161 int
    162 o3(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
    163 {
    164 	return (0);
    165 }
    166 
    167 /*ARGSUSED*/
    168 int
    169 o4(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
    170 {
    171 	return (0);
    172 }
    173 
    174 /*ARGSUSED*/
    175 int
    176 o5(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
    177 {
    178 	return (0);
    179 }
    180 
    181 /*ARGSUSED*/
    182 int
    183 o7(unsigned long arg1, unsigned long *arg2, unsigned long *arg3)
    184 {
    185 	return (0);
    186 }
    187 
    188 #else /* LINT */
    189 
    190 	.align 64
    191 ENTRY(TARGET_REG)
    192 
    193 	save	%sp, -SA(MINFRAME), %sp
    194 
    195 	setn	0x12345678, %g1, %TARGET_REG 	! initialize the TARGET_REG
    196 						! with a known value
    197 
    198 #ifdef	_sparc64
    199 	stx	%i0, [%i1] 	! store the pattern to the first location
    200 #else
    201 	st	%i0, [%i1]
    202 #endif
    203 
    204 	nop
    205 	nop
    206 	nop
    207 	nop
    208 
    209 	nop
    210 	nop
    211 	nop
    212 	nop
    213 #ifdef	_sparc64
    214 	stx	%g0, [%i2]
    215 	stx	%g0, [%i2]
    216 #else
    217 	st	%g0, [%i2]
    218 	st	%g0, [%i2]
    219 #endif
    220 
    221 
    222 !!
    223 	clr	%TEMP_REG
    224 	clr	%TEMP_REG
    225 
    226 #ifdef	_sparc64
    227 	st	%g0, [%i2]
    228 #else
    229 	st	%g0, [%i2]
    230 #endif
    231 	inc	%g0
    232 	inc	%g0
    233 	or	%TEMP_REG, %g0, %TEMP_REG
    234 	or	%TEMP_REG, %g0, %TEMP_REG
    235 
    236 
    237 !!
    238 #ifdef	_sparc64
    239 	ldx	[%i1], %TARGET_REG
    240 #else
    241 	ld	[%i1], %TARGET_REG
    242 #endif
    243 	mov	%TARGET_REG, %CHECK_REG1	! CHECK_REG1 should contain the
    244 						! most recent value of TARGET_REG.
    245 
    246 	mov	%TARGET_REG, %CHECK_REG2	! CHECK_REG2 should have the same
    247 						! value as CHECK_REG1
    248 ! ==
    249 	cmp	%CHECK_REG1, %CHECK_REG2	! comparison should pass in non-faulty
    250 						! hardware
    251 
    252 	be	Done
    253 	mov	0, %i0
    254 
    255 #ifdef	_sparc64
    256 	stx	%CHECK_REG1, [%i1]
    257 	stx	%CHECK_REG2, [%i2]
    258 #else
    259 	st	%CHECK_REG1, [%i1]
    260 	st	%CHECK_REG2, [%i2]
    261 #endif
    262 
    263 	mov	1, %i0
    264 
    265 Done :
    266 
    267 	ret
    268 	restore
    269 SET_SIZE(TARGET_REG)
    270 
    271 #endif /* LINT */
    272