Open64 (mfef90, whirl2f, and IR tools)
TAG: version-openad; SVN changeset: 916
|
00001 /* 00002 00003 Copyright (C) 2000, 2001 Silicon Graphics, Inc. All Rights Reserved. 00004 00005 This program is free software; you can redistribute it and/or modify it 00006 under the terms of version 2 of the GNU General Public License as 00007 published by the Free Software Foundation. 00008 00009 This program is distributed in the hope that it would be useful, but 00010 WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00012 00013 Further, this software is distributed without any warranty that it is 00014 free of the rightful claim of any third person regarding infringement 00015 or the like. Any license provided herein, whether implied or 00016 otherwise, applies only to this software file. Patent licenses, if 00017 any, provided herein do not apply to combinations of this program with 00018 other software, or any other product whatsoever. 00019 00020 You should have received a copy of the GNU General Public License along 00021 with this program; if not, write the Free Software Foundation, Inc., 59 00022 Temple Place - Suite 330, Boston MA 02111-1307, USA. 00023 00024 Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pky, 00025 Mountain View, CA 94043, or: 00026 00027 http://www.sgi.com 00028 00029 For further information regarding this notice, see: 00030 00031 http://oss.sgi.com/projects/GenInfo/NoticeExplan 00032 00033 */ 00034 00035 00036 #include <stdio.h> 00037 #include "arith.h" 00038 #include "arith.internal.h" 00039 00040 #if !defined __sun && (!defined __STDC__ || !defined _CRAY || _RELEASE < 4) 00041 #error Must be compiled with gcc or Cray Standard C Compiler, version >= 4.0. 00042 #endif 00043 00044 #if defined _CRAY 00045 00046 typedef signed int SINT46; 00047 typedef unsigned int UINT46; 00048 typedef unsigned long UINT64; 00049 typedef signed long SINT64; 00050 00051 # define LS46(v) (*(SINT46*)v) 00052 # define LU46(v) (*(UINT46*)v) 00053 # define LS64(v) (*(SINT64*)v) 00054 # define LU64(v) (*(UINT64*)v) 00055 00056 #elif defined __sun 00057 00058 typedef unsigned long long int UINT64; 00059 typedef signed long long int SINT64; 00060 typedef signed long long int SINT46; 00061 00062 /* 00063 * The Sun needs these because data alignment issues prevent us from 00064 * casting AR_INT_64 addresses directly to SINT64 addresses and then 00065 * loading the pointed-to doubleword. 00066 */ 00067 SINT46 LS46(AR_INT_64 *vp) 00068 { 00069 return((((SINT46) vp->part1) << 48) | 00070 (((SINT46) vp->part2) << 32) | 00071 (((SINT46) vp->part3) << 16) | 00072 (((SINT46) vp->part4) )); 00073 } 00074 00075 SINT64 LS64(AR_INT_64 *vp) 00076 { 00077 return((((SINT64) vp->part1) << 48) | 00078 (((SINT64) vp->part2) << 32) | 00079 (((SINT64) vp->part3) << 16) | 00080 (((SINT64) vp->part4) )); 00081 } 00082 00083 UINT64 LU64(AR_INT_64 *vp) 00084 { 00085 return((((UINT64) vp->part1) << 48) | 00086 (((UINT64) vp->part2) << 32) | 00087 (((UINT64) vp->part3) << 16) | 00088 (((UINT64) vp->part4) )); 00089 } 00090 #endif 00091 00092 00093 AR_INT_64 cool_ints[] = 00094 { 00095 /* march a one bit though a positive 64-bit int */ 00096 {0x0000, 0x0000, 0x0000, 0x0000}, 00097 {0x0000, 0x0000, 0x0000, 0x0001}, 00098 {0x0000, 0x0000, 0x0000, 0x0002}, 00099 {0x0000, 0x0000, 0x0000, 0x0004}, 00100 {0x0000, 0x0000, 0x0000, 0x0010}, 00101 {0x0000, 0x0000, 0x0000, 0x0040}, 00102 {0x0000, 0x0000, 0x0000, 0x0100}, 00103 {0x0000, 0x0000, 0x0000, 0x0400}, 00104 {0x0000, 0x0000, 0x0000, 0x1000}, 00105 {0x0000, 0x0000, 0x0000, 0x4000}, 00106 {0x0000, 0x0000, 0x0001, 0x0000}, 00107 {0x0000, 0x0000, 0x0004, 0x0000}, 00108 {0x0000, 0x0000, 0x0010, 0x0000}, 00109 {0x0000, 0x0000, 0x0040, 0x0000}, 00110 {0x0000, 0x0000, 0x0100, 0x0000}, 00111 {0x0000, 0x0000, 0x0400, 0x0000}, 00112 {0x0000, 0x0000, 0x1000, 0x0000}, 00113 {0x0000, 0x0000, 0x4000, 0x0000}, 00114 {0x0000, 0x0001, 0x0000, 0x0000}, 00115 {0x0000, 0x0004, 0x0000, 0x0000}, 00116 {0x0000, 0x0010, 0x0000, 0x0000}, 00117 {0x0000, 0x0040, 0x0000, 0x0000}, 00118 {0x0000, 0x0100, 0x0000, 0x0000}, 00119 {0x0000, 0x0400, 0x0000, 0x0000}, 00120 {0x0000, 0x1000, 0x0000, 0x0000}, 00121 {0x0000, 0x4000, 0x0000, 0x0000}, 00122 {0x0001, 0x0000, 0x0000, 0x0000}, 00123 {0x0004, 0x0000, 0x0000, 0x0000}, 00124 {0x0010, 0x0000, 0x0000, 0x0000}, 00125 {0x0040, 0x0000, 0x0000, 0x0000}, 00126 {0x0100, 0x0000, 0x0000, 0x0000}, 00127 {0x0400, 0x0000, 0x0000, 0x0000}, 00128 {0x1000, 0x0000, 0x0000, 0x0000}, 00129 {0x2000, 0x0000, 0x0000, 0x0000}, 00130 {0x4000, 0x0000, 0x0000, 0x0000}, 00131 {0x8000, 0x0000, 0x0000, 0x0000}, 00132 00133 /* march a one bit though a negative 32/64-bit int */ 00134 {0x8000, 0x0000, 0x8000, 0x0000}, 00135 {0x8000, 0x0000, 0x8000, 0x0001}, 00136 {0x8000, 0x0000, 0x8000, 0x0002}, 00137 {0x8000, 0x0000, 0x8000, 0x0004}, 00138 {0x8000, 0x0000, 0x8000, 0x0010}, 00139 {0x8000, 0x0000, 0x8000, 0x0040}, 00140 {0x8000, 0x0000, 0x8000, 0x0100}, 00141 {0x8000, 0x0000, 0x8000, 0x0400}, 00142 {0x8000, 0x0000, 0x8000, 0x1000}, 00143 {0x8000, 0x0000, 0x8000, 0x4000}, 00144 {0x8000, 0x0000, 0x8001, 0x0000}, 00145 {0x8000, 0x0000, 0x8004, 0x0000}, 00146 {0x8000, 0x0000, 0x8010, 0x0000}, 00147 {0x8000, 0x0000, 0x8040, 0x0000}, 00148 {0x8000, 0x0000, 0x8100, 0x0000}, 00149 {0x8000, 0x0000, 0x8400, 0x0000}, 00150 {0x8000, 0x0000, 0x9000, 0x0000}, 00151 {0x8000, 0x0000, 0xc000, 0x0000}, 00152 {0x8000, 0x0001, 0x0000, 0x0000}, 00153 {0x8000, 0x0004, 0x0000, 0x0000}, 00154 {0x8000, 0x0010, 0x0000, 0x0000}, 00155 {0x8000, 0x0040, 0x0000, 0x0000}, 00156 {0x8000, 0x0100, 0x0000, 0x0000}, 00157 {0x8000, 0x0400, 0x0000, 0x0000}, 00158 {0x8000, 0x1000, 0x0000, 0x0000}, 00159 {0x8000, 0x4000, 0x0000, 0x0000}, 00160 {0x8001, 0x0000, 0x0000, 0x0000}, 00161 {0x8004, 0x0000, 0x0000, 0x0000}, 00162 {0x8010, 0x0000, 0x0000, 0x0000}, 00163 {0x8040, 0x0000, 0x0000, 0x0000}, 00164 {0x8100, 0x0000, 0x0000, 0x0000}, 00165 {0x8400, 0x0000, 0x0000, 0x0000}, 00166 {0x9000, 0x0000, 0x0000, 0x0000}, 00167 {0xa000, 0x0000, 0x0000, 0x0000}, 00168 {0xc000, 0x0000, 0x0000, 0x0000}, 00169 00170 /* shift 64 one bits through a 64-bit positive int */ 00171 /* {0x0000, 0x0000, 0x0000, 0x0001}, */ /* already have this one */ 00172 {0x0000, 0x0000, 0x0000, 0x0003}, 00173 {0x0000, 0x0000, 0x0000, 0x0007}, 00174 {0x0000, 0x0000, 0x0000, 0x000f}, 00175 {0x0000, 0x0000, 0x0000, 0x003f}, 00176 {0x0000, 0x0000, 0x0000, 0x00ff}, 00177 {0x0000, 0x0000, 0x0000, 0x03ff}, 00178 {0x0000, 0x0000, 0x0000, 0x0fff}, 00179 {0x0000, 0x0000, 0x0000, 0x3fff}, 00180 {0x0000, 0x0000, 0x0000, 0xffff}, 00181 {0x0000, 0x0000, 0x0003, 0xffff}, 00182 {0x0000, 0x0000, 0x000f, 0xffff}, 00183 {0x0000, 0x0000, 0x003f, 0xffff}, 00184 {0x0000, 0x0000, 0x00ff, 0xffff}, 00185 {0x0000, 0x0000, 0x03ff, 0xffff}, 00186 {0x0000, 0x0000, 0x0fff, 0xffff}, 00187 {0x0000, 0x0000, 0x3fff, 0xffff}, 00188 {0x0000, 0x0000, 0xffff, 0xffff}, 00189 {0x0000, 0x0003, 0xffff, 0xffff}, 00190 {0x0000, 0x000f, 0xffff, 0xffff}, 00191 {0x0000, 0x003f, 0xffff, 0xffff}, 00192 {0x0000, 0x00ff, 0xffff, 0xffff}, 00193 {0x0000, 0x03ff, 0xffff, 0xffff}, 00194 {0x0000, 0x0fff, 0xffff, 0xffff}, 00195 {0x0000, 0x3fff, 0xffff, 0xffff}, 00196 {0x0000, 0xffff, 0xffff, 0xffff}, 00197 {0x0003, 0xffff, 0xffff, 0xffff}, 00198 {0x000f, 0xffff, 0xffff, 0xffff}, 00199 {0x003f, 0xffff, 0xffff, 0xffff}, 00200 {0x00ff, 0xffff, 0xffff, 0xffff}, 00201 {0x03ff, 0xffff, 0xffff, 0xffff}, 00202 {0x0fff, 0xffff, 0xffff, 0xffff}, 00203 {0x3fff, 0xffff, 0xffff, 0xffff}, 00204 {0x7fff, 0xffff, 0xffff, 0xfffe}, 00205 {0x7fff, 0xffff, 0xffff, 0xfff8}, 00206 {0x7fff, 0xffff, 0xffff, 0xffe0}, 00207 {0x7fff, 0xffff, 0xffff, 0xff80}, 00208 {0x7fff, 0xffff, 0xffff, 0xfe00}, 00209 {0x7fff, 0xffff, 0xffff, 0xf800}, 00210 {0x7fff, 0xffff, 0xffff, 0xe000}, 00211 {0x7fff, 0xffff, 0xffff, 0x8000}, 00212 {0x7fff, 0xffff, 0xfffe, 0x0000}, 00213 {0x7fff, 0xffff, 0xfff8, 0x0000}, 00214 {0x7fff, 0xffff, 0xffe0, 0x0000}, 00215 {0x7fff, 0xffff, 0xff80, 0x0000}, 00216 {0x7fff, 0xffff, 0xfe00, 0x0000}, 00217 {0x7fff, 0xffff, 0xf800, 0x0000}, 00218 {0x7fff, 0xffff, 0xe000, 0x0000}, 00219 {0x7fff, 0xffff, 0x8000, 0x0000}, 00220 {0x7fff, 0xfffe, 0x0000, 0x0000}, 00221 {0x7fff, 0xfff8, 0x0000, 0x0000}, 00222 {0x7fff, 0xffe0, 0x0000, 0x0000}, 00223 {0x7fff, 0xff80, 0x0000, 0x0000}, 00224 {0x7fff, 0xfe00, 0x0000, 0x0000}, 00225 {0x7fff, 0xf800, 0x0000, 0x0000}, 00226 {0x7fff, 0xe000, 0x0000, 0x0000}, 00227 {0x7fff, 0x8000, 0x0000, 0x0000}, 00228 {0x7ffe, 0x0000, 0x0000, 0x0000}, 00229 {0x7ff8, 0x0000, 0x0000, 0x0000}, 00230 {0x7fe0, 0x0000, 0x0000, 0x0000}, 00231 {0x7f80, 0x0000, 0x0000, 0x0000}, 00232 {0x7e00, 0x0000, 0x0000, 0x0000}, 00233 {0x7800, 0x0000, 0x0000, 0x0000}, 00234 {0x7000, 0x0000, 0x0000, 0x0000}, 00235 {0x6000, 0x0000, 0x0000, 0x0000}, 00236 {0x4000, 0x0000, 0x0000, 0x0000}, 00237 00238 /* shift 64 one bits through a 64-bit negative int */ 00239 {0x8000, 0x0000, 0x0000, 0x0001}, 00240 {0x8000, 0x0000, 0x0000, 0x0003}, 00241 {0x8000, 0x0000, 0x0000, 0x0007}, 00242 {0x8000, 0x0000, 0x0000, 0x000f}, 00243 {0x8000, 0x0000, 0x0000, 0x001f}, 00244 {0x8000, 0x0000, 0x0000, 0x007f}, 00245 {0x8000, 0x0000, 0x0000, 0x01ff}, 00246 {0x8000, 0x0000, 0x0000, 0x07ff}, 00247 {0x8000, 0x0000, 0x0000, 0x1fff}, 00248 {0x8000, 0x0000, 0x0000, 0x7fff}, 00249 {0x8000, 0x0000, 0x0001, 0xffff}, 00250 {0x8000, 0x0000, 0x0007, 0xffff}, 00251 {0x8000, 0x0000, 0x001f, 0xffff}, 00252 {0x8000, 0x0000, 0x007f, 0xffff}, 00253 {0x8000, 0x0000, 0x01ff, 0xffff}, 00254 {0x8000, 0x0000, 0x07ff, 0xffff}, 00255 {0x8000, 0x0000, 0x1fff, 0xffff}, 00256 {0x8000, 0x0000, 0x7fff, 0xffff}, 00257 {0x8000, 0x0001, 0xffff, 0xffff}, 00258 {0x8000, 0x0007, 0xffff, 0xffff}, 00259 {0x8000, 0x001f, 0xffff, 0xffff}, 00260 {0x8000, 0x007f, 0xffff, 0xffff}, 00261 {0x8000, 0x01ff, 0xffff, 0xffff}, 00262 {0x8000, 0x07ff, 0xffff, 0xffff}, 00263 {0x8000, 0x1fff, 0xffff, 0xffff}, 00264 {0x8000, 0x7fff, 0xffff, 0xffff}, 00265 {0x8001, 0xffff, 0xffff, 0xffff}, 00266 {0x8007, 0xffff, 0xffff, 0xffff}, 00267 {0x801f, 0xffff, 0xffff, 0xffff}, 00268 {0x807f, 0xffff, 0xffff, 0xffff}, 00269 {0x81ff, 0xffff, 0xffff, 0xffff}, 00270 {0x87ff, 0xffff, 0xffff, 0xffff}, 00271 {0x9fff, 0xffff, 0xffff, 0xffff}, 00272 {0xffff, 0xffff, 0xffff, 0xffff}, 00273 {0xffff, 0xffff, 0xffff, 0xfffc}, 00274 {0xffff, 0xffff, 0xffff, 0xfff0}, 00275 {0xffff, 0xffff, 0xffff, 0xffc0}, 00276 {0xffff, 0xffff, 0xffff, 0xff00}, 00277 {0xffff, 0xffff, 0xffff, 0xfc00}, 00278 {0xffff, 0xffff, 0xffff, 0xf000}, 00279 {0xffff, 0xffff, 0xffff, 0xc000}, 00280 {0xffff, 0xffff, 0xffff, 0x0000}, 00281 {0xffff, 0xffff, 0xfffc, 0x0000}, 00282 {0xffff, 0xffff, 0xfff0, 0x0000}, 00283 {0xffff, 0xffff, 0xffc0, 0x0000}, 00284 {0xffff, 0xffff, 0xff00, 0x0000}, 00285 {0xffff, 0xffff, 0xfc00, 0x0000}, 00286 {0xffff, 0xffff, 0xf000, 0x0000}, 00287 {0xffff, 0xffff, 0xc000, 0x0000}, 00288 {0xffff, 0xffff, 0x0000, 0x0000}, 00289 {0xffff, 0xfffc, 0x0000, 0x0000}, 00290 {0xffff, 0xfff0, 0x0000, 0x0000}, 00291 {0xffff, 0xffc0, 0x0000, 0x0000}, 00292 {0xffff, 0xff00, 0x0000, 0x0000}, 00293 {0xffff, 0xfc00, 0x0000, 0x0000}, 00294 {0xffff, 0xf000, 0x0000, 0x0000}, 00295 {0xffff, 0xc000, 0x0000, 0x0000}, 00296 {0xffff, 0x0000, 0x0000, 0x0000}, 00297 {0xfffc, 0x0000, 0x0000, 0x0000}, 00298 {0xfff0, 0x0000, 0x0000, 0x0000}, 00299 {0xffc0, 0x0000, 0x0000, 0x0000}, 00300 {0xff00, 0x0000, 0x0000, 0x0000}, 00301 {0xfc00, 0x0000, 0x0000, 0x0000}, 00302 {0xf000, 0x0000, 0x0000, 0x0000}, 00303 {0xe000, 0x0000, 0x0000, 0x0000}, 00304 {0xc000, 0x0000, 0x0000, 0x0000} 00305 }; 00306 int num_cool_ints = sizeof(cool_ints)/sizeof(AR_INT_64); 00307 00308 00309 AR_INT_64 dshift_vals[] = 00310 { 00311 {0x0000, 0x0000, 0x0000, 0x0000}, /* 0 */ 00312 {0x0000, 0x0000, 0x0000, 0x0001}, /* 1 */ 00313 {0x0000, 0x0000, 0x0000, 0x000a}, /* 10 */ 00314 {0x0000, 0x0000, 0x0000, 0x0010}, /* 16 */ 00315 {0x0000, 0x0000, 0x0000, 0x0015}, /* 20 */ 00316 {0x0000, 0x0000, 0x0000, 0x001f}, /* 31 */ 00317 {0x0000, 0x0000, 0x0000, 0x0020}, /* 32 */ 00318 {0x0000, 0x0000, 0x0000, 0x0021}, /* 33 */ 00319 {0x0000, 0x0000, 0x0000, 0x002b}, /* 44 */ 00320 {0x0000, 0x0000, 0x0000, 0x003f}, /* 63 */ 00321 {0x0000, 0x0000, 0x0000, 0x0040}, /* 64 */ 00322 {0x0000, 0x0000, 0x0000, 0x0041}, /* 65 */ 00323 {0xffff, 0xffff, 0xffff, 0xffff} /* -1 */ 00324 }; 00325 int num_dshift_vals = sizeof(dshift_vals)/sizeof(AR_INT_64); 00326 00327 00328 AR_TYPE ar_types[] = 00329 { 00330 AR_Int_8_S, 00331 AR_Int_8_U, 00332 AR_Int_16_S, 00333 AR_Int_16_U, 00334 AR_Int_24_S, 00335 AR_Int_24_U, 00336 AR_Int_32_S, 00337 AR_Int_32_U, 00338 AR_Int_46_S, 00339 AR_Int_64_S, 00340 AR_Int_64_U 00341 }; 00342 int num_ar_types = sizeof(ar_types) / sizeof(AR_TYPE); 00343 00344 #define IS_SUPPORTED_INT_TYPE(t) \ 00345 ((t) == AR_Int_8_S || (t) == AR_Int_8_U || \ 00346 (t) == AR_Int_16_S || (t) == AR_Int_16_U || \ 00347 (t) == AR_Int_32_S || (t) == AR_Int_32_U || \ 00348 (t) == AR_Int_46_S || \ 00349 (t) == AR_Int_64_S || (t) == AR_Int_64_U) 00350 00351 AR_TYPE sint8_artype = AR_Int_8_S; 00352 AR_TYPE uint8_artype = AR_Int_8_U; 00353 AR_TYPE sint16_artype = AR_Int_16_S; 00354 AR_TYPE uint16_artype = AR_Int_16_U; 00355 AR_TYPE sint24_artype = AR_Int_24_S; 00356 AR_TYPE uint24_artype = AR_Int_24_U; 00357 AR_TYPE sint32_artype = AR_Int_32_S; 00358 AR_TYPE uint32_artype = AR_Int_32_U; 00359 AR_TYPE sint46_artype = AR_Int_46_S; 00360 AR_TYPE sint64_artype = AR_Int_64_S; 00361 AR_TYPE uint64_artype = AR_Int_64_U; 00362 00363 SINT64 act_result [sizeof(cool_ints)/sizeof(AR_INT_64)]; 00364 int act_status [sizeof(cool_ints)/sizeof(AR_INT_64)]; 00365 00366 AR_INT_64 test_result[sizeof(cool_ints)/sizeof(AR_INT_64)]; 00367 int test_status[sizeof(cool_ints)/sizeof(AR_INT_64)]; 00368 00369 00370 /*======================================== 00371 * 00372 * SUN SUPPORT 00373 */ 00374 #if defined __sun 00375 /* 00376 * On the Sun, these are not intrinsics. Also, the Sun 64 bit ("long 00377 * long") shift code is limited to shifting by 0 .. 63 bits, so shift 00378 * counts of 64, and some of those of 0, have to be handled specially. 00379 */ 00380 static SINT64 _dshiftl(SINT64 op1, SINT64 op2, SINT64 shcnt) 00381 { 00382 SINT64 rshcnt = ((SINT64) 64) - shcnt; 00383 00384 if (shcnt == 0) 00385 return(op1); 00386 else if (shcnt == 64) 00387 return(op2); 00388 return((op1 << shcnt) | (((UINT64) op2) >> rshcnt)); 00389 } 00390 00391 static SINT64 _dshiftr(SINT64 op1, SINT64 op2, SINT64 shcnt) 00392 { 00393 SINT64 rshcnt = ((SINT64) 64) - shcnt; 00394 00395 if (shcnt == 0) 00396 return(op2); 00397 else if (shcnt == 64) 00398 return(op1); 00399 return((op1 << rshcnt) | (((UINT64) op2) >> shcnt)); 00400 } 00401 00402 static UINT64 shftl64(UINT64 op, SINT64 shcnt) 00403 { 00404 if (shcnt == 0) 00405 return(op); 00406 else if (shcnt == 64) 00407 return(0); 00408 return(op << shcnt); 00409 } 00410 00411 static UINT64 shftr64(UINT64 op, SINT64 shcnt) 00412 { 00413 if (shcnt == 0) 00414 return(op); 00415 else if (shcnt == 64) 00416 return(0); 00417 return(op >> shcnt); 00418 } 00419 00420 static SINT64 _mask(SINT64 bits) 00421 { 00422 /* 00423 * Kludge time ... 00424 * 00425 * Gcc 2.6.3 apparently has a bug, in that (~((UINT64) 0)) does 00426 * not, in fact generate 0xFFFFFFFFFFFFFFFF. Instead, it makes 00427 * a 0x00000000FFFFFFFF. The following is used to generate the 00428 * correct value instead. I would recommend switching to Sun's 00429 * unbundled ANSI cc, but it only #defines __STC__ as 1 when a 00430 * -Xc (strict ANSI compliance) switch is given, and in that 00431 * mode, it doesn't allow the "long long" types. 00432 */ 00433 union 00434 { 00435 AR_INT_64 u64p; 00436 UINT64 u64w; 00437 } u; 00438 00439 u.u64p.part1 = u.u64p.part2 = u.u64p.part3 = u.u64p.part4 = 0xFFFF; 00440 00441 if (bits > 0 && bits <= 63) 00442 return((SINT64) (u.u64w << (((SINT64) 64) - bits))); 00443 else if (bits >= 64 && bits < 128) 00444 return((SINT64) (u.u64w >> (bits - ((SINT64) 64)))); 00445 return(0); 00446 } 00447 00448 static SINT64 _leadz(SINT64 val) 00449 { 00450 int lz_bits; 00451 00452 if (val == 0) 00453 return(64); 00454 for (lz_bits = 0; val > 0; val <<= 1, lz_bits++) 00455 ; 00456 return((SINT64) lz_bits); 00457 } 00458 00459 static SINT64 _popcnt(SINT64 val) 00460 { 00461 int pop_bits, bit_count; 00462 00463 for (pop_bits = bit_count = 0; 00464 bit_count < 64; 00465 pop_bits += val & 0x1, val >>= 1, bit_count++) 00466 ; 00467 return((SINT64) pop_bits); 00468 } 00469 00470 static SINT64 _poppar(SINT64 val) 00471 { 00472 return(_popcnt(val) & ((SINT64) 0x1)); 00473 } 00474 #endif 00475 00476 00477 /*======================================== 00478 * 00479 * 8-BIT SUPPORT 00480 */ 00481 00482 /* 00483 * These un-sign-extend and sign-extend 8 bit values stored in 00484 * 64 bit integers. 00485 */ 00486 SINT64 DSEXT8(SINT64 v) 00487 { 00488 return(v & 0xFF); 00489 } 00490 00491 SINT64 SEXT8(SINT64 v) 00492 { 00493 return((( - ((v >> 7) & 0x1)) << 8) | DSEXT8(v)); 00494 } 00495 00496 00497 /* 00498 * These load a 8 bit value and if necessary sign extend it to 8 bits. 00499 */ 00500 SINT64 LS8(AR_INT_64 *vp) 00501 { 00502 return(SEXT8((UINT64) (vp->part4 & 0xFF))); 00503 } 00504 00505 UINT64 LU8(AR_INT_64 *vp) 00506 { 00507 return((UINT64) (vp->part4 & 0xFF)); 00508 } 00509 00510 00511 /* 00512 * This determines whether or not 8-bit values are zero/negative. 00513 */ 00514 #define is_zero8(v) (DSEXT8(v) == 0) 00515 #define is_neg8(v) (((v) & 0x80) != 0) 00516 00517 00518 /* 00519 * New 8-bit equivalents to the 64-bit intrinsics. 00520 */ 00521 static SINT64 _dshiftl8(SINT64 op1, SINT64 op2, SINT64 shcnt) 00522 { 00523 SINT64 rshcnt = ((SINT64) 8) - shcnt; 00524 00525 op2 &= 0xFF; 00526 return(((op1 << shcnt) | (op2 >> rshcnt)) & 0xFF); 00527 } 00528 00529 static SINT64 _dshiftr8(SINT64 op1, SINT64 op2, SINT64 shcnt) 00530 { 00531 SINT64 rshcnt = ((SINT64) 8) - shcnt; 00532 00533 op2 &= 0xFF; 00534 return(((op1 << rshcnt) | (op2 >> shcnt)) & 0xFF); 00535 } 00536 00537 static SINT64 _mask8(SINT64 bits) 00538 { 00539 bits &= 0xFF; 00540 if (bits > 0 && bits < 8) 00541 return((SINT64) ((0xFF << (((SINT64) 8) - bits)) & 0xFF)); 00542 else if (bits >= 8 && bits < 16) 00543 return((SINT64) (((UINT64) 0xFF) >> (bits - 8))); 00544 return(0); 00545 } 00546 00547 static SINT64 _leadz8(SINT64 val) 00548 { 00549 int lz_bits; 00550 00551 val <<= 56; 00552 if (val == 0) 00553 return(8); 00554 for (lz_bits = 0; val >= 0; val <<= 1) { 00555 lz_bits++; 00556 } 00557 return((SINT64) lz_bits); 00558 } 00559 00560 static SINT64 _popcnt8(SINT64 val) 00561 { 00562 int pop_bits, bit_count; 00563 00564 for (pop_bits = bit_count = 0; 00565 bit_count < 8; 00566 pop_bits += val & 0x1, val >>= 1, bit_count++) 00567 ; 00568 return((SINT64) pop_bits); 00569 } 00570 00571 static SINT64 _poppar8(SINT64 val) 00572 { 00573 return(_popcnt8(val) & ((SINT64) 0x1)); 00574 } 00575 00576 00577 /*======================================== 00578 * 00579 * 16-BIT SUPPORT 00580 */ 00581 00582 /* 00583 * These un-sign-extend and sign-extend 16 bit values stored in 00584 * 64 bit integers. 00585 */ 00586 SINT64 DSEXT16(SINT64 v) 00587 { 00588 return(v & 0xFFFF); 00589 } 00590 00591 SINT64 SEXT16(SINT64 v) 00592 { 00593 return((( - ((v >> 15) & 0x1)) << 16) | DSEXT16(v)); 00594 } 00595 00596 00597 /* 00598 * These load a 16 bit value and if necessary sign extend it to 16 bits. 00599 */ 00600 SINT64 LS16(AR_INT_64 *vp) 00601 { 00602 return(SEXT16((UINT64) vp->part4)); 00603 } 00604 00605 UINT64 LU16(AR_INT_64 *vp) 00606 { 00607 return((UINT64) vp->part4); 00608 } 00609 00610 00611 /* 00612 * This determines whether or not 16-bit values are zero/negative. 00613 */ 00614 #define is_zero16(v) (DSEXT16(v) == 0) 00615 #define is_neg16(v) (((v) & 0x8000) != 0) 00616 00617 00618 /* 00619 * New 16-bit equivalents to the 64-bit intrinsics. 00620 */ 00621 static SINT64 _dshiftl16(SINT64 op1, SINT64 op2, SINT64 shcnt) 00622 { 00623 SINT64 rshcnt = ((SINT64) 16) - shcnt; 00624 00625 op2 &= 0xFFFF; 00626 return(((op1 << shcnt) | (op2 >> rshcnt)) & 0xFFFF); 00627 } 00628 00629 static SINT64 _dshiftr16(SINT64 op1, SINT64 op2, SINT64 shcnt) 00630 { 00631 SINT64 rshcnt = ((SINT64) 16) - shcnt; 00632 00633 op2 &= 0xFFFF; 00634 return(((op1 << rshcnt) | (op2 >> shcnt)) & 0xFFFF); 00635 } 00636 00637 static SINT64 _mask16(SINT64 bits) 00638 { 00639 bits &= 0xFFFF; 00640 if (bits > 0 && bits < 16) 00641 return((SINT64) ((0xFFFF << (((SINT64) 16) - bits)) & 0xFFFF)); 00642 else if (bits >= 16 && bits < 32) 00643 return((SINT64) (((UINT64) 0xFFFF) >> (bits - 16))); 00644 return(0); 00645 } 00646 00647 static SINT64 _leadz16(SINT64 val) 00648 { 00649 int lz_bits; 00650 00651 val <<= 48; 00652 if (val == 0) 00653 return(16); 00654 for (lz_bits = 0; val >= 0; val <<= 1) { 00655 lz_bits++; 00656 } 00657 return((SINT64) lz_bits); 00658 } 00659 00660 static SINT64 _popcnt16(SINT64 val) 00661 { 00662 int pop_bits, bit_count; 00663 00664 for (pop_bits = bit_count = 0; 00665 bit_count < 16; 00666 pop_bits += val & 0x1, val >>= 1, bit_count++) 00667 ; 00668 return((SINT64) pop_bits); 00669 } 00670 00671 static SINT64 _poppar16(SINT64 val) 00672 { 00673 return(_popcnt16(val) & ((SINT64) 0x1)); 00674 } 00675 00676 00677 /*======================================== 00678 * 00679 * 32-BIT SUPPORT 00680 */ 00681 00682 /* 00683 * These un-sign-extend and sign-extend 32 bit values stored in 00684 * 64 bit integers. 00685 */ 00686 SINT64 DSEXT32(SINT64 v) 00687 { 00688 return(v & 0xFFFFFFFF); 00689 } 00690 00691 SINT64 SEXT32(SINT64 v) 00692 { 00693 return((( - ((v >> 31) & 0x1)) << 32) | DSEXT32(v)); 00694 } 00695 00696 00697 /* 00698 * These load a 32 bit value and if necessary sign extend it to 32 bits. 00699 */ 00700 SINT64 LS32(AR_INT_64 *vp) 00701 { 00702 return(SEXT32((((UINT64) vp->part3) << 16) | ((UINT64) vp->part4))); 00703 } 00704 00705 UINT64 LU32(AR_INT_64 *vp) 00706 { 00707 return((((UINT64) vp->part3) << 16) | (((UINT64) vp->part4))); 00708 } 00709 00710 00711 /* 00712 * This determines whether or not 32-bit values are zero/negative. 00713 */ 00714 #define is_zero32(v) (DSEXT32(v) == 0) 00715 #define is_neg32(v) (((v) & 0x80000000) != 0) 00716 00717 00718 /* 00719 * New 32-bit equivalents to the 64-bit intrinsics. 00720 */ 00721 static SINT64 _dshiftl32(SINT64 op1, SINT64 op2, SINT64 shcnt) 00722 { 00723 SINT64 rshcnt = ((SINT64) 32) - shcnt; 00724 00725 op2 &= 0xFFFFFFFF; 00726 return(((op1 << shcnt) | (op2 >> rshcnt)) & 0xFFFFFFFF); 00727 } 00728 00729 static SINT64 _dshiftr32(SINT64 op1, SINT64 op2, SINT64 shcnt) 00730 { 00731 SINT64 rshcnt = ((SINT64) 32) - shcnt; 00732 00733 op2 &= 0xFFFFFFFF; 00734 return(((op1 << rshcnt) | (op2 >> shcnt)) & 0xFFFFFFFF); 00735 } 00736 00737 static SINT64 _mask32(SINT64 bits) 00738 { 00739 bits &= 0xFFFFFFFF; 00740 if (bits > 0 && bits < 32) 00741 return((SINT64) ((0xFFFFFFFF << (((SINT64) 32) - bits)) & 0xFFFFFFFF)); 00742 else if (bits >= 32 && bits < 64) 00743 return((SINT64) (((UINT64) 0xFFFFFFFF) >> (bits - 32))); 00744 return(0); 00745 } 00746 00747 static SINT64 _leadz32(SINT64 val) 00748 { 00749 int lz_bits; 00750 00751 val <<= 32; 00752 if (val == 0) 00753 return(32); 00754 for (lz_bits = 0; val >= 0; val <<= 1) { 00755 lz_bits++; 00756 } 00757 return((SINT64) lz_bits); 00758 } 00759 00760 static SINT64 _popcnt32(SINT64 val) 00761 { 00762 int pop_bits, bit_count; 00763 00764 for (pop_bits = bit_count = 0; 00765 bit_count < 32; 00766 pop_bits += val & 0x1, val >>= 1, bit_count++) 00767 ; 00768 return((SINT64) pop_bits); 00769 } 00770 00771 static SINT64 _poppar32(SINT64 val) 00772 { 00773 return(_popcnt32(val) & ((SINT64) 0x1)); 00774 } 00775 00776 00777 /*======================================== 00778 * 00779 * 46-BIT SUPPORT 00780 */ 00781 00782 /* 00783 * These un-sign-extend and sign-extend 46 bit values stored in 00784 * 64 bit integers. They're no-ops, but they make writing the 00785 * code easier. 00786 */ 00787 SINT64 DSEXT46(SINT64 v) 00788 { 00789 return(v); 00790 } 00791 00792 SINT64 SEXT46(SINT64 v) 00793 { 00794 return(v); 00795 } 00796 00797 00798 /* 00799 * This determines whether or not 46-bit values are zero/negative. 00800 */ 00801 #define is_zero46(v) ((v) == 0) 00802 #define is_neg46(v) ((v) < 0) 00803 00804 00805 /* 00806 * New 46-bit equivalents to the 64-bit intrinsics. Also no-ops, 00807 * to make writing the code easier. 00808 */ 00809 static SINT64 _dshiftl46(SINT64 op1, SINT64 op2, SINT64 shcnt) 00810 { 00811 return(_dshiftl(op1, op2, shcnt)); 00812 } 00813 00814 static SINT64 _dshiftr46(SINT64 op1, SINT64 op2, SINT64 shcnt) 00815 { 00816 return(_dshiftr(op1, op2, shcnt)); 00817 } 00818 00819 static SINT64 _mask46(SINT64 bits) 00820 { 00821 return(_mask(bits)); 00822 } 00823 00824 static SINT64 _leadz46(SINT64 val) 00825 { 00826 return(_leadz(val)); 00827 } 00828 00829 static SINT64 _popcnt46(SINT64 val) 00830 { 00831 return(_popcnt(val)); 00832 } 00833 00834 static SINT64 _poppar46(SINT64 val) 00835 { 00836 return(_poppar(val)); 00837 } 00838 00839 00840 /*======================================== 00841 * 00842 * 64-BIT SUPPORT 00843 */ 00844 00845 /* 00846 * These un-sign-extend and sign-extend 64 bit values stored in 00847 * 64 bit integers. They're no-ops, but they make writing the 00848 * code easier. 00849 */ 00850 SINT64 DSEXT64(SINT64 v) 00851 { 00852 return(v); 00853 } 00854 00855 SINT64 SEXT64(SINT64 v) 00856 { 00857 return(v); 00858 } 00859 00860 00861 /* 00862 * This determines whether or not 64-bit values are zero/negative. 00863 */ 00864 #define is_zero64(v) ((v) == 0) 00865 #define is_neg64(v) ((v) < 0) 00866 00867 00868 /* 00869 * New 64-bit equivalents to the 64-bit intrinsics. Also no-ops, 00870 * to make writing the code easier. 00871 */ 00872 static SINT64 _dshiftl64(SINT64 op1, SINT64 op2, SINT64 shcnt) 00873 { 00874 return(_dshiftl(op1, op2, shcnt)); 00875 } 00876 00877 static SINT64 _dshiftr64(SINT64 op1, SINT64 op2, SINT64 shcnt) 00878 { 00879 return(_dshiftr(op1, op2, shcnt)); 00880 } 00881 00882 static SINT64 _mask64(SINT64 bits) 00883 { 00884 return(_mask(bits)); 00885 } 00886 00887 static SINT64 _leadz64(SINT64 val) 00888 { 00889 return(_leadz(val)); 00890 } 00891 00892 static SINT64 _popcnt64(SINT64 val) 00893 { 00894 return(_popcnt(val)); 00895 } 00896 00897 static SINT64 _poppar64(SINT64 val) 00898 { 00899 return(_poppar(val)); 00900 } 00901 00902 00903 main() 00904 { 00905 test_bitor(); 00906 test_bitand(); 00907 test_bitxor(); 00908 test_bitcomplement(); 00909 test_shiftl(); 00910 test_shiftr(); 00911 test_dshiftl(); 00912 test_dshiftr(); 00913 test_ishft(); 00914 test_ishftc(); 00915 test_ibits(); 00916 test_mask(); 00917 test_leadz(); 00918 test_popcnt(); 00919 test_poppar(); 00920 test_arstatus(); 00921 test_add(); 00922 test_subtract(); 00923 test_negate(); 00924 test_abs(); 00925 test_multiply(); 00926 test_divide(); 00927 test_modulo(); 00928 test_compare(); 00929 exit(0); 00930 } 00931 00932 00933 /*====================================================================== 00934 * 00935 * BIT OPERATORS 00936 * 00937 */ 00938 00939 #define TEST_BINARY_BIT_OP_SIGNED(size, opr, func) \ 00940 do { \ 00941 int i, j; \ 00942 \ 00943 printf(" Testing: SIGNED %2d INT %-10s: ", size, #opr); \ 00944 \ 00945 for (i=0; i<num_cool_ints; i++) \ 00946 { \ 00947 for (j=0; j<num_cool_ints; j++) \ 00948 { \ 00949 act_result[j] = DSEXT##size(LS##size(&cool_ints[i]) opr \ 00950 LS##size(&cool_ints[j])); \ 00951 \ 00952 act_status[j] = is_zero##size(act_result[j]) \ 00953 ? AR_STAT_ZERO : AR_STAT_OK; \ 00954 if (is_neg##size(act_result[j])) \ 00955 act_status[j] |= AR_STAT_NEGATIVE; \ 00956 \ 00957 test_result[j].part1 = 0; \ 00958 test_result[j].part2 = 0; \ 00959 test_result[j].part3 = 0; \ 00960 test_result[j].part4 = 0; \ 00961 \ 00962 test_status[j] = func((AR_DATA *)&test_result[j], \ 00963 &sint##size##_artype, \ 00964 (AR_DATA *)&cool_ints[i], \ 00965 &sint##size##_artype, \ 00966 (AR_DATA *)&cool_ints[j], \ 00967 &sint##size##_artype); \ 00968 \ 00969 if (LU64(&test_result[j]) != act_result[j]) \ 00970 { \ 00971 printf(" ERROR: incorrect result at %d,%d\n", i, j); \ 00972 abort(); \ 00973 } \ 00974 \ 00975 if (act_status[j] != test_status[j]) \ 00976 { \ 00977 printf(" ERROR: incorrect status at %d,%d\n", i, j); \ 00978 abort(); \ 00979 } \ 00980 } \ 00981 } \ 00982 \ 00983 printf("PASSED\n"); \ 00984 } while (0) 00985 00986 00987 #define TEST_BINARY_BIT_OP_UNSIGNED(size, opr, func) \ 00988 do { \ 00989 int i, j; \ 00990 \ 00991 printf(" Testing: UNSIGNED %2d INT %-10s: ", size, #opr); \ 00992 \ 00993 for (i=0; i<num_cool_ints; i++) \ 00994 { \ 00995 for (j=0; j<num_cool_ints; j++) \ 00996 { \ 00997 act_result[j] = DSEXT##size(LU##size(&cool_ints[i]) opr \ 00998 LU##size(&cool_ints[j])); \ 00999 \ 01000 act_status[j] = is_zero##size(act_result[j]) \ 01001 ? AR_STAT_ZERO \ 01002 : AR_STAT_OK; \ 01003 \ 01004 test_result[j].part1 = 0; \ 01005 test_result[j].part2 = 0; \ 01006 test_result[j].part3 = 0; \ 01007 test_result[j].part4 = 0; \ 01008 \ 01009 test_status[j] = func((AR_DATA *)&test_result[j], \ 01010 &uint##size##_artype, \ 01011 (AR_DATA *)&cool_ints[i], \ 01012 &uint##size##_artype, \ 01013 (AR_DATA *)&cool_ints[j], \ 01014 &uint##size##_artype); \ 01015 \ 01016 if (LU64(&test_result[j]) != (UINT64)act_result[j]) \ 01017 { \ 01018 printf(" ERROR: incorrect result at %d,%d\n", i, j); \ 01019 abort(); \ 01020 } \ 01021 \ 01022 if (act_status[j] != test_status[j]) \ 01023 { \ 01024 printf(" ERROR: incorrect status at %d,%d\n", i, j); \ 01025 abort(); \ 01026 } \ 01027 } \ 01028 } \ 01029 \ 01030 printf("PASSED\n"); \ 01031 } while (0) 01032 01033 01034 #define TEST_BINARY_BIT_OP_TYPES(opr, func) \ 01035 do { \ 01036 int i, j, k; \ 01037 \ 01038 printf(" Testing: types %-10s: ", #opr); \ 01039 \ 01040 for (i=0; i<num_ar_types; i++) \ 01041 { \ 01042 for (j=0; j<num_ar_types; j++) \ 01043 { \ 01044 for (k=0; k<num_ar_types; k++) \ 01045 { \ 01046 act_status[k] = AR_STAT_OK; \ 01047 if (ar_types[i] != ar_types[j] || \ 01048 ar_types[j] != ar_types[k] || \ 01049 !IS_SUPPORTED_INT_TYPE(ar_types[i])) \ 01050 act_status[k] = AR_STAT_INVALID_TYPE; \ 01051 \ 01052 test_status[k] = func((AR_DATA *)&test_result[1], \ 01053 &ar_types[i], \ 01054 (AR_DATA *)&cool_ints[1], \ 01055 &ar_types[j], \ 01056 (AR_DATA *)&cool_ints[1], \ 01057 &ar_types[k]); \ 01058 \ 01059 if ((act_status[k] ^ test_status[k]) & \ 01060 AR_STAT_INVALID_TYPE) \ 01061 { \ 01062 printf(" ERROR: incorrect status at %d,%d,%d\n", \ 01063 i, j, k); \ 01064 abort(); \ 01065 } \ 01066 } \ 01067 } \ 01068 } \ 01069 \ 01070 printf("PASSED\n"); \ 01071 } while (0) 01072 01073 01074 #define TEST_UNARY_BIT_OP_SIGNED(size, opr, func) \ 01075 do { \ 01076 int j; \ 01077 \ 01078 printf(" Testing: SIGNED %2d INT %-10s: ", size, #opr); \ 01079 \ 01080 for (j=0; j<num_cool_ints; j++) \ 01081 { \ 01082 act_result[j] = DSEXT##size(opr LS##size(&cool_ints[j])); \ 01083 \ 01084 act_status[j] = is_zero##size(act_result[j]) \ 01085 ? AR_STAT_ZERO \ 01086 : AR_STAT_OK; \ 01087 if (is_neg##size(act_result[j])) \ 01088 act_status[j] |= AR_STAT_NEGATIVE; \ 01089 \ 01090 test_result[j].part1 = 0; \ 01091 test_result[j].part2 = 0; \ 01092 test_result[j].part3 = 0; \ 01093 test_result[j].part4 = 0; \ 01094 \ 01095 test_status[j] = func((AR_DATA *)&test_result[j], \ 01096 &sint##size##_artype, \ 01097 (AR_DATA *)&cool_ints[j], \ 01098 &sint##size##_artype); \ 01099 \ 01100 if (LU64(&test_result[j]) != act_result[j]) \ 01101 { \ 01102 printf(" ERROR: incorrect result at %d\n", j); \ 01103 abort(); \ 01104 } \ 01105 \ 01106 if (act_status[j] != test_status[j]) \ 01107 { \ 01108 printf(" ERROR: incorrect status at %d\n", j); \ 01109 abort(); \ 01110 } \ 01111 } \ 01112 \ 01113 printf("PASSED\n"); \ 01114 } while (0) 01115 01116 01117 #define TEST_UNARY_BIT_OP_UNSIGNED(size, opr, func) \ 01118 do { \ 01119 int j; \ 01120 \ 01121 printf(" Testing: UNSIGNED %2d INT %-10s: ", size, #opr); \ 01122 \ 01123 for (j=0; j<num_cool_ints; j++) \ 01124 { \ 01125 act_result[j] = DSEXT##size(opr LU##size(&cool_ints[j])); \ 01126 \ 01127 act_status[j] = is_zero##size(act_result[j]) \ 01128 ? AR_STAT_ZERO \ 01129 : AR_STAT_OK; \ 01130 \ 01131 test_result[j].part1 = 0; \ 01132 test_result[j].part2 = 0; \ 01133 test_result[j].part3 = 0; \ 01134 test_result[j].part4 = 0; \ 01135 \ 01136 test_status[j] = func((AR_DATA *)&test_result[j], \ 01137 &uint##size##_artype, \ 01138 (AR_DATA *)&cool_ints[j], \ 01139 &uint##size##_artype); \ 01140 \ 01141 if (LU64(&test_result[j]) != (UINT64)act_result[j]) \ 01142 { \ 01143 printf(" ERROR: incorrect result at %d\n", j); \ 01144 abort(); \ 01145 } \ 01146 \ 01147 if (act_status[j] != test_status[j]) \ 01148 { \ 01149 printf(" ERROR: incorrect status at %d\n", j); \ 01150 abort(); \ 01151 } \ 01152 } \ 01153 \ 01154 printf("PASSED\n"); \ 01155 } while (0) 01156 01157 01158 #define TEST_UNARY_BIT_OP_TYPES(opr, func) \ 01159 do { \ 01160 int j, k; \ 01161 \ 01162 printf(" Testing: types %-10s: ", #opr); \ 01163 \ 01164 for (j=0; j<num_ar_types; j++) \ 01165 { \ 01166 for (k=0; k<num_ar_types; k++) \ 01167 { \ 01168 act_status[k] = AR_STAT_OK; \ 01169 if (ar_types[j] != ar_types[k] || \ 01170 !IS_SUPPORTED_INT_TYPE(ar_types[j])) \ 01171 act_status[k] = AR_STAT_INVALID_TYPE; \ 01172 \ 01173 test_status[k] = func((AR_DATA *)&test_result[1], \ 01174 &ar_types[j], \ 01175 (AR_DATA *)&cool_ints[1], \ 01176 &ar_types[k]); \ 01177 \ 01178 if ((act_status[k] ^ test_status[k]) & \ 01179 AR_STAT_INVALID_TYPE) \ 01180 { \ 01181 printf(" ERROR: incorrect status at %d,%d\n", j, k); \ 01182 abort(); \ 01183 } \ 01184 } \ 01185 } \ 01186 \ 01187 printf("PASSED\n"); \ 01188 } while (0) 01189 01190 01191 test_bitor() 01192 { 01193 01194 TEST_BINARY_BIT_OP_SIGNED( 8, |, AR_bitor ); 01195 TEST_BINARY_BIT_OP_UNSIGNED( 8, |, AR_bitor ); 01196 01197 TEST_BINARY_BIT_OP_SIGNED( 16, |, AR_bitor ); 01198 TEST_BINARY_BIT_OP_UNSIGNED(16, |, AR_bitor ); 01199 01200 TEST_BINARY_BIT_OP_SIGNED( 32, |, AR_bitor ); 01201 TEST_BINARY_BIT_OP_UNSIGNED(32, |, AR_bitor ); 01202 01203 TEST_BINARY_BIT_OP_SIGNED( 46, |, AR_bitor ); 01204 01205 TEST_BINARY_BIT_OP_SIGNED( 64, |, AR_bitor ); 01206 TEST_BINARY_BIT_OP_UNSIGNED(64, |, AR_bitor ); 01207 01208 TEST_BINARY_BIT_OP_TYPES( |, AR_bitor ); 01209 01210 } /* test_bitor */ 01211 01212 01213 test_bitand() 01214 { 01215 01216 TEST_BINARY_BIT_OP_SIGNED( 8, &, AR_bitand); 01217 TEST_BINARY_BIT_OP_UNSIGNED( 8, &, AR_bitand); 01218 01219 TEST_BINARY_BIT_OP_SIGNED( 16, &, AR_bitand); 01220 TEST_BINARY_BIT_OP_UNSIGNED(16, &, AR_bitand); 01221 01222 TEST_BINARY_BIT_OP_SIGNED( 32, &, AR_bitand); 01223 TEST_BINARY_BIT_OP_UNSIGNED(32, &, AR_bitand); 01224 01225 TEST_BINARY_BIT_OP_SIGNED( 46, &, AR_bitand); 01226 01227 TEST_BINARY_BIT_OP_SIGNED( 64, &, AR_bitand); 01228 TEST_BINARY_BIT_OP_UNSIGNED(64, &, AR_bitand); 01229 01230 TEST_BINARY_BIT_OP_TYPES( &, AR_bitand); 01231 01232 } /* test_bitand */ 01233 01234 01235 test_bitxor() 01236 { 01237 01238 TEST_BINARY_BIT_OP_SIGNED( 8, ^, AR_bitxor); 01239 TEST_BINARY_BIT_OP_UNSIGNED( 8, ^, AR_bitxor); 01240 01241 TEST_BINARY_BIT_OP_SIGNED( 16, ^, AR_bitxor); 01242 TEST_BINARY_BIT_OP_UNSIGNED(16, ^, AR_bitxor); 01243 01244 TEST_BINARY_BIT_OP_SIGNED( 32, ^, AR_bitxor); 01245 TEST_BINARY_BIT_OP_UNSIGNED(32, ^, AR_bitxor); 01246 01247 TEST_BINARY_BIT_OP_SIGNED( 46, ^, AR_bitxor); 01248 01249 TEST_BINARY_BIT_OP_SIGNED( 64, ^, AR_bitxor); 01250 TEST_BINARY_BIT_OP_UNSIGNED(64, ^, AR_bitxor); 01251 01252 TEST_BINARY_BIT_OP_TYPES( ^, AR_bitxor); 01253 01254 } /* test_bitxor */ 01255 01256 01257 test_bitcomplement() 01258 { 01259 01260 TEST_UNARY_BIT_OP_SIGNED( 8, ~, AR_bitcomplement); 01261 TEST_UNARY_BIT_OP_UNSIGNED( 8, ~, AR_bitcomplement); 01262 01263 TEST_UNARY_BIT_OP_SIGNED( 16, ~, AR_bitcomplement); 01264 TEST_UNARY_BIT_OP_UNSIGNED(16, ~, AR_bitcomplement); 01265 01266 TEST_UNARY_BIT_OP_SIGNED( 32, ~, AR_bitcomplement); 01267 TEST_UNARY_BIT_OP_UNSIGNED(32, ~, AR_bitcomplement); 01268 01269 TEST_UNARY_BIT_OP_SIGNED( 46, ~, AR_bitcomplement); 01270 01271 TEST_UNARY_BIT_OP_SIGNED( 64, ~, AR_bitcomplement); 01272 TEST_UNARY_BIT_OP_UNSIGNED(64, ~, AR_bitcomplement); 01273 01274 TEST_UNARY_BIT_OP_TYPES( ~, AR_bitcomplement); 01275 01276 } /* test_bitcomplement */ 01277 01278 01279 #undef TEST_BINARY_BIT_OP_SIGNED 01280 #undef TEST_BINARY_BIT_OP_UNSIGNED 01281 #undef TEST_BINARY_BIT_OP_TYPES 01282 #undef TEST_UNARY_BIT_OP_SIGNED 01283 #undef TEST_UNARY_BIT_OP_UNSIGNED 01284 #undef TEST_UNARY_BIT_OP_TYPES 01285 01286 01287 /*====================================================================== 01288 * 01289 * SHIFT OPERATORS 01290 * 01291 */ 01292 01293 #define TEST_SHIFT_OP_SIGNED(size, max_shift, opr, func) \ 01294 do { \ 01295 int i, j; \ 01296 \ 01297 printf(" Testing: SIGNED %2d INT %-10s: ", size, #opr); \ 01298 \ 01299 for (i=0; i<num_cool_ints; i++) \ 01300 { \ 01301 for (j=0; j<num_cool_ints; j++) \ 01302 { \ 01303 if (LS##size(&cool_ints[j]) >= max_shift || \ 01304 LS##size(&cool_ints[j]) < 0) \ 01305 { /* status is undefined, result is zero */ \ 01306 act_status[j] = AR_STAT_UNDEFINED; \ 01307 act_result[j] = 0; \ 01308 } \ 01309 else \ 01310 { \ 01311 act_result[j] = DSEXT##size(LS##size(&cool_ints[i]) opr \ 01312 LS##size(&cool_ints[j])); \ 01313 \ 01314 if (size >= 46 && \ 01315 strcmp(#opr, ">>") == 0 && \ 01316 LS64(&cool_ints[i]) < 0) \ 01317 { /* the first operand is negative */ \ 01318 /* fill vacated bit(s) with sign bit */ \ 01319 act_result[j] |= (SINT64) \ 01320 ~(-1 >> LS46(&cool_ints[j])); \ 01321 } \ 01322 \ 01323 act_status[j] = is_zero##size(act_result[j]) \ 01324 ? AR_STAT_ZERO \ 01325 : AR_STAT_OK; \ 01326 if (is_neg##size(act_result[j])) \ 01327 act_status[j] |= AR_STAT_NEGATIVE; \ 01328 } \ 01329 \ 01330 test_result[j].part1 = 0; \ 01331 test_result[j].part2 = 0; \ 01332 test_result[j].part3 = 0; \ 01333 test_result[j].part4 = 0; \ 01334 \ 01335 test_status[j] = func((AR_DATA *)&test_result[j], \ 01336 &sint##size##_artype, \ 01337 (AR_DATA *)&cool_ints[i], \ 01338 &sint##size##_artype, \ 01339 (AR_DATA *)&cool_ints[j], \ 01340 &sint##size##_artype); \ 01341 \ 01342 if (LU64(&test_result[j]) != act_result[j]) \ 01343 { \ 01344 printf(" ERROR: incorrect result at %d,%d\n", i, j); \ 01345 abort(); \ 01346 } \ 01347 \ 01348 if (act_status[j] != test_status[j]) \ 01349 { \ 01350 printf(" ERROR: incorrect status at %d,%d\n", i, j); \ 01351 abort(); \ 01352 } \ 01353 } \ 01354 } \ 01355 \ 01356 printf("PASSED\n"); \ 01357 } while (0) 01358 01359 01360 #define TEST_SHIFT_OP_UNSIGNED(size, max_shift, opr, func) \ 01361 do { \ 01362 int i, j; \ 01363 \ 01364 printf(" Testing: UNSIGNED %2d INT %-10s: ", size, #opr); \ 01365 \ 01366 for (i=0; i<num_cool_ints; i++) \ 01367 { \ 01368 for (j=0; j<num_cool_ints; j++) \ 01369 { \ 01370 if (LU##size(&cool_ints[j]) >= max_shift) \ 01371 { /* status is undefined, result is zero */ \ 01372 act_status[j] = AR_STAT_UNDEFINED; \ 01373 act_result[j] = 0; \ 01374 } \ 01375 else \ 01376 { \ 01377 act_result[j] = DSEXT##size(LU##size(&cool_ints[i]) opr \ 01378 LU##size(&cool_ints[j])); \ 01379 \ 01380 act_status[j] = is_zero##size(act_result[j]) \ 01381 ? AR_STAT_ZERO \ 01382 : AR_STAT_OK; \ 01383 } \ 01384 \ 01385 test_result[j].part1 = 0; \ 01386 test_result[j].part2 = 0; \ 01387 test_result[j].part3 = 0; \ 01388 test_result[j].part4 = 0; \ 01389 \ 01390 test_status[j] = func((AR_DATA *)&test_result[j], \ 01391 &uint##size##_artype, \ 01392 (AR_DATA *)&cool_ints[i], \ 01393 &uint##size##_artype, \ 01394 (AR_DATA *)&cool_ints[j], \ 01395 &uint##size##_artype); \ 01396 \ 01397 if (LU64(&test_result[j]) != (UINT64)act_result[j]) \ 01398 { \ 01399 printf(" ERROR: incorrect result at %d,%d\n", i, j); \ 01400 abort(); \ 01401 } \ 01402 \ 01403 if (act_status[j] != test_status[j]) \ 01404 { \ 01405 printf(" ERROR: incorrect status at %d,%d\n", i, j); \ 01406 abort(); \ 01407 } \ 01408 } \ 01409 } \ 01410 \ 01411 printf("PASSED\n"); \ 01412 } while (0) 01413 01414 01415 #define TEST_SHIFT_OP_TYPES(opr, func) \ 01416 do { \ 01417 int i, j, k; \ 01418 \ 01419 printf(" Testing: types %-10s: ", #opr); \ 01420 \ 01421 for (i=0; i<num_ar_types; i++) \ 01422 { \ 01423 for (j=0; j<num_ar_types; j++) \ 01424 { \ 01425 for (k=0; k<num_ar_types; k++) \ 01426 { \ 01427 act_status[k] = AR_STAT_OK; \ 01428 if (ar_types[i] != ar_types[j] || \ 01429 !IS_SUPPORTED_INT_TYPE(ar_types[i])) \ 01430 act_status[k] = AR_STAT_INVALID_TYPE; \ 01431 \ 01432 test_status[k] = func((AR_DATA *)&test_result[1], \ 01433 &ar_types[i], \ 01434 (AR_DATA *)&cool_ints[1], \ 01435 &ar_types[j], \ 01436 (AR_DATA *)&cool_ints[1], \ 01437 &ar_types[k]); \ 01438 \ 01439 if ((act_status[k] ^ test_status[k]) & \ 01440 AR_STAT_INVALID_TYPE) \ 01441 { \ 01442 printf(" ERROR: incorrect status at %d,%d,%d\n", \ 01443 i, j, k); \ 01444 abort(); \ 01445 } \ 01446 } \ 01447 } \ 01448 } \ 01449 \ 01450 printf("PASSED\n"); \ 01451 } while (0) 01452 01453 01454 test_shiftl() 01455 { 01456 01457 TEST_SHIFT_OP_SIGNED( 8, 8, <<, AR_shiftl); 01458 TEST_SHIFT_OP_UNSIGNED( 8, 8, <<, AR_shiftl); 01459 01460 TEST_SHIFT_OP_SIGNED( 16, 16, <<, AR_shiftl); 01461 TEST_SHIFT_OP_UNSIGNED(16, 16, <<, AR_shiftl); 01462 01463 TEST_SHIFT_OP_SIGNED( 32, 32, <<, AR_shiftl); 01464 TEST_SHIFT_OP_UNSIGNED(32, 32, <<, AR_shiftl); 01465 01466 TEST_SHIFT_OP_SIGNED( 46, 64, <<, AR_shiftl); 01467 01468 TEST_SHIFT_OP_SIGNED( 64, 64, <<, AR_shiftl); 01469 TEST_SHIFT_OP_UNSIGNED(64, 64, <<, AR_shiftl); 01470 01471 TEST_SHIFT_OP_TYPES( <<, AR_shiftl); 01472 01473 } /* test_shiftl */ 01474 01475 01476 test_shiftr() 01477 { 01478 01479 TEST_SHIFT_OP_SIGNED( 8, 8, >>, AR_shiftr); 01480 TEST_SHIFT_OP_UNSIGNED( 8, 8, >>, AR_shiftr); 01481 01482 TEST_SHIFT_OP_SIGNED( 16, 16, >>, AR_shiftr); 01483 TEST_SHIFT_OP_UNSIGNED(16, 16, >>, AR_shiftr); 01484 01485 TEST_SHIFT_OP_SIGNED( 32, 32, >>, AR_shiftr); 01486 TEST_SHIFT_OP_UNSIGNED(32, 32, >>, AR_shiftr); 01487 01488 TEST_SHIFT_OP_SIGNED( 46, 64, >>, AR_shiftr); 01489 01490 TEST_SHIFT_OP_SIGNED( 64, 64, >>, AR_shiftr); 01491 TEST_SHIFT_OP_UNSIGNED(64, 64, >>, AR_shiftr); 01492 01493 TEST_SHIFT_OP_TYPES( >>, AR_shiftr); 01494 01495 } /* test_shiftr */ 01496 01497 01498 #undef TEST_SHIFT_OP_SIGNED 01499 #undef TEST_SHIFT_OP_UNSIGNED 01500 #undef TEST_SHIFT_OP_TYPES 01501 01502 01503 #define TEST_DSHIFT_OP_SIGNED(size, max_shift, opr) \ 01504 do { \ 01505 int i, j, k; \ 01506 \ 01507 printf(" Testing: SIGNED %2d INT %-10s: ", size, #opr); \ 01508 \ 01509 for (i=0; i<num_cool_ints; i++) \ 01510 { \ 01511 for (j=0; j<num_cool_ints; j++) \ 01512 { \ 01513 for (k=0; k<num_dshift_vals; k++) \ 01514 { \ 01515 if (LS##size(&dshift_vals[k]) > max_shift || \ 01516 LS##size(&dshift_vals[k]) < 0) \ 01517 { /* status is undefined, result is zero */ \ 01518 act_status[k] = AR_STAT_UNDEFINED; \ 01519 act_result[k] = 0; \ 01520 } \ 01521 else \ 01522 { \ 01523 act_result[k] = DSEXT##size( \ 01524 opr##size( \ 01525 LS##size(&cool_ints[i]), \ 01526 LS##size(&cool_ints[j]), \ 01527 LS##size(&dshift_vals[k]))); \ 01528 \ 01529 act_status[k] = is_zero##size(act_result[k]) \ 01530 ? AR_STAT_ZERO \ 01531 : AR_STAT_OK; \ 01532 if (is_neg##size(act_result[k])) \ 01533 act_status[k] |= AR_STAT_NEGATIVE; \ 01534 } \ 01535 \ 01536 test_result[k].part1 = 0; \ 01537 test_result[k].part2 = 0; \ 01538 test_result[k].part3 = 0; \ 01539 test_result[k].part4 = 0; \ 01540 \ 01541 test_status[k] = AR##opr((AR_DATA *)&test_result[k], \ 01542 &sint##size##_artype, \ 01543 (AR_DATA *)&cool_ints[i], \ 01544 &sint##size##_artype, \ 01545 (AR_DATA *)&cool_ints[j], \ 01546 &sint##size##_artype, \ 01547 (AR_DATA *)&dshift_vals[k], \ 01548 &sint##size##_artype); \ 01549 \ 01550 if (LU64(&test_result[k]) != (UINT64)act_result[k]) \ 01551 { \ 01552 printf(" ERROR: incorrect result at %d,%d,%d\n", \ 01553 i, j, k); \ 01554 abort(); \ 01555 } \ 01556 \ 01557 if (act_status[k] != test_status[k]) \ 01558 { \ 01559 printf(" ERROR: incorrect status at %d,%d,%d\n", \ 01560 i, j, k); \ 01561 abort(); \ 01562 } \ 01563 } \ 01564 } \ 01565 } \ 01566 \ 01567 printf("PASSED\n"); \ 01568 } while (0) 01569 01570 01571 #define TEST_DSHIFT_OP_UNSIGNED(size, max_shift, opr) \ 01572 do { \ 01573 int i, j, k; \ 01574 \ 01575 printf(" Testing: UNSIGNED %2d INT %-10s: ", size, #opr); \ 01576 \ 01577 for (i=0; i<num_cool_ints; i++) \ 01578 { \ 01579 for (j=0; j<num_cool_ints; j++) \ 01580 { \ 01581 for (k=0; k<num_dshift_vals; k++) \ 01582 { \ 01583 if (LU##size(&dshift_vals[k]) > max_shift) \ 01584 { /* status is undefined, result is zero */ \ 01585 act_status[k] = AR_STAT_UNDEFINED; \ 01586 act_result[k] = 0; \ 01587 } \ 01588 else \ 01589 { \ 01590 act_result[k] = DSEXT##size( \ 01591 opr##size( \ 01592 LU##size(&cool_ints[i]), \ 01593 LU##size(&cool_ints[j]), \ 01594 LU##size(&dshift_vals[k]))); \ 01595 \ 01596 act_status[k] = is_zero##size(act_result[k]) \ 01597 ? AR_STAT_ZERO \ 01598 : AR_STAT_OK; \ 01599 } \ 01600 \ 01601 test_result[k].part1 = 0; \ 01602 test_result[k].part2 = 0; \ 01603 test_result[k].part3 = 0; \ 01604 test_result[k].part4 = 0; \ 01605 \ 01606 test_status[k] = AR##opr((AR_DATA *)&test_result[k], \ 01607 &uint##size##_artype, \ 01608 (AR_DATA *)&cool_ints[i], \ 01609 &uint##size##_artype, \ 01610 (AR_DATA *)&cool_ints[j], \ 01611 &uint##size##_artype, \ 01612 (AR_DATA *)&dshift_vals[k], \ 01613 &uint##size##_artype); \ 01614 \ 01615 if (LU64(&test_result[k]) != (UINT64)act_result[k]) \ 01616 { \ 01617 printf(" ERROR: incorrect result at %d,%d,%d\n", \ 01618 i, j, k); \ 01619 abort(); \ 01620 } \ 01621 \ 01622 if (act_status[k] != test_status[k]) \ 01623 { \ 01624 printf(" ERROR: incorrect status at %d,%d,%d\n", \ 01625 i, j, k); \ 01626 abort(); \ 01627 } \ 01628 } \ 01629 } \ 01630 } \ 01631 \ 01632 printf("PASSED\n"); \ 01633 } while (0) 01634 01635 01636 #define TEST_DSHIFT_OP_TYPES(opr) \ 01637 do { \ 01638 int h, i, j, k; \ 01639 \ 01640 printf(" Testing: types %-10s: ", #opr); \ 01641 \ 01642 for (h=0; h<num_ar_types; h++) \ 01643 { \ 01644 for (i=0; i<num_ar_types; i++) \ 01645 { \ 01646 for (j=0; j<num_ar_types; j++) \ 01647 { \ 01648 for (k=0; k<num_ar_types; k++) \ 01649 { \ 01650 act_status[k] = AR_STAT_OK; \ 01651 if (ar_types[h] != ar_types[i] || \ 01652 ar_types[i] != ar_types[j] || \ 01653 !IS_SUPPORTED_INT_TYPE(ar_types[h])) \ 01654 act_status[k] = AR_STAT_INVALID_TYPE; \ 01655 \ 01656 test_status[k] = AR##opr((AR_DATA *)&test_result[1], \ 01657 &ar_types[h], \ 01658 (AR_DATA *)&cool_ints[1], \ 01659 &ar_types[i], \ 01660 (AR_DATA *)&cool_ints[1], \ 01661 &ar_types[j], \ 01662 (AR_DATA *)&dshift_vals[1], \ 01663 &ar_types[k]); \ 01664 \ 01665 if ((act_status[k] ^ test_status[k]) & \ 01666 AR_STAT_INVALID_TYPE) { \ 01667 printf(" ERROR: incorrect status at " \ 01668 "%d,%d,%d,%d\n", \ 01669 h, i, j, k); \ 01670 abort(); \ 01671 } \ 01672 } \ 01673 } \ 01674 } \ 01675 } \ 01676 \ 01677 printf("PASSED\n"); \ 01678 } while (0) 01679 01680 01681 test_dshiftl() 01682 { 01683 01684 TEST_DSHIFT_OP_SIGNED( 8, 8, _dshiftl); 01685 TEST_DSHIFT_OP_UNSIGNED( 8, 8, _dshiftl); 01686 01687 TEST_DSHIFT_OP_SIGNED( 16, 16, _dshiftl); 01688 TEST_DSHIFT_OP_UNSIGNED(16, 16, _dshiftl); 01689 01690 TEST_DSHIFT_OP_SIGNED( 32, 32, _dshiftl); 01691 TEST_DSHIFT_OP_UNSIGNED(32, 32, _dshiftl); 01692 01693 TEST_DSHIFT_OP_SIGNED( 46, 64, _dshiftl); 01694 01695 TEST_DSHIFT_OP_SIGNED( 64, 64, _dshiftl); 01696 TEST_DSHIFT_OP_UNSIGNED(64, 64, _dshiftl); 01697 01698 TEST_DSHIFT_OP_TYPES( _dshiftl); 01699 01700 } /* test_dshiftl */ 01701 01702 01703 test_dshiftr() 01704 { 01705 01706 TEST_DSHIFT_OP_SIGNED( 8, 8, _dshiftr); 01707 TEST_DSHIFT_OP_UNSIGNED( 8, 8, _dshiftr); 01708 01709 TEST_DSHIFT_OP_SIGNED( 16, 16, _dshiftr); 01710 TEST_DSHIFT_OP_UNSIGNED(16, 16, _dshiftr); 01711 01712 TEST_DSHIFT_OP_SIGNED( 32, 32, _dshiftr); 01713 TEST_DSHIFT_OP_UNSIGNED(32, 32, _dshiftr); 01714 01715 TEST_DSHIFT_OP_SIGNED( 46, 64, _dshiftr); 01716 01717 TEST_DSHIFT_OP_SIGNED( 64, 64, _dshiftr); 01718 TEST_DSHIFT_OP_UNSIGNED(64, 64, _dshiftr); 01719 01720 TEST_DSHIFT_OP_TYPES( _dshiftr); 01721 01722 } /* test_dshiftr */ 01723 01724 01725 #undef TEST_DSHIFT_OP_SIGNED 01726 #undef TEST_DSHIFT_OP_UNSIGNED 01727 #undef TEST_DSHIFT_OP_TYPES 01728 01729 01730 static 01731 void 01732 test_ishft_signed(int size) 01733 { 01734 int i, j; 01735 01736 printf(" Testing: SIGNED %2d INT %-10s: ", size, "ISHFT"); 01737 01738 for (i=0; i<num_cool_ints; i++) 01739 { 01740 for (j=0; j<num_cool_ints; j++) 01741 { 01742 SINT64 shift; 01743 01744 test_result[j].part1 = 0; 01745 test_result[j].part2 = 0; 01746 test_result[j].part3 = 0; 01747 test_result[j].part4 = 0; 01748 01749 switch (size) 01750 { 01751 case 8: 01752 shift = LS8(&cool_ints[j]); 01753 if ((shift > 0 && shift > size) || 01754 (shift < 0 && shift < -size)) 01755 { /* status is undefined, result is zero */ 01756 act_status[j] = AR_STAT_UNDEFINED; 01757 act_result[j] = 0; 01758 } 01759 else 01760 { 01761 if (shift > 0) 01762 act_result[j] = DSEXT8(LU8(&cool_ints[i]) << 01763 shift); 01764 else 01765 act_result[j] = DSEXT8(LU8(&cool_ints[i]) >> 01766 (-shift)); 01767 01768 act_status[j] = is_zero8(act_result[j]) 01769 ? AR_STAT_ZERO 01770 : AR_STAT_OK; 01771 if (is_neg8(act_result[j])) 01772 act_status[j] |= AR_STAT_NEGATIVE; 01773 } 01774 01775 test_status[j] = AR_ishft((AR_DATA *)&test_result[j], 01776 &sint8_artype, 01777 (AR_DATA *)&cool_ints[i], 01778 &sint8_artype, 01779 (AR_DATA *)&cool_ints[j], 01780 &sint8_artype); 01781 break; 01782 01783 case 16: 01784 shift = LS16(&cool_ints[j]); 01785 if ((shift > 0 && shift > size) || 01786 (shift < 0 && shift < -size)) 01787 { /* status is undefined, result is zero */ 01788 act_status[j] = AR_STAT_UNDEFINED; 01789 act_result[j] = 0; 01790 } 01791 else 01792 { 01793 if (shift > 0) 01794 act_result[j] = DSEXT16(LU16(&cool_ints[i]) << 01795 shift); 01796 else 01797 act_result[j] = DSEXT16(LU16(&cool_ints[i]) >> 01798 (-shift)); 01799 01800 act_status[j] = is_zero16(act_result[j]) 01801 ? AR_STAT_ZERO 01802 : AR_STAT_OK; 01803 if (is_neg16(act_result[j])) 01804 act_status[j] |= AR_STAT_NEGATIVE; 01805 } 01806 01807 test_status[j] = AR_ishft((AR_DATA *)&test_result[j], 01808 &sint16_artype, 01809 (AR_DATA *)&cool_ints[i], 01810 &sint16_artype, 01811 (AR_DATA *)&cool_ints[j], 01812 &sint16_artype); 01813 break; 01814 01815 case 32: 01816 shift = LS32(&cool_ints[j]); 01817 if ((shift > 0 && shift > size) || 01818 (shift < 0 && shift < -size)) 01819 { /* status is undefined, result is zero */ 01820 act_status[j] = AR_STAT_UNDEFINED; 01821 act_result[j] = 0; 01822 } 01823 else 01824 { 01825 if (shift > 0) 01826 act_result[j] = DSEXT32(LU32(&cool_ints[i]) << 01827 shift); 01828 else 01829 act_result[j] = DSEXT32(LU32(&cool_ints[i]) >> 01830 (-shift)); 01831 01832 act_status[j] = is_zero32(act_result[j]) 01833 ? AR_STAT_ZERO 01834 : AR_STAT_OK; 01835 if (is_neg32(act_result[j])) 01836 act_status[j] |= AR_STAT_NEGATIVE; 01837 } 01838 01839 test_status[j] = AR_ishft((AR_DATA *)&test_result[j], 01840 &sint32_artype, 01841 (AR_DATA *)&cool_ints[i], 01842 &sint32_artype, 01843 (AR_DATA *)&cool_ints[j], 01844 &sint32_artype); 01845 break; 01846 01847 case 46: 01848 case 64: 01849 shift = LS64(&cool_ints[j]); 01850 if ((shift > 0 && shift > 64) || 01851 (shift < 0 && shift < -64)) 01852 { /* status is undefined, result is zero */ 01853 act_status[j] = AR_STAT_UNDEFINED; 01854 act_result[j] = 0; 01855 } 01856 else 01857 { 01858 if (shift > 0) 01859 #if defined __sun 01860 act_result[j] = DSEXT64(shftl64(LU64(&cool_ints[i]), 01861 shift)); 01862 #else 01863 act_result[j] = DSEXT64(LU64(&cool_ints[i]) << 01864 shift); 01865 #endif 01866 else 01867 #if defined __sun 01868 act_result[j] = DSEXT64(shftr64(LU64(&cool_ints[i]), 01869 (-shift))); 01870 #else 01871 act_result[j] = DSEXT64(LU64(&cool_ints[i]) >> 01872 (-shift)); 01873 #endif 01874 01875 act_status[j] = is_zero64(act_result[j]) 01876 ? AR_STAT_ZERO 01877 : AR_STAT_OK; 01878 if (is_neg64(act_result[j])) 01879 act_status[j] |= AR_STAT_NEGATIVE; 01880 } 01881 01882 test_status[j] = AR_ishft((AR_DATA *)&test_result[j], 01883 &sint64_artype, 01884 (AR_DATA *)&cool_ints[i], 01885 &sint64_artype, 01886 (AR_DATA *)&cool_ints[j], 01887 &sint64_artype); 01888 break; 01889 } 01890 01891 if (LU64(&test_result[j]) != (UINT64)act_result[j]) 01892 { 01893 printf(" ERROR: incorrect result at %d,%d\n", i, j); 01894 abort(); 01895 } 01896 01897 if (act_status[j] != test_status[j]) 01898 { 01899 printf(" ERROR: incorrect status at %d,%d\n", i, j); 01900 abort(); 01901 } 01902 } 01903 } 01904 01905 printf("PASSED\n"); 01906 } 01907 01908 01909 #define TEST_ISHFT_TYPES \ 01910 do { \ 01911 int i, j, k; \ 01912 \ 01913 printf(" Testing: types %-10s: ", "ISHFT"); \ 01914 \ 01915 for (i=0; i<num_ar_types; i++) \ 01916 { \ 01917 for (j=0; j<num_ar_types; j++) \ 01918 { \ 01919 for (k=0; k<num_ar_types; k++) \ 01920 { \ 01921 act_status[k] = AR_STAT_OK; \ 01922 if (ar_types[i] != ar_types[j] || \ 01923 !IS_SUPPORTED_INT_TYPE(ar_types[i]) || \ 01924 !IS_SUPPORTED_INT_TYPE(ar_types[k])) \ 01925 act_status[k] = AR_STAT_INVALID_TYPE; \ 01926 \ 01927 test_status[k] = AR_ishft((AR_DATA *)&test_result[1], \ 01928 &ar_types[i], \ 01929 (AR_DATA *)&cool_ints[1], \ 01930 &ar_types[j], \ 01931 (AR_DATA *)&cool_ints[1], \ 01932 &ar_types[k]); \ 01933 \ 01934 if ((act_status[k] ^ test_status[k]) & \ 01935 AR_STAT_INVALID_TYPE) \ 01936 { \ 01937 printf(" ERROR: incorrect status at %d,%d,%d\n", \ 01938 i, j, k); \ 01939 abort(); \ 01940 } \ 01941 } \ 01942 } \ 01943 } \ 01944 \ 01945 printf("PASSED\n"); \ 01946 } while (0) 01947 01948 01949 test_ishft() 01950 { 01951 01952 test_ishft_signed( 8); 01953 01954 test_ishft_signed(16); 01955 01956 test_ishft_signed(32); 01957 01958 test_ishft_signed(46); 01959 01960 test_ishft_signed(64); 01961 01962 TEST_ISHFT_TYPES; 01963 01964 } /* test_ishft */ 01965 01966 01967 #undef TEST_ISHFT_TYPES 01968 01969 01970 static 01971 void 01972 test_ishftc_signed(int size) 01973 { 01974 int i, j; 01975 01976 printf(" Testing: SIGNED %2d INT %-10s: ", size, "ISHFTC"); 01977 01978 if (size == 46) 01979 size = 64; 01980 01981 for (i=0; i<num_cool_ints; i++) 01982 { 01983 for (j=0; j<num_cool_ints; j++) 01984 { 01985 SINT64 width; 01986 SINT64 max_shift; 01987 SINT64 shift; 01988 SINT64 unch_mask; 01989 SINT64 rot_mask; 01990 01991 switch (size) 01992 { 01993 case 8: 01994 width = LS8(&cool_ints[j]); 01995 break; 01996 01997 case 16: 01998 width = LS16(&cool_ints[j]); 01999 break; 02000 02001 case 32: 02002 width = LS32(&cool_ints[j]); 02003 break; 02004 02005 case 46: 02006 case 64: 02007 width = LS64(&cool_ints[j]); 02008 break; 02009 } 02010 02011 if (width < 1 || width > size) { 02012 max_shift = 0; 02013 unch_mask = 0; 02014 rot_mask = 0; 02015 } 02016 else { 02017 max_shift = width + 1; 02018 #if defined(__sun) 02019 unch_mask = _mask(64 - width); 02020 #else 02021 unch_mask = MASKL(64 - width); 02022 #endif 02023 rot_mask = ~unch_mask; 02024 } 02025 02026 for (shift = -(max_shift + 1); shift < max_shift; shift++) 02027 { 02028 UINT64 opnd; 02029 ar_data shift_data; 02030 02031 test_result[j].part1 = 0; 02032 test_result[j].part2 = 0; 02033 test_result[j].part3 = 0; 02034 test_result[j].part4 = 0; 02035 02036 act_status[j] = AR_STAT_OK; 02037 02038 if (width < 1 || 02039 width > size || 02040 (shift < 0 && shift < -size) || 02041 (shift >= 0 && shift > size)) 02042 { /* status is undefined, result is zero */ 02043 act_status[j] = AR_STAT_UNDEFINED; 02044 act_result[j] = 0; 02045 } 02046 02047 switch (size) 02048 { 02049 case 8: 02050 if ((shift < 0 && shift < -width) || 02051 (shift >= 0 && shift > width)) 02052 { 02053 act_status[j] = AR_STAT_UNDEFINED; 02054 act_result[j] = 0; 02055 } 02056 else if (act_status[j] == AR_STAT_OK) 02057 { 02058 opnd = LU8(&cool_ints[i]); 02059 02060 if (shift == 0) 02061 act_result[j] = opnd; 02062 else if (shift > 0) 02063 act_result[j] = (opnd & unch_mask) | 02064 (((opnd << shift) | 02065 ((opnd & rot_mask) >> 02066 (width - shift))) & 02067 rot_mask); 02068 else 02069 act_result[j] = (opnd & unch_mask) | 02070 ((((opnd & rot_mask) >> -shift) | 02071 (opnd << (width + shift))) & 02072 rot_mask); 02073 act_result[j] = DSEXT8(act_result[j]); 02074 02075 act_status[j] = is_zero8(act_result[j]) 02076 ? AR_STAT_ZERO 02077 : AR_STAT_OK; 02078 if (is_neg8(act_result[j])) 02079 act_status[j] |= AR_STAT_NEGATIVE; 02080 } 02081 02082 ZERO_INT8_UPPER(&shift_data); 02083 shift_data.ar_i8.part5 = shift & 0xFF; 02084 02085 test_status[j] = AR_ishftc((AR_DATA *)&test_result[j], 02086 &sint8_artype, 02087 (AR_DATA *)&cool_ints[i], 02088 &sint8_artype, 02089 (AR_DATA *)&shift_data, 02090 &sint8_artype, 02091 (AR_DATA *)&cool_ints[j], 02092 &sint8_artype); 02093 break; 02094 02095 case 16: 02096 if ((shift < 0 && shift < -width) || 02097 (shift >= 0 && shift > width)) 02098 { 02099 act_status[j] = AR_STAT_UNDEFINED; 02100 act_result[j] = 0; 02101 } 02102 else if (act_status[j] == AR_STAT_OK) 02103 { 02104 opnd = LU16(&cool_ints[i]); 02105 02106 if (shift == 0) 02107 act_result[j] = opnd; 02108 else if (shift > 0) 02109 act_result[j] = (opnd & unch_mask) | 02110 (((opnd << shift) | 02111 ((opnd & rot_mask) >> 02112 (width - shift))) & 02113 rot_mask); 02114 else 02115 act_result[j] = (opnd & unch_mask) | 02116 ((((opnd & rot_mask) >> -shift) | 02117 (opnd << (width + shift))) & 02118 rot_mask); 02119 act_result[j] = DSEXT16(act_result[j]); 02120 02121 act_status[j] = is_zero16(act_result[j]) 02122 ? AR_STAT_ZERO 02123 : AR_STAT_OK; 02124 if (is_neg16(act_result[j])) 02125 act_status[j] |= AR_STAT_NEGATIVE; 02126 } 02127 02128 ZERO_INT16_UPPER(&shift_data); 02129 shift_data.ar_i64.part4 = shift & 0xFFFF; 02130 02131 test_status[j] = AR_ishftc((AR_DATA *)&test_result[j], 02132 &sint16_artype, 02133 (AR_DATA *)&cool_ints[i], 02134 &sint16_artype, 02135 (AR_DATA *)&shift_data, 02136 &sint16_artype, 02137 (AR_DATA *)&cool_ints[j], 02138 &sint16_artype); 02139 break; 02140 02141 case 32: 02142 if ((shift < 0 && shift < -width) || 02143 (shift >= 0 && shift > width)) 02144 { 02145 act_status[j] = AR_STAT_UNDEFINED; 02146 act_result[j] = 0; 02147 } 02148 else if (act_status[j] == AR_STAT_OK) 02149 { 02150 opnd = LU32(&cool_ints[i]); 02151 02152 if (shift == 0) 02153 act_result[j] = opnd; 02154 else if (shift > 0) 02155 act_result[j] = (opnd & unch_mask) | 02156 (((opnd << shift) | 02157 ((opnd & rot_mask) >> 02158 (width - shift))) & 02159 rot_mask); 02160 else 02161 act_result[j] = (opnd & unch_mask) | 02162 ((((opnd & rot_mask) >> -shift) | 02163 (opnd << (width + shift))) & 02164 rot_mask); 02165 act_result[j] = DSEXT32(act_result[j]); 02166 02167 act_status[j] = is_zero32(act_result[j]) 02168 ? AR_STAT_ZERO 02169 : AR_STAT_OK; 02170 if (is_neg32(act_result[j])) 02171 act_status[j] |= AR_STAT_NEGATIVE; 02172 } 02173 02174 ZERO_INT32_UPPER(&shift_data); 02175 shift_data.ar_i64.part3 = (shift >> 16) & 0xFFFF; 02176 shift_data.ar_i64.part4 = (shift ) & 0xFFFF; 02177 02178 test_status[j] = AR_ishftc((AR_DATA *)&test_result[j], 02179 &sint32_artype, 02180 (AR_DATA *)&cool_ints[i], 02181 &sint32_artype, 02182 (AR_DATA *)&shift_data, 02183 &sint32_artype, 02184 (AR_DATA *)&cool_ints[j], 02185 &sint32_artype); 02186 break; 02187 02188 case 46: 02189 case 64: 02190 if ((shift < 0 && shift < -width) || 02191 (shift >= 0 && shift > width)) 02192 { 02193 act_status[j] = AR_STAT_UNDEFINED; 02194 act_result[j] = 0; 02195 } 02196 else if (act_status[j] == AR_STAT_OK) 02197 { 02198 opnd = LU64(&cool_ints[i]); 02199 02200 if (shift == 0) 02201 act_result[j] = opnd; 02202 else if (shift > 0) 02203 #if defined __sun 02204 act_result[j] = (opnd & unch_mask) | 02205 ((shftl64(opnd, shift) | 02206 shftr64((opnd & rot_mask), 02207 (width - shift))) & 02208 rot_mask); 02209 #else 02210 act_result[j] = (opnd & unch_mask) | 02211 (((opnd << shift) | 02212 ((opnd & rot_mask) >> 02213 (width - shift))) & 02214 rot_mask); 02215 #endif 02216 else 02217 #if defined __sun 02218 act_result[j] = (opnd & unch_mask) | 02219 ((shftr64((opnd & rot_mask), 02220 (-shift)) | 02221 shftl64(opnd, (width + shift))) & 02222 rot_mask); 02223 #else 02224 act_result[j] = (opnd & unch_mask) | 02225 ((((opnd & rot_mask) >> -shift) | 02226 (opnd << (width + shift))) & 02227 rot_mask); 02228 #endif 02229 act_result[j] = DSEXT64(act_result[j]); 02230 02231 act_status[j] = is_zero64(act_result[j]) 02232 ? AR_STAT_ZERO 02233 : AR_STAT_OK; 02234 if (is_neg64(act_result[j])) 02235 act_status[j] |= AR_STAT_NEGATIVE; 02236 } 02237 02238 shift_data.ar_i64.part1 = (shift >> 48) & 0xFFFF; 02239 shift_data.ar_i64.part2 = (shift >> 32) & 0xFFFF; 02240 shift_data.ar_i64.part3 = (shift >> 16) & 0xFFFF; 02241 shift_data.ar_i64.part4 = (shift ) & 0xFFFF; 02242 02243 test_status[j] = AR_ishftc((AR_DATA *)&test_result[j], 02244 &sint64_artype, 02245 (AR_DATA *)&cool_ints[i], 02246 &sint64_artype, 02247 (AR_DATA *)&shift_data, 02248 &sint64_artype, 02249 (AR_DATA *)&cool_ints[j], 02250 &sint64_artype); 02251 break; 02252 } 02253 02254 if (LU64(&test_result[j]) != (UINT64)act_result[j]) 02255 { 02256 printf(" ERROR: incorrect result at %d,%d,%d\n", 02257 i, j, (int) shift); 02258 abort(); 02259 } 02260 02261 if (act_status[j] != test_status[j]) 02262 { 02263 printf(" ERROR: incorrect status at %d,%d,%d\n", 02264 i, j, (int) shift); 02265 abort(); 02266 } 02267 } 02268 } 02269 } 02270 02271 printf("PASSED\n"); 02272 } 02273 02274 02275 #define TEST_ISHFTC_TYPES \ 02276 do { \ 02277 int i, j, k, l; \ 02278 \ 02279 printf(" Testing: types %-10s: ", "ISHFTC"); \ 02280 \ 02281 for (i=0; i<num_ar_types; i++) \ 02282 { \ 02283 for (j=0; j<num_ar_types; j++) \ 02284 { \ 02285 for (k=0; k<num_ar_types; k++) \ 02286 { \ 02287 for (l=0; l<num_ar_types; l++) \ 02288 { \ 02289 act_status[l] = AR_STAT_OK; \ 02290 if (ar_types[i] != ar_types[j] || \ 02291 !IS_SUPPORTED_INT_TYPE(ar_types[i]) || \ 02292 !IS_SUPPORTED_INT_TYPE(ar_types[k]) || \ 02293 !IS_SUPPORTED_INT_TYPE(ar_types[l])) \ 02294 act_status[l] = AR_STAT_INVALID_TYPE; \ 02295 \ 02296 test_status[l] = AR_ishftc((AR_DATA *)&test_result[1],\ 02297 &ar_types[i], \ 02298 (AR_DATA *)&cool_ints[1], \ 02299 &ar_types[j], \ 02300 (AR_DATA *)&cool_ints[1], \ 02301 &ar_types[l], \ 02302 (AR_DATA *)&cool_ints[1], \ 02303 &ar_types[k]); \ 02304 \ 02305 if ((act_status[l] ^ test_status[l]) & \ 02306 AR_STAT_INVALID_TYPE) \ 02307 { \ 02308 printf(" ERROR: incorrect status at %d,%d,%d,%d" \ 02309 "\n", \ 02310 i, j, k, l); \ 02311 abort(); \ 02312 } \ 02313 } \ 02314 } \ 02315 } \ 02316 } \ 02317 \ 02318 printf("PASSED\n"); \ 02319 } while (0) 02320 02321 02322 test_ishftc() 02323 { 02324 02325 test_ishftc_signed( 8); 02326 02327 test_ishftc_signed(16); 02328 02329 test_ishftc_signed(32); 02330 02331 test_ishftc_signed(46); 02332 02333 test_ishftc_signed(64); 02334 02335 TEST_ISHFTC_TYPES; 02336 02337 } /* test_ishftc */ 02338 02339 02340 #undef TEST_ISHFTC_TYPES 02341 02342 02343 /*====================================================================== 02344 * 02345 * IBITS OPERATOR 02346 * 02347 */ 02348 02349 static 02350 void 02351 test_ibits_signed(int size) 02352 { 02353 int i, j; 02354 02355 printf(" Testing: SIGNED %2d INT %-10s: ", size, "IBITS"); 02356 02357 if (size == 46) 02358 size = 64; 02359 02360 for (i=0; i<num_cool_ints; i++) 02361 { 02362 for (j=0; j<num_cool_ints; j++) 02363 { 02364 SINT64 width; 02365 SINT64 max_shift; 02366 SINT64 shift; 02367 SINT64 mask; 02368 02369 switch (size) 02370 { 02371 case 8: 02372 width = LS8(&cool_ints[j]); 02373 break; 02374 02375 case 16: 02376 width = LS16(&cool_ints[j]); 02377 break; 02378 02379 case 32: 02380 width = LS32(&cool_ints[j]); 02381 break; 02382 02383 case 46: 02384 case 64: 02385 width = LS64(&cool_ints[j]); 02386 break; 02387 } 02388 02389 if (width < 0 || width > size) { 02390 max_shift = 0; 02391 mask = 0; 02392 } 02393 else { 02394 max_shift = width + 1; 02395 #if defined(__sun) 02396 mask = _mask(128 - width); 02397 #else 02398 mask = MASKR(width); 02399 #endif 02400 } 02401 02402 for (shift = -1; shift < max_shift + 1; shift++) 02403 { 02404 UINT64 opnd; 02405 ar_data shift_data; 02406 02407 test_result[j].part1 = 0; 02408 test_result[j].part2 = 0; 02409 test_result[j].part3 = 0; 02410 test_result[j].part4 = 0; 02411 02412 act_status[j] = AR_STAT_OK; 02413 02414 if (width < 0 || 02415 shift < 0 || shift > (size - width)) 02416 { /* status is undefined, result is zero */ 02417 act_status[j] = AR_STAT_UNDEFINED; 02418 act_result[j] = 0; 02419 } 02420 02421 switch (size) 02422 { 02423 case 8: 02424 if (act_status[j] == AR_STAT_OK) 02425 { 02426 opnd = LU8(&cool_ints[i]); 02427 02428 if (shift == 0) 02429 act_result[j] = opnd & mask; 02430 else if (shift == size) 02431 act_result[j] = 0; 02432 else 02433 act_result[j] = (opnd >> shift) & mask; 02434 02435 act_status[j] = is_zero8(act_result[j]) 02436 ? AR_STAT_ZERO 02437 : AR_STAT_OK; 02438 if (is_neg8(act_result[j])) 02439 act_status[j] |= AR_STAT_NEGATIVE; 02440 } 02441 02442 ZERO_INT8_UPPER(&shift_data); 02443 shift_data.ar_i8.part5 = shift & 0xFF; 02444 02445 test_status[j] = AR_ibits((AR_DATA *)&test_result[j], 02446 &sint8_artype, 02447 (AR_DATA *)&cool_ints[i], 02448 &sint8_artype, 02449 (AR_DATA *)&shift_data, 02450 &sint8_artype, 02451 (AR_DATA *)&cool_ints[j], 02452 &sint8_artype); 02453 break; 02454 02455 case 16: 02456 if (act_status[j] == AR_STAT_OK) 02457 { 02458 opnd = LU16(&cool_ints[i]); 02459 02460 if (shift == 0) 02461 act_result[j] = opnd & mask; 02462 else if (shift == size) 02463 act_result[j] = 0; 02464 else 02465 act_result[j] = (opnd >> shift) & mask; 02466 02467 act_status[j] = is_zero16(act_result[j]) 02468 ? AR_STAT_ZERO 02469 : AR_STAT_OK; 02470 if (is_neg16(act_result[j])) 02471 act_status[j] |= AR_STAT_NEGATIVE; 02472 } 02473 02474 ZERO_INT16_UPPER(&shift_data); 02475 shift_data.ar_i64.part4 = shift & 0xFFFF; 02476 02477 test_status[j] = AR_ibits((AR_DATA *)&test_result[j], 02478 &sint16_artype, 02479 (AR_DATA *)&cool_ints[i], 02480 &sint16_artype, 02481 (AR_DATA *)&shift_data, 02482 &sint16_artype, 02483 (AR_DATA *)&cool_ints[j], 02484 &sint16_artype); 02485 break; 02486 02487 case 32: 02488 if (act_status[j] == AR_STAT_OK) 02489 { 02490 opnd = LU32(&cool_ints[i]); 02491 02492 if (shift == 0) 02493 act_result[j] = opnd & mask; 02494 else if (shift == size) 02495 act_result[j] = 0; 02496 else 02497 act_result[j] = (opnd >> shift) & mask; 02498 02499 act_status[j] = is_zero32(act_result[j]) 02500 ? AR_STAT_ZERO 02501 : AR_STAT_OK; 02502 if (is_neg32(act_result[j])) 02503 act_status[j] |= AR_STAT_NEGATIVE; 02504 } 02505 02506 ZERO_INT32_UPPER(&shift_data); 02507 shift_data.ar_i64.part3 = (shift >> 16) & 0xFFFF; 02508 shift_data.ar_i64.part4 = (shift ) & 0xFFFF; 02509 02510 test_status[j] = AR_ibits((AR_DATA *)&test_result[j], 02511 &sint32_artype, 02512 (AR_DATA *)&cool_ints[i], 02513 &sint32_artype, 02514 (AR_DATA *)&shift_data, 02515 &sint32_artype, 02516 (AR_DATA *)&cool_ints[j], 02517 &sint32_artype); 02518 break; 02519 02520 case 46: 02521 case 64: 02522 if (act_status[j] == AR_STAT_OK) 02523 { 02524 opnd = LU64(&cool_ints[i]); 02525 02526 if (shift == 0) 02527 act_result[j] = opnd & mask; 02528 else if (shift == size) 02529 act_result[j] = 0; 02530 else 02531 #if defined __sun 02532 act_result[j] = shftr64(opnd, shift) & mask; 02533 #else 02534 act_result[j] = (opnd >> shift) & mask; 02535 #endif 02536 02537 act_status[j] = is_zero64(act_result[j]) 02538 ? AR_STAT_ZERO 02539 : AR_STAT_OK; 02540 if (is_neg64(act_result[j])) 02541 act_status[j] |= AR_STAT_NEGATIVE; 02542 } 02543 02544 shift_data.ar_i64.part1 = (shift >> 48) & 0xFFFF; 02545 shift_data.ar_i64.part2 = (shift >> 32) & 0xFFFF; 02546 shift_data.ar_i64.part3 = (shift >> 16) & 0xFFFF; 02547 shift_data.ar_i64.part4 = (shift ) & 0xFFFF; 02548 02549 test_status[j] = AR_ibits((AR_DATA *)&test_result[j], 02550 &sint64_artype, 02551 (AR_DATA *)&cool_ints[i], 02552 &sint64_artype, 02553 (AR_DATA *)&shift_data, 02554 &sint64_artype, 02555 (AR_DATA *)&cool_ints[j], 02556 &sint64_artype); 02557 break; 02558 } 02559 02560 if (LU64(&test_result[j]) != (UINT64)act_result[j]) 02561 { 02562 printf(" ERROR: incorrect result at %d,%d,%d\n", 02563 i, j, (int) shift); 02564 abort(); 02565 } 02566 02567 if (act_status[j] != test_status[j]) 02568 { 02569 printf(" ERROR: incorrect status at %d,%d,%d\n", 02570 i, j, (int) shift); 02571 abort(); 02572 } 02573 } 02574 } 02575 } 02576 02577 printf("PASSED\n"); 02578 } 02579 02580 02581 #define TEST_IBITS_TYPES \ 02582 do { \ 02583 int i, j, k, l; \ 02584 \ 02585 printf(" Testing: types %-10s: ", "IBITS"); \ 02586 \ 02587 for (i=0; i<num_ar_types; i++) \ 02588 { \ 02589 for (j=0; j<num_ar_types; j++) \ 02590 { \ 02591 for (k=0; k<num_ar_types; k++) \ 02592 { \ 02593 for (l=0; l<num_ar_types; l++) \ 02594 { \ 02595 act_status[l] = AR_STAT_OK; \ 02596 if (ar_types[i] != ar_types[j] || \ 02597 !IS_SUPPORTED_INT_TYPE(ar_types[i]) || \ 02598 !IS_SUPPORTED_INT_TYPE(ar_types[k]) || \ 02599 !IS_SUPPORTED_INT_TYPE(ar_types[l])) \ 02600 act_status[l] = AR_STAT_INVALID_TYPE; \ 02601 \ 02602 test_status[l] = AR_ibits((AR_DATA *)&test_result[1],\ 02603 &ar_types[i], \ 02604 (AR_DATA *)&cool_ints[1], \ 02605 &ar_types[j], \ 02606 (AR_DATA *)&cool_ints[1], \ 02607 &ar_types[l], \ 02608 (AR_DATA *)&cool_ints[1], \ 02609 &ar_types[k]); \ 02610 \ 02611 if ((act_status[l] ^ test_status[l]) & \ 02612 AR_STAT_INVALID_TYPE) \ 02613 { \ 02614 printf(" ERROR: incorrect status at %d,%d,%d,%d" \ 02615 "\n", \ 02616 i, j, k, l); \ 02617 abort(); \ 02618 } \ 02619 } \ 02620 } \ 02621 } \ 02622 } \ 02623 \ 02624 printf("PASSED\n"); \ 02625 } while (0) 02626 02627 02628 test_ibits() 02629 { 02630 02631 test_ibits_signed( 8); 02632 02633 test_ibits_signed(16); 02634 02635 test_ibits_signed(32); 02636 02637 test_ibits_signed(46); 02638 02639 test_ibits_signed(64); 02640 02641 TEST_IBITS_TYPES; 02642 02643 } /* test_ibits */ 02644 02645 02646 #undef TEST_IBITS_TYPES 02647 02648 02649 /*====================================================================== 02650 * 02651 * MASK/LEADZ/POP OPERATORS 02652 * 02653 */ 02654 02655 #define TEST_MASK_OP_SIGNED(size, max_shift) \ 02656 do { \ 02657 int i, j; \ 02658 \ 02659 printf(" Testing: SIGNED %2d INT %-10s: ", size, "_mask"); \ 02660 \ 02661 for (j=0; j<num_cool_ints; j++) \ 02662 { \ 02663 if (LS##size(&cool_ints[j]) > max_shift || \ 02664 LS##size(&cool_ints[j]) < 0) \ 02665 { /* status is undefined, result is zero */ \ 02666 act_result[j] = 0; \ 02667 act_status[j] = AR_STAT_UNDEFINED; \ 02668 } \ 02669 else \ 02670 { \ 02671 act_result[j] = DSEXT##size( \ 02672 _mask##size(LS##size(&cool_ints[j]))); \ 02673 act_status[j] = is_zero##size(act_result[j]) \ 02674 ? AR_STAT_ZERO : AR_STAT_OK; \ 02675 if (is_neg##size(act_result[j])) \ 02676 act_status[j] |= AR_STAT_NEGATIVE; \ 02677 } \ 02678 \ 02679 test_result[j].part1 = 0; \ 02680 test_result[j].part2 = 0; \ 02681 test_result[j].part3 = 0; \ 02682 test_result[j].part4 = 0; \ 02683 \ 02684 test_status[j] = AR_mask((AR_DATA *)&test_result[j], \ 02685 &sint##size##_artype, \ 02686 (AR_DATA *)&cool_ints[j], \ 02687 &sint##size##_artype); \ 02688 \ 02689 if (LU64(&test_result[j]) != act_result[j]) \ 02690 { \ 02691 printf(" ERROR: incorrect result at %d\n", j); \ 02692 abort(); \ 02693 } \ 02694 \ 02695 if (act_status[j] != test_status[j]) \ 02696 { \ 02697 printf(" ERROR: incorrect status at %d\n", j); \ 02698 abort(); \ 02699 } \ 02700 } \ 02701 \ 02702 printf("PASSED\n"); \ 02703 } while (0) 02704 02705 02706 #define TEST_MASK_OP_UNSIGNED(size, max_shift) \ 02707 do { \ 02708 int i, j; \ 02709 \ 02710 printf(" Testing: UNSIGNED %2d INT %-10s: ", size, "_mask"); \ 02711 \ 02712 for (j=0; j<num_cool_ints; j++) \ 02713 { \ 02714 if (LU##size(&cool_ints[j]) > max_shift) \ 02715 { /* status is undefined, result is zero */ \ 02716 act_result[j] = 0; \ 02717 act_status[j] = AR_STAT_UNDEFINED; \ 02718 } \ 02719 else \ 02720 { \ 02721 act_result[j] = DSEXT##size( \ 02722 _mask##size(LU##size(&cool_ints[j]))); \ 02723 act_status[j] = is_zero##size(act_result[j]) \ 02724 ? AR_STAT_ZERO : AR_STAT_OK; \ 02725 } \ 02726 \ 02727 test_result[j].part1 = 0; \ 02728 test_result[j].part2 = 0; \ 02729 test_result[j].part3 = 0; \ 02730 test_result[j].part4 = 0; \ 02731 \ 02732 test_status[j] = AR_mask((AR_DATA *)&test_result[j], \ 02733 &uint##size##_artype, \ 02734 (AR_DATA *)&cool_ints[j], \ 02735 &uint##size##_artype); \ 02736 \ 02737 if (LU64(&test_result[j]) != (UINT64)act_result[j]) \ 02738 { \ 02739 printf(" ERROR: incorrect result at %d\n", j); \ 02740 abort(); \ 02741 } \ 02742 \ 02743 if (act_status[j] != test_status[j]) \ 02744 { \ 02745 printf(" ERROR: incorrect status at %d\n", j); \ 02746 abort(); \ 02747 } \ 02748 } \ 02749 \ 02750 printf("PASSED\n"); \ 02751 } while (0) 02752 02753 02754 #define TEST_MASK_OP_TYPES \ 02755 do { \ 02756 int j, k; \ 02757 \ 02758 printf(" Testing: types %-10s: ", "_mask"); \ 02759 \ 02760 for (j=0; j<num_ar_types; j++) \ 02761 { \ 02762 for (k=0; k<num_ar_types; k++) \ 02763 { \ 02764 act_status[k] = AR_STAT_OK; \ 02765 if (ar_types[j] != ar_types[k] || \ 02766 !IS_SUPPORTED_INT_TYPE(ar_types[j])) \ 02767 act_status[k] = AR_STAT_INVALID_TYPE; \ 02768 \ 02769 test_status[k] = AR_mask((AR_DATA *)&test_result[1], \ 02770 &ar_types[j], \ 02771 (AR_DATA *)&cool_ints[1], \ 02772 &ar_types[k]); \ 02773 \ 02774 if ((act_status[k] ^ test_status[k]) & \ 02775 AR_STAT_INVALID_TYPE) \ 02776 { \ 02777 printf(" ERROR: incorrect status at %d,%d\n", j, k); \ 02778 abort(); \ 02779 } \ 02780 } \ 02781 } \ 02782 \ 02783 printf("PASSED\n"); \ 02784 } while (0) 02785 02786 02787 #define TEST_LP_OP_SIGNED(size, opr, func) \ 02788 do { \ 02789 int i, j; \ 02790 \ 02791 printf(" Testing: SIGNED %2d INT %-10s: ", size, #opr); \ 02792 \ 02793 for (j=0; j<num_cool_ints; j++) \ 02794 { \ 02795 act_result[j] = opr##size(LS##size(&cool_ints[j])); \ 02796 \ 02797 act_status[j] = is_zero##size(act_result[j]) \ 02798 ? AR_STAT_ZERO : AR_STAT_OK; \ 02799 if (is_neg##size(act_result[j])) \ 02800 act_status[j] |= AR_STAT_NEGATIVE; \ 02801 \ 02802 test_result[j].part1 = 0; \ 02803 test_result[j].part2 = 0; \ 02804 test_result[j].part3 = 0; \ 02805 test_result[j].part4 = 0; \ 02806 \ 02807 test_status[j] = func((AR_DATA *)&test_result[j], \ 02808 &sint##size##_artype, \ 02809 (AR_DATA *)&cool_ints[j], \ 02810 &sint##size##_artype); \ 02811 \ 02812 if (LU64(&test_result[j]) != act_result[j]) \ 02813 { \ 02814 printf(" ERROR: incorrect result at %d\n", j); \ 02815 abort(); \ 02816 } \ 02817 \ 02818 if (act_status[j] != test_status[j]) \ 02819 { \ 02820 printf(" ERROR: incorrect status at %d\n", j); \ 02821 abort(); \ 02822 } \ 02823 } \ 02824 \ 02825 printf("PASSED\n"); \ 02826 } while (0) 02827 02828 02829 #define TEST_LP_OP_UNSIGNED(size, opr, func) \ 02830 do { \ 02831 int i, j; \ 02832 \ 02833 printf(" Testing: UNSIGNED %2d INT %-10s: ", size, #opr); \ 02834 \ 02835 for (j=0; j<num_cool_ints; j++) \ 02836 { \ 02837 act_result[j] = opr##size(LU##size(&cool_ints[j])); \ 02838 act_status[j] = is_zero##size(act_result[j]) \ 02839 ? AR_STAT_ZERO : AR_STAT_OK; \ 02840 \ 02841 test_result[j].part1 = 0; \ 02842 test_result[j].part2 = 0; \ 02843 test_result[j].part3 = 0; \ 02844 test_result[j].part4 = 0; \ 02845 \ 02846 test_status[j] = func((AR_DATA *)&test_result[j], \ 02847 &uint##size##_artype, \ 02848 (AR_DATA *)&cool_ints[j], \ 02849 &uint##size##_artype); \ 02850 \ 02851 if (LU64(&test_result[j]) != (UINT64)act_result[j]) \ 02852 { \ 02853 printf(" ERROR: incorrect result at %d\n", j); \ 02854 abort(); \ 02855 } \ 02856 \ 02857 if (act_status[j] != test_status[j]) \ 02858 { \ 02859 printf(" ERROR: incorrect status at %d\n", j); \ 02860 abort(); \ 02861 } \ 02862 } \ 02863 \ 02864 printf("PASSED\n"); \ 02865 } while (0) 02866 02867 02868 #define TEST_LP_OP_TYPES(opr, func) \ 02869 do { \ 02870 int j, k; \ 02871 \ 02872 printf(" Testing: types %-10s: ", #opr); \ 02873 \ 02874 for (j=0; j<num_ar_types; j++) \ 02875 { \ 02876 for (k=0; k<num_ar_types; k++) \ 02877 { \ 02878 act_status[k] = AR_STAT_OK; \ 02879 if (!IS_SUPPORTED_INT_TYPE(ar_types[j]) || \ 02880 !IS_SUPPORTED_INT_TYPE(ar_types[k])) \ 02881 act_status[k] = AR_STAT_INVALID_TYPE; \ 02882 \ 02883 test_status[k] = func((AR_DATA *)&test_result[1], \ 02884 &ar_types[j], \ 02885 (AR_DATA *)&cool_ints[1], \ 02886 &ar_types[k]); \ 02887 \ 02888 if ((act_status[k] ^ test_status[k]) & \ 02889 AR_STAT_INVALID_TYPE) \ 02890 { \ 02891 printf(" ERROR: incorrect status at %d,%d\n", j, k); \ 02892 abort(); \ 02893 } \ 02894 } \ 02895 } \ 02896 \ 02897 printf("PASSED\n"); \ 02898 } while (0) 02899 02900 02901 test_mask() 02902 { 02903 02904 TEST_MASK_OP_SIGNED( 8, 16); 02905 TEST_MASK_OP_UNSIGNED( 8, 16); 02906 02907 TEST_MASK_OP_SIGNED( 16, 32); 02908 TEST_MASK_OP_UNSIGNED(16, 32); 02909 02910 TEST_MASK_OP_SIGNED( 32, 64); 02911 TEST_MASK_OP_UNSIGNED(32, 64); 02912 02913 TEST_MASK_OP_SIGNED( 46, 128); 02914 02915 TEST_MASK_OP_SIGNED( 64, 128); 02916 TEST_MASK_OP_UNSIGNED(64, 128); 02917 02918 TEST_MASK_OP_TYPES; 02919 02920 } /* test_mask */ 02921 02922 02923 test_leadz() 02924 { 02925 02926 TEST_LP_OP_SIGNED( 8, _leadz , AR_leadz ); 02927 TEST_LP_OP_UNSIGNED( 8, _leadz , AR_leadz ); 02928 02929 TEST_LP_OP_SIGNED( 16, _leadz , AR_leadz ); 02930 TEST_LP_OP_UNSIGNED(16, _leadz , AR_leadz ); 02931 02932 TEST_LP_OP_SIGNED( 32, _leadz , AR_leadz ); 02933 TEST_LP_OP_UNSIGNED(32, _leadz , AR_leadz ); 02934 02935 TEST_LP_OP_SIGNED( 46, _leadz , AR_leadz ); 02936 02937 TEST_LP_OP_SIGNED( 64, _leadz , AR_leadz ); 02938 TEST_LP_OP_UNSIGNED(64, _leadz , AR_leadz ); 02939 02940 TEST_LP_OP_TYPES( _leadz , AR_leadz ); 02941 02942 } /* test_leadz */ 02943 02944 02945 test_popcnt() 02946 { 02947 02948 TEST_LP_OP_SIGNED( 8, _popcnt, AR_popcnt); 02949 TEST_LP_OP_UNSIGNED( 8, _popcnt, AR_popcnt); 02950 02951 TEST_LP_OP_SIGNED( 16, _popcnt, AR_popcnt); 02952 TEST_LP_OP_UNSIGNED(16, _popcnt, AR_popcnt); 02953 02954 TEST_LP_OP_SIGNED( 32, _popcnt, AR_popcnt); 02955 TEST_LP_OP_UNSIGNED(32, _popcnt, AR_popcnt); 02956 02957 TEST_LP_OP_SIGNED( 46, _popcnt, AR_popcnt); 02958 02959 TEST_LP_OP_SIGNED( 64, _popcnt, AR_popcnt); 02960 TEST_LP_OP_UNSIGNED(64, _popcnt, AR_popcnt); 02961 02962 TEST_LP_OP_TYPES( _popcnt, AR_popcnt); 02963 02964 } /* test_popcnt */ 02965 02966 02967 test_poppar() 02968 { 02969 02970 TEST_LP_OP_SIGNED( 8, _poppar, AR_poppar); 02971 TEST_LP_OP_UNSIGNED( 8, _poppar, AR_poppar); 02972 02973 TEST_LP_OP_SIGNED( 16, _poppar, AR_poppar); 02974 TEST_LP_OP_UNSIGNED(16, _poppar, AR_poppar); 02975 02976 TEST_LP_OP_SIGNED( 32, _poppar, AR_poppar); 02977 TEST_LP_OP_UNSIGNED(32, _poppar, AR_poppar); 02978 02979 TEST_LP_OP_SIGNED( 46, _poppar, AR_poppar); 02980 02981 TEST_LP_OP_SIGNED( 64, _poppar, AR_poppar); 02982 TEST_LP_OP_UNSIGNED(64, _poppar, AR_poppar); 02983 02984 TEST_LP_OP_TYPES( _poppar, AR_poppar); 02985 02986 } /* test_poppar */ 02987 02988 02989 #undef TEST_MASK_SIGNED 02990 #undef TEST_MASK_UNSIGNED 02991 #undef TEST_MASK_TYPES 02992 #undef TEST_LP_OP_SIGNED 02993 #undef TEST_LP_OP_UNSIGNED 02994 #undef TEST_LP_OP_TYPES 02995 02996 02997 /*====================================================================== 02998 * 02999 * STATUS 03000 * 03001 */ 03002 03003 #define TEST_STATUS_SIGNED(size) \ 03004 do { \ 03005 int j; \ 03006 \ 03007 printf(" Testing: SIGNED %2d INT %-10s: ", size, "status"); \ 03008 \ 03009 for (j=0; j<num_cool_ints; j++) \ 03010 { \ 03011 act_status[j] = is_zero##size( \ 03012 DSEXT##size(LS##size(&cool_ints[j]))) \ 03013 ? AR_STAT_ZERO : AR_STAT_OK; \ 03014 \ 03015 if (is_neg##size(LS##size(&cool_ints[j]))) \ 03016 act_status[j] |= AR_STAT_NEGATIVE; \ 03017 \ 03018 test_status[j] = AR_status((AR_DATA *)&cool_ints[j], \ 03019 &sint##size##_artype); \ 03020 \ 03021 if (act_status[j] != test_status[j]) \ 03022 { \ 03023 printf(" ERROR: incorrect status at %d\n", j); \ 03024 abort(); \ 03025 } \ 03026 } \ 03027 \ 03028 printf("PASSED\n"); \ 03029 } while (0) 03030 03031 03032 #define TEST_STATUS_UNSIGNED(size) \ 03033 do { \ 03034 int j; \ 03035 \ 03036 printf(" Testing: SIGNED %2d INT %-10s: ", size, "status"); \ 03037 \ 03038 for (j=0; j<num_cool_ints; j++) \ 03039 { \ 03040 act_status[j] = is_zero##size(LU##size(&cool_ints[j])) \ 03041 ? AR_STAT_ZERO : AR_STAT_OK; \ 03042 \ 03043 test_status[j] = AR_status((AR_DATA *)&cool_ints[j], \ 03044 &uint##size##_artype); \ 03045 \ 03046 if (act_status[j] != test_status[j]) \ 03047 { \ 03048 printf(" ERROR: incorrect status at %d\n", j); \ 03049 abort(); \ 03050 } \ 03051 } \ 03052 \ 03053 printf("PASSED\n"); \ 03054 } while (0) 03055 03056 03057 #define TEST_STATUS_TYPES \ 03058 do { \ 03059 int k; \ 03060 \ 03061 printf(" Testing: types %-10s: ", "status"); \ 03062 \ 03063 for (k=0; k<num_ar_types; k++) \ 03064 { \ 03065 test_status[k] = AR_status((AR_DATA *)&cool_ints[1], \ 03066 &ar_types[k]); \ 03067 \ 03068 if (test_status[k] & AR_STAT_INVALID_TYPE) \ 03069 { \ 03070 printf(" ERROR: incorrect status at %d\n", k); \ 03071 abort(); \ 03072 } \ 03073 } \ 03074 \ 03075 printf("PASSED\n"); \ 03076 } while (0) 03077 03078 03079 test_arstatus() 03080 { 03081 03082 TEST_STATUS_SIGNED( 8); 03083 TEST_STATUS_UNSIGNED( 8); 03084 03085 TEST_STATUS_SIGNED( 16); 03086 TEST_STATUS_UNSIGNED(16); 03087 03088 TEST_STATUS_SIGNED( 32); 03089 TEST_STATUS_UNSIGNED(32); 03090 03091 TEST_STATUS_SIGNED( 46); 03092 03093 TEST_STATUS_SIGNED( 64); 03094 TEST_STATUS_UNSIGNED(64); 03095 03096 TEST_STATUS_TYPES; 03097 03098 } /* test_arstatus */ 03099 03100 03101 #undef TEST_STATUS_SIGNED 03102 #undef TEST_STATUS_UNSIGNED 03103 #undef TEST_STATUS_TYPES 03104 03105 03106 /*====================================================================== 03107 * 03108 * ARITHMETIC 03109 * 03110 */ 03111 03112 03113 #define TEST_ADDSUB_OP_SIGNED(size, opr, func) \ 03114 do { \ 03115 int i, j; \ 03116 \ 03117 printf(" Testing: SIGNED %2d INT %-10s: ", size, #opr); \ 03118 \ 03119 for (i=0; i<num_cool_ints; i++) \ 03120 { \ 03121 for (j=0; j<num_cool_ints; j++) \ 03122 { \ 03123 act_result[j] = DSEXT##size(LS##size(&cool_ints[i]) opr \ 03124 LS##size(&cool_ints[j])); \ 03125 \ 03126 act_status[j] = is_zero##size(act_result[j]) \ 03127 ? AR_STAT_ZERO : AR_STAT_OK; \ 03128 if (is_neg##size(act_result[j])) \ 03129 act_status[j] |= AR_STAT_NEGATIVE; \ 03130 \ 03131 /* Overflow check. */ \ 03132 if ((strcmp(#opr, "+") == 0 && \ 03133 is_neg##size(LS##size(&cool_ints[i])) == \ 03134 is_neg##size(LS##size(&cool_ints[j])) && \ 03135 is_neg##size(LS##size(&cool_ints[i])) != \ 03136 is_neg##size(act_result[j])) || \ 03137 (strcmp(#opr, "-") == 0 && \ 03138 is_neg##size(LS##size(&cool_ints[i])) != \ 03139 is_neg##size(LS##size(&cool_ints[j])) && \ 03140 is_neg##size(LS##size(&cool_ints[i])) != \ 03141 is_neg##size(act_result[j]))) \ 03142 { \ 03143 act_status[j] |= AR_STAT_OVERFLOW; \ 03144 } \ 03145 \ 03146 test_result[j].part1 = 0; \ 03147 test_result[j].part2 = 0; \ 03148 test_result[j].part3 = 0; \ 03149 test_result[j].part4 = 0; \ 03150 \ 03151 test_status[j] = func((AR_DATA *)&test_result[j], \ 03152 &sint##size##_artype, \ 03153 (AR_DATA *)&cool_ints[i], \ 03154 &sint##size##_artype, \ 03155 (AR_DATA *)&cool_ints[j], \ 03156 &sint##size##_artype); \ 03157 \ 03158 if (LU64(&test_result[j]) != act_result[j]) \ 03159 { \ 03160 printf(" ERROR: incorrect result at %d,%d\n", i, j); \ 03161 abort(); \ 03162 } \ 03163 \ 03164 if (act_status[j] != test_status[j]) \ 03165 { \ 03166 printf(" ERROR: incorrect status at %d,%d\n", i, j); \ 03167 abort(); \ 03168 } \ 03169 } \ 03170 } \ 03171 \ 03172 printf("PASSED\n"); \ 03173 } while (0) 03174 03175 03176 #define TEST_ADDSUB_OP_UNSIGNED(size, opr, func) \ 03177 do { \ 03178 int i, j; \ 03179 \ 03180 printf(" Testing: UNSIGNED %2d INT %-10s: ", size, #opr); \ 03181 \ 03182 for (i=0; i<num_cool_ints; i++) \ 03183 { \ 03184 for (j=0; j<num_cool_ints; j++) \ 03185 { \ 03186 act_result[j] = DSEXT##size(LU##size(&cool_ints[i]) opr \ 03187 LU##size(&cool_ints[j])); \ 03188 \ 03189 act_status[j] = is_zero##size(act_result[j]) \ 03190 ? AR_STAT_ZERO : AR_STAT_OK; \ 03191 \ 03192 test_result[j].part1 = 0; \ 03193 test_result[j].part2 = 0; \ 03194 test_result[j].part3 = 0; \ 03195 test_result[j].part4 = 0; \ 03196 \ 03197 test_status[j] = func((AR_DATA *)&test_result[j], \ 03198 &uint##size##_artype, \ 03199 (AR_DATA *)&cool_ints[i], \ 03200 &uint##size##_artype, \ 03201 (AR_DATA *)&cool_ints[j], \ 03202 &uint##size##_artype); \ 03203 \ 03204 if (LU64(&test_result[j]) != (UINT64)act_result[j]) \ 03205 { \ 03206 printf(" ERROR: incorrect result at %d,%d\n", i, j); \ 03207 abort(); \ 03208 } \ 03209 \ 03210 if (act_status[j] != test_status[j]) \ 03211 { \ 03212 printf(" ERROR: incorrect status at %d,%d\n", i, j); \ 03213 abort(); \ 03214 } \ 03215 } \ 03216 } \ 03217 \ 03218 printf("PASSED\n"); \ 03219 } while (0) 03220 03221 03222 #define TEST_ADDSUB_OP_TYPES(opr, func) \ 03223 do { \ 03224 int i, j, k; \ 03225 \ 03226 printf(" Testing: types %-10s: ", #opr); \ 03227 \ 03228 for (i=0; i<num_ar_types; i++) \ 03229 { \ 03230 for (j=0; j<num_ar_types; j++) \ 03231 { \ 03232 for (k=0; k<num_ar_types; k++) \ 03233 { \ 03234 act_status[k] = AR_STAT_OK; \ 03235 if (ar_types[i] != ar_types[j] || \ 03236 ar_types[j] != ar_types[k] || \ 03237 !IS_SUPPORTED_INT_TYPE(ar_types[i])) \ 03238 act_status[k] = AR_STAT_INVALID_TYPE; \ 03239 \ 03240 test_status[k] = func((AR_DATA *)&test_result[1], \ 03241 &ar_types[i], \ 03242 (AR_DATA *)&cool_ints[1], \ 03243 &ar_types[j], \ 03244 (AR_DATA *)&cool_ints[1], \ 03245 &ar_types[k]); \ 03246 \ 03247 if ((act_status[k] ^ test_status[k]) & \ 03248 AR_STAT_INVALID_TYPE) \ 03249 { \ 03250 printf(" ERROR: incorrect status at %d,%d,%d\n", \ 03251 i, j, k); \ 03252 abort(); \ 03253 } \ 03254 } \ 03255 } \ 03256 } \ 03257 \ 03258 printf("PASSED\n"); \ 03259 } while (0) 03260 03261 03262 test_add() 03263 { 03264 03265 TEST_ADDSUB_OP_SIGNED( 8, +, AR_add); 03266 TEST_ADDSUB_OP_UNSIGNED( 8, +, AR_add); 03267 03268 TEST_ADDSUB_OP_SIGNED( 16, +, AR_add); 03269 TEST_ADDSUB_OP_UNSIGNED(16, +, AR_add); 03270 03271 TEST_ADDSUB_OP_SIGNED( 32, +, AR_add); 03272 TEST_ADDSUB_OP_UNSIGNED(32, +, AR_add); 03273 03274 TEST_ADDSUB_OP_SIGNED( 46, +, AR_add); 03275 03276 TEST_ADDSUB_OP_SIGNED( 64, +, AR_add); 03277 TEST_ADDSUB_OP_UNSIGNED(64, +, AR_add); 03278 03279 TEST_ADDSUB_OP_TYPES( +, AR_add); 03280 03281 } /* test_add */ 03282 03283 03284 test_subtract() 03285 { 03286 03287 TEST_ADDSUB_OP_SIGNED( 8, -, AR_subtract); 03288 TEST_ADDSUB_OP_UNSIGNED( 8, -, AR_subtract); 03289 03290 TEST_ADDSUB_OP_SIGNED( 16, -, AR_subtract); 03291 TEST_ADDSUB_OP_UNSIGNED(16, -, AR_subtract); 03292 03293 TEST_ADDSUB_OP_SIGNED( 32, -, AR_subtract); 03294 TEST_ADDSUB_OP_UNSIGNED(32, -, AR_subtract); 03295 03296 TEST_ADDSUB_OP_SIGNED( 46, -, AR_subtract); 03297 03298 TEST_ADDSUB_OP_SIGNED( 64, -, AR_subtract); 03299 TEST_ADDSUB_OP_UNSIGNED(64, -, AR_subtract); 03300 03301 TEST_ADDSUB_OP_TYPES( -, AR_subtract); 03302 03303 } /* test_subtract */ 03304 03305 03306 #undef ADDSUB_OP_SIGNED 03307 #undef ADDSUB_OP_UNSIGNED 03308 #undef ADDSUB_OP_TYPES 03309 03310 03311 #define TEST_NEG_OP_SIGNED(size) \ 03312 do { \ 03313 int j; \ 03314 \ 03315 printf(" Testing: SIGNED %2d INT %-10s: ", size, "unary -"); \ 03316 \ 03317 for (j=0; j<num_cool_ints; j++) \ 03318 { \ 03319 act_result[j] = DSEXT##size(- LS##size(&cool_ints[j])); \ 03320 \ 03321 if (is_zero##size(act_result[j])) \ 03322 { /* result is zero */ \ 03323 act_status[j] = AR_STAT_ZERO; \ 03324 } \ 03325 else \ 03326 { /* result is non-zero */ \ 03327 if (is_neg##size(LS##size(&cool_ints[j])) == \ 03328 is_neg##size(act_result[j])) \ 03329 { /* The sign bit of the operand and the result match. \ 03330 Overflow except negate of maximum negative int. */ \ 03331 if(LS##size(&cool_ints[j]) != \ 03332 LS##size((AR_INT_64*)&act_result[j])) \ 03333 act_status[j] = AR_STAT_OVERFLOW; \ 03334 else \ 03335 act_status[j] = AR_STAT_SEMIVALID; \ 03336 } \ 03337 else \ 03338 { /* No overflow. */ \ 03339 act_status[j] = AR_STAT_OK; \ 03340 } \ 03341 } \ 03342 \ 03343 if (is_neg##size(act_result[j])) \ 03344 act_status[j] |= AR_STAT_NEGATIVE; \ 03345 \ 03346 test_result[j].part1 = 0; \ 03347 test_result[j].part2 = 0; \ 03348 test_result[j].part3 = 0; \ 03349 test_result[j].part4 = 0; \ 03350 \ 03351 test_status[j] = AR_negate((AR_DATA *)&test_result[j], \ 03352 &sint##size##_artype, \ 03353 (AR_DATA *)&cool_ints[j], \ 03354 &sint##size##_artype); \ 03355 \ 03356 if (LU64(&test_result[j]) != act_result[j]) \ 03357 { \ 03358 printf(" ERROR: incorrect result at %d\n", j); \ 03359 abort(); \ 03360 } \ 03361 \ 03362 if (act_status[j] != test_status[j]) \ 03363 { \ 03364 printf(" ERROR: incorrect status at %d\n", j); \ 03365 abort(); \ 03366 } \ 03367 } \ 03368 \ 03369 printf("PASSED\n"); \ 03370 } while (0) 03371 03372 03373 #define TEST_NEG_OP_UNSIGNED(size) \ 03374 do { \ 03375 int j; \ 03376 \ 03377 printf(" Testing: UNSIGNED %2d INT %-10s: ", size, "unary -"); \ 03378 \ 03379 for (j=0; j<num_cool_ints; j++) \ 03380 { \ 03381 act_result[j] = DSEXT##size(- LU##size(&cool_ints[j])); \ 03382 \ 03383 act_status[j] = is_zero##size(act_result[j]) \ 03384 ? AR_STAT_ZERO : AR_STAT_OK; \ 03385 \ 03386 test_result[j].part1 = 0; \ 03387 test_result[j].part2 = 0; \ 03388 test_result[j].part3 = 0; \ 03389 test_result[j].part4 = 0; \ 03390 \ 03391 test_status[j] = AR_negate((AR_DATA *)&test_result[j], \ 03392 &uint##size##_artype, \ 03393 (AR_DATA *)&cool_ints[j], \ 03394 &uint##size##_artype); \ 03395 \ 03396 if (LU64(&test_result[j]) != (UINT64)act_result[j]) \ 03397 { \ 03398 printf(" ERROR: incorrect result at %d\n", j); \ 03399 abort(); \ 03400 } \ 03401 \ 03402 if (act_status[j] != test_status[j]) \ 03403 { \ 03404 printf(" ERROR: incorrect status at %d\n", j); \ 03405 abort(); \ 03406 } \ 03407 } \ 03408 \ 03409 printf("PASSED\n"); \ 03410 } while (0) 03411 03412 03413 #define TEST_NEG_OP_TYPES \ 03414 do { \ 03415 int j, k; \ 03416 \ 03417 printf(" Testing: types %-10s: ", "unary -"); \ 03418 \ 03419 for (j=0; j<num_ar_types; j++) \ 03420 { \ 03421 for (k=0; k<num_ar_types; k++) \ 03422 { \ 03423 act_status[k] = AR_STAT_OK; \ 03424 if (ar_types[j] != ar_types[k] || \ 03425 !IS_SUPPORTED_INT_TYPE(ar_types[j])) \ 03426 act_status[k] = AR_STAT_INVALID_TYPE; \ 03427 \ 03428 test_status[k] = AR_negate((AR_DATA *)&test_result[1], \ 03429 &ar_types[j], \ 03430 (AR_DATA *)&cool_ints[1], \ 03431 &ar_types[k]); \ 03432 \ 03433 if ((act_status[k] ^ test_status[k]) & \ 03434 AR_STAT_INVALID_TYPE) \ 03435 { \ 03436 printf(" ERROR: incorrect status at %d,%d\n", j, k); \ 03437 abort(); \ 03438 } \ 03439 } \ 03440 } \ 03441 \ 03442 printf("PASSED\n"); \ 03443 } while (0) 03444 03445 03446 test_negate() 03447 { 03448 03449 TEST_NEG_OP_SIGNED( 8); 03450 TEST_NEG_OP_UNSIGNED( 8); 03451 03452 TEST_NEG_OP_SIGNED( 16); 03453 TEST_NEG_OP_UNSIGNED(16); 03454 03455 TEST_NEG_OP_SIGNED( 32); 03456 TEST_NEG_OP_UNSIGNED(32); 03457 03458 TEST_NEG_OP_SIGNED( 46); 03459 03460 TEST_NEG_OP_SIGNED( 64); 03461 TEST_NEG_OP_UNSIGNED(64); 03462 03463 TEST_NEG_OP_TYPES; 03464 03465 } /* test_negate */ 03466 03467 03468 #undef TEST_NEG_SIGNED 03469 #undef TEST_NEG_UNSIGNED 03470 #undef TEST_NEG_TYPES 03471 03472 03473 #define TEST_ABS_OP_SIGNED(size) \ 03474 do { \ 03475 int j; \ 03476 \ 03477 printf(" Testing: SIGNED %2d INT %-10s: ", size, "abs"); \ 03478 \ 03479 for (j=0; j<num_cool_ints; j++) \ 03480 { \ 03481 if (is_neg##size(LS##size(&cool_ints[j]))) \ 03482 act_result[j] = DSEXT##size( - LS##size(&cool_ints[j])); \ 03483 else \ 03484 act_result[j] = DSEXT##size( LS##size(&cool_ints[j])); \ 03485 \ 03486 act_status[j] = is_zero##size(act_result[j]) \ 03487 ? AR_STAT_ZERO : AR_STAT_OK; \ 03488 \ 03489 if (is_neg##size(act_result[j])) \ 03490 { /* The result can be negative only if it overflows. */ \ 03491 act_status[j] |= AR_STAT_NEGATIVE; \ 03492 act_status[j] |= AR_STAT_OVERFLOW; \ 03493 } \ 03494 \ 03495 test_result[j].part1 = 0; \ 03496 test_result[j].part2 = 0; \ 03497 test_result[j].part3 = 0; \ 03498 test_result[j].part4 = 0; \ 03499 \ 03500 test_status[j] = AR_abs((AR_DATA *)&test_result[j], \ 03501 &sint##size##_artype, \ 03502 (AR_DATA *)&cool_ints[j], \ 03503 &sint##size##_artype); \ 03504 \ 03505 if (LU64(&test_result[j]) != act_result[j]) \ 03506 { \ 03507 printf(" ERROR: incorrect result at %d\n", j); \ 03508 abort(); \ 03509 } \ 03510 \ 03511 if (act_status[j] != test_status[j]) \ 03512 { \ 03513 printf(" ERROR: incorrect status at %d\n", j); \ 03514 abort(); \ 03515 } \ 03516 } \ 03517 \ 03518 printf("PASSED\n"); \ 03519 } while (0) 03520 03521 03522 #define TEST_ABS_OP_UNSIGNED(size) \ 03523 do { \ 03524 int j; \ 03525 \ 03526 printf(" Testing: UNSIGNED %2d INT %-10s: ", size, "abs"); \ 03527 \ 03528 for (j=0; j<num_cool_ints; j++) \ 03529 { \ 03530 act_result[j] = DSEXT##size(LU64(&cool_ints[j])); \ 03531 \ 03532 act_status[j] = is_zero##size(act_result[j]) \ 03533 ? AR_STAT_ZERO : AR_STAT_OK; \ 03534 \ 03535 test_result[j].part1 = 0; \ 03536 test_result[j].part2 = 0; \ 03537 test_result[j].part3 = 0; \ 03538 test_result[j].part4 = 0; \ 03539 \ 03540 test_status[j] = AR_abs((AR_DATA *)&test_result[j], \ 03541 &uint##size##_artype, \ 03542 (AR_DATA *)&cool_ints[j], \ 03543 &uint##size##_artype); \ 03544 \ 03545 if (LU64(&test_result[j]) != (UINT64)act_result[j]) \ 03546 { \ 03547 printf(" ERROR: incorrect result at %d\n", j); \ 03548 abort(); \ 03549 } \ 03550 \ 03551 if (act_status[j] != test_status[j]) \ 03552 { \ 03553 printf(" ERROR: incorrect status at %d\n", j); \ 03554 abort(); \ 03555 } \ 03556 } \ 03557 \ 03558 printf("PASSED\n"); \ 03559 } while (0) 03560 03561 03562 #define TEST_ABS_OP_TYPES \ 03563 do { \ 03564 int j, k; \ 03565 \ 03566 printf(" Testing: types %-10s: ", "abs"); \ 03567 \ 03568 for (j=0; j<num_ar_types; j++) \ 03569 { \ 03570 for (k=0; k<num_ar_types; k++) \ 03571 { \ 03572 act_status[k] = AR_STAT_OK; \ 03573 if (ar_types[j] != ar_types[k] || \ 03574 !IS_SUPPORTED_INT_TYPE(ar_types[j])) \ 03575 act_status[k] = AR_STAT_INVALID_TYPE; \ 03576 \ 03577 test_status[k] = AR_abs((AR_DATA *)&test_result[1], \ 03578 &ar_types[j], \ 03579 (AR_DATA *)&cool_ints[1], \ 03580 &ar_types[k]); \ 03581 \ 03582 if ((act_status[k] ^ test_status[k]) & \ 03583 AR_STAT_INVALID_TYPE) \ 03584 { \ 03585 printf(" ERROR: incorrect status at %d,%d\n", j, k); \ 03586 abort(); \ 03587 } \ 03588 } \ 03589 } \ 03590 \ 03591 printf("PASSED\n"); \ 03592 } while (0) 03593 03594 03595 test_abs() 03596 { 03597 03598 TEST_ABS_OP_SIGNED( 8); 03599 TEST_ABS_OP_UNSIGNED( 8); 03600 03601 TEST_ABS_OP_SIGNED( 16); 03602 TEST_ABS_OP_UNSIGNED(16); 03603 03604 TEST_ABS_OP_SIGNED( 32); 03605 TEST_ABS_OP_UNSIGNED(32); 03606 03607 TEST_ABS_OP_SIGNED( 46); 03608 03609 TEST_ABS_OP_SIGNED( 64); 03610 TEST_ABS_OP_UNSIGNED(64); 03611 03612 TEST_ABS_OP_TYPES; 03613 03614 } /* test_abs */ 03615 03616 03617 #undef TEST_ABS_OP_SIGNED 03618 #undef TEST_ABS_OP_UNSIGNED 03619 #undef TEST_ABS_OP_TYPES 03620 03621 03622 #define TEST_MUL_OP_SIGNED(size) \ 03623 do { \ 03624 int i, j; \ 03625 \ 03626 printf(" Testing: SIGNED %2d INT %-10s: ", size, "*"); \ 03627 \ 03628 for (i=0; i<num_cool_ints; i++) \ 03629 { \ 03630 for (j=0; j<num_cool_ints; j++) \ 03631 { \ 03632 if (size == 46) \ 03633 act_result[j] = (SINT64)(LS64(&cool_ints[i]) * \ 03634 LS64(&cool_ints[j])); \ 03635 else \ 03636 act_result[j] = DSEXT##size(LS##size(&cool_ints[i]) * \ 03637 LS##size(&cool_ints[j])); \ 03638 \ 03639 act_status[j] = is_zero##size(act_result[j]) \ 03640 ? AR_STAT_ZERO : AR_STAT_OK; \ 03641 if (is_neg##size(act_result[j])) \ 03642 act_status[j] |= AR_STAT_NEGATIVE; \ 03643 \ 03644 /* Overflow checks. */ \ 03645 if (size == 46) \ 03646 { \ 03647 if (((LS64(&cool_ints[i]) & ((~((SINT64) 0)) << 45)) \ 03648 != 0) && \ 03649 ((LS64(&cool_ints[i]) & ((~((SINT64) 0)) << 45)) \ 03650 != ((~((SINT64) 0)) << 45))) \ 03651 { /* first operand too big to be represented as a \ 03652 46-bit int */ \ 03653 act_status[j] |= AR_STAT_OVERFLOW; \ 03654 } \ 03655 else \ 03656 if (((LS64(&cool_ints[j]) & ((~((SINT64) 0)) << 45)) \ 03657 != 0) && \ 03658 ((LS64(&cool_ints[j]) & ((~((SINT64) 0)) << 45)) \ 03659 != ((~((SINT64) 0)) << 45))) \ 03660 { /* second operand too big to be represented as a \ 03661 46-bit int */ \ 03662 act_status[j] |= AR_STAT_OVERFLOW; \ 03663 } \ 03664 else \ 03665 if (((act_result[j] & ((~((SINT64) 0)) << 45)) \ 03666 != 0) && \ 03667 ((act_result[j] & ((~((SINT64) 0)) << 45)) \ 03668 != ((~((SINT64) 0)) << 45))) \ 03669 { /* result too big to be represented as a \ 03670 46-bit int */ \ 03671 act_status[j] |= AR_STAT_OVERFLOW; \ 03672 } \ 03673 } \ 03674 \ 03675 if (LS##size(&cool_ints[i]) != 0 && \ 03676 LS##size(&cool_ints[j]) != 0) \ 03677 { /* Check for overflow if neither operand is zero. \ 03678 (If either is zero, an overflow can not occur \ 03679 and dealing with zeros in the checks below \ 03680 causes headaches.) */ \ 03681 if (is_neg##size(LS##size(&cool_ints[i]) ^ \ 03682 LS##size(&cool_ints[j]) ^ \ 03683 act_result[j])) \ 03684 { /* The sign of the result does not match the XOR \ 03685 of the signs of the two operands. Overflow. */ \ 03686 act_status[j] |= AR_STAT_OVERFLOW; \ 03687 } \ 03688 else if ((SEXT##size(act_result[j]) / \ 03689 LS##size(&cool_ints[i])) != \ 03690 LS##size(&cool_ints[j])) \ 03691 { /* The above test does not catch all overflows. \ 03692 This test catches all remaining overflows by \ 03693 checking to see that the result divided by the \ 03694 the first operand equals the second operand. */ \ 03695 act_status[j] |= AR_STAT_OVERFLOW; \ 03696 } \ 03697 } \ 03698 \ 03699 test_result[j].part1 = 0; \ 03700 test_result[j].part2 = 0; \ 03701 test_result[j].part3 = 0; \ 03702 test_result[j].part4 = 0; \ 03703 \ 03704 test_status[j] = AR_multiply((AR_DATA *)&test_result[j], \ 03705 &sint##size##_artype, \ 03706 (AR_DATA *)&cool_ints[i], \ 03707 &sint##size##_artype, \ 03708 (AR_DATA *)&cool_ints[j], \ 03709 &sint##size##_artype); \ 03710 \ 03711 if (LU64(&test_result[j]) != act_result[j]) \ 03712 { \ 03713 printf(" ERROR: incorrect result at %d,%d\n", i, j); \ 03714 abort(); \ 03715 } \ 03716 \ 03717 if (act_status[j] != test_status[j]) \ 03718 { \ 03719 printf(" ERROR: incorrect status at %d,%d\n", i, j); \ 03720 abort(); \ 03721 } \ 03722 } \ 03723 } \ 03724 \ 03725 printf("PASSED\n"); \ 03726 } while (0) 03727 03728 03729 #define TEST_MUL_OP_UNSIGNED(size) \ 03730 do { \ 03731 int i, j; \ 03732 \ 03733 printf(" Testing: UNSIGNED %2d INT %-10s: ", size, "*"); \ 03734 \ 03735 for (i=0; i<num_cool_ints; i++) \ 03736 { \ 03737 for (j=0; j<num_cool_ints; j++) \ 03738 { \ 03739 act_result[j] = DSEXT##size(LU##size(&cool_ints[i]) * \ 03740 LU##size(&cool_ints[j])); \ 03741 \ 03742 act_status[j] = is_zero##size(act_result[j]) \ 03743 ? AR_STAT_ZERO : AR_STAT_OK; \ 03744 \ 03745 test_result[j].part1 = 0; \ 03746 test_result[j].part2 = 0; \ 03747 test_result[j].part3 = 0; \ 03748 test_result[j].part4 = 0; \ 03749 \ 03750 test_status[j] = AR_multiply((AR_DATA *)&test_result[j], \ 03751 &uint##size##_artype, \ 03752 (AR_DATA *)&cool_ints[i], \ 03753 &uint##size##_artype, \ 03754 (AR_DATA *)&cool_ints[j], \ 03755 &uint##size##_artype); \ 03756 \ 03757 if (LU64(&test_result[j]) != (UINT64)act_result[j]) \ 03758 { \ 03759 printf(" ERROR: incorrect result at %d,%d\n", i, j); \ 03760 abort(); \ 03761 } \ 03762 \ 03763 if (act_status[j] != test_status[j]) \ 03764 { \ 03765 printf(" ERROR: incorrect status at %d,%d\n", i, j); \ 03766 abort(); \ 03767 } \ 03768 } \ 03769 } \ 03770 \ 03771 printf("PASSED\n"); \ 03772 } while (0) 03773 03774 03775 #define TEST_MUL_OP_TYPES \ 03776 do { \ 03777 int i, j, k; \ 03778 \ 03779 printf(" Testing: types %-10s: ", "*"); \ 03780 \ 03781 for (i=0; i<num_ar_types; i++) \ 03782 { \ 03783 for (j=0; j<num_ar_types; j++) \ 03784 { \ 03785 for (k=0; k<num_ar_types; k++) \ 03786 { \ 03787 act_status[k] = AR_STAT_OK; \ 03788 if (ar_types[i] != ar_types[j] || \ 03789 ar_types[j] != ar_types[k] || \ 03790 !IS_SUPPORTED_INT_TYPE(ar_types[i])) \ 03791 act_status[k] = AR_STAT_INVALID_TYPE; \ 03792 \ 03793 test_status[k] = AR_multiply((AR_DATA *)&test_result[1], \ 03794 &ar_types[i], \ 03795 (AR_DATA *)&cool_ints[1], \ 03796 &ar_types[j], \ 03797 (AR_DATA *)&cool_ints[1], \ 03798 &ar_types[k]); \ 03799 \ 03800 if ((act_status[k] ^ test_status[k]) & \ 03801 AR_STAT_INVALID_TYPE) \ 03802 { \ 03803 printf(" ERROR: incorrect status at %d,%d,%d\n", \ 03804 i, j, k); \ 03805 abort(); \ 03806 } \ 03807 } \ 03808 } \ 03809 } \ 03810 \ 03811 printf("PASSED\n"); \ 03812 } while (0) 03813 03814 03815 test_multiply() 03816 { 03817 03818 TEST_MUL_OP_SIGNED( 8); 03819 TEST_MUL_OP_UNSIGNED( 8); 03820 03821 TEST_MUL_OP_SIGNED( 16); 03822 TEST_MUL_OP_UNSIGNED(16); 03823 03824 TEST_MUL_OP_SIGNED( 32); 03825 TEST_MUL_OP_UNSIGNED(32); 03826 03827 TEST_MUL_OP_SIGNED( 46); 03828 03829 TEST_MUL_OP_SIGNED( 64); 03830 TEST_MUL_OP_UNSIGNED(64); 03831 03832 TEST_MUL_OP_TYPES; 03833 03834 } /* test_multiply */ 03835 03836 03837 #undef TEST_MUL_OP_SIGNED 03838 #undef TEST_MUL_OP_UNSIGNED 03839 #undef TEST_MUL_OP_TYPES 03840 03841 03842 #define TEST_DIV_OP_SIGNED(size) \ 03843 do { \ 03844 int i, j; \ 03845 \ 03846 printf(" Testing: SIGNED %2d INT %-10s: ", size, "/"); \ 03847 \ 03848 for (i=0; i<num_cool_ints; i++) \ 03849 { \ 03850 for (j=0; j<num_cool_ints; j++) \ 03851 { \ 03852 act_status[j] = AR_STAT_OK; \ 03853 \ 03854 if (LS##size(&cool_ints[j]) == 0) \ 03855 { /* divide by zero */ \ 03856 act_result[j] = 0; \ 03857 act_status[j] |= AR_STAT_OVERFLOW; \ 03858 } \ 03859 else if (size == 46) \ 03860 { /* 46-bit divide */ \ 03861 /* not divide by zero */ \ 03862 /* Perform division using 64-bit precision to avoid \ 03863 "fastmd" problems. */ \ 03864 act_result[j] = (SINT64)(LS64(&cool_ints[i]) / \ 03865 LS64(&cool_ints[j])); \ 03866 \ 03867 if (((LS64(&cool_ints[i]) & ((~((SINT64) 0)) << 45)) \ 03868 != 0) && \ 03869 ((LS64(&cool_ints[i]) & ((~((SINT64) 0)) << 45)) \ 03870 != ((~((SINT64) 0)) << 45))) \ 03871 { /* first operand too big to be represented as a \ 03872 46-bit int */ \ 03873 act_status[j] |= AR_STAT_OVERFLOW; \ 03874 } \ 03875 else if (((LS64(&cool_ints[j]) & ((~((SINT64) 0)) << 45))\ 03876 != 0) && \ 03877 ((LS64(&cool_ints[j]) & ((~((SINT64) 0)) << 45))\ 03878 != ((~((SINT64) 0)) << 45))) \ 03879 { /* second operand too big to be represented as a \ 03880 46-bit int */ \ 03881 act_status[j] |= AR_STAT_OVERFLOW; \ 03882 } \ 03883 else if (((act_result[j] & ((~((SINT64) 0)) << 45)) \ 03884 != 0) && \ 03885 ((act_result[j] & ((~((SINT64) 0)) << 45)) \ 03886 != ((~((SINT64) 0)) << 45))) \ 03887 { /* result too big to be represented as a \ 03888 46-bit int */ \ 03889 act_status[j] |= AR_STAT_OVERFLOW; \ 03890 } \ 03891 else if (!is_zero##size(act_result [j]) && \ 03892 (LS64(&cool_ints[i]) ^ \ 03893 LS64(&cool_ints[j]) ^ \ 03894 act_result[j]) < 0) \ 03895 { /* Overflow. */ \ 03896 act_status[j] |= AR_STAT_OVERFLOW; \ 03897 } \ 03898 } \ 03899 else \ 03900 { /* not 46-bit divide */ \ 03901 /* not divide by zero */ \ 03902 act_result[j] = DSEXT##size(LS##size(&cool_ints[i]) / \ 03903 LS##size(&cool_ints[j])); \ 03904 \ 03905 if (!is_zero##size(act_result[j]) && \ 03906 is_neg##size(LS##size(&cool_ints[i]) ^ \ 03907 LS##size(&cool_ints[j]) ^ \ 03908 act_result[j])) \ 03909 { /* Overflow. */ \ 03910 act_status[j] |= AR_STAT_OVERFLOW; \ 03911 } \ 03912 } \ 03913 \ 03914 if (is_zero##size(act_result[j])) \ 03915 act_status[j] |= AR_STAT_ZERO; \ 03916 \ 03917 if (is_neg##size(act_result[j])) \ 03918 act_status[j] |= AR_STAT_NEGATIVE; \ 03919 \ 03920 test_result[j].part1 = 0; \ 03921 test_result[j].part2 = 0; \ 03922 test_result[j].part3 = 0; \ 03923 test_result[j].part4 = 0; \ 03924 \ 03925 test_status[j] = AR_divide((AR_DATA *)&test_result[j], \ 03926 &sint##size##_artype, \ 03927 (AR_DATA *)&cool_ints[i], \ 03928 &sint##size##_artype, \ 03929 (AR_DATA *)&cool_ints[j], \ 03930 &sint##size##_artype); \ 03931 \ 03932 if (LU64(&test_result[j]) != act_result[j]) \ 03933 { \ 03934 printf(" ERROR: incorrect result at %d,%d\n", i, j); \ 03935 abort(); \ 03936 } \ 03937 \ 03938 if (act_status[j] != test_status[j]) \ 03939 { \ 03940 printf(" ERROR: incorrect status at %d,%d\n", i, j); \ 03941 abort(); \ 03942 } \ 03943 } \ 03944 } \ 03945 \ 03946 printf("PASSED\n"); \ 03947 } while (0) 03948 03949 03950 #define TEST_DIV_OP_UNSIGNED(size) \ 03951 do { \ 03952 int i, j; \ 03953 \ 03954 printf(" Testing: UNSIGNED %2d INT %-10s: ", size, "/"); \ 03955 \ 03956 for (i=0; i<num_cool_ints; i++) \ 03957 { \ 03958 for (j=0; j<num_cool_ints; j++) \ 03959 { \ 03960 act_status[j] = AR_STAT_OK; \ 03961 \ 03962 if (LU##size(&cool_ints[j]) == 0) \ 03963 { /* divide by zero */ \ 03964 act_result[j] = 0; \ 03965 act_status[j] |= AR_STAT_OVERFLOW; \ 03966 } \ 03967 else \ 03968 { /* not divide by zero */ \ 03969 act_result[j] = LU##size(&cool_ints[i]) / \ 03970 LU##size(&cool_ints[j]); \ 03971 } \ 03972 \ 03973 if (is_zero##size(act_result[j])) \ 03974 act_status[j] |= AR_STAT_ZERO; \ 03975 \ 03976 test_result[j].part1 = 0; \ 03977 test_result[j].part2 = 0; \ 03978 test_result[j].part3 = 0; \ 03979 test_result[j].part4 = 0; \ 03980 \ 03981 test_status[j] = AR_divide((AR_DATA *)&test_result[j], \ 03982 &uint##size##_artype, \ 03983 (AR_DATA *)&cool_ints[i], \ 03984 &uint##size##_artype, \ 03985 (AR_DATA *)&cool_ints[j], \ 03986 &uint##size##_artype); \ 03987 \ 03988 if (LU64(&test_result[j]) != (UINT64)act_result[j]) \ 03989 { \ 03990 printf(" ERROR: incorrect result at %d,%d\n", i, j); \ 03991 abort(); \ 03992 } \ 03993 \ 03994 if (act_status[j] != test_status[j]) \ 03995 { \ 03996 printf(" ERROR: incorrect status at %d,%d\n", i, j); \ 03997 abort(); \ 03998 } \ 03999 } \ 04000 } \ 04001 \ 04002 printf("PASSED\n"); \ 04003 } while (0) 04004 04005 04006 #define TEST_DIV_OP_TYPES \ 04007 do { \ 04008 int i, j, k; \ 04009 \ 04010 printf(" Testing: types %-10s: ", "/"); \ 04011 \ 04012 for (i=0; i<num_ar_types; i++) \ 04013 { \ 04014 for (j=0; j<num_ar_types; j++) \ 04015 { \ 04016 for (k=0; k<num_ar_types; k++) \ 04017 { \ 04018 act_status[k] = AR_STAT_OK; \ 04019 if (ar_types[i] != ar_types[j] || \ 04020 ar_types[j] != ar_types[k] || \ 04021 !IS_SUPPORTED_INT_TYPE(ar_types[i])) \ 04022 act_status[k] = AR_STAT_INVALID_TYPE; \ 04023 \ 04024 test_status[k] = AR_divide((AR_DATA *)&test_result[1], \ 04025 &ar_types[i], \ 04026 (AR_DATA *)&cool_ints[1], \ 04027 &ar_types[j], \ 04028 (AR_DATA *)&cool_ints[1], \ 04029 &ar_types[k]); \ 04030 \ 04031 if ((act_status[k] ^ test_status[k]) & \ 04032 AR_STAT_INVALID_TYPE) \ 04033 { \ 04034 printf(" ERROR: incorrect status at %d,%d,%d\n", \ 04035 i, j, k); \ 04036 abort(); \ 04037 } \ 04038 } \ 04039 } \ 04040 } \ 04041 \ 04042 printf("PASSED\n"); \ 04043 } while (0) 04044 04045 04046 test_divide() 04047 { 04048 TEST_DIV_OP_SIGNED( 8); 04049 TEST_DIV_OP_UNSIGNED( 8); 04050 04051 TEST_DIV_OP_SIGNED( 16); 04052 TEST_DIV_OP_UNSIGNED(16); 04053 04054 TEST_DIV_OP_SIGNED( 32); 04055 TEST_DIV_OP_UNSIGNED(32); 04056 04057 TEST_DIV_OP_SIGNED( 46); 04058 04059 TEST_DIV_OP_SIGNED( 64); 04060 TEST_DIV_OP_UNSIGNED(64); 04061 04062 TEST_DIV_OP_TYPES; 04063 04064 } /* test_divide */ 04065 04066 04067 #undef TEST_DIV_OP_SIGNED 04068 #undef TEST_DIV_OP_UNSIGNED 04069 #undef TEST_DIV_OP_TYPES 04070 04071 04072 #define TEST_MOD_OP_SIGNED(size) \ 04073 do { \ 04074 int i, j; \ 04075 \ 04076 printf(" Testing: SIGNED %2d INT %-10s: ", size, "%"); \ 04077 \ 04078 for (i=0; i<num_cool_ints; i++) \ 04079 { \ 04080 for (j=0; j<num_cool_ints; j++) \ 04081 { \ 04082 act_status[j] = AR_STAT_OK; \ 04083 \ 04084 if (LS##size(&cool_ints[j]) == 0) \ 04085 { /* modulo by zero */ \ 04086 act_result[j] = 0; \ 04087 act_status[j] |= AR_STAT_OVERFLOW; \ 04088 } \ 04089 else \ 04090 { /* not modulo by zero */ \ 04091 act_result[j] = DSEXT##size(LS##size(&cool_ints[i]) % \ 04092 LS##size(&cool_ints[j])); \ 04093 \ 04094 if (!is_zero##size(act_result[j]) && \ 04095 is_neg##size(LS##size(&cool_ints[i]) ^ \ 04096 act_result[j])) \ 04097 { /* Overflow. */ \ 04098 act_status[j] |= AR_STAT_OVERFLOW; \ 04099 } \ 04100 } \ 04101 \ 04102 if (is_zero##size(act_result[j])) \ 04103 act_status[j] |= AR_STAT_ZERO; \ 04104 \ 04105 if (is_neg##size(act_result[j])) \ 04106 act_status[j] |= AR_STAT_NEGATIVE; \ 04107 \ 04108 test_result[j].part1 = 0; \ 04109 test_result[j].part2 = 0; \ 04110 test_result[j].part3 = 0; \ 04111 test_result[j].part4 = 0; \ 04112 \ 04113 test_status[j] = AR_modulo((AR_DATA *)&test_result[j], \ 04114 &sint##size##_artype, \ 04115 (AR_DATA *)&cool_ints[i], \ 04116 &sint##size##_artype, \ 04117 (AR_DATA *)&cool_ints[j], \ 04118 &sint##size##_artype); \ 04119 \ 04120 if (LU64(&test_result[j]) != act_result[j]) \ 04121 { \ 04122 printf(" ERROR: incorrect result at %d,%d\n", i, j); \ 04123 abort(); \ 04124 } \ 04125 \ 04126 if (act_status[j] != test_status[j]) \ 04127 { \ 04128 printf(" ERROR: incorrect status at %d,%d\n", i, j); \ 04129 abort(); \ 04130 } \ 04131 } \ 04132 } \ 04133 \ 04134 printf("PASSED\n"); \ 04135 } while (0) 04136 04137 04138 #define TEST_MOD_OP_UNSIGNED(size) \ 04139 do { \ 04140 int i, j; \ 04141 \ 04142 printf(" Testing: UNSIGNED %2d INT %-10s: ", size, "%"); \ 04143 \ 04144 for (i=0; i<num_cool_ints; i++) \ 04145 { \ 04146 for (j=0; j<num_cool_ints; j++) \ 04147 { \ 04148 act_status[j] = AR_STAT_OK; \ 04149 \ 04150 if (LU##size(&cool_ints[j]) == 0) \ 04151 { /* modulo by zero */ \ 04152 act_result[j] = 0; \ 04153 act_status[j] |= AR_STAT_OVERFLOW; \ 04154 } \ 04155 else \ 04156 { /* not modulo by zero */ \ 04157 act_result[j] = LU##size(&cool_ints[i]) % \ 04158 LU##size(&cool_ints[j]); \ 04159 } \ 04160 \ 04161 if (is_zero##size(act_result[j])) \ 04162 act_status[j] |= AR_STAT_ZERO; \ 04163 \ 04164 test_result[j].part1 = 0; \ 04165 test_result[j].part2 = 0; \ 04166 test_result[j].part3 = 0; \ 04167 test_result[j].part4 = 0; \ 04168 \ 04169 test_status[j] = AR_modulo((AR_DATA *)&test_result[j], \ 04170 &uint##size##_artype, \ 04171 (AR_DATA *)&cool_ints[i], \ 04172 &uint##size##_artype, \ 04173 (AR_DATA *)&cool_ints[j], \ 04174 &uint##size##_artype); \ 04175 \ 04176 if (LU64(&test_result[j]) != (UINT64)act_result[j]) \ 04177 { \ 04178 printf(" ERROR: incorrect result at %d,%d\n", i, j); \ 04179 abort(); \ 04180 } \ 04181 \ 04182 if (act_status[j] != test_status[j]) \ 04183 { \ 04184 printf(" ERROR: incorrect status at %d,%d\n", i, j); \ 04185 abort(); \ 04186 } \ 04187 } \ 04188 } \ 04189 \ 04190 printf("PASSED\n"); \ 04191 } while (0) 04192 04193 04194 #define TEST_MOD_OP_TYPES \ 04195 do { \ 04196 int i, j, k; \ 04197 \ 04198 printf(" Testing: types %-10s: ", "%"); \ 04199 \ 04200 for (i=0; i<num_ar_types; i++) \ 04201 { \ 04202 for (j=0; j<num_ar_types; j++) \ 04203 { \ 04204 for (k=0; k<num_ar_types; k++) \ 04205 { \ 04206 act_status[k] = AR_STAT_OK; \ 04207 if (ar_types[i] != ar_types[j] || \ 04208 ar_types[j] != ar_types[k] || \ 04209 !IS_SUPPORTED_INT_TYPE(ar_types[i])) \ 04210 act_status[k] = AR_STAT_INVALID_TYPE; \ 04211 \ 04212 test_status[k] = AR_modulo((AR_DATA *)&test_result[1], \ 04213 &ar_types[i], \ 04214 (AR_DATA *)&cool_ints[1], \ 04215 &ar_types[j], \ 04216 (AR_DATA *)&cool_ints[1], \ 04217 &ar_types[k]); \ 04218 \ 04219 if ((act_status[k] ^ test_status[k]) & \ 04220 AR_STAT_INVALID_TYPE) \ 04221 { \ 04222 printf(" ERROR: incorrect status at %d,%d,%d\n", \ 04223 i, j, k); \ 04224 abort(); \ 04225 } \ 04226 } \ 04227 } \ 04228 } \ 04229 \ 04230 printf("PASSED\n"); \ 04231 } while (0) 04232 04233 04234 test_modulo() 04235 { 04236 04237 TEST_MOD_OP_SIGNED( 8); 04238 TEST_MOD_OP_UNSIGNED( 8); 04239 04240 TEST_MOD_OP_SIGNED( 16); 04241 TEST_MOD_OP_UNSIGNED(16); 04242 04243 TEST_MOD_OP_SIGNED( 32); 04244 TEST_MOD_OP_UNSIGNED(32); 04245 04246 TEST_MOD_OP_SIGNED( 46); 04247 04248 TEST_MOD_OP_SIGNED( 64); 04249 TEST_MOD_OP_UNSIGNED(64); 04250 04251 TEST_MOD_OP_TYPES; 04252 04253 } /* test_modulo */ 04254 04255 04256 #undef TEST_MOD_OP_SIGNED 04257 #undef TEST_MOD_OP_UNSIGNED 04258 #undef TEST_MOD_OP_TYPES 04259 04260 04261 /*====================================================================== 04262 * 04263 * COMPARISONS 04264 * 04265 */ 04266 04267 04268 #define TEST_COMPARE_OP_SIGNED(size) \ 04269 do { \ 04270 int i, j; \ 04271 \ 04272 printf(" Testing: SIGNED %2d INT %-10s: ", size, "compare"); \ 04273 \ 04274 for (i=0; i<num_cool_ints; i++) \ 04275 { \ 04276 for (j=0; j<num_cool_ints; j++) \ 04277 { \ 04278 if (size == 46) { \ 04279 if (LS64(&cool_ints[i]) < \ 04280 LS64(&cool_ints[j])) \ 04281 act_status[j] = AR_Compare_LT; \ 04282 else if (LS64(&cool_ints[i]) > \ 04283 LS64(&cool_ints[j])) \ 04284 act_status[j] = AR_Compare_GT; \ 04285 else \ 04286 act_status[j] = AR_Compare_EQ; \ 04287 } \ 04288 else { \ 04289 if (LS##size(&cool_ints[i]) < \ 04290 LS##size(&cool_ints[j])) \ 04291 act_status[j] = AR_Compare_LT; \ 04292 else if (LS##size(&cool_ints[i]) > \ 04293 LS##size(&cool_ints[j])) \ 04294 act_status[j] = AR_Compare_GT; \ 04295 else \ 04296 act_status[j] = AR_Compare_EQ; \ 04297 } \ 04298 \ 04299 test_status[j] = AR_compare((AR_DATA *)&cool_ints[i], \ 04300 &sint##size##_artype, \ 04301 (AR_DATA *)&cool_ints[j], \ 04302 &sint##size##_artype); \ 04303 \ 04304 if (act_status[j] != test_status[j]) \ 04305 { \ 04306 printf(" ERROR: incorrect status at %d,%d\n", i, j); \ 04307 abort(); \ 04308 } \ 04309 } \ 04310 } \ 04311 \ 04312 printf("PASSED\n"); \ 04313 } while (0) 04314 04315 04316 #define TEST_COMPARE_OP_UNSIGNED(size) \ 04317 do { \ 04318 int i, j; \ 04319 \ 04320 printf(" Testing: UNSIGNED %2d INT %-10s: ", size, "compare"); \ 04321 \ 04322 for (i=0; i<num_cool_ints; i++) \ 04323 { \ 04324 for (j=0; j<num_cool_ints; j++) \ 04325 { \ 04326 if (LU##size(&cool_ints[i]) < LU##size(&cool_ints[j])) \ 04327 act_status[j] = AR_Compare_LT; \ 04328 else if (LU##size(&cool_ints[i]) > LU##size(&cool_ints[j])) \ 04329 act_status[j] = AR_Compare_GT; \ 04330 else \ 04331 act_status[j] = AR_Compare_EQ; \ 04332 \ 04333 test_status[j] = AR_compare((AR_DATA *)&cool_ints[i], \ 04334 &uint##size##_artype, \ 04335 (AR_DATA *)&cool_ints[j], \ 04336 &uint##size##_artype); \ 04337 \ 04338 if (act_status[j] != test_status[j]) \ 04339 { \ 04340 printf(" ERROR: incorrect status at %d,%d\n", i, j); \ 04341 abort(); \ 04342 } \ 04343 } \ 04344 } \ 04345 \ 04346 printf("PASSED\n"); \ 04347 } while (0) 04348 04349 04350 #define TEST_COMPARE_OP_TYPES \ 04351 do { \ 04352 int j, k; \ 04353 \ 04354 printf(" Testing: types %-10s: ", "compare"); \ 04355 \ 04356 for (j=0; j<num_ar_types; j++) \ 04357 { \ 04358 for (k=0; k<num_ar_types; k++) \ 04359 { \ 04360 act_status[k] = AR_STAT_OK; \ 04361 if (ar_types[j] != ar_types[k] || \ 04362 !IS_SUPPORTED_INT_TYPE(ar_types[j])) \ 04363 act_status[k] = AR_Compare_Invalid; \ 04364 \ 04365 test_status[k] = AR_compare((AR_DATA *)&cool_ints[1], \ 04366 &ar_types[j], \ 04367 (AR_DATA *)&cool_ints[1], \ 04368 &ar_types[k]); \ 04369 \ 04370 if ((act_status[k] == AR_Compare_Invalid) ^ \ 04371 (test_status[k] == AR_Compare_Invalid)) \ 04372 { \ 04373 printf(" ERROR: incorrect status at %d,%d\n", j, k); \ 04374 abort(); \ 04375 } \ 04376 } \ 04377 } \ 04378 \ 04379 printf("PASSED\n"); \ 04380 } while (0) 04381 04382 04383 test_compare() 04384 { 04385 04386 TEST_COMPARE_OP_SIGNED( 8); 04387 TEST_COMPARE_OP_UNSIGNED( 8); 04388 04389 TEST_COMPARE_OP_SIGNED( 16); 04390 TEST_COMPARE_OP_UNSIGNED(16); 04391 04392 TEST_COMPARE_OP_SIGNED( 32); 04393 TEST_COMPARE_OP_UNSIGNED(32); 04394 04395 TEST_COMPARE_OP_SIGNED( 46); 04396 04397 TEST_COMPARE_OP_SIGNED( 64); 04398 TEST_COMPARE_OP_UNSIGNED(64); 04399 04400 TEST_COMPARE_OP_TYPES; 04401 04402 } /* test_compare */ 04403 04404 04405 static char USMID [] = "\n%Z%%M% %I% %G% %U%\n"; 04406 static char rcsid [] = "$Id: testint.c,v 1.1.1.1 2002-05-22 20:06:19 dsystem Exp $";