1 1.1 christos # gr28-gr31, fr31, icc3, fcc3 are used as tmps. 2 1.1 christos # consider them call clobbered by these macros. 3 1.1 christos 4 1.1 christos .macro start 5 1.1 christos .data 6 1.1 christos failmsg: 7 1.1 christos .ascii "fail\n" 8 1.1 christos passmsg: 9 1.1 christos .ascii "pass\n" 10 1.1 christos .text 11 1.1 christos .global _start 12 1.1 christos _start: 13 1.1 christos ; enable data and insn caches in copy-back mode 14 1.1 christos ; Also enable all registers 15 1.1 christos or_spr_immed 0xc80003c0,hsr0 16 1.1 christos and_spr_immed 0xfffff3ff,hsr0 17 1.1 christos 18 1.1 christos ; turn on psr.nem, psr.cm, psr.ef, psr.em, psr.esr, 19 1.1 christos ; disable external interrupts 20 1.1 christos or_spr_immed 0x69f8,psr 21 1.1 christos 22 1.1 christos ; If fsr exists, enable all fp_exceptions except inexact 23 1.1 christos movsg psr,gr28 24 1.1 christos srli gr28,28,gr28 25 1.1 christos subicc gr28,0x2,gr0,icc3 ; is fr400? 26 1.1 christos beq icc3,0,nofsr0 27 1.1 christos or_spr_immed 0x3d000000,fsr0 28 1.1 christos nofsr0: 29 1.1 christos 30 1.1 christos ; Set the stack pointer 31 1.1 christos sethi.p 0x7,sp 32 1.1 christos setlo 0xfffc,sp ; TODO -- what's a good value for this? 33 1.1 christos 34 1.1 christos ; Set the TBR address 35 1.1 christos sethi.p 0xf,gr28 36 1.1 christos setlo 0xf000,gr28 37 1.1 christos movgs gr28,tbr ; TODO -- what's a good value for this? 38 1.1 christos 39 1.1 christos ; Go to user mode -- causes too many problems 40 1.1 christos ;and_spr_immed 0xfffffffb,psr 41 1.1 christos .endm 42 1.1 christos 43 1.1 christos ; Set GR with another GR 44 1.1 christos .macro set_gr_gr src targ 45 1.1 christos addi \src,0,\targ 46 1.1 christos .endm 47 1.1 christos 48 1.1 christos ; Set GR with immediate value 49 1.1 christos .macro set_gr_immed val reg 50 1.1 christos .if (\val >= -32768) && (\val <= 23767) 51 1.1 christos setlos \val,\reg 52 1.1 christos .else 53 1.1 christos setlo.p %lo(\val),\reg 54 1.1 christos sethi %hi(\val),\reg 55 1.1 christos .endif 56 1.1 christos .endm 57 1.1 christos 58 1.1 christos .macro set_gr_limmed valh vall reg 59 1.1 christos sethi.p \valh,\reg 60 1.1 christos setlo \vall,\reg 61 1.1 christos .endm 62 1.1 christos 63 1.1 christos ; Set GR with address value 64 1.1 christos .macro set_gr_addr addr reg 65 1.1 christos sethi.p %hi(\addr),\reg 66 1.1 christos setlo %lo(\addr),\reg 67 1.1 christos .endm 68 1.1 christos 69 1.1 christos ; Set GR with SPR 70 1.1 christos .macro set_gr_spr src targ 71 1.1 christos movsg \src,\targ 72 1.1 christos .endm 73 1.1 christos 74 1.1 christos ; Set GR with a value from memory 75 1.1 christos .macro set_gr_mem addr reg 76 1.1 christos set_gr_addr \addr,gr28 77 1.1 christos ldi @(gr28,0),\reg 78 1.1 christos .endm 79 1.1 christos 80 1.1 christos ; Increment GR with immediate value 81 1.1 christos .macro inc_gr_immed val reg 82 1.1 christos .if (\val >= -2048) && (\val <= 2047) 83 1.1 christos addi \reg,\val,\reg 84 1.1 christos .else 85 1.1 christos set_gr_immed \val,gr28 86 1.1 christos add \reg,gr28,\reg 87 1.1 christos .endif 88 1.1 christos .endm 89 1.1 christos 90 1.1 christos ; AND GR with immediate value 91 1.1 christos .macro and_gr_immed val reg 92 1.1 christos .if (\val >= -2048) && (\val <= 2047) 93 1.1 christos andi \reg,\val,\reg 94 1.1 christos .else 95 1.1 christos set_gr_immed \val,gr28 96 1.1 christos and \reg,gr28,\reg 97 1.1 christos .endif 98 1.1 christos .endm 99 1.1 christos 100 1.1 christos ; OR GR with immediate value 101 1.1 christos .macro or_gr_immed val reg 102 1.1 christos .if (\val >= -2048) && (\val <= 2047) 103 1.1 christos ori \reg,\val,\reg 104 1.1 christos .else 105 1.1 christos set_gr_immed \val,gr28 106 1.1 christos or \reg,gr28,\reg 107 1.1 christos .endif 108 1.1 christos .endm 109 1.1 christos 110 1.1 christos ; Set FR with another FR 111 1.1 christos .macro set_fr_fr src targ 112 1.1 christos fmovs \src,\targ 113 1.1 christos .endm 114 1.1 christos 115 1.1 christos ; Set FR with integer immediate value 116 1.1 christos .macro set_fr_iimmed valh vall reg 117 1.1 christos set_gr_limmed \valh,\vall,gr28 118 1.1 christos movgf gr28,\reg 119 1.1 christos .endm 120 1.1 christos 121 1.1 christos ; Set FR with integer immediate value 122 1.1 christos .macro set_fr_immed val reg 123 1.1 christos set_gr_immed \val,gr28 124 1.1 christos movgf gr28,\reg 125 1.1 christos .endm 126 1.1 christos 127 1.1 christos ; Set FR with a value from memory 128 1.1 christos .macro set_fr_mem addr reg 129 1.1 christos set_gr_addr \addr,gr28 130 1.1 christos ldfi @(gr28,0),\reg 131 1.1 christos .endm 132 1.1 christos 133 1.1 christos ; Set double FR with another double FR 134 1.1 christos .macro set_dfr_dfr src targ 135 1.1 christos fmovd \src,\targ 136 1.1 christos .endm 137 1.1 christos 138 1.1 christos ; Set double FR with a value from memory 139 1.1 christos .macro set_dfr_mem addr reg 140 1.1 christos set_gr_addr \addr,gr28 141 1.1 christos lddfi @(gr28,0),\reg 142 1.1 christos .endm 143 1.1 christos 144 1.1 christos ; Set CPR with immediate value 145 1.1 christos .macro set_cpr_immed val reg 146 1.1 christos addi sp,-4,gr28 147 1.1 christos set_gr_immed \val,gr29 148 1.1 christos st gr29,@(gr28,gr0) 149 1.1 christos ldc @(gr28,gr0),\reg 150 1.1 christos .endm 151 1.1 christos 152 1.1 christos .macro set_cpr_limmed valh vall reg 153 1.1 christos addi sp,-4,gr28 154 1.1 christos set_gr_limmed \valh,\vall,gr29 155 1.1 christos st gr29,@(gr28,gr0) 156 1.1 christos ldc @(gr28,gr0),\reg 157 1.1 christos .endm 158 1.1 christos 159 1.1 christos ; Set SPR with immediate value 160 1.1 christos .macro set_spr_immed val reg 161 1.1 christos set_gr_immed \val,gr28 162 1.1 christos movgs gr28,\reg 163 1.1 christos .endm 164 1.1 christos 165 1.1 christos .macro set_spr_limmed valh vall reg 166 1.1 christos set_gr_limmed \valh,\vall,gr28 167 1.1 christos movgs gr28,\reg 168 1.1 christos .endm 169 1.1 christos 170 1.1 christos .macro set_spr_addr addr reg 171 1.1 christos set_gr_addr \addr,gr28 172 1.1 christos movgs gr28,\reg 173 1.1 christos .endm 174 1.1 christos 175 1.1 christos ; increment SPR with immediate value 176 1.1 christos .macro inc_spr_immed val reg 177 1.1 christos movsg \reg,gr28 178 1.1 christos inc_gr_immed \val,gr28 179 1.1 christos movgs gr28,\reg 180 1.1 christos .endm 181 1.1 christos 182 1.1 christos ; OR spr with immediate value 183 1.1 christos .macro or_spr_immed val reg 184 1.1 christos movsg \reg,gr28 185 1.1 christos set_gr_immed \val,gr29 186 1.1 christos or gr28,gr29,gr28 187 1.1 christos movgs gr28,\reg 188 1.1 christos .endm 189 1.1 christos 190 1.1 christos ; AND spr with immediate value 191 1.1 christos .macro and_spr_immed val reg 192 1.1 christos movsg \reg,gr28 193 1.1 christos set_gr_immed \val,gr29 194 1.1 christos and gr28,gr29,gr28 195 1.1 christos movgs gr28,\reg 196 1.1 christos .endm 197 1.1 christos 198 1.1 christos ; Set accumulator with immediate value 199 1.1 christos .macro set_acc_immed val reg 200 1.1 christos set_fr_immed \val,fr31 201 1.1 christos mwtacc fr31,\reg 202 1.1 christos .endm 203 1.1 christos 204 1.1 christos ; Set accumulator guard with immediate value 205 1.1 christos .macro set_accg_immed val reg 206 1.1 christos set_fr_immed \val,fr31 207 1.1 christos mwtaccg fr31,\reg 208 1.1 christos .endm 209 1.1 christos 210 1.1 christos ; Set memory with immediate value 211 1.1 christos .macro set_mem_immed val base 212 1.1 christos set_gr_immed \val,gr28 213 1.1 christos sti gr28,@(\base,0) 214 1.1 christos .endm 215 1.1 christos 216 1.1 christos .macro set_mem_limmed valh vall base 217 1.1 christos set_gr_limmed \valh,\vall,gr28 218 1.1 christos sti gr28,@(\base,0) 219 1.1 christos .endm 220 1.1 christos 221 1.1 christos ; Set memory with GR value 222 1.1 christos .macro set_mem_gr reg addr 223 1.1 christos set_gr_addr \addr,gr28 224 1.1 christos sti \reg,@(gr28,0) 225 1.1 christos .endm 226 1.1 christos 227 1.1 christos ; Test the value of a general register against another general register 228 1.1 christos .macro test_gr_gr reg1 reg2 229 1.1 christos subcc \reg1,\reg2,gr0,icc3 230 1.1 christos beq icc3,0,test_gr\@ 231 1.1 christos fail 232 1.1 christos test_gr\@: 233 1.1 christos .endm 234 1.1 christos 235 1.1 christos ; Test the value of an immediate against a general register 236 1.1 christos .macro test_gr_immed val reg 237 1.1 christos .if (\val >= -512) && (\val <= 511) 238 1.1 christos subicc \reg,\val,gr0,icc3 239 1.1 christos .else 240 1.1 christos set_gr_immed \val,gr28 241 1.1 christos subcc \reg,gr28,gr0,icc3 242 1.1 christos .endif 243 1.1 christos beq icc3,0,test_gr\@ 244 1.1 christos fail 245 1.1 christos test_gr\@: 246 1.1 christos .endm 247 1.1 christos 248 1.1 christos .macro test_gr_limmed valh vall reg 249 1.1 christos set_gr_limmed \valh,\vall,gr28 250 1.1 christos subcc \reg,gr28,gr0,icc3 251 1.1 christos beq icc3,0,test_gr\@ 252 1.1 christos fail 253 1.1 christos test_gr\@: 254 1.1 christos .endm 255 1.1 christos 256 1.1 christos ; Test the value of an floating register against an integer immediate 257 1.1 christos .macro test_fr_limmed valh vall reg 258 1.1 christos movfg \reg,gr29 259 1.1 christos set_gr_limmed \valh,\vall,gr28 260 1.1 christos subcc gr29,gr28,gr0,icc3 261 1.1 christos beq icc3,0,test_gr\@ 262 1.1 christos fail 263 1.1 christos test_gr\@: 264 1.1 christos .endm 265 1.1 christos 266 1.1 christos .macro test_fr_iimmed val reg 267 1.1 christos movfg \reg,gr29 268 1.1 christos set_gr_immed \val,gr28 269 1.1 christos subcc gr29,gr28,gr0,icc3 270 1.1 christos beq icc3,0,test_gr\@ 271 1.1 christos fail 272 1.1 christos test_gr\@: 273 1.1 christos .endm 274 1.1 christos 275 1.1 christos ; Test the value of a floating register against another floating point register 276 1.1 christos .macro test_fr_fr reg1 reg2 277 1.1 christos fcmps \reg1,\reg2,fcc3 278 1.1 christos fbeq fcc3,0,test_gr\@ 279 1.1 christos fail 280 1.1 christos test_gr\@: 281 1.1 christos .endm 282 1.1 christos 283 1.1 christos ; Test the value of a double floating register against another 284 1.1 christos ; double floating point register 285 1.1 christos .macro test_dfr_dfr reg1 reg2 286 1.1 christos fcmpd \reg1,\reg2,fcc3 287 1.1 christos fbeq fcc3,0,test_gr\@ 288 1.1 christos fail 289 1.1 christos test_gr\@: 290 1.1 christos .endm 291 1.1 christos 292 1.1 christos ; Test the value of a special purpose register against an integer immediate 293 1.1 christos .macro test_spr_immed val reg 294 1.1 christos movsg \reg,gr29 295 1.1 christos set_gr_immed \val,gr28 296 1.1 christos subcc gr29,gr28,gr0,icc3 297 1.1 christos beq icc3,0,test_gr\@ 298 1.1 christos fail 299 1.1 christos test_gr\@: 300 1.1 christos .endm 301 1.1 christos 302 1.1 christos .macro test_spr_limmed valh vall reg 303 1.1 christos movsg \reg,gr29 304 1.1 christos set_gr_limmed \valh,\vall,gr28 305 1.1 christos subcc gr29,gr28,gr0,icc3 306 1.1 christos beq icc3,0,test_gr\@ 307 1.1 christos fail 308 1.1 christos test_gr\@: 309 1.1 christos .endm 310 1.1 christos 311 1.1 christos .macro test_spr_gr spr gr 312 1.1 christos movsg \spr,gr28 313 1.1 christos test_gr_gr \gr,gr28 314 1.1 christos .endm 315 1.1 christos 316 1.1 christos .macro test_spr_addr addr reg 317 1.1 christos movsg \reg,gr29 318 1.1 christos set_gr_addr \addr,gr28 319 1.1 christos test_gr_gr gr28,gr29 320 1.1 christos .endm 321 1.1 christos 322 1.1 christos ; Test spr bits masked and shifted against the given value 323 1.1 christos .macro test_spr_bits mask,shift,val,reg 324 1.1 christos movsg \reg,gr28 325 1.1 christos set_gr_immed \mask,gr29 326 1.1 christos and gr28,gr29,gr28 327 1.1 christos srli gr28,\shift,gr29 328 1.1 christos test_gr_immed \val,gr29 329 1.1 christos .endm 330 1.1 christos 331 1.1 christos 332 1.1 christos ; Test the value of an accumulator against an integer immediate 333 1.1 christos .macro test_acc_immed val reg 334 1.1 christos mrdacc \reg,fr31 335 1.1 christos test_fr_iimmed \val,fr31 336 1.1 christos .endm 337 1.1 christos 338 1.1 christos ; Test the value of an accumulator against an integer immediate 339 1.1 christos .macro test_acc_limmed valh vall reg 340 1.1 christos mrdacc \reg,fr31 341 1.1 christos test_fr_limmed \valh,\vall,fr31 342 1.1 christos .endm 343 1.1 christos 344 1.1 christos ; Test the value of an accumulator guard against an integer immediate 345 1.1 christos .macro test_accg_immed val reg 346 1.1 christos mrdaccg \reg,fr31 347 1.1 christos test_fr_iimmed \val,fr31 348 1.1 christos .endm 349 1.1 christos 350 1.1.1.2 christos ; Test CPR against an immediate value 351 1.1 christos .macro test_cpr_limmed valh vall reg 352 1.1 christos addi sp,-4,gr31 353 1.1 christos stc \reg,@(gr31,gr0) 354 1.1 christos test_mem_limmed \valh,\vall,gr31 355 1.1 christos .endm 356 1.1 christos 357 1.1 christos ; Test the value of an immediate against memory 358 1.1 christos .macro test_mem_immed val base 359 1.1 christos ldi @(\base,0),gr29 360 1.1 christos .if (\val >= -512) && (\val <= 511) 361 1.1 christos subicc gr29,\val,gr0,icc3 362 1.1 christos .else 363 1.1 christos set_gr_immed \val,gr28 364 1.1 christos subcc gr29,gr28,gr0,icc3 365 1.1 christos .endif 366 1.1 christos beq icc3,0,test_gr\@ 367 1.1 christos fail 368 1.1 christos test_gr\@: 369 1.1 christos .endm 370 1.1 christos 371 1.1 christos .macro test_mem_limmed valh vall base 372 1.1 christos ldi @(\base,0),gr29 373 1.1 christos set_gr_limmed \valh,\vall,gr28 374 1.1 christos subcc gr29,gr28,gr0,icc3 375 1.1 christos beq icc3,0,test_gr\@ 376 1.1 christos fail 377 1.1 christos test_gr\@: 378 1.1 christos .endm 379 1.1 christos 380 1.1 christos ; Set an integer condition code 381 1.1 christos .macro set_icc mask iccno 382 1.1 christos set_gr_immed 4,gr29 383 1.1 christos smuli gr29,\iccno,gr30 384 1.1 christos addi gr31,16,gr31 385 1.1 christos set_gr_immed 0xf,gr28 386 1.1 christos sll gr28,gr31,gr28 387 1.1 christos not gr28,gr28 388 1.1 christos movsg ccr,gr29 389 1.1 christos and gr28,gr29,gr29 390 1.1 christos set_gr_immed \mask,gr28 391 1.1 christos sll gr28,gr31,gr28 392 1.1 christos or gr28,gr29,gr29 393 1.1 christos movgs gr29,ccr 394 1.1 christos .endm 395 1.1 christos ; started here 396 1.1 christos ; Test the condition codes 397 1.1 christos .macro test_icc N Z V C iccno 398 1.1 christos .if (\N == 1) 399 1.1 christos bp \iccno,0,fail\@ 400 1.1 christos .else 401 1.1 christos bn \iccno,0,fail\@ 402 1.1 christos .endif 403 1.1 christos .if (\Z == 1) 404 1.1 christos bne \iccno,0,fail\@ 405 1.1 christos .else 406 1.1 christos beq \iccno,0,fail\@ 407 1.1 christos .endif 408 1.1 christos .if (\V == 1) 409 1.1 christos bnv \iccno,0,fail\@ 410 1.1 christos .else 411 1.1 christos bv \iccno,0,fail\@ 412 1.1 christos .endif 413 1.1 christos .if (\C == 1) 414 1.1 christos bnc \iccno,0,fail\@ 415 1.1 christos .else 416 1.1 christos bc \iccno,0,fail\@ 417 1.1 christos .endif 418 1.1 christos bra test_cc\@ 419 1.1 christos fail\@: 420 1.1 christos fail 421 1.1 christos test_cc\@: 422 1.1 christos .endm 423 1.1 christos 424 1.1 christos ; Set an floating point condition code 425 1.1 christos .macro set_fcc mask fccno 426 1.1 christos set_gr_immed 4,gr29 427 1.1 christos smuli gr29,\fccno,gr30 428 1.1 christos set_gr_immed 0xf,gr28 429 1.1 christos sll gr28,gr31,gr28 430 1.1 christos not gr28,gr28 431 1.1 christos movsg ccr,gr29 432 1.1 christos and gr28,gr29,gr29 433 1.1 christos set_gr_immed \mask,gr28 434 1.1 christos sll gr28,gr31,gr28 435 1.1 christos or gr28,gr29,gr29 436 1.1 christos movgs gr29,ccr 437 1.1 christos .endm 438 1.1 christos 439 1.1 christos ; Test the condition codes 440 1.1 christos .macro test_fcc val fccno 441 1.1 christos set_gr_immed 4,gr29 442 1.1 christos smuli gr29,\fccno,gr30 443 1.1 christos movsg ccr,gr29 444 1.1 christos srl gr29,gr31,gr29 445 1.1 christos andi gr29,0xf,gr29 446 1.1 christos test_gr_immed \val,gr29 447 1.1 christos .endm 448 1.1 christos 449 1.1 christos ; Set PSR.ET 450 1.1 christos .macro set_psr_et val 451 1.1 christos movsg psr,gr28 452 1.1 christos .if (\val == 1) 453 1.1 christos ori gr28,1,gr28 ; Turn on SPR.ET 454 1.1 christos .else 455 1.1 christos andi gr28,0xfffffffe,gr28 ; Turn off SPR.ET 456 1.1 christos .endif 457 1.1 christos movgs gr28,psr 458 1.1 christos .endm 459 1.1 christos 460 1.1 christos ; Floating point constants 461 1.1 christos .macro float_constants 462 1.1 christos f0: .float 0.0 463 1.1 christos f1: .float 1.0 464 1.1 christos f2: .float 2.0 465 1.1 christos f3: .float 3.0 466 1.1 christos f6: .float 6.0 467 1.1 christos f9: .float 9.0 468 1.1 christos fn0: .float -0.0 469 1.1 christos fn1: .float -1.0 470 1.1 christos finf: .long 0x7f800000 471 1.1 christos fninf: .long 0xff800000 472 1.1 christos fmax: .long 0x7f7fffff 473 1.1 christos fmin: .long 0xff7fffff 474 1.1 christos feps: .long 0x00400000 475 1.1 christos fneps: .long 0x80400000 476 1.1 christos fnan1: .long 0x7fc00000 477 1.1 christos fnan2: .long 0x7f800001 478 1.1 christos .endm 479 1.1 christos 480 1.1 christos .macro double_constants 481 1.1 christos d0: .double 0.0 482 1.1 christos d1: .double 1.0 483 1.1 christos d2: .double 2.0 484 1.1 christos d3: .double 3.0 485 1.1 christos d6: .double 6.0 486 1.1 christos d9: .double 9.0 487 1.1 christos dn0: .double -0.0 488 1.1 christos dn1: .double -1.0 489 1.1 christos dinf: .long 0x7ff00000 490 1.1 christos .long 0x00000000 491 1.1 christos dninf: .long 0xfff00000 492 1.1 christos .long 0x00000000 493 1.1 christos dmax: .long 0x7fefffff 494 1.1 christos .long 0xffffffff 495 1.1 christos dmin: .long 0xffefffff 496 1.1 christos .long 0xffffffff 497 1.1 christos deps: .long 0x00080000 498 1.1 christos .long 0x00000000 499 1.1 christos dneps: .long 0x80080000 500 1.1 christos .long 0x00000000 501 1.1 christos dnan1: .long 0x7ff80000 502 1.1 christos .long 0x00000000 503 1.1 christos dnan2: .long 0x7ff00000 504 1.1 christos .long 0x00000001 505 1.1 christos .endm 506 1.1 christos 507 1.1 christos ; Load floating point constants 508 1.1 christos .macro load_float_constants 509 1.1 christos set_fr_mem fninf,fr0 510 1.1 christos set_fr_mem fmin,fr4 511 1.1 christos set_fr_mem fn1,fr8 512 1.1 christos set_fr_mem fneps,fr12 513 1.1 christos set_fr_mem fn0,fr16 514 1.1 christos set_fr_mem f0,fr20 515 1.1 christos set_fr_mem feps,fr24 516 1.1 christos set_fr_mem f1,fr28 517 1.1 christos set_fr_mem f2,fr32 518 1.1 christos set_fr_mem f3,fr36 519 1.1 christos set_fr_mem f6,fr40 520 1.1 christos set_fr_mem f9,fr44 521 1.1 christos set_fr_mem fmax,fr48 522 1.1 christos set_fr_mem finf,fr52 523 1.1 christos set_fr_mem fnan1,fr56 524 1.1 christos set_fr_mem fnan2,fr60 525 1.1 christos .endm 526 1.1 christos 527 1.1 christos .macro load_float_constants1 528 1.1 christos set_fr_mem fninf,fr1 529 1.1 christos set_fr_mem fmin,fr5 530 1.1 christos set_fr_mem fn1,fr9 531 1.1 christos set_fr_mem fneps,fr13 532 1.1 christos set_fr_mem fn0,fr17 533 1.1 christos set_fr_mem f0,fr21 534 1.1 christos set_fr_mem feps,fr25 535 1.1 christos set_fr_mem f1,fr29 536 1.1 christos set_fr_mem f2,fr33 537 1.1 christos set_fr_mem f3,fr37 538 1.1 christos set_fr_mem f6,fr41 539 1.1 christos set_fr_mem f9,fr45 540 1.1 christos set_fr_mem fmax,fr49 541 1.1 christos set_fr_mem finf,fr53 542 1.1 christos set_fr_mem fnan1,fr57 543 1.1 christos set_fr_mem fnan2,fr61 544 1.1 christos .endm 545 1.1 christos 546 1.1 christos .macro load_float_constants2 547 1.1 christos set_fr_mem fninf,fr2 548 1.1 christos set_fr_mem fmin,fr6 549 1.1 christos set_fr_mem fn1,fr10 550 1.1 christos set_fr_mem fneps,fr14 551 1.1 christos set_fr_mem fn0,fr18 552 1.1 christos set_fr_mem f0,fr22 553 1.1 christos set_fr_mem feps,fr26 554 1.1 christos set_fr_mem f1,fr30 555 1.1 christos set_fr_mem f2,fr34 556 1.1 christos set_fr_mem f3,fr38 557 1.1 christos set_fr_mem f6,fr42 558 1.1 christos set_fr_mem f9,fr46 559 1.1 christos set_fr_mem fmax,fr50 560 1.1 christos set_fr_mem finf,fr54 561 1.1 christos set_fr_mem fnan1,fr58 562 1.1 christos set_fr_mem fnan2,fr62 563 1.1 christos .endm 564 1.1 christos 565 1.1 christos .macro load_float_constants3 566 1.1 christos set_fr_mem fninf,fr3 567 1.1 christos set_fr_mem fmin,fr7 568 1.1 christos set_fr_mem fn1,fr11 569 1.1 christos set_fr_mem fneps,fr15 570 1.1 christos set_fr_mem fn0,fr19 571 1.1 christos set_fr_mem f0,fr23 572 1.1 christos set_fr_mem feps,fr27 573 1.1 christos set_fr_mem f1,fr31 574 1.1 christos set_fr_mem f2,fr35 575 1.1 christos set_fr_mem f3,fr39 576 1.1 christos set_fr_mem f6,fr43 577 1.1 christos set_fr_mem f9,fr47 578 1.1 christos set_fr_mem fmax,fr51 579 1.1 christos set_fr_mem finf,fr55 580 1.1 christos set_fr_mem fnan1,fr59 581 1.1 christos set_fr_mem fnan2,fr63 582 1.1 christos .endm 583 1.1 christos 584 1.1 christos .macro load_double_constants 585 1.1 christos set_dfr_mem dninf,fr0 586 1.1 christos set_dfr_mem dmin,fr4 587 1.1 christos set_dfr_mem dn1,fr8 588 1.1 christos set_dfr_mem dneps,fr12 589 1.1 christos set_dfr_mem dn0,fr16 590 1.1 christos set_dfr_mem d0,fr20 591 1.1 christos set_dfr_mem deps,fr24 592 1.1 christos set_dfr_mem d1,fr28 593 1.1 christos set_dfr_mem d2,fr32 594 1.1 christos set_dfr_mem d3,fr36 595 1.1 christos set_dfr_mem d6,fr40 596 1.1 christos set_dfr_mem d9,fr44 597 1.1 christos set_dfr_mem dmax,fr48 598 1.1 christos set_dfr_mem dinf,fr52 599 1.1 christos set_dfr_mem dnan1,fr56 600 1.1 christos set_dfr_mem dnan2,fr60 601 1.1 christos .endm 602 1.1 christos 603 1.1 christos ; Lock the insn cache at the given address 604 1.1 christos .macro lock_insn_cache address 605 1.1 christos icpl \address,gr0,1 606 1.1 christos .endm 607 1.1 christos 608 1.1 christos ; Lock the data cache at the given address 609 1.1 christos .macro lock_data_cache address 610 1.1 christos dcpl \address,gr0,1 611 1.1 christos .endm 612 1.1 christos 613 1.1 christos ; Invalidate the data cache at the given address 614 1.1 christos .macro invalidate_data_cache address 615 1.1 christos dci @(\address,gr0) 616 1.1 christos .endm 617 1.1 christos 618 1.1 christos ; Flush the data cache at the given address 619 1.1 christos .macro flush_data_cache address 620 1.1 christos dcf @(\address,gr0) 621 1.1 christos .endm 622 1.1 christos 623 1.1 christos ; Write a bctrlr 0,0 insn at the address contained in the given register 624 1.1 christos .macro set_bctrlr_0_0 address 625 1.1 christos set_mem_immed 0x80382000,\address ; bctrlr 0,0 626 1.1 christos flush_data_cache \address 627 1.1 christos .endm 628 1.1 christos 629 1.1 christos ; Exit with return code 630 1.1 christos .macro exit rc 631 1.1 christos setlos #1,gr7 632 1.1 christos set_gr_immed \rc,gr8 633 1.1 christos tira gr0,#0 634 1.1 christos .endm 635 1.1 christos 636 1.1 christos ; Pass the test case 637 1.1 christos .macro pass 638 1.1 christos pass\@: 639 1.1 christos setlos.p #5,gr10 640 1.1 christos setlos #1,gr8 641 1.1 christos setlos #5,gr7 642 1.1 christos set_gr_addr passmsg,gr9 643 1.1 christos tira gr0,#0 644 1.1 christos exit #0 645 1.1 christos .endm 646 1.1 christos 647 1.1 christos ; Fail the testcase 648 1.1 christos .macro fail 649 1.1 christos fail\@: 650 1.1 christos setlos.p #5,gr10 651 1.1 christos setlos #1,gr8 652 1.1 christos setlos #5,gr7 653 1.1 christos set_gr_addr failmsg,gr9 654 1.1 christos tira gr0,#0 655 1.1 christos exit #1 656 1.1 christos .endm 657