1 1.1 christos # mips test sanity, expected to pass. 2 1.1 christos # mach: mips64 sb1 3 1.1 christos # as: -mabi=eabi 4 1.1 christos # ld: -N -Ttext=0x80010000 5 1.1 christos # output: *\\npass\\n 6 1.1 christos 7 1.1 christos .include "testutils.inc" 8 1.1 christos 9 1.1 christos .macro check_ps psval, upperval, lowerval 10 1.1 christos .set push 11 1.1 christos .set noreorder 12 1.1 christos cvt.s.pu $f0, \psval # upper 13 1.1 christos cvt.s.pl $f2, \psval # lower 14 1.1 christos li.s $f4, \upperval 15 1.1 christos li.s $f6, \lowerval 16 1.1 christos c.eq.s $fcc0, $f0, $f4 17 1.1 christos bc1f $fcc0, _fail 18 1.1 christos c.eq.s $fcc0, $f2, $f6 19 1.1 christos bc1f $fcc0, _fail 20 1.1 christos nop 21 1.1 christos .set pop 22 1.1 christos .endm 23 1.1 christos 24 1.1 christos setup 25 1.1 christos 26 1.1 christos .set noreorder 27 1.1 christos 28 1.1 christos .ent DIAG 29 1.1 christos DIAG: 30 1.1 christos 31 1.1 christos # make sure that Status.FR and .CU1 are set. 32 1.1 christos mfc0 $2, $12 33 1.1 christos or $2, $2, (1 << 26) | (1 << 29) 34 1.1 christos mtc0 $2, $12 35 1.1 christos 36 1.1 christos 37 1.1 christos writemsg "ldc1" 38 1.1 christos 39 1.1 christos .data 40 1.1 christos 1: .dword 0xc1a8000042200000 # -21.0, 40.0 41 1.1 christos .text 42 1.1 christos la $2, 1b 43 1.1 christos ldc1 $f8, 0($2) 44 1.1 christos check_ps $f8, -21.0, 40.0 45 1.1 christos 46 1.1 christos 47 1.1 christos writemsg "cvt.ps.s" 48 1.1 christos 49 1.1 christos li.s $f10, 1.0 50 1.1 christos li.s $f12, 3.0 51 1.1 christos cvt.ps.s $f8, $f10, $f12 # upper, lower 52 1.1 christos check_ps $f8, 1.0, 3.0 53 1.1 christos 54 1.1 christos 55 1.1 christos writemsg "cvt.ps.s, sdc1, copy, ldc1" 56 1.1 christos 57 1.1 christos .data 58 1.1 christos 1: .dword 0 59 1.1 christos .dword 0 60 1.1 christos .text 61 1.1 christos la $2, 1b 62 1.1 christos li.s $f12, -4.0 63 1.1 christos li.s $f14, 32.0 64 1.1 christos cvt.ps.s $f10, $f12, $f14 # upper, lower 65 1.1 christos sdc1 $f10, 8($2) 66 1.1 christos lw $3, 8($2) 67 1.1 christos lw $4, 12($2) 68 1.1 christos sw $3, 0($2) 69 1.1 christos sw $4, 4($2) 70 1.1 christos ldc1 $f8, 0($2) 71 1.1 christos check_ps $f8, -4.0, 32.0 72 1.1 christos 73 1.1 christos 74 1.1 christos # Load some constants for later use 75 1.1 christos 76 1.1 christos li.s $f10, 4.0 77 1.1 christos li.s $f12, 16.0 78 1.1 christos cvt.ps.s $f20, $f10, $f12 # $f20: u=4.0, l=16.0 79 1.1 christos 80 1.1 christos li.s $f10, -1.0 81 1.1 christos li.s $f12, 2.0 82 1.1 christos cvt.ps.s $f22, $f10, $f12 # $f22: u=-1.0, l=2.0 83 1.1 christos 84 1.1 christos li.s $f10, 17.0 85 1.1 christos li.s $f12, -8.0 86 1.1 christos cvt.ps.s $f24, $f10, $f12 # $f24: u=17.0, l=-8.0 87 1.1 christos 88 1.1 christos 89 1.1 christos writemsg "pll.ps" 90 1.1 christos 91 1.1 christos pll.ps $f8, $f20, $f22 92 1.1 christos check_ps $f8, 16.0, 2.0 93 1.1 christos 94 1.1 christos 95 1.1 christos writemsg "plu.ps" 96 1.1 christos 97 1.1 christos plu.ps $f8, $f20, $f22 98 1.1 christos check_ps $f8, 16.0, -1.0 99 1.1 christos 100 1.1 christos 101 1.1 christos writemsg "pul.ps" 102 1.1 christos 103 1.1 christos pul.ps $f8, $f20, $f22 104 1.1 christos check_ps $f8, 4.0, 2.0 105 1.1 christos 106 1.1 christos 107 1.1 christos writemsg "puu.ps" 108 1.1 christos 109 1.1 christos puu.ps $f8, $f20, $f22 110 1.1 christos check_ps $f8, 4.0, -1.0 111 1.1 christos 112 1.1 christos 113 1.1 christos writemsg "abs.ps" 114 1.1 christos 115 1.1 christos abs.ps $f8, $f22 116 1.1 christos check_ps $f8, 1.0, 2.0 117 1.1 christos 118 1.1 christos 119 1.1 christos writemsg "mov.ps" 120 1.1 christos 121 1.1 christos mov.ps $f8, $f22 122 1.1 christos check_ps $f8, -1.0, 2.0 123 1.1 christos 124 1.1 christos 125 1.1 christos writemsg "neg.ps" 126 1.1 christos 127 1.1 christos neg.ps $f8, $f22 128 1.1 christos check_ps $f8, 1.0, -2.0 129 1.1 christos 130 1.1 christos 131 1.1 christos writemsg "add.ps" 132 1.1 christos 133 1.1 christos add.ps $f8, $f20, $f22 134 1.1 christos check_ps $f8, 3.0, 18.0 135 1.1 christos 136 1.1 christos 137 1.1 christos writemsg "mul.ps" 138 1.1 christos 139 1.1 christos mul.ps $f8, $f20, $f22 140 1.1 christos check_ps $f8, -4.0, 32.0 141 1.1 christos 142 1.1 christos 143 1.1 christos writemsg "sub.ps" 144 1.1 christos 145 1.1 christos sub.ps $f8, $f20, $f22 146 1.1 christos check_ps $f8, 5.0, 14.0 147 1.1 christos 148 1.1 christos 149 1.1 christos writemsg "madd.ps" 150 1.1 christos 151 1.1 christos madd.ps $f8, $f24, $f20, $f22 152 1.1 christos check_ps $f8, 13.0, 24.0 153 1.1 christos 154 1.1 christos 155 1.1 christos writemsg "msub.ps" 156 1.1 christos 157 1.1 christos msub.ps $f8, $f24, $f20, $f22 158 1.1 christos check_ps $f8, -21.0, 40.0 159 1.1 christos 160 1.1 christos 161 1.1 christos writemsg "nmadd.ps" 162 1.1 christos 163 1.1 christos nmadd.ps $f8, $f24, $f20, $f22 164 1.1 christos check_ps $f8, -13.0, -24.0 165 1.1 christos 166 1.1 christos 167 1.1 christos writemsg "nmsub.ps" 168 1.1 christos 169 1.1 christos nmsub.ps $f8, $f24, $f20, $f22 170 1.1 christos check_ps $f8, 21.0, -40.0 171 1.1 christos 172 1.1 christos 173 1.1 christos writemsg "movn.ps (n)" 174 1.1 christos 175 1.1 christos li $2, 0 176 1.1 christos mov.ps $f8, $f20 177 1.1 christos movn.ps $f8, $f22, $2 # doesn't move 178 1.1 christos check_ps $f8, 4.0, 16.0 179 1.1 christos 180 1.1 christos 181 1.1 christos writemsg "movn.ps (y)" 182 1.1 christos 183 1.1 christos li $2, 1 184 1.1 christos mov.ps $f8, $f20 185 1.1 christos movn.ps $f8, $f22, $2 # does move 186 1.1 christos check_ps $f8, -1.0, 2.0 187 1.1 christos 188 1.1 christos 189 1.1 christos writemsg "movz.ps (y)" 190 1.1 christos 191 1.1 christos li $2, 0 192 1.1 christos mov.ps $f8, $f20 193 1.1 christos movz.ps $f8, $f22, $2 # does move 194 1.1 christos check_ps $f8, -1.0, 2.0 195 1.1 christos 196 1.1 christos 197 1.1 christos writemsg "movz.ps (n)" 198 1.1 christos 199 1.1 christos li $2, 1 200 1.1 christos mov.ps $f8, $f20 201 1.1 christos movz.ps $f8, $f22, $2 # doesn't move 202 1.1 christos check_ps $f8, 4.0, 16.0 203 1.1 christos 204 1.1 christos 205 1.1 christos writemsg "movf.ps (y,y)" 206 1.1 christos 207 1.1 christos cfc1 $2, $31 208 1.1 christos or $2, $2, (1 << 23) | (1 << 25) 209 1.1 christos xor $2, $2, (1 << 23) | (1 << 25) 210 1.1 christos ctc1 $2, $31 # clear fcc0, clear fcc1 211 1.1 christos mov.ps $f8, $f20 212 1.1 christos movf.ps $f8, $f22, $fcc0 # moves both halves 213 1.1 christos check_ps $f8, -1.0, 2.0 214 1.1 christos 215 1.1 christos 216 1.1 christos writemsg "movf.ps (y,n)" 217 1.1 christos 218 1.1 christos cfc1 $2, $31 219 1.1 christos or $2, $2, (1 << 23) | (1 << 25) 220 1.1 christos xor $2, $2, (0 << 23) | (1 << 25) 221 1.1 christos ctc1 $2, $31 # set fcc0, clear fcc1 222 1.1 christos mov.ps $f8, $f20 223 1.1 christos movf.ps $f8, $f22, $fcc0 # moves upper half only 224 1.1 christos check_ps $f8, -1.0, 16.0 225 1.1 christos 226 1.1 christos 227 1.1 christos writemsg "movf.ps (n,y)" 228 1.1 christos 229 1.1 christos cfc1 $2, $31 230 1.1 christos or $2, $2, (1 << 23) | (1 << 25) 231 1.1 christos xor $2, $2, (1 << 23) | (0 << 25) 232 1.1 christos ctc1 $2, $31 # clear fcc0, set fcc1 233 1.1 christos mov.ps $f8, $f20 234 1.1 christos movf.ps $f8, $f22, $fcc0 # moves lower half only 235 1.1 christos check_ps $f8, 4.0, 2.0 236 1.1 christos 237 1.1 christos 238 1.1 christos writemsg "movf.ps (n,n)" 239 1.1 christos 240 1.1 christos cfc1 $2, $31 241 1.1 christos or $2, $2, (1 << 23) | (1 << 25) 242 1.1 christos xor $2, $2, (0 << 23) | (0 << 25) 243 1.1 christos ctc1 $2, $31 # set fcc0, set fcc1 244 1.1 christos mov.ps $f8, $f20 245 1.1 christos movf.ps $f8, $f22, $fcc0 # doesn't move either half 246 1.1 christos check_ps $f8, 4.0, 16.0 247 1.1 christos 248 1.1 christos 249 1.1 christos writemsg "movt.ps (n,n)" 250 1.1 christos 251 1.1 christos cfc1 $2, $31 252 1.1 christos or $2, $2, (1 << 23) | (1 << 25) 253 1.1 christos xor $2, $2, (1 << 23) | (1 << 25) 254 1.1 christos ctc1 $2, $31 # clear fcc0, clear fcc1 255 1.1 christos mov.ps $f8, $f20 256 1.1 christos movt.ps $f8, $f22, $fcc0 # doesn't move either half 257 1.1 christos check_ps $f8, 4.0, 16.0 258 1.1 christos 259 1.1 christos 260 1.1 christos writemsg "movt.ps (n,y)" 261 1.1 christos 262 1.1 christos cfc1 $2, $31 263 1.1 christos or $2, $2, (1 << 23) | (1 << 25) 264 1.1 christos xor $2, $2, (0 << 23) | (1 << 25) 265 1.1 christos ctc1 $2, $31 # set fcc0, clear fcc1 266 1.1 christos mov.ps $f8, $f20 267 1.1 christos movt.ps $f8, $f22, $fcc0 # moves lower half only 268 1.1 christos check_ps $f8, 4.0, 2.0 269 1.1 christos 270 1.1 christos 271 1.1 christos writemsg "movt.ps (y,n)" 272 1.1 christos 273 1.1 christos cfc1 $2, $31 274 1.1 christos or $2, $2, (1 << 23) | (1 << 25) 275 1.1 christos xor $2, $2, (1 << 23) | (0 << 25) 276 1.1 christos ctc1 $2, $31 # clear fcc0, set fcc1 277 1.1 christos mov.ps $f8, $f20 278 1.1 christos movt.ps $f8, $f22, $fcc0 # moves upper half only 279 1.1 christos check_ps $f8, -1.0, 16.0 280 1.1 christos 281 1.1 christos 282 1.1 christos writemsg "movt.ps (y,y)" 283 1.1 christos 284 1.1 christos cfc1 $2, $31 285 1.1 christos or $2, $2, (1 << 23) | (1 << 25) 286 1.1 christos xor $2, $2, (0 << 23) | (0 << 25) 287 1.1 christos ctc1 $2, $31 # set fcc0, set fcc1 288 1.1 christos mov.ps $f8, $f20 289 1.1 christos movt.ps $f8, $f22, $fcc0 # moves both halves 290 1.1 christos check_ps $f8, -1.0, 2.0 291 1.1 christos 292 1.1 christos 293 1.1 christos writemsg "alnv.ps (aligned)" 294 1.1 christos 295 1.1 christos .data 296 1.1 christos 1: .dword 0xc1a8000042200000 # -21.0, 40.0 297 1.1 christos .dword 0xc228000041a00000 # -42.0, 20.0 298 1.1 christos .text 299 1.1 christos la $2, 1b 300 1.1 christos li $3, 0 301 1.1 christos addu $4, $3, 8 302 1.1 christos luxc1 $f10, $3($2) 303 1.1 christos luxc1 $f12, $4($2) 304 1.1 christos alnv.ps $f8, $f10, $f12, $3 305 1.1 christos check_ps $f8, -21.0, 40.0 306 1.1 christos 307 1.1 christos 308 1.1 christos writemsg "alnv.ps (unaligned)" 309 1.1 christos 310 1.1 christos .data 311 1.1 christos 1: .dword 0xc1a8000042200000 # -21.0, 40.0 312 1.1 christos .dword 0xc228000041a00000 # -42.0, 20.0 313 1.1 christos .hword 0x0001 314 1.1 christos .text 315 1.1 christos la $2, 1b 316 1.1 christos li $3, 4 317 1.1 christos addu $4, $3, 8 318 1.1 christos luxc1 $f10, $3($2) 319 1.1 christos luxc1 $f12, $4($2) 320 1.1 christos alnv.ps $f8, $f10, $f12, $3 321 1.1 christos 322 1.1 christos lb $5, 16($2) 323 1.1 christos bnez $5, 2f # little endian 324 1.1 christos nop 325 1.1 christos 326 1.1 christos # big endian 327 1.1 christos check_ps $f8, 40.0, -42.0 328 1.1 christos b 3f 329 1.1 christos nop 330 1.1 christos 2: 331 1.1 christos # little endian 332 1.1 christos check_ps $f8, 20.0, -21.0 333 1.1 christos 3: 334 1.1 christos 335 1.1 christos 336 1.1 christos # We test c.cond.ps only lightly, just to make sure it modifies 337 1.1 christos # two bits and compares the halves separately. Perhaps it should 338 1.1 christos # be tested more thoroughly. 339 1.1 christos 340 1.1 christos writemsg "c.f.ps" 341 1.1 christos 342 1.1 christos cfc1 $2, $31 343 1.1 christos or $2, $2, (1 << 23) | (0x7f << 25) 344 1.1 christos ctc1 $2, $31 # set all fcc bits 345 1.1 christos c.f.ps $fcc0, $f8, $f8 # -> f, f 346 1.1 christos bc1t $fcc0, _fail 347 1.1 christos nop 348 1.1 christos bc1t $fcc1, _fail 349 1.1 christos nop 350 1.1 christos 351 1.1 christos 352 1.1 christos writemsg "c.olt.ps" 353 1.1 christos 354 1.1 christos cfc1 $2, $31 355 1.1 christos or $2, $2, (1 << 23) | (0x7f << 25) 356 1.1 christos xor $2, $2, (1 << 23) | (0x7f << 25) 357 1.1 christos ctc1 $2, $31 # clear all fcc bits 358 1.1 christos c.lt.ps $fcc0, $f22, $f24 # -> f, t 359 1.1 christos bc1t $fcc0, _fail 360 1.1 christos nop 361 1.1 christos bc1f $fcc1, _fail 362 1.1 christos nop 363 1.1 christos 364 1.1 christos 365 1.1 christos pass 366 1.1 christos 367 1.1 christos .end DIAG 368