Changeset 377
- Timestamp:
- Jan 24, 2004, 3:32:29 PM (21 years ago)
- File:
-
- 1 edited
-
trunk/ccl/compiler/PPC/PPC64/ppc64-vinsns.lisp (modified) (143 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ccl/compiler/PPC/PPC64/ppc64-vinsns.lisp
r346 r377 34 34 35 35 (define-ppc64-vinsn scale-32bit-misc-index (((dest :u64)) 36 ((idx :imm) ; A fixnum36 ((idx :imm) ; A fixnum 37 37 ) 38 38 ()) … … 41 41 42 42 (define-ppc64-vinsn scale-16bit-misc-index (((dest :u32)) 43 ((idx :imm); A fixnum44 )45 ())43 ((idx :imm) ; A fixnum 44 ) 45 ()) 46 46 (srdi dest idx 2) 47 47 (addi dest dest ppc64::misc-data-offset)) 48 48 49 49 (define-ppc64-vinsn scale-8bit-misc-index (((dest :u32)) 50 ((idx :imm); A fixnum51 )52 ())50 ((idx :imm) ; A fixnum 51 ) 52 ()) 53 53 (srdi dest idx ppc64::word-shift) 54 54 (addi dest dest ppc64::misc-data-offset)) 55 55 56 56 57 (define-ppc64-vinsn scale-64bit-misc-index ((( (dest :u64))58 ((idx :imm); A fixnum59 )60 ()))57 (define-ppc64-vinsn scale-64bit-misc-index (((dest :u64)) 58 ((idx :imm) ; A fixnum 59 ) 60 ()) 61 61 (addi dest idx ppc64::misc-data-offset)) 62 62 63 63 (define-ppc64-vinsn scale-1bit-misc-index (((word-index :u32) 64 (bitnum :u8)); (unsigned-byte 5)65 ((idx :imm); A fixnum66 )67 )68 ; Logically, we want to:69 ; 1) Unbox the index by shifting it right 2 bits.70 ; 2) Shift (1) right 5 bits71 ; 3) Scale (2) by shifting it left 2 bits.72 ; We get to do all of this with one instruction64 (bitnum :u8)) ; (unsigned-byte 5) 65 ((idx :imm) ; A fixnum 66 ) 67 ) 68 ; Logically, we want to: 69 ; 1) Unbox the index by shifting it right 2 bits. 70 ; 2) Shift (1) right 5 bits 71 ; 3) Scale (2) by shifting it left 2 bits. 72 ; We get to do all of this with one instruction 73 73 (rlwinm word-index idx (- ppc64::nbits-in-word 5) 5 (- ppc64::least-significant-bit ppc64::fixnum-shift)) 74 (addi word-index word-index ppc64::misc-data-offset) ; Hmmm. Also one instruction, but less impressive somehow.74 (addi word-index word-index ppc64::misc-data-offset) ; Hmmm. Also one instruction, but less impressive somehow. 75 75 (extrwi bitnum idx 5 (- ppc64::nbits-in-word (+ ppc64::fixnum-shift 5)))) 76 76 … … 137 137 138 138 (define-ppc64-vinsn misc-ref-c-single-float (((dest :single-float)) 139 ((v :lisp)140 (idx :u32const))141 ())139 ((v :lisp) 140 (idx :u32const)) 141 ()) 142 142 (lfs dest (:apply + ppc64::misc-data-offset (:apply ash idx 2)) v)) 143 143 … … 150 150 151 151 (define-ppc64-vinsn misc-ref-c-double-float (((dest :double-float)) 152 ((v :lisp)153 (idx :u32const))154 ())152 ((v :lisp) 153 (idx :u32const)) 154 ()) 155 155 (lfd dest (:apply + ppc64::misc-dfloat-offset (:apply ash idx 3)) v)) 156 156 157 157 (define-ppc64-vinsn misc-set-c-double-float (((val :double-float)) 158 ((v :lisp)159 (idx :u32const)))158 ((v :lisp) 159 (idx :u32const))) 160 160 (stfd val (:apply + ppc64::misc-dfloat-offset (:apply ash idx 3)) v)) 161 161 162 162 (define-ppc64-vinsn misc-set-double-float (() 163 ((val :double-float)164 (v :lisp)165 (scaled-idx :u32)))163 ((val :double-float) 164 (v :lisp) 165 (scaled-idx :u32))) 166 166 (stfdx val v scaled-idx)) 167 167 168 168 (define-ppc64-vinsn misc-set-c-single-float (((val :single-float)) 169 ((v :lisp)170 (idx :u32const)))169 ((v :lisp) 170 (idx :u32const))) 171 171 (stfs val (:apply + ppc64::misc-data-offset (:apply ash idx 2)) v)) 172 172 … … 185 185 186 186 (define-ppc64-vinsn misc-ref-c-u16 (((dest :u16)) 187 ((v :lisp)188 (idx :u32const))189 ())187 ((v :lisp) 188 (idx :u32const)) 189 ()) 190 190 (lhz dest (:apply + ppc64::misc-data-offset (:apply ash idx 1)) v)) 191 191 … … 202 202 203 203 (define-ppc64-vinsn misc-ref-s16 (((dest :s16)) 204 ((v :lisp)205 (scaled-idx :u32))206 ())204 ((v :lisp) 205 (scaled-idx :u32)) 206 ()) 207 207 (lhax dest v scaled-idx)) 208 208 … … 220 220 221 221 (define-ppc64-vinsn misc-ref-c-u8 (((dest :u8)) 222 ((v :lisp)223 (idx :u32const))224 ())222 ((v :lisp) 223 (idx :u32const)) 224 ()) 225 225 (lbz dest (:apply + ppc64::misc-data-offset idx) v)) 226 226 … … 228 228 ((v :lisp) 229 229 (idx :u32const)) 230 ())230 ()) 231 231 (stb val (:apply + ppc64::misc-data-offset idx) v)) 232 232 … … 247 247 ((v :lisp) 248 248 (idx :u32const)) 249 ())249 ()) 250 250 (lbz dest (:apply + ppc64::misc-data-offset idx) v) 251 251 (extsb dest dest)) … … 260 260 261 261 (define-ppc64-vinsn misc-ref-c-bit-fixnum (((dest :imm)) 262 ((v :lisp)263 (idx :u32const))264 ((temp :u32)))262 ((v :lisp) 263 (idx :u32const)) 264 ((temp :u32))) 265 265 (lwz temp (:apply + ppc64::misc-data-offset (:apply ash idx -5)) v) 266 266 (rlwinm dest … … 302 302 303 303 (define-ppc64-vinsn misc-element-count-fixnum (((dest :imm)) 304 ((v :lisp))305 ((temp :u32)))304 ((v :lisp)) 305 ((temp :u32))) 306 306 (ld temp ppc64::misc-header-offset v) 307 307 (rlwinm dest … … 312 312 313 313 (define-ppc64-vinsn check-misc-bound (() 314 ((idx :imm) 315 (v :lisp)) 316 ((temp :u32))) 317 (lwz temp ppc64::misc-header-offset v) 318 (rlwinm temp 319 temp 320 (- ppc64::nbits-in-word (- ppc64::num-subtag-bits ppc64::fixnumshift)) 321 (- ppc64::num-subtag-bits ppc64::fixnumshift) 322 (- ppc64::least-significant-bit ppc64::fixnumshift)) 323 (twlge idx temp)) 314 ((idx :imm) 315 (v :lisp)) 316 ((temp :u32))) 317 (ld temp ppc64::misc-header-offset v) 318 (rldicr temp temp 0 (- 63 8)) 319 (rldicl temp temp (- 64 (- 8 ppc64::fixnumshift)) (- 8 ppc64::fixnumshift)) 320 (tdlge idx temp)) 324 321 325 322 (define-ppc64-vinsn 2d-unscaled-index (((dest :u32)) 326 ((array :lisp)327 (i :imm)328 (j :imm)329 (dim1 :u32)))323 ((array :lisp) 324 (i :imm) 325 (j :imm) 326 (dim1 :u32))) 330 327 (mullw dest i dim1) 331 328 (add dest dest j)) … … 334 331 335 332 (define-ppc64-vinsn 2d-32-scaled-index (((dest :u32)) 336 ((array :lisp)337 (i :imm)338 (j :imm)339 (dim1 :u32)))333 ((array :lisp) 334 (i :imm) 335 (j :imm) 336 (dim1 :u32))) 340 337 (mullw dest i dim1) 341 338 (add dest dest j) … … 343 340 344 341 (define-ppc64-vinsn 2d-dim1 (((dest :u32)) 345 ((header :lisp)))346 (l wz dest (+ ppc64::misc-data-offset (* 4(1+ ppc64::arrayH.dim0-cell))) header)347 (sra wi dest dest ppc64::fixnumshift))342 ((header :lisp))) 343 (ld dest (+ ppc64::misc-data-offset (* 8 (1+ ppc64::arrayH.dim0-cell))) header) 344 (sradi dest dest ppc64::fixnumshift)) 348 345 349 346 ;; Return dim1 (unboxed) 350 (define-ppc64-vinsn check-2d-bound (((dim :u 32))351 ((i :imm)352 (j :imm)353 (header :lisp)))354 (l wz dim (+ ppc64::misc-data-offset (* 4ppc64::arrayH.dim0-cell)) header)355 (t wlge i dim)356 (l wz dim (+ ppc64::misc-data-offset (* 4(1+ ppc64::arrayH.dim0-cell))) header)357 (t wlge j dim)358 (sra wi dim dim ppc64::fixnumshift))347 (define-ppc64-vinsn check-2d-bound (((dim :u64)) 348 ((i :imm) 349 (j :imm) 350 (header :lisp))) 351 (ld dim (+ ppc64::misc-data-offset (* 8 ppc64::arrayH.dim0-cell)) header) 352 (tdlge i dim) 353 (ld dim (+ ppc64::misc-data-offset (* 8 (1+ ppc64::arrayH.dim0-cell))) header) 354 (tdlge j dim) 355 (sradi dim dim ppc64::fixnumshift)) 359 356 360 357 (define-ppc64-vinsn array-data-vector-ref (((dest :lisp)) 361 ((header :lisp)))362 (l wzdest ppc64::arrayH.data-vector header))358 ((header :lisp))) 359 (ld dest ppc64::arrayH.data-vector header)) 363 360 364 361 365 362 (define-ppc64-vinsn check-arrayH-rank (() 366 ((header :lisp)367 (expected :u32const))368 ((rank :imm)))363 ((header :lisp) 364 (expected :u32const)) 365 ((rank :imm))) 369 366 (lwz rank ppc64::arrayH.rank header) 370 (t wi 27 rank (:apply ash expected ppc64::fixnumshift)))367 (tdi 27 rank (:apply ash expected ppc64::fixnumshift))) 371 368 372 369 (define-ppc64-vinsn check-arrayH-flags (() 373 ((header :lisp)374 (expected :u16const))375 ((flags :imm)376 (xreg :u32)))370 ((header :lisp) 371 (expected :u16const)) 372 ((flags :imm) 373 (xreg :u32))) 377 374 (lis xreg (:apply ldb (byte 16 16) (:apply ash expected ppc64::fixnumshift))) 378 375 (ori xreg xreg (:apply ldb (byte 16 0) (:apply ash expected ppc64::fixnumshift))) … … 410 407 411 408 (define-ppc64-vinsn mem-ref-c-u16 (((dest :u16)) 412 ((src :address)413 (index :s16const)))409 ((src :address) 410 (index :s16const))) 414 411 (lhz dest index src)) 415 412 416 413 (define-ppc64-vinsn mem-ref-u16 (((dest :u16)) 417 ((src :address)418 (index :s32)))414 ((src :address) 415 (index :s32))) 419 416 (lhzx dest src index)) 420 417 421 418 422 419 (define-ppc64-vinsn mem-ref-c-s16 (((dest :s16)) 423 ((src :address)424 (index :s16const)))420 ((src :address) 421 (index :s16const))) 425 422 (lha dest src index)) 426 423 427 424 (define-ppc64-vinsn mem-ref-s16 (((dest :s16)) 428 ((src :address)429 (index :s32)))425 ((src :address) 426 (index :s32))) 430 427 (lhax dest src index)) 431 428 432 429 (define-ppc64-vinsn mem-ref-c-u8 (((dest :u8)) 433 ((src :address)434 (index :s16const)))430 ((src :address) 431 (index :s16const))) 435 432 (lbz dest index src)) 436 433 437 434 (define-ppc64-vinsn mem-ref-u8 (((dest :u8)) 438 ((src :address)439 (index :s32)))435 ((src :address) 436 (index :s32))) 440 437 (lbzx dest src index)) 441 438 442 439 (define-ppc64-vinsn mem-ref-c-s8 (((dest :s8)) 443 ((src :address)444 (index :s16const)))440 ((src :address) 441 (index :s16const))) 445 442 (lbz dest index src) 446 443 (extsb dest dest)) 447 444 448 445 (define-ppc64-vinsn mem-ref-s8 (((dest :s8)) 449 ((src :address)450 (index :s32)))446 ((src :address) 447 (index :s32))) 451 448 (lbzx dest src index) 452 449 (extsb dest dest)) 453 450 454 451 (define-ppc64-vinsn mem-ref-c-bit (((dest :u8)) 455 ((src :address)456 (byte-index :s16const)457 (bit-shift :u8const)))452 ((src :address) 453 (byte-index :s16const) 454 (bit-shift :u8const))) 458 455 (lbz dest byte-index src) 459 456 (rlwinm dest dest bit-shift 31 31)) 460 457 461 458 (define-ppc64-vinsn mem-ref-c-bit-fixnum (((dest :lisp)) 462 ((src :address)463 (byte-index :s16const)464 (bit-shift :u8const))465 ((byteval :u8)))459 ((src :address) 460 (byte-index :s16const) 461 (bit-shift :u8const)) 462 ((byteval :u8))) 466 463 (lbz byteval byte-index src) 467 464 (rlwinm dest byteval bit-shift 29 29)) 468 465 469 466 (define-ppc64-vinsn mem-ref-bit (((dest :u8)) 470 ((src :address)471 (bit-index :lisp))472 ((byte-index :s16)473 (bit-shift :u8)))467 ((src :address) 468 (bit-index :lisp)) 469 ((byte-index :s16) 470 (bit-shift :u8))) 474 471 (srwi byte-index bit-index (+ ppc64::fixnumshift 3)) 475 472 (extrwi bit-shift bit-index 3 27) … … 480 477 481 478 (define-ppc64-vinsn mem-ref-bit-fixnum (((dest :lisp)) 482 ((src :address)483 (bit-index :lisp))484 ((byte-index :s16)485 (bit-shift :u8)))479 ((src :address) 480 (bit-index :lisp)) 481 ((byte-index :s16) 482 (bit-shift :u8))) 486 483 (srwi byte-index bit-index (+ ppc64::fixnumshift 3)) 487 484 (extrwi bit-shift bit-index 3 27) … … 495 492 496 493 (define-ppc64-vinsn mem-ref-c-double-float (((dest :double-float)) 497 ((src :address)498 (index :s16const)))494 ((src :address) 495 (index :s16const))) 499 496 (lfd dest index src)) 500 497 501 498 (define-ppc64-vinsn mem-ref-double-float (((dest :double-float)) 502 ((src :address)503 (index :s32)))499 ((src :address) 500 (index :s32))) 504 501 (lfdx dest src index)) 505 502 506 503 (define-ppc64-vinsn mem-set-c-double-float (() 507 ((val :double-float)508 (src :address)509 (index :s16const)))504 ((val :double-float) 505 (src :address) 506 (index :s16const))) 510 507 (stfd val index src)) 511 508 512 509 (define-ppc64-vinsn mem-set-double-float (() 513 ((val :double-float)514 (src :address)515 (index :s32)))510 ((val :double-float) 511 (src :address) 512 (index :s32))) 516 513 (stfdx val src index)) 517 514 518 515 (define-ppc64-vinsn mem-ref-c-single-float (((dest :single-float)) 519 ((src :address)520 (index :s16const)))516 ((src :address) 517 (index :s16const))) 521 518 (lfs dest index src)) 522 519 523 520 (define-ppc64-vinsn mem-ref-single-float (((dest :single-float)) 524 ((src :address)525 (index :s32)))521 ((src :address) 522 (index :s32))) 526 523 (lfsx dest src index)) 527 524 528 525 (define-ppc64-vinsn mem-set-c-single-float (() 529 ((val :single-float)530 (src :address)531 (index :s16const)))526 ((val :single-float) 527 (src :address) 528 (index :s16const))) 532 529 (stfs val index src)) 533 530 534 531 (define-ppc64-vinsn mem-set-single-float (() 535 ((val :single-float)536 (src :address)537 (index :s32)))532 ((val :single-float) 533 (src :address) 534 (index :s32))) 538 535 (stfsx val src index)) 539 536 540 537 541 538 (define-ppc64-vinsn mem-set-c-fullword (() 542 ((val :u32)543 (src :address)544 (index :s16const)))539 ((val :u32) 540 (src :address) 541 (index :s16const))) 545 542 (stw val index src)) 546 543 547 544 (define-ppc64-vinsn mem-set-fullword (() 548 ((val :u32)549 (src :address)550 (index :s32)))545 ((val :u32) 546 (src :address) 547 (index :s32))) 551 548 (stwx val src index)) 552 549 553 550 (define-ppc64-vinsn mem-set-c-halfword (() 554 ((val :u16)555 (src :address)556 (index :s16const)))551 ((val :u16) 552 (src :address) 553 (index :s16const))) 557 554 (sth val index src)) 558 555 559 556 (define-ppc64-vinsn mem-set-halfword (() 560 ((val :u16)561 (src :address)562 (index :s32)))557 ((val :u16) 558 (src :address) 559 (index :s32))) 563 560 (sthx val src index)) 564 561 565 562 (define-ppc64-vinsn mem-set-c-byte (() 566 ((val :u16)567 (src :address)568 (index :s16const)))563 ((val :u16) 564 (src :address) 565 (index :s16const))) 569 566 (stb val index src)) 570 567 571 568 (define-ppc64-vinsn mem-set-byte (() 572 ((val :u8)573 (src :address)574 (index :s32)))569 ((val :u8) 570 (src :address) 571 (index :s32))) 575 572 (stbx val src index)) 576 573 577 574 (define-ppc64-vinsn mem-set-c-bit-0 (() 578 ((src :address)579 (byte-index :s16const)580 (mask-begin :u8const)581 (mask-end :u8const))582 ((val :u8)))575 ((src :address) 576 (byte-index :s16const) 577 (mask-begin :u8const) 578 (mask-end :u8const)) 579 ((val :u8))) 583 580 (lbz val byte-index src) 584 581 (rlwinm val val 0 mask-begin mask-end) … … 586 583 587 584 (define-ppc64-vinsn mem-set-c-bit-1 (() 588 ((src :address)589 (byte-index :s16const)590 (mask :u8const))591 ((val :u8)))585 ((src :address) 586 (byte-index :s16const) 587 (mask :u8const)) 588 ((val :u8))) 592 589 (lbz val byte-index src) 593 590 (ori val val mask) … … 595 592 596 593 (define-ppc64-vinsn mem-set-c-bit (() 597 ((src :address)598 (byte-index :s16const)599 (bit-index :u8const)600 (val :imm))601 ((byteval :u8)))594 ((src :address) 595 (byte-index :s16const) 596 (bit-index :u8const) 597 (val :imm)) 598 ((byteval :u8))) 602 599 (lbz byteval byte-index src) 603 600 (rlwimi byteval val (:apply logand 31 (:apply - 29 bit-index)) bit-index bit-index) … … 607 604 ;;; long it takes ... 608 605 (define-ppc64-vinsn mem-set-bit (() 609 ((src :address)610 (bit-index :lisp)611 (val :lisp))612 ((bit-shift :u32)613 (mask :u32)614 (byte-index :u32)615 (crf :crf)))606 ((src :address) 607 (bit-index :lisp) 608 (val :lisp)) 609 ((bit-shift :u32) 610 (mask :u32) 611 (byte-index :u32) 612 (crf :crf))) 616 613 (cmplwi crf val (ash 1 ppc64::fixnumshift)) 617 614 (extrwi bit-shift bit-index 3 27) … … 635 632 636 633 (define-ppc64-vinsn extract-tag (((tag :u8)) 637 ((object :lisp))638 ())634 ((object :lisp)) 635 ()) 639 636 (clrlwi tag object (- ppc64::nbits-in-word ppc64::nlisptagbits))) 640 637 641 638 (define-ppc64-vinsn extract-tag-fixnum (((tag :imm)) 642 ((object :lisp)))639 ((object :lisp))) 643 640 (rlwinm tag 644 641 object … … 649 646 650 647 (define-ppc64-vinsn extract-fulltag (((tag :u8)) 651 ((object :lisp))652 ())648 ((object :lisp)) 649 ()) 653 650 (clrlwi tag object (- ppc64::nbits-in-word ppc64::ntagbits))) 654 651 655 652 656 653 (define-ppc64-vinsn extract-fulltag-fixnum (((tag :imm)) 657 ((object :lisp)))654 ((object :lisp))) 658 655 (rlwinm tag 659 656 object … … 664 661 665 662 (define-ppc64-vinsn extract-typecode (((code :u8)) 666 ((object :lisp)) 667 ((crf :crf))) 668 (clrlwi code object (- ppc64::nbits-in-word ppc64::nlisptagbits)) 669 (cmpwi crf code ppc64::tag-misc) 663 ((object :lisp)) 664 ((crf :crf))) 665 (clrldi code object (- ppc64::nbits-in-word ppc64::ntagbits)) 666 (cmpdi crf code ppc64::fulltag-misc) 667 (clrldi code code (- ppc64::nbits-in-word ppc64::nlisptagbits)) 670 668 (bne crf :not-misc) 671 669 (lbz code ppc64::misc-subtag-offset object) … … 673 671 674 672 (define-ppc64-vinsn extract-typecode-fixnum (((code :imm)) 675 ((object (:lisp (:ne code))))676 ((crf :crf) (subtag :u8)))673 ((object (:lisp (:ne code)))) 674 ((crf :crf) (subtag :u8))) 677 675 (rlwinm code 678 676 object … … 681 679 (+ ppc64::nlisptagbits ppc64::fixnum-shift)) 682 680 (- ppc64::least-significant-bit ppc64::fixnum-shift)) 683 (cmpwi crf code (ash ppc64:: tag-misc ppc64::fixnum-shift))681 (cmpwi crf code (ash ppc64::fulltag-misc ppc64::fixnum-shift)) 684 682 (bne crf :not-misc) 685 683 (lbz subtag ppc64::misc-subtag-offset object) … … 689 687 690 688 (define-ppc64-vinsn require-fixnum (() 691 ((object :lisp))692 ((crf0 (:crf 0))693 (tag :u8)))689 ((object :lisp)) 690 ((crf0 (:crf 0)) 691 (tag :u8))) 694 692 :again 695 (clrl wi. tag object (- ppc64::nbits-in-word ppc64::nlisptagbits))693 (clrldi. tag object (- ppc64::nbits-in-word ppc64::nlisptagbits)) 696 694 (beq+ crf0 :got-it) 697 695 (uuo_intcerr arch::error-object-not-fixnum object) … … 700 698 701 699 (define-ppc64-vinsn require-integer (() 702 ((object :lisp))703 ((crf0 (:crf 0))704 (tag :u8)))700 ((object :lisp)) 701 ((crf0 (:crf 0)) 702 (tag :u8))) 705 703 :again 706 (clrl wi. tag object (- ppc64::nbits-in-word ppc64::nlisptagbits))704 (clrldi. tag object (- ppc64::nbits-in-word ppc64::nlisptagbits)) 707 705 (beq+ crf0 :got-it) 708 (cmpwi crf0 tag ppc64:: tag-misc)706 (cmpwi crf0 tag ppc64::fulltag-misc) 709 707 (bne crf0 :no-got) 710 708 (lbz tag ppc64::misc-subtag-offset object) … … 717 715 718 716 (define-ppc64-vinsn require-simple-vector (() 719 ((object :lisp))720 ((tag :u8)721 (crf :crf)))717 ((object :lisp)) 718 ((tag :u8) 719 (crf :crf))) 722 720 :again 723 721 (clrlwi tag object (- ppc64::nbits-in-word ppc64::nlisptagbits)) 724 (cmpwi crf tag ppc64:: tag-misc)722 (cmpwi crf tag ppc64::fulltag-misc) 725 723 (bne crf :no-got) 726 724 (lbz tag ppc64::misc-subtag-offset object) … … 733 731 734 732 (define-ppc64-vinsn require-simple-string (() 735 ((object :lisp))736 ((tag :u8)737 (crf :crf)738 (crf2 :crf)))733 ((object :lisp)) 734 ((tag :u8) 735 (crf :crf) 736 (crf2 :crf))) 739 737 :again 740 738 (clrlwi tag object (- ppc64::nbits-in-word ppc64::nlisptagbits)) 741 (cmpwi crf tag ppc64:: tag-misc)739 (cmpwi crf tag ppc64::fulltag-misc) 742 740 (bne crf :no-got) 743 741 (lbz tag ppc64::misc-subtag-offset object) 744 742 (cmpwi crf tag ppc64::subtag-simple-base-string) 745 (cmpwi crf2 tag ppc64::subtag-simple-general-string)746 743 (beq+ crf :got-it) 747 (beq+ crf2 :got-it)748 744 :no-got 749 745 (uuo_intcerr arch::error-object-not-simple-string object) … … 751 747 :got-it) 752 748 753 749 750 #+notyet 754 751 (define-ppc64-vinsn require-real (() 755 ((object :lisp))756 ((crf0 (:crf 0))757 (tag :u8)))752 ((object :lisp)) 753 ((crf0 (:crf 0)) 754 (tag :u8))) 758 755 :again 759 756 (clrlwi. tag object (- ppc64::nbits-in-word ppc64::nlisptagbits)) 760 757 (beq+ crf0 :got-it) 761 (cmpwi crf0 tag ppc64:: tag-misc)758 (cmpwi crf0 tag ppc64::fulltag-misc) 762 759 (bne crf0 :no-got) 763 760 (lbz tag ppc64::misc-subtag-offset object) … … 769 766 :got-it) 770 767 768 #+notyet 771 769 (define-ppc64-vinsn require-number (() 772 ((object :lisp))773 ((crf0 (:crf 0))774 (tag :u8)))770 ((object :lisp)) 771 ((crf0 (:crf 0)) 772 (tag :u8))) 775 773 :again 776 774 (clrlwi. tag object (- ppc64::nbits-in-word ppc64::nlisptagbits)) 777 775 (beq+ crf0 :got-it) 778 (cmpwi crf0 tag ppc64:: tag-misc)776 (cmpwi crf0 tag ppc64::fulltag-misc) 779 777 (bne crf0 :no-got) 780 778 (lbz tag ppc64::misc-subtag-offset object) … … 788 786 789 787 (define-ppc64-vinsn require-list (() 790 ((object :lisp)) 791 ((tag :u8) 792 (crf :crf))) 788 ((object :lisp)) 789 ((tag :u8) 790 (crfx :crf) 791 (crfy :crf))) 793 792 :again 794 (clrlwi tag object (- ppc64::nbits-in-word ppc64::nlisptagbits)) 795 (cmpwi crf tag ppc64::tag-list) 796 (beq+ crf :got-it) 793 (cmpdi crfx object ppc64::nil-value) 794 (clrldi tag object (- ppc64::nbits-in-word ppc64::nlisptagbits)) 795 (cmpwi crfy tag ppc64::fulltag-cons) 796 (beq crfx :got-it) 797 (beq+ crfy :got-it) 797 798 (uuo_intcerr arch::error-object-not-list object) 798 799 (b :again) … … 800 801 801 802 (define-ppc64-vinsn require-symbol (() 802 ((object :lisp))803 ((tag :u8)804 (crf :crf)))803 ((object :lisp)) 804 ((tag :u8) 805 (crf :crf))) 805 806 :again 806 807 (cmpwi crf object ppc64::nil-value) 807 808 (clrlwi tag object (- ppc64::nbits-in-word ppc64::nlisptagbits)) 808 809 (beq crf :got-it) 809 (cmpwi crf tag ppc64:: tag-misc)810 (cmpwi crf tag ppc64::fulltag-misc) 810 811 (bne crf :no-got) 811 812 (lbz tag ppc64::misc-subtag-offset object) … … 818 819 819 820 (define-ppc64-vinsn require-character (() 820 ((object :lisp))821 ((tag :u8)822 (crf :crf)))821 ((object :lisp)) 822 ((tag :u8) 823 (crf :crf))) 823 824 :again 824 (clrl wi tag object (- ppc64::nbits-in-word ppc64::num-subtag-bits))825 (clrldi tag object (- ppc64::nbits-in-word ppc64::num-subtag-bits)) 825 826 (cmpwi crf tag ppc64::subtag-character) 826 827 (beq+ crf :got-it) … … 831 832 832 833 (define-ppc64-vinsn require-u8 (() 833 ((object :lisp))834 ((crf0 (:crf 0))835 (tag :u32)))834 ((object :lisp)) 835 ((crf0 (:crf 0)) 836 (tag :u32))) 836 837 :again 837 ; The bottom ppc64::fixnumshift bits and the top (- 32 (+ ppc64::fixnumshift 8)) must all be zero.838 ; The bottom ppc64::fixnumshift bits and the top (- 32 (+ ppc64::fixnumshift 8)) must all be zero. 838 839 (rlwinm. tag object 0 (- ppc64::nbits-in-word ppc64::fixnumshift) (- ppc64::least-significant-bit (+ ppc64::fixnumshift 8))) 839 840 (beq+ crf0 :got-it) … … 843 844 844 845 (define-ppc64-vinsn box-fixnum (((dest :imm)) 845 ((src :s32)))846 ((src :s32))) 846 847 (slwi dest src ppc64::fixnumshift)) 847 848 848 849 (define-ppc64-vinsn fixnum->s32 (((dest :s32)) 849 ((src :imm)))850 ((src :imm))) 850 851 (srawi dest src ppc64::fixnumshift)) 851 852 852 853 (define-ppc64-vinsn fixnum->u32 (((dest :u32)) 853 ((src :imm)))854 ((src :imm))) 854 855 (srwi dest src ppc64::fixnumshift)) 855 856 … … 860 861 861 862 (define-ppc64-vinsn unbox-u32 (((dest :u32)) 862 ((src :lisp))863 ((crf0 (:crf 0))864 (crf1 :crf)))863 ((src :lisp)) 864 ((crf0 (:crf 0)) 865 (crf1 :crf))) 865 866 (rlwinm. dest src 0 (- ppc64::nbits-in-word ppc64::fixnumshift) 0) 866 867 (srwi dest src ppc64::fixnumshift) 867 868 (beq+ crf0 :got-it) 868 869 (clrlwi dest src (- ppc64::nbits-in-word ppc64::nlisptagbits)) 869 (cmpwi crf0 dest ppc64:: tag-misc)870 (cmpwi crf0 dest ppc64::fulltag-misc) 870 871 (bne- crf0 :bad) 871 872 (lwz dest ppc64::misc-header-offset src) … … 891 892 892 893 (define-ppc64-vinsn unbox-s32 (((dest :s32)) 893 ((src :lisp))894 ((crfx :crf)895 (crfy :crf)896 (tag :u32)))894 ((src :lisp)) 895 ((crfx :crf) 896 (crfy :crf) 897 (tag :u32))) 897 898 (clrlwi tag src (- ppc64::nbits-in-word ppc64::nlisptagbits)) 898 899 (cmpwi crfx tag ppc64::tag-fixnum) 899 (cmpwi crfy tag ppc64:: tag-misc)900 (cmpwi crfy tag ppc64::fulltag-misc) 900 901 (srawi dest src ppc64::fixnumshift) 901 902 (beq+ crfx :got-it) … … 913 914 ; Say that it's not (signed-byte 32) if neither. 914 915 (define-ppc64-vinsn unbox-x32 (((dest :u32)) 915 ((src :lisp))916 ((crfx :crf)917 (crfy :crf)918 (tag :u32)))916 ((src :lisp)) 917 ((crfx :crf) 918 (crfy :crf) 919 (tag :u32))) 919 920 (clrlwi tag src (- ppc64::nbits-in-word ppc64::nlisptagbits)) 920 921 (cmpwi crfx tag ppc64::tag-fixnum) 921 (cmpwi crfy tag ppc64:: tag-misc)922 (cmpwi crfy tag ppc64::fulltag-misc) 922 923 (srawi dest src ppc64::fixnumshift) 923 924 (beq+ crfx :got-it) … … 937 938 938 939 (define-ppc64-vinsn unbox-u16 (((dest :u16)) 939 ((src :lisp)) 940 ((crf0 (:crf 0)))) 941 ; The bottom ppc64::fixnumshift bits and the top (- 31 (+ ppc64::fixnumshift 16)) must all be zero. 940 ((src :lisp)) 941 ((crf0 (:crf 0)))) 942 ;; The bottom ppc64::fixnumshift bits and the top (- 31 (+ 943 ;; ppc64::fixnumshift 16)) must all be zero. 942 944 (rlwinm. dest src 0 (- ppc64::nbits-in-word ppc64::fixnumshift) (- ppc64::least-significant-bit (+ ppc64::fixnumshift 16))) 943 945 (rlwinm dest src (- 32 ppc64::fixnumshift) 16 31) … … 947 949 948 950 (define-ppc64-vinsn unbox-s16 (((dest :s16)) 949 ((src :lisp))950 ((crf :crf)))951 ((src :lisp)) 952 ((crf :crf))) 951 953 (slwi dest src (- 16 ppc64::fixnumshift)) 952 954 (srawi dest dest (- 16 ppc64::fixnumshift)) … … 964 966 965 967 (define-ppc64-vinsn unbox-u8 (((dest :u8)) 966 ((src :lisp))967 ((crf0 (:crf 0))))968 ; The bottom ppc64::fixnumshift bits and the top (- 31 (+ ppc64::fixnumshift 8)) must all be zero.968 ((src :lisp)) 969 ((crf0 (:crf 0)))) 970 ; The bottom ppc64::fixnumshift bits and the top (- 31 (+ ppc64::fixnumshift 8)) must all be zero. 969 971 (rlwinm. dest src 0 (- ppc64::nbits-in-word ppc64::fixnumshift) (- ppc64::least-significant-bit (+ ppc64::fixnumshift 8))) 970 972 (rlwinm dest src (- 32 ppc64::fixnumshift) 24 31) … … 974 976 975 977 (define-ppc64-vinsn unbox-s8 (((dest :s8)) 976 ((src :lisp))977 ((crf :crf)))978 ((src :lisp)) 979 ((crf :crf))) 978 980 (slwi dest src (- ppc64::nbits-in-word (+ 8 ppc64::fixnumshift))) 979 981 (srawi dest dest (- ppc64::nbits-in-word (+ 8 ppc64::fixnumshift))) … … 989 991 990 992 (define-ppc64-vinsn unbox-base-char (((dest :u32)) 991 ((src :lisp))992 ((crf :crf)))993 ((src :lisp)) 994 ((crf :crf))) 993 995 (rlwinm dest src 8 16 31) 994 996 (cmpwi crf dest (ash ppc64::subtag-character 8)) … … 999 1001 1000 1002 (define-ppc64-vinsn unbox-character (((dest :u32)) 1001 ((src :lisp))1002 ((crf :crf)))1003 ((src :lisp)) 1004 ((crf :crf))) 1003 1005 (clrlwi dest src 24) 1004 1006 (cmpwi crf dest ppc64::subtag-character) … … 1009 1011 1010 1012 (define-ppc64-vinsn unbox-bit (((dest :u32)) 1011 ((src :lisp))1012 ((crf :crf)))1013 ((src :lisp)) 1014 ((crf :crf))) 1013 1015 (cmplwi crf src (ash 1 ppc64::fixnumshift)) 1014 1016 (srawi dest src ppc64::fixnumshift) … … 1018 1020 1019 1021 (define-ppc64-vinsn unbox-bit-bit0 (((dest :u32)) 1020 ((src :lisp))1021 ((crf :crf)))1022 ((src :lisp)) 1023 ((crf :crf))) 1022 1024 (cmplwi crf src (ash 1 ppc64::fixnumshift)) 1023 1025 (rlwinm dest src (- 32 (1+ ppc64::fixnumshift)) 0 0) … … 1026 1028 :got-it) 1027 1029 1028 (define-ppc64-vinsn fixnum->fpr (((dest :double-float)) 1029 ((src :lisp)) 1030 ((imm :s32))) 1031 (stwu ppc::tsp -16 ppc::tsp) 1032 (stw ppc::tsp 4 ppc::tsp) 1033 (stfd ppc::fp-s32conv 8 ppc::tsp) 1034 (srawi imm src ppc64::fixnumshift) 1035 (xoris imm imm #x8000) 1036 (stw imm 12 ppc::tsp) 1037 (lfd dest 8 ppc::tsp) 1038 (lwz ppc::tsp 0 ppc::tsp) 1039 (fsub dest dest ppc::fp-s32conv)) 1040 1041 1042 (define-ppc64-vinsn shift-right-variable-word (((dest :u32)) 1043 ((src :u32) 1044 (sh :u32))) 1030 1031 1032 1033 (define-ppc64-vinsn shift-right-variable-word (((dest :u64)) 1034 ((src :u64) 1035 (sh :u64))) 1045 1036 (srw dest src sh)) 1046 1037 1047 (define-ppc64-vinsn u 32logandc2 (((dest :u32))1048 ((x :u32)1049 (y :u32)))1038 (define-ppc64-vinsn u64logandc2 (((dest :u64)) 1039 ((x :u64) 1040 (y :u64))) 1050 1041 (andc dest x y)) 1051 1042 1052 (define-ppc64-vinsn u 32logior (((dest :u32))1053 ((x :u32)1054 (y :u32)))1043 (define-ppc64-vinsn u64logior (((dest :u64)) 1044 ((x :u64) 1045 (y :u64))) 1055 1046 (or dest x y)) 1056 1047 1057 (define-ppc64-vinsn rotate-left-variable-word (((dest :u32)) 1058 ((src :u32) 1059 (rot :u32))) 1060 (rlwnm dest src rot 0 31)) 1061 1062 (define-ppc64-vinsn complement-shift-count (((dest :u32)) 1063 ((src :u32))) 1064 (subfic dest src 32)) 1065 1066 (define-ppc64-vinsn extract-lowbyte (((dest :u32)) 1067 ((src :lisp))) 1068 (clrlwi dest src (- ppc64::nbits-in-word ppc64::num-subtag-bits))) 1069 1070 ; Set DEST to the difference between the low byte of SRC and BYTEVAL. 1071 (define-ppc64-vinsn extract-compare-lowbyte (((dest :u32)) 1072 ((src :lisp) 1073 (byteval :u8const))) 1074 (clrlwi dest src (- ppc64::nbits-in-word ppc64::num-subtag-bits)) 1075 (subi dest dest byteval)) 1076 1077 1078 ; Set the "EQ" bit in condition-register field CRF if object is 1079 ; a fixnum. Leave the object's tag in TAG. 1080 ; This is a little easier if CRF is CR0. 1081 (define-ppc64-vinsn eq-if-fixnum (((crf :crf) 1082 (tag :u8)) 1083 ((object :lisp)) 1084 ()) 1085 ((:eq crf 0) 1086 (clrlwi. tag object (- ppc64::nbits-in-word ppc64::nlisptagbits))) 1087 ((:not (:eq crf 0)) 1088 (clrlwi tag object (- ppc64::nbits-in-word ppc64::nlisptagbits)) 1089 (cmpwi crf tag ppc64::tag-fixnum))) 1090 1091 (define-ppc64-vinsn trap-unless-tag= (() 1092 ((object :lisp) 1093 (tagval :u16const)) 1094 ((tag :u8))) 1095 (clrlwi tag object (- ppc64::nbits-in-word ppc64::nlisptagbits)) 1048 1049 (define-ppc64-vinsn trap-unless-fixnum (() 1050 ((object :lisp)) 1051 ((tag :u8))) 1052 (clrldi tag object (- ppc64::nbits-in-word ppc64::nlisptagbits)) 1053 (tdnei tag ppc64::tag-fixnum)) 1054 1055 (define-ppc64-vinsn trap-unless-list (() 1056 ((object :lisp)) 1057 ((tag :u8) 1058 (crf :crf))) 1059 (cmpldi crf object ppc64::nil-value) 1060 (clrldi tag object (- ppc64::nbits-in-word ppc64::ntagbits)) 1061 (beq crf :ok) 1062 (tdnei tag ppc64::fulltag-cons) 1063 :ok) 1064 1065 (define-ppc64-vinsn trap-unless-uvector (() 1066 ((object :lisp)) 1067 ((tag :u8))) 1068 (clrldi tag object (- ppc64::nbits-in-word ppc64::nlisptagbits)) 1069 (tdnei tag ppc64::fulltag-misc)) 1070 1071 (define-ppc64-vinsn trap-unless-fulltag= (() 1072 ((object :lisp) 1073 (tagval :u16const)) 1074 ((tag :u8))) 1075 (clrldi tag object (- ppc64::nbits-in-word ppc64::ntagbits)) 1096 1076 (twnei tag tagval)) 1097 1077 1098 (define-ppc64-vinsn trap-unless-fulltag= (()1099 ((object :lisp)1100 (tagval :u16const))1101 ((tag :u8)))1102 (clrlwi tag object (- ppc64::nbits-in-word ppc64::ntagbits))1103 (twnei tag tagval))1104 1105 1078 (define-ppc64-vinsn trap-unless-lowbyte= (() 1106 ((object :lisp)1107 (tagval :u16const))1108 ((tag :u8)))1079 ((object :lisp) 1080 (tagval :u16const)) 1081 ((tag :u8))) 1109 1082 (clrlwi tag object (- ppc64::nbits-in-word 8)) 1110 1083 (twnei tag tagval)) 1111 1084 1112 1085 (define-ppc64-vinsn trap-unless-typecode= (() 1113 ((object :lisp) 1114 (tagval :u16const)) 1115 ((tag :u8) 1116 (crf :crf))) 1117 (clrlwi tag object (- ppc64::nbits-in-word ppc64::nlisptagbits)) 1118 (cmpwi crf tag ppc64::tag-misc) 1086 ((object :lisp) 1087 (tagval :u16const)) 1088 ((tag :u8) 1089 (crf :crf))) 1090 (clrldi tag object (- ppc64::nbits-in-word ppc64::ntagbits)) 1091 (cmpdi crf tag ppc64::fulltag-misc) 1092 (clrldi tag object (- ppc64::nbits-in-word ppc64::nlisptagbits)) 1119 1093 (bne crf :do-trap) 1120 1094 (lbz tag ppc64::misc-subtag-offset object) 1121 1095 :do-trap 1122 (t wnei tag tagval))1096 (tdnei tag tagval)) 1123 1097 1124 1098 (define-ppc64-vinsn subtract-constant (((dest :imm)) 1125 ((src :imm)1126 (const :s16const)))1099 ((src :imm) 1100 (const :s16const))) 1127 1101 (subi dest src const)) 1128 1102 1103 #+not-yet 1129 1104 (define-ppc64-vinsn trap-unless-numeric-type (() 1130 ((object :lisp)1131 (maxtype :u16const))1132 ((crf0 (:crf 0))1133 (tag :u8)1134 (crfX :crf)))1105 ((object :lisp) 1106 (maxtype :u16const)) 1107 ((crf0 (:crf 0)) 1108 (tag :u8) 1109 (crfX :crf))) 1135 1110 (clrlwi. tag object (- ppc64::nbits-in-word ppc64::nlisptagbits)) 1136 1111 (cmpwi tag ppc64::tag-misc) … … 1146 1121 ;; Bit-extraction & boolean operations 1147 1122 1148 (eval-when (:compile-toplevel :execute)1149 (assert (= ppc64::t-offset #b10001))) ; PPC-bits 31 and 27 set1150 1123 1151 1124 ;; For some mind-numbing reason, IBM decided to call the most significant … … 1159 1132 1160 1133 (define-ppc64-vinsn extract-variable-bit (((dest :u8)) 1161 ((src :u32)1162 (bitnum :u8))1163 ())1134 ((src :u32) 1135 (bitnum :u8)) 1136 ()) 1164 1137 (rotlw dest src bitnum) 1165 1138 (extrwi dest dest 1 0)) … … 1167 1140 1168 1141 (define-ppc64-vinsn extract-variable-bit-fixnum (((dest :imm)) 1169 ((src :u32)1170 (bitnum :u8))1171 ((temp :u32)))1142 ((src :u32) 1143 (bitnum :u8)) 1144 ((temp :u32))) 1172 1145 (rotlw temp src bitnum) 1173 1146 (rlwinm dest … … 1185 1158 1186 1159 (define-ppc64-vinsn bit31->truth (((dest :lisp) 1187 (bits :u32))1188 ((bits :u32))1189 ())1190 (rlwimi bits bits (- ppc64::least-significant-bit 27) 27 27) ; bits = 0000...X000X1160 (bits :u32)) 1161 ((bits :u32)) 1162 ()) 1163 (rlwimi bits bits (- ppc64::least-significant-bit 27) 27 27) ; bits = 0000...X000X 1191 1164 (addi dest bits ppc64::nil-value)) 1192 1165 1193 1166 (define-ppc64-vinsn invert-bit31 (((bits :u32)) 1194 ((bits :u32))1195 ())1167 ((bits :u32)) 1168 ()) 1196 1169 (xori bits bits 1)) 1197 1170 … … 1212 1185 1213 1186 (define-ppc64-vinsn eq0->bit31 (((bits :u32)) 1214 ((src (t (:ne bits)))))1187 ((src (t (:ne bits))))) 1215 1188 (cntlzw bits src) 1216 (srwi bits bits 5)) ; bits = 0000...000X1189 (srwi bits bits 5)) ; bits = 0000...000X 1217 1190 1218 1191 (define-ppc64-vinsn ne0->bit31 (((bits :u32)) 1219 ((src (t (:ne bits)))))1192 ((src (t (:ne bits))))) 1220 1193 (cntlzw bits src) 1221 1194 (slw bits src bits) 1222 (srwi bits bits 31)) ; bits = 0000...000X1195 (srwi bits bits 31)) ; bits = 0000...000X 1223 1196 1224 1197 (define-ppc64-vinsn lt0->bit31 (((bits :u32)) 1225 ((src (t (:ne bits)))))1198 ((src (t (:ne bits))))) 1226 1199 (srwi bits src 31)) ; bits = 0000...000X 1227 1200 1228 1201 1229 1202 (define-ppc64-vinsn ge0->bit31 (((bits :u32)) 1230 ((src (t (:ne bits)))))1203 ((src (t (:ne bits))))) 1231 1204 (srwi bits src 31) 1232 1205 (xori bits bits 1)) ; bits = 0000...000X … … 1234 1207 1235 1208 (define-ppc64-vinsn le0->bit31 (((bits :u32)) 1236 ((src (t (:ne bits)))))1209 ((src (t (:ne bits))))) 1237 1210 (neg bits src) 1238 1211 (orc bits bits src) … … 1240 1213 1241 1214 (define-ppc64-vinsn gt0->bit31 (((bits :u32)) 1242 ((src (t (:ne bits)))))1215 ((src (t (:ne bits))))) 1243 1216 (subi bits src 1) 1244 1217 (nor bits bits src) … … 1246 1219 1247 1220 (define-ppc64-vinsn ne->bit31 (((bits :u32)) 1248 ((x t)1249 (y t))1250 ((temp :u32)))1221 ((x t) 1222 (y t)) 1223 ((temp :u32))) 1251 1224 (subf temp x y) 1252 1225 (cntlzw bits temp) 1253 1226 (slw bits temp bits) 1254 (srwi bits bits 31)) ; bits = 0000...000X1227 (srwi bits bits 31)) ; bits = 0000...000X 1255 1228 1256 1229 (define-ppc64-vinsn fulltag->bit31 (((bits :u32)) 1257 ((lispobj :lisp)1258 (tagval :u8const))1259 ())1230 ((lispobj :lisp) 1231 (tagval :u8const)) 1232 ()) 1260 1233 (clrlwi bits lispobj (- ppc64::nbits-in-word ppc64::ntagbits)) 1261 1234 (subi bits bits tagval) … … 1265 1238 1266 1239 (define-ppc64-vinsn eq->bit31 (((bits :u32)) 1267 ((x t)1268 (y t)))1240 ((x t) 1241 (y t))) 1269 1242 (subf bits x y) 1270 1243 (cntlzw bits bits) 1271 (srwi bits bits 5)) ; bits = 0000...000X1244 (srwi bits bits 5)) ; bits = 0000...000X 1272 1245 1273 1246 (define-ppc64-vinsn eqnil->bit31 (((bits :u32)) 1274 ((x t)))1247 ((x t))) 1275 1248 (subi bits x ppc64::nil-value) 1276 1249 (cntlzw bits bits) … … 1278 1251 1279 1252 (define-ppc64-vinsn ne->bit31 (((bits :u32)) 1280 ((x t)1281 (y t)))1253 ((x t) 1254 (y t))) 1282 1255 (subf bits x y) 1283 1256 (cntlzw bits bits) … … 1286 1259 1287 1260 (define-ppc64-vinsn nenil->bit31 (((bits :u32)) 1288 ((x t)))1261 ((x t))) 1289 1262 (subi bits x ppc64::nil-value) 1290 1263 (cntlzw bits bits) … … 1293 1266 1294 1267 (define-ppc64-vinsn lt->bit31 (((bits :u32)) 1295 ((x (t (:ne bits)))1296 (y (t (:ne bits)))))1268 ((x (t (:ne bits))) 1269 (y (t (:ne bits))))) 1297 1270 1298 1271 (xor bits x y) … … 1300 1273 (or bits bits x) 1301 1274 (subf bits y bits) 1302 (srwi bits bits 31)) ; bits = 0000...000X1275 (srwi bits bits 31)) ; bits = 0000...000X 1303 1276 1304 1277 (define-ppc64-vinsn ltu->bit31 (((bits :u32)) 1305 ((x :u32)1306 (y :u32)))1278 ((x :u32) 1279 (y :u32))) 1307 1280 (subfc bits y x) 1308 1281 (subfe bits bits bits) … … 1310 1283 1311 1284 (define-ppc64-vinsn le->bit31 (((bits :u32)) 1312 ((x (t (:ne bits)))1313 (y (t (:ne bits)))))1285 ((x (t (:ne bits))) 1286 (y (t (:ne bits))))) 1314 1287 1315 1288 (xor bits x y) … … 1317 1290 (nor bits bits y) 1318 1291 (add bits bits x) 1319 (srwi bits bits 31)) ; bits = 0000...000X1292 (srwi bits bits 31)) ; bits = 0000...000X 1320 1293 1321 1294 (define-ppc64-vinsn leu->bit31 (((bits :u32)) 1322 ((x :u32)1323 (y :u32)))1295 ((x :u32) 1296 (y :u32))) 1324 1297 (subfc bits x y) 1325 1298 (addze bits ppc::rzero)) 1326 1299 1327 1300 (define-ppc64-vinsn gt->bit31 (((bits :u32)) 1328 ((x (t (:ne bits)))1329 (y (t (:ne bits)))))1301 ((x (t (:ne bits))) 1302 (y (t (:ne bits))))) 1330 1303 1331 1304 (eqv bits x y) … … 1333 1306 (and bits bits x) 1334 1307 (subf bits bits y) 1335 (srwi bits bits 31)) ; bits = 0000...000X1308 (srwi bits bits 31)) ; bits = 0000...000X 1336 1309 1337 1310 (define-ppc64-vinsn gtu->bit31 (((bits :u32)) 1338 ((x :u32)1339 (y :u32)))1311 ((x :u32) 1312 (y :u32))) 1340 1313 (subfc bits x y) 1341 1314 (subfe bits bits bits) … … 1343 1316 1344 1317 (define-ppc64-vinsn ge->bit31 (((bits :u32)) 1345 ((x (t (:ne bits)))1346 (y (t (:ne bits)))))1318 ((x (t (:ne bits))) 1319 (y (t (:ne bits))))) 1347 1320 (eqv bits x y) 1348 1321 (srawi bits bits 31) 1349 1322 (andc bits bits x) 1350 1323 (add bits bits y) 1351 (srwi bits bits 31)) ; bits = 0000...000X1324 (srwi bits bits 31)) ; bits = 0000...000X 1352 1325 1353 1326 (define-ppc64-vinsn geu->bit31 (((bits :u32)) 1354 ((x :u32)1355 (y :u32)))1327 ((x :u32) 1328 (y :u32))) 1356 1329 (subfc bits y x) 1357 1330 (addze bits ppc::rzero)) … … 1365 1338 ; Of course, using a CR field costs us something as well. 1366 1339 (define-ppc64-vinsn crbit->bit31 (((bits :u32)) 1367 ((crf :crf)1368 (bitnum :crbit))1369 ())1340 ((crf :crf) 1341 (bitnum :crbit)) 1342 ()) 1370 1343 (mfcr bits) ; Suffer. 1371 (rlwinm bits bits (:apply + 1 bitnum (:apply ash crf 2)) 31 31)) ; bits = 0000...000X1344 (rlwinm bits bits (:apply + 1 bitnum (:apply ash crf 2)) 31 31)) ; bits = 0000...000X 1372 1345 1373 1346 1374 1347 (define-ppc64-vinsn compare (((crf :crf)) 1375 ((arg0 t)1376 (arg1 t))1377 ())1348 ((arg0 t) 1349 (arg1 t)) 1350 ()) 1378 1351 (cmpw crf arg0 arg1)) 1379 1352 1380 1353 (define-ppc64-vinsn compare-to-nil (((crf :crf)) 1381 ((arg0 t)))1354 ((arg0 t))) 1382 1355 (cmpwi crf arg0 ppc64::nil-value)) 1383 1356 1384 1357 (define-ppc64-vinsn compare-logical (((crf :crf)) 1385 ((arg0 t)1386 (arg1 t))1387 ())1358 ((arg0 t) 1359 (arg1 t)) 1360 ()) 1388 1361 (cmplw crf arg0 arg1)) 1389 1362 1390 1363 (define-ppc64-vinsn double-float-compare (((crf :crf)) 1391 ((arg0 :double-float)1392 (arg1 :double-float))1393 ())1364 ((arg0 :double-float) 1365 (arg1 :double-float)) 1366 ()) 1394 1367 (fcmpo crf arg0 arg1)) 1395 1368 1396 1369 1397 1370 (define-ppc64-vinsn double-float+-2 (((result :double-float)) 1398 ((x :double-float)1399 (y :double-float))1400 ((crf (:crf 4))))1371 ((x :double-float) 1372 (y :double-float)) 1373 ((crf (:crf 4)))) 1401 1374 (fadd result x y)) 1402 1375 1403 1376 (define-ppc64-vinsn double-float--2 (((result :double-float)) 1404 ((x :double-float)1405 (y :double-float))1406 ((crf (:crf 4))))1377 ((x :double-float) 1378 (y :double-float)) 1379 ((crf (:crf 4)))) 1407 1380 (fsub result x y)) 1408 1381 1409 1382 (define-ppc64-vinsn double-float*-2 (((result :double-float)) 1410 ((x :double-float)1411 (y :double-float))1412 ((crf (:crf 4))))1383 ((x :double-float) 1384 (y :double-float)) 1385 ((crf (:crf 4)))) 1413 1386 (fmul result x y)) 1414 1387 1415 1388 (define-ppc64-vinsn double-float/-2 (((result :double-float)) 1416 ((x :double-float)1417 (y :double-float))1418 ((crf (:crf 4))))1389 ((x :double-float) 1390 (y :double-float)) 1391 ((crf (:crf 4)))) 1419 1392 (fdiv result x y)) 1420 1393 1421 1394 (define-ppc64-vinsn single-float+-2 (((result :single-float)) 1422 ((x :single-float)1423 (y :single-float))1424 ((crf (:crf 4))))1395 ((x :single-float) 1396 (y :single-float)) 1397 ((crf (:crf 4)))) 1425 1398 (fadds result x y)) 1426 1399 1427 1400 (define-ppc64-vinsn single-float--2 (((result :single-float)) 1428 ((x :single-float)1429 (y :single-float))1430 ((crf (:crf 4))))1401 ((x :single-float) 1402 (y :single-float)) 1403 ((crf (:crf 4)))) 1431 1404 (fsubs result x y)) 1432 1405 1433 1406 (define-ppc64-vinsn single-float*-2 (((result :single-float)) 1434 ((x :single-float)1435 (y :single-float))1436 ((crf (:crf 4))))1407 ((x :single-float) 1408 (y :single-float)) 1409 ((crf (:crf 4)))) 1437 1410 (fmuls result x y)) 1438 1411 1439 1412 (define-ppc64-vinsn single-float/-2 (((result :single-float)) 1440 ((x :single-float)1441 (y :single-float))1442 ((crf (:crf 4))))1413 ((x :single-float) 1414 (y :single-float)) 1415 ((crf (:crf 4)))) 1443 1416 (fdivs result x y)) 1444 1417 … … 1448 1421 1449 1422 (define-ppc64-vinsn compare-unsigned (((crf :crf)) 1450 ((arg0 :imm)1451 (arg1 :imm))1452 ())1423 ((arg0 :imm) 1424 (arg1 :imm)) 1425 ()) 1453 1426 (cmplw crf arg0 arg1)) 1454 1427 1455 1428 (define-ppc64-vinsn compare-signed-s16const (((crf :crf)) 1456 ((arg0 :imm)1457 (imm :s16const))1458 ())1429 ((arg0 :imm) 1430 (imm :s16const)) 1431 ()) 1459 1432 (cmpwi crf arg0 imm)) 1460 1433 1461 1434 (define-ppc64-vinsn compare-unsigned-u16const (((crf :crf)) 1462 ((arg0 :u32)1463 (imm :u16const))1464 ())1435 ((arg0 :u32) 1436 (imm :u16const)) 1437 ()) 1465 1438 (cmplwi crf arg0 imm)) 1466 1439 … … 1470 1443 ;; Bitnum is treated mod 32. 1471 1444 (define-ppc64-vinsn extract-constant-ppc-bit (((dest :u32)) 1472 ((src :imm)1473 (bitnum :u16const))1474 ())1445 ((src :imm) 1446 (bitnum :u16const)) 1447 ()) 1475 1448 (rlwinm dest src (:apply + 1 bitnum) 31 31)) 1476 1449 1477 1450 1478 1451 (define-ppc64-vinsn set-constant-ppc-bit-to-variable-value (((dest :u32)) 1479 ((src :u32)1480 (bitval :u32) ; 0 or 11481 (bitnum :u8const)))1452 ((src :u32) 1453 (bitval :u32) ; 0 or 1 1454 (bitnum :u8const))) 1482 1455 (rlwimi dest bitval (:apply - 31 bitnum) bitnum bitnum)) 1483 1456 1484 1457 (define-ppc64-vinsn set-constant-ppc-bit-to-1 (((dest :u32)) 1485 ((src :u32)1486 (bitnum :u8const)))1458 ((src :u32) 1459 (bitnum :u8const))) 1487 1460 ((:pred < bitnum 16) 1488 1461 (oris dest src (:apply ash #x8000 (:apply - bitnum)))) … … 1491 1464 1492 1465 (define-ppc64-vinsn set-constant-ppc-bit-to-0 (((dest :u32)) 1493 ((src :u32)1494 (bitnum :u8const)))1466 ((src :u32) 1467 (bitnum :u8const))) 1495 1468 (rlwinm dest src 0 (:apply logand #x1f (:apply 1+ bitnum)) (:apply logand #x1f (:apply 1- bitnum)))) 1496 1469 1497 1470 1498 1471 (define-ppc64-vinsn insert-bit-0 (((dest :u32)) 1499 ((src :u32)1500 (val :u32)))1472 ((src :u32) 1473 (val :u32))) 1501 1474 (rlwimi dest val 0 0 0)) 1502 1475 … … 1509 1482 ; Actually, it'd be "unbox, then subtract from 30". 1510 1483 (define-ppc64-vinsn extract-variable-non-insane-bit (((dest :u32)) 1511 ((src :imm)1512 (bit :imm))1513 ((temp :u32)))1484 ((src :imm) 1485 (bit :imm)) 1486 ((temp :u32))) 1514 1487 (srwi temp bit ppc64::fixnumshift) 1515 1488 (subfic temp temp (- 32 ppc64::fixnumshift)) … … 1519 1492 1520 1493 (define-ppc64-vinsn %cdr (((dest :lisp)) 1521 ((src :lisp)))1522 (l wzdest ppc64::cons.cdr src))1494 ((src :lisp))) 1495 (ld dest ppc64::cons.cdr src)) 1523 1496 1524 1497 (define-ppc64-vinsn %car (((dest :lisp)) 1525 ((src :lisp)))1526 (l wzdest ppc64::cons.car src))1498 ((src :lisp))) 1499 (ld dest ppc64::cons.car src)) 1527 1500 1528 1501 (define-ppc64-vinsn %set-car (() 1529 ((cell :lisp)1530 (new :lisp)))1531 (st wnew ppc64::cons.car cell))1502 ((cell :lisp) 1503 (new :lisp))) 1504 (std new ppc64::cons.car cell)) 1532 1505 1533 1506 (define-ppc64-vinsn %set-cdr (() 1534 ((cell :lisp)1535 (new :lisp)))1536 (st wnew ppc64::cons.cdr cell))1507 ((cell :lisp) 1508 (new :lisp))) 1509 (std new ppc64::cons.cdr cell)) 1537 1510 1538 1511 (define-ppc64-vinsn load-adl (() 1539 ((n :u32const)))1512 ((n :u32const))) 1540 1513 (lis ppc::nargs (:apply ldb (byte 16 16) n)) 1541 1514 (ori ppc::nargs ppc::nargs (:apply ldb (byte 16 0) n))) 1542 1515 1543 1516 (define-ppc64-vinsn set-nargs (() 1544 ((n :s16const)))1517 ((n :s16const))) 1545 1518 (li ppc::nargs (:apply ash n ppc64::word-shift))) 1546 1519 1547 1520 (define-ppc64-vinsn scale-nargs (() 1548 ((nfixed :s16const)))1521 ((nfixed :s16const))) 1549 1522 ((:pred > nfixed 0) 1550 1523 (la ppc::nargs (:apply - (:apply ash nfixed ppc64::word-shift)) ppc::nargs))) … … 1555 1528 (() 1556 1529 ((reg :lisp))) 1557 (st wu reg -4ppc::vsp))1530 (stdu reg -8 ppc::vsp)) 1558 1531 1559 1532 (define-ppc64-vinsn (vpush-register-arg :push :node :vsp :outgoing-argument) 1560 1533 (() 1561 1534 ((reg :lisp))) 1562 (st wu reg -4ppc::vsp))1535 (stdu reg -8 ppc::vsp)) 1563 1536 1564 1537 (define-ppc64-vinsn (vpop-register :pop :node :vsp) 1565 1538 (((dest :lisp)) 1566 1539 ()) 1567 (l wzdest 0 ppc::vsp)1568 (la ppc::vsp 4ppc::vsp))1540 (ld dest 0 ppc::vsp) 1541 (la ppc::vsp ppc64::word-size-in-bytes ppc::vsp)) 1569 1542 1570 1543 1571 1544 (define-ppc64-vinsn copy-node-gpr (((dest :lisp)) 1572 ((src :lisp)))1545 ((src :lisp))) 1573 1546 ((:not (:pred = 1574 1547 (:apply %hard-regspec-value dest) … … 1577 1550 1578 1551 (define-ppc64-vinsn copy-gpr (((dest t)) 1579 ((src t)))1552 ((src t))) 1580 1553 ((:not (:pred = 1581 1554 (:apply %hard-regspec-value dest) … … 1584 1557 1585 1558 1586 (define-ppc64-vinsn copy-fpr (((dest t))1587 ((srct)))1559 (define-ppc64-vinsn copy-fpr (((dest :double-float)) 1560 ((src :double-float))) 1588 1561 ((:not (:pred = 1589 1562 (:apply %hard-regspec-value dest) … … 1592 1565 1593 1566 (define-ppc64-vinsn vcell-ref (((dest :lisp)) 1594 ((vcell :lisp)))1595 (l wzdest ppc64::misc-data-offset vcell))1567 ((vcell :lisp))) 1568 (ld dest ppc64::misc-data-offset vcell)) 1596 1569 1597 1570 (define-ppc64-vinsn vcell-set (() 1598 ((vcell :lisp)1599 (value :lisp)))1600 (st wvalue ppc64::misc-data-offset vcell))1571 ((vcell :lisp) 1572 (value :lisp))) 1573 (std value ppc64::misc-data-offset vcell)) 1601 1574 1602 1575 1603 1576 (define-ppc64-vinsn make-vcell (((dest :lisp)) 1604 ((closed (:lisp :ne dest)))1605 ((header :u32)))1577 ((closed (:lisp :ne dest))) 1578 ((header :u64))) 1606 1579 (li header ppc64::value-cell-header) 1607 1580 (la ppc::allocptr (- ppc64::fulltag-misc ppc64::value-cell.size) ppc::allocptr) 1608 (t wllt ppc::allocptr ppc::allocbase)1609 (st wheader ppc64::misc-header-offset ppc::allocptr)1581 (tdllt ppc::allocptr ppc::allocbase) 1582 (std header ppc64::misc-header-offset ppc::allocptr) 1610 1583 (mr dest ppc::allocptr) 1611 ( clrrwi ppc::allocptr ppc::allocptr ppc64::ntagbits)1612 (st wclosed ppc64::value-cell.value dest))1584 (rldicr ppc::allocptr ppc::allocptr 0 (- 63 ppc64::ntagbits)) 1585 (std closed ppc64::value-cell.value dest)) 1613 1586 1614 1587 (define-ppc64-vinsn make-tsp-vcell (((dest :lisp)) 1615 ((closed :lisp))1616 ((header :u32)))1588 ((closed :lisp)) 1589 ((header :u64))) 1617 1590 (li header ppc64::value-cell-header) 1618 (stwu ppc::tsp -16 ppc::tsp) 1619 (stw ppc::tsp 4 ppc::tsp) 1620 (stfd ppc::fp-zero 8 ppc::tsp) 1621 (stw ppc::rzero 4 ppc::tsp) 1622 (stw header (+ 8 ppc64::fulltag-misc ppc64::value-cell.header) ppc::tsp) 1623 (stw closed (+ 8 ppc64::fulltag-misc ppc64::value-cell.value) ppc::tsp) 1624 (la dest (+ 8 ppc64::fulltag-misc) ppc::tsp)) 1591 (stdu ppc::tsp -32 ppc::tsp) 1592 (std ppc::tsp 8 ppc::tsp) 1593 (stfd ppc::fp-zero 16 ppc::tsp) 1594 (stfd ppc::fp-zero 24 ppc::tsp) 1595 (std ppc::rzero 8 ppc::tsp) 1596 (std header (+ 16 ppc64::fulltag-misc ppc64::value-cell.header) ppc::tsp) 1597 (std closed (+ 16 ppc64::fulltag-misc ppc64::value-cell.value) ppc::tsp) 1598 (la dest (+ 16 ppc64::fulltag-misc) ppc::tsp)) 1625 1599 1626 1600 (define-ppc64-vinsn make-tsp-cons (((dest :lisp)) 1627 ((car :lisp) (cdr :lisp)) 1628 ()) 1629 (stwu ppc::tsp -16 ppc::tsp) 1630 (stw ppc::tsp 4 ppc::tsp) 1631 (stfd ppc::fp-zero 8 ppc::tsp) 1632 (stw ppc::rzero 4 ppc::tsp) 1633 (stw car (+ 8 ppc64::fulltag-cons ppc64::cons.car) ppc::tsp) 1634 (stw cdr (+ 8 ppc64::fulltag-cons ppc64::cons.cdr) ppc::tsp) 1635 (la dest (+ 8 ppc64::fulltag-cons) ppc::tsp)) 1601 ((car :lisp) (cdr :lisp)) 1602 ()) 1603 (stdu ppc::tsp -32 ppc::tsp) 1604 (std ppc::tsp 8 ppc::tsp) 1605 (stfd ppc::fp-zero 16 ppc::tsp) 1606 (stfd ppc::fp-zero 24 ppc::tsp) 1607 (std ppc::rzero 8 ppc::tsp) 1608 (std car (+ 16 ppc64::fulltag-cons ppc64::cons.car) ppc::tsp) 1609 (std cdr (+ 16 ppc64::fulltag-cons ppc64::cons.cdr) ppc::tsp) 1610 (la dest (+ 16 ppc64::fulltag-cons) ppc::tsp)) 1636 1611 1637 1612 1638 1613 (define-ppc64-vinsn %closure-code% (((dest :lisp)) 1639 ())1614 ()) 1640 1615 (lwz dest (+ ppc64::symbol.vcell (ppc64::nrs-offset %closure-code%) ppc64::nil-value) 0)) 1641 1616 1642 1617 1643 1618 (define-ppc64-vinsn (call-subprim :call :subprim-call) (() 1644 ((spno :s32const)))1619 ((spno :s32const))) 1645 1620 (bla spno)) 1646 1621 1647 1622 (define-ppc64-vinsn (jump-subprim :jumpLR) (() 1648 ((spno :s32const)))1623 ((spno :s32const))) 1649 1624 (ba spno)) 1650 1625 … … 1652 1627 ; track args, results, etc. 1653 1628 (define-ppc64-vinsn (call-subprim-0 :call :subprim-call) (((dest t)) 1654 ((spno :s32const)))1629 ((spno :s32const))) 1655 1630 (bla spno)) 1656 1631 1657 1632 (define-ppc64-vinsn (call-subprim-1 :call :subprim-call) (((dest t)) 1658 ((spno :s32const)1659 (z t)))1633 ((spno :s32const) 1634 (z t))) 1660 1635 (bla spno)) 1661 1636 1662 1637 (define-ppc64-vinsn (call-subprim-2 :call :subprim-call) (((dest t)) 1663 ((spno :s32const)1664 (y t)1665 (z t)))1638 ((spno :s32const) 1639 (y t) 1640 (z t))) 1666 1641 (bla spno)) 1667 1642 1668 1643 (define-ppc64-vinsn (call-subprim-3 :call :subprim-call) (((dest t)) 1669 ((spno :s32const)1670 (x t)1671 (y t)1672 (z t)))1644 ((spno :s32const) 1645 (x t) 1646 (y t) 1647 (z t))) 1673 1648 (bla spno)) 1674 1649 1675 1650 (define-ppc64-vinsn event-poll (() 1676 ())1651 ()) 1677 1652 (lwz ppc::nargs ppc64::tcr.interrupt-level ppc::rcontext) 1678 1653 (twgti ppc::nargs 0)) … … 1686 1661 1687 1662 (define-ppc64-vinsn (call-label :call) (() 1688 ((label :label)))1663 ((label :label))) 1689 1664 (bl label)) 1690 1665 … … 1692 1667 ; code is somehow reachable. 1693 1668 (define-ppc64-vinsn (non-barrier-jump :xref) (() 1694 ((label :label)))1669 ((label :label))) 1695 1670 (b label)) 1696 1671 1697 1672 1698 1673 (define-ppc64-vinsn (cbranch-true :branch) (() 1699 ((label :label)1700 (crf :crf)1701 (crbit :u8const)))1674 ((label :label) 1675 (crf :crf) 1676 (crbit :u8const))) 1702 1677 (bt (:apply + crf crbit) label)) 1703 1678 1704 1679 (define-ppc64-vinsn (cbranch-false :branch) (() 1705 ((label :label)1706 (crf :crf)1707 (crbit :u8const)))1680 ((label :label) 1681 (crf :crf) 1682 (crbit :u8const))) 1708 1683 (bf (:apply + crf crbit) label)) 1709 1684 1710 1685 (define-ppc64-vinsn check-trap-error (() 1711 ())1686 ()) 1712 1687 (beq+ 0 :no-error) 1713 1688 (uuo_interr arch::error-reg-regnum ppc::arg_z) … … 1716 1691 1717 1692 (define-ppc64-vinsn lisp-word-ref (((dest t)) 1718 ((base t)1719 (offset t)))1693 ((base t) 1694 (offset t))) 1720 1695 (lwzx dest base offset)) 1721 1696 1722 1697 (define-ppc64-vinsn lisp-word-ref-c (((dest t)) 1723 ((base t)1724 (offset :s16const)))1698 ((base t) 1699 (offset :s16const))) 1725 1700 (lwz dest offset base)) 1726 1701 … … 1729 1704 ;; Load an unsigned, 32-bit constant into a destination register. 1730 1705 (define-ppc64-vinsn (lwi :constant-ref) (((dest :imm)) 1731 ((intval :u32const))1732 ())1706 ((intval :u32const)) 1707 ()) 1733 1708 ((:or (:pred = (:apply ash intval -15) #x1ffff) 1734 1709 (:pred = (:apply ash intval -15) #x0)) … … 1746 1721 ; Exactly the same thing, but take a signed integer value 1747 1722 (define-ppc64-vinsn lwi-s32 (((dest :imm)) 1748 ((intval :s32const))1749 ())1723 ((intval :s32const)) 1724 ()) 1750 1725 ((:or (:pred = (:apply ash intval -15) -1) 1751 1726 (:pred = (:apply ash intval -15) #x0)) … … 1762 1737 1763 1738 (define-ppc64-vinsn discard-temp-frame (() 1764 ())1739 ()) 1765 1740 (lwz ppc::tsp 0 ppc::tsp)) 1766 1741 … … 1774 1749 ;;; (large chunks of which are unused). 1775 1750 (define-ppc64-vinsn alloc-c-frame (() 1776 ((n-c-args :u16const)))1751 ((n-c-args :u16const))) 1777 1752 ;; Always reserve space for at least 8 args and space for a lisp 1778 1753 ;; frame (for the kernel) underneath it. … … 1802 1777 1803 1778 (define-ppc64-vinsn alloc-eabi-c-frame (() 1804 ((n-c-args :u16const)))1779 ((n-c-args :u16const))) 1805 1780 ; Always reserve space for at least 8 args and space for a lisp 1806 1781 ; frame (for the kernel) underneath it. Store NIL inthe c-frame's … … 1827 1802 ; of each frame. 1828 1803 (define-ppc64-vinsn discard-c-frame (() 1829 ())1804 ()) 1830 1805 (lwz ppc::sp 0 ppc::sp)) 1831 1806 … … 1834 1809 1835 1810 (define-ppc64-vinsn set-c-arg (() 1836 ((argval :u32)1837 (argnum :u16const)))1811 ((argval :u32) 1812 (argnum :u16const))) 1838 1813 (stw argval (:apply + ppc64::c-frame.param0 (:apply ash argnum ppc64::word-shift)) ppc::sp)) 1839 1814 1840 1815 (define-ppc64-vinsn set-single-c-arg (() 1841 ((argval :single-float)1842 (argnum :u16const)))1816 ((argval :single-float) 1817 (argnum :u16const))) 1843 1818 (stfs argval (:apply + ppc64::c-frame.param0 (:apply ash argnum ppc64::word-shift)) ppc::sp)) 1844 1819 1845 1820 (define-ppc64-vinsn set-double-c-arg (() 1846 ((argval :double-float)1847 (argnum :u16const)))1821 ((argval :double-float) 1822 (argnum :u16const))) 1848 1823 (stfd argval (:apply + ppc64::c-frame.param0 (:apply ash argnum ppc64::word-shift)) ppc::sp)) 1849 1824 1850 1825 (define-ppc64-vinsn reload-single-c-arg (((argval :single-float)) 1851 ((argnum :u16const)))1826 ((argnum :u16const))) 1852 1827 (lfs argval (:apply + ppc64::c-frame.param0 (:apply ash argnum ppc64::word-shift)) ppc::sp)) 1853 1828 1854 1829 (define-ppc64-vinsn reload-double-c-arg (((argval :double-float)) 1855 ((argnum :u16const)))1830 ((argnum :u16const))) 1856 1831 (lfd argval (:apply + ppc64::c-frame.param0 (:apply ash argnum ppc64::word-shift)) ppc::sp)) 1857 1832 1858 1833 (define-ppc64-vinsn set-eabi-c-arg (() 1859 ((argval :u32)1860 (argnum :u16const)))1834 ((argval :u32) 1835 (argnum :u16const))) 1861 1836 (stw argval (:apply + ppc64::eabi-c-frame.param0 (:apply ash argnum ppc64::word-shift)) ppc::sp)) 1862 1837 1863 1838 (define-ppc64-vinsn set-single-eabi-c-arg (() 1864 ((argval :single-float)1865 (argnum :u16const)))1839 ((argval :single-float) 1840 (argnum :u16const))) 1866 1841 (stfs argval (:apply + ppc64::eabi-c-frame.param0 (:apply ash argnum ppc64::word-shift)) ppc::sp)) 1867 1842 1868 1843 (define-ppc64-vinsn set-double-eabi-c-arg (() 1869 ((argval :double-float)1870 (argnum :u16const)))1844 ((argval :double-float) 1845 (argnum :u16const))) 1871 1846 (stfd argval (:apply + ppc64::eabi-c-frame.param0 (:apply ash argnum ppc64::word-shift)) ppc::sp)) 1872 1847 1873 1848 (define-ppc64-vinsn reload-single-eabi-c-arg (((argval :single-float)) 1874 ((argnum :u16const)))1849 ((argnum :u16const))) 1875 1850 (lfs argval (:apply + ppc64::eabi-c-frame.param0 (:apply ash argnum ppc64::word-shift)) ppc::sp)) 1876 1851 1877 1852 (define-ppc64-vinsn reload-double-eabi-c-arg (((argval :double-float)) 1878 ((argnum :u16const)))1853 ((argnum :u16const))) 1879 1854 (lfd argval (:apply + ppc64::eabi-c-frame.param0 (:apply ash argnum ppc64::word-shift)) ppc::sp)) 1880 1855 1881 1856 (define-ppc64-vinsn (load-nil :constant-ref) (((dest t)) 1882 ())1857 ()) 1883 1858 (li dest ppc64::nil-value)) 1884 1859 1860 1861 #+not-yet 1885 1862 (define-ppc64-vinsn (load-t :constant-ref) (((dest t)) 1886 ())1863 ()) 1887 1864 (li dest (+ ppc64::t-offset ppc64::nil-value))) 1888 1865 1889 1866 (define-ppc64-vinsn set-eq-bit (((dest :crf)) 1890 ())1867 ()) 1891 1868 (creqv (:apply + ppc::ppc-eq-bit dest) 1892 1869 (:apply + ppc::ppc-eq-bit dest) … … 1894 1871 1895 1872 (define-ppc64-vinsn (ref-constant :constant-ref) (((dest :lisp)) 1896 ((src :s16const)))1897 (l wz dest (:apply + ppc64::misc-data-offset (:apply ash (:apply 1+ src) 2)) ppc::fn))1873 ((src :s16const))) 1874 (ld dest (:apply + ppc64::misc-data-offset (:apply ash (:apply 1+ src) 3)) ppc::fn)) 1898 1875 1899 1876 (define-ppc64-vinsn ref-indexed-constant (((dest :lisp)) 1900 ((idxreg :s32)))1901 (l wzx dest ppc::fn idxreg))1877 ((idxreg :s32))) 1878 (ldx dest ppc::fn idxreg)) 1902 1879 1903 1880 1904 1881 (define-ppc64-vinsn cons (((dest :lisp)) 1905 ((newcar :lisp)1906 (newcdr :lisp)))1882 ((newcar :lisp) 1883 (newcdr :lisp))) 1907 1884 (la ppc::allocptr (- ppc64::fulltag-cons ppc64::cons.size) ppc::allocptr) 1908 (t wllt ppc::allocptr ppc::allocbase)1909 (st wnewcdr ppc64::cons.cdr ppc::allocptr)1910 (st wnewcar ppc64::cons.car ppc::allocptr)1885 (tdllt ppc::allocptr ppc::allocbase) 1886 (std newcdr ppc64::cons.cdr ppc::allocptr) 1887 (std newcar ppc64::cons.car ppc::allocptr) 1911 1888 (mr dest ppc::allocptr) 1912 ( clrrwi ppc::allocptr ppc::allocptr ppc64::ntagbits))1889 (rldicr ppc::allocptr ppc::allocptr 0 (- 63 ppc64::ntagbits))) 1913 1890 1914 1891 … … 1916 1893 ;; subtag had better be a PPC-NODE-SUBTAG of some sort! 1917 1894 (define-ppc64-vinsn %ppc-gvector (((dest :lisp)) 1918 ((Rheader :u32)1919 (nbytes :u32const))1920 ((immtemp0 :u32)1921 (nodetemp :lisp)1922 (crf :crf)))1895 ((Rheader :u32) 1896 (nbytes :u32const)) 1897 ((immtemp0 :u32) 1898 (nodetemp :lisp) 1899 (crf :crf))) 1923 1900 (la ppc::allocptr (:apply - ppc64::fulltag-misc 1924 1901 (:apply logand (lognot 7) … … 1928 1905 (stw Rheader ppc64::misc-header-offset ppc::allocptr) 1929 1906 (mr dest ppc::allocptr) 1930 ( clrrwi ppc::allocptr ppc::allocptr ppc64::ntagbits)1907 (rldicr ppc::allocptr ppc::allocptr 0 (- 63 ppc64::ntagbits)) 1931 1908 ((:not (:pred = nbytes 0)) 1932 1909 (li immtemp0 (:apply + ppc64::misc-data-offset nbytes)) … … 1941 1918 ;; allocate a small (phys size <= 32K bytes) misc obj of known size/subtag 1942 1919 (define-ppc64-vinsn %alloc-misc-fixed (((dest :lisp)) 1943 ((Rheader :u32)1944 (nbytes :u32const)))1920 ((Rheader :u64) 1921 (nbytes :u32const))) 1945 1922 (la ppc::allocptr (:apply - ppc64::fulltag-misc 1946 (:apply logand (lognot 7)1947 (:apply + (+ 7 4) nbytes)))1923 (:apply logand (lognot 15) 1924 (:apply + (+ 15 8) nbytes))) 1948 1925 ppc::allocptr) 1949 (t wllt ppc::allocptr ppc::allocbase)1950 (st wRheader ppc64::misc-header-offset ppc::allocptr)1926 (tdllt ppc::allocptr ppc::allocbase) 1927 (std Rheader ppc64::misc-header-offset ppc::allocptr) 1951 1928 (mr dest ppc::allocptr) 1952 ( clrrwi ppc::allocptr ppc::allocptr ppc64::ntagbits))1929 (rldicr ppc::allocptr ppc::allocptr 0 (- 63 ppc64::ntagbits))) 1953 1930 1954 1931 (define-ppc64-vinsn vstack-discard (() 1955 ((nwords :u32const)))1932 ((nwords :u32const))) 1956 1933 ((:not (:pred = nwords 0)) 1957 1934 (la ppc::vsp (:apply ash nwords ppc64::word-shift) ppc::vsp))) … … 1959 1936 1960 1937 (define-ppc64-vinsn lcell-load (((dest :lisp)) 1961 ((cell :lcell)1962 (top :lcell)))1963 (l wzdest (:apply -1964 (:apply - (:apply calc-lcell-depth top) 4)1965 (:apply calc-lcell-offset cell)) ppc::vsp))1938 ((cell :lcell) 1939 (top :lcell))) 1940 (ld dest (:apply - 1941 (:apply - (:apply calc-lcell-depth top) ppc64::word-size-in-bytes) 1942 (:apply calc-lcell-offset cell)) ppc::vsp)) 1966 1943 1967 1944 (define-ppc64-vinsn vframe-load (((dest :lisp)) 1968 ((frame-offset :u16const)1969 (cur-vsp :u16const)))1970 (l wz dest (:apply - (:apply - cur-vsp 4) frame-offset) ppc::vsp))1945 ((frame-offset :u16const) 1946 (cur-vsp :u16const))) 1947 (ld dest (:apply - (:apply - cur-vsp ppc64::word-size-in-bytes) frame-offset) ppc::vsp)) 1971 1948 1972 1949 (define-ppc64-vinsn lcell-store (() 1973 ((src :lisp)1974 (cell :lcell)1975 (top :lcell)))1950 ((src :lisp) 1951 (cell :lcell) 1952 (top :lcell))) 1976 1953 (stw src (:apply - 1977 1954 (:apply - (:apply calc-lcell-depth top) 4) … … 1979 1956 1980 1957 (define-ppc64-vinsn vframe-store (() 1981 ((src :lisp)1982 (frame-offset :u16const)1983 (cur-vsp :u16const)))1984 (st w src (:apply - (:apply - cur-vsp 4) frame-offset) ppc::vsp))1958 ((src :lisp) 1959 (frame-offset :u16const) 1960 (cur-vsp :u16const))) 1961 (std src (:apply - (:apply - cur-vsp 8) frame-offset) ppc::vsp)) 1985 1962 1986 1963 (define-ppc64-vinsn load-vframe-address (((dest :imm)) 1987 ((offset :s16const)))1964 ((offset :s16const))) 1988 1965 (la dest offset ppc::vsp)) 1989 1966 1990 1967 (define-ppc64-vinsn copy-lexpr-argument (() 1991 ()1992 ((temp :lisp)))1993 (l wzx temp ppc::vsp ppc::nargs)1994 (st wu temp -4ppc::vsp))1968 () 1969 ((temp :lisp))) 1970 (ldx temp ppc::vsp ppc::nargs) 1971 (stdu temp -8 ppc::vsp)) 1995 1972 1996 1973 ; Boxing/unboxing of integers. … … 1998 1975 ; Treat the low 8 bits of VAL as an unsigned integer; set RESULT to the equivalent fixnum. 1999 1976 (define-ppc64-vinsn u8->fixnum (((result :imm)) 2000 ((val :u8))2001 ())1977 ((val :u8)) 1978 ()) 2002 1979 (rlwinm result val ppc64::fixnumshift (- ppc64::nbits-in-word (+ 8 ppc64::fixnumshift)) (- ppc64::least-significant-bit ppc64::fixnumshift))) 2003 1980 2004 1981 ; Treat the low 8 bits of VAL as a signed integer; set RESULT to the equivalent fixnum. 2005 1982 (define-ppc64-vinsn s8->fixnum (((result :imm)) 2006 ((val :s8))2007 ())1983 ((val :s8)) 1984 ()) 2008 1985 (extlwi result val 8 (- ppc64::nbits-in-word 8)) 2009 1986 (srawi result result (- (- ppc64::nbits-in-word 8) ppc64::fixnumshift))) … … 2012 1989 ; Treat the low 16 bits of VAL as an unsigned integer; set RESULT to the equivalent fixnum. 2013 1990 (define-ppc64-vinsn u16->fixnum (((result :imm)) 2014 ((val :u16))2015 ())1991 ((val :u16)) 1992 ()) 2016 1993 (rlwinm result val ppc64::fixnumshift (- ppc64::nbits-in-word (+ 16 ppc64::fixnumshift)) (- ppc64::least-significant-bit ppc64::fixnumshift))) 2017 1994 2018 1995 ; Treat the low 16 bits of VAL as a signed integer; set RESULT to the equivalent fixnum. 2019 1996 (define-ppc64-vinsn s16->fixnum (((result :imm)) 2020 ((val :s16))2021 ())1997 ((val :s16)) 1998 ()) 2022 1999 (extlwi result val 16 (- ppc64::nbits-in-word 16)) 2023 2000 (srawi result result (- (- ppc64::nbits-in-word 16) ppc64::fixnumshift))) 2024 2001 2025 2002 (define-ppc64-vinsn fixnum->s16 (((result :s16)) 2026 ((src :imm)))2003 ((src :imm))) 2027 2004 (srawi result src ppc64::fixnumshift)) 2028 2005 2029 ; A signed 32-bit untagged value can be at worst a 1-digit bignum.2006 ; A signed 64-bit untagged value can be at worst a 1-digit bignum. 2030 2007 ; There should be something very much like this that takes a stack-consed 2031 2008 ; bignum result ... 2032 (define-ppc64-vinsn s 32->integer (((result :lisp))2033 ((src :s32))2034 ((crf (:crf 0)) ; a casualty2035 (temp :s32)))2009 (define-ppc64-vinsn s64->integer (((result :lisp)) 2010 ((src :s64)) 2011 ((crf (:crf 0)) ; a casualty 2012 (temp :s64))) 2036 2013 (addo temp src src) 2014 (addo temp temp temp) 2037 2015 (addo. result temp temp) 2038 2016 (bns+ :done) 2039 2017 (mtxer ppc::rzero) 2040 2018 (li temp ppc64::one-digit-bignum-header) 2041 (la ppc::allocptr (- ppc64::fulltag-misc 8) ppc::allocptr)2042 (t wllt ppc::allocptr ppc::allocbase)2043 (st wtemp ppc64::misc-header-offset ppc::allocptr)2019 (la ppc::allocptr (- ppc64::fulltag-misc 16) ppc::allocptr) 2020 (tdllt ppc::allocptr ppc::allocbase) 2021 (std temp ppc64::misc-header-offset ppc::allocptr) 2044 2022 (mr result ppc::allocptr) 2045 ( clrrwi ppc::allocptr ppc::allocptr ppc64::ntagbits)2046 (st wsrc ppc64::misc-data-offset result)2023 (rldicr ppc::allocptr ppc::allocptr 0 (- 63 ppc64::ntagbits)) 2024 (std src ppc64::misc-data-offset result) 2047 2025 :done) 2048 2026 … … 2050 2028 ; An unsigned 32-bit untagged value can be either a 1 or a 2-digit bignum. 2051 2029 (define-ppc64-vinsn u32->integer (((result :lisp)) 2052 ((src :u32))2053 ((crf (:crf 0)) ; a casualty2054 (temp :s32)2055 (size :u32)))2056 ( clrrwi. temp src (- ppc64::least-significant-bit ppc64::nfixnumtagbits))2057 (sl wi result src ppc64::fixnumshift)2030 ((src :u32)) 2031 ((crf (:crf 0)) ; a casualty 2032 (temp :s32) 2033 (size :u32))) 2034 (rldicr. temp src 0 ppc64::nfixnumtagbits) 2035 (sldi result src ppc64::fixnumshift) 2058 2036 (beq+ crf :done) 2059 (cmp wi src 0)2037 (cmpdi src 0) 2060 2038 (li temp ppc64::one-digit-bignum-header) 2061 (li size (- 8ppc64::fulltag-misc))2039 (li size (- 16 ppc64::fulltag-misc)) 2062 2040 (bgt :common) 2063 2041 (li temp ppc64::two-digit-bignum-header) 2064 (li size (- 16ppc64::fulltag-misc))2042 (li size (- 24 ppc64::fulltag-misc)) 2065 2043 :common 2066 2044 (sub ppc::allocptr ppc::allocptr size) 2067 (t wllt ppc::allocptr ppc::allocbase)2068 (st wtemp ppc64::misc-header-offset ppc::allocptr)2045 (tdllt ppc::allocptr ppc::allocbase) 2046 (std temp ppc64::misc-header-offset ppc::allocptr) 2069 2047 (mr result ppc::allocptr) 2070 ( clrrwi ppc::allocptr ppc::allocptr ppc64::ntagbits)2071 (st wsrc ppc64::misc-data-offset result)2048 (rldicr ppc::allocptr ppc::allocptr 0 (- 63 ppc64::ntagbits)) 2049 (std src ppc64::misc-data-offset result) 2072 2050 :done) 2073 2051 2074 2052 (define-ppc64-vinsn u16->u32 (((dest :u32)) 2075 ((src :u16)))2053 ((src :u16))) 2076 2054 (clrlwi dest src 16)) 2077 2055 2078 2056 (define-ppc64-vinsn u8->u32 (((dest :u32)) 2079 ((src :u8)))2057 ((src :u8))) 2080 2058 (clrlwi dest src 24)) 2081 2059 2082 2060 2083 2061 (define-ppc64-vinsn s16->s32 (((dest :s32)) 2084 ((src :s16)))2062 ((src :s16))) 2085 2063 (extsh dest src)) 2086 2064 2087 2065 (define-ppc64-vinsn s8->s32 (((dest :s32)) 2088 ((src :s8)))2066 ((src :s8))) 2089 2067 (extsb dest src)) 2090 2068 … … 2095 2073 ; this blindly. 2096 2074 (define-ppc64-vinsn double->heap (((result :lisp)) ; tagged as a double-float 2097 ((fpreg :double-float))2098 ((header-temp :u32)))2075 ((fpreg :double-float)) 2076 ((header-temp :u32))) 2099 2077 (li header-temp (arch::make-vheader ppc64::double-float.element-count ppc64::subtag-double-float)) 2100 2078 (la ppc::allocptr (- ppc64::fulltag-misc ppc64::double-float.size) ppc::allocptr) 2101 (t wllt ppc::allocptr ppc::allocbase)2102 (st wheader-temp ppc64::misc-header-offset ppc::allocptr)2079 (tdllt ppc::allocptr ppc::allocbase) 2080 (std header-temp ppc64::misc-header-offset ppc::allocptr) 2103 2081 (mr result ppc::allocptr) 2104 ( clrrwi ppc::allocptr ppc::allocptr ppc64::ntagbits)2082 (rldicr ppc::allocptr ppc::allocptr 0 (- 63 ppc64::ntagbits)) 2105 2083 (stfd fpreg ppc64::double-float.value result) ) 2106 2084 2107 2085 2108 ; This is about as bad as heap-consing a double-float. (In terms of verbosity). 2109 ; Wouldn't kill us to do either/both out-of-line, but need to make visible to 2110 ; compiler so unnecessary heap-consing can be elided. 2111 (define-ppc64-vinsn single->heap (((result :lisp)) ; tagged as a single-float 2112 ((fpreg :single-float)) 2113 ((header-temp :u32))) 2114 (li header-temp (arch::make-vheader ppc64::single-float.element-count ppc64::subtag-single-float)) 2115 (la ppc::allocptr (- ppc64::fulltag-misc ppc64::single-float.size) ppc::allocptr) 2116 (twllt ppc::allocptr ppc::allocbase) 2117 (stw header-temp ppc64::misc-header-offset ppc::allocptr) 2118 (mr result ppc::allocptr) 2119 (clrrwi ppc::allocptr ppc::allocptr ppc64::ntagbits) 2120 (stfs fpreg ppc64::single-float.value result)) 2086 (define-ppc64-vinsn single->node (((result :lisp)) ; tagged as a single-float 2087 ((fpreg :single-float))) 2088 (stfs fpreg ppc64::tcr.single-float-convert ppc::rcontext) 2089 (ld result ppc64::tcr.single-float-convert ppc::rcontext)) 2121 2090 2122 2091 2123 2092 ; "dest" is preallocated, presumably on a stack somewhere. 2124 2093 (define-ppc64-vinsn store-double (() 2125 ((dest :lisp)2126 (source :double-float))2127 ())2094 ((dest :lisp) 2095 (source :double-float)) 2096 ()) 2128 2097 (stfd source ppc64::double-float.value dest)) 2129 2098 2130 2099 (define-ppc64-vinsn get-double (((target :double-float)) 2131 ((source :lisp))2132 ())2100 ((source :lisp)) 2101 ()) 2133 2102 (lfd target ppc64::double-float.value source)) 2134 2103 … … 2138 2107 2139 2108 (define-ppc64-vinsn get-double? (((target :double-float)) 2140 ((source :lisp))2141 ((tag :u8)2142 (crf :crf)))2143 (clrl wi tag source (- ppc64::nbits-in-word ppc64::nlisptagbits))2144 (cmp wi crf tag ppc64::tag-misc)2109 ((source :lisp)) 2110 ((tag :u8) 2111 (crf :crf))) 2112 (clrldi tag source (- ppc64::nbits-in-word ppc64::ntagbits)) 2113 (cmpdi crf tag ppc64::fulltag-misc) 2145 2114 (bne crf :do-trap) 2146 2115 (lbz tag ppc64::misc-subtag-offset source) 2147 2116 :do-trap 2148 (t wnei tag ppc64::subtag-double-float)2117 (tdnei tag ppc64::subtag-double-float) 2149 2118 (lfd target ppc64::double-float.value source)) 2150 2119 2151 2120 2152 2121 (define-ppc64-vinsn store-single (() 2153 ((dest :lisp) 2154 (source :single-float)) 2155 ()) 2156 (stfs source ppc64::single-float.value dest)) 2122 ((dest :lisp) 2123 (source :single-float)) 2124 ()) 2125 (stfs source ppc64::tcr.single-float-convert ppc::rcontext) 2126 (ld dest ppc64::tcr.single-float-convert ppc::rcontext)) 2157 2127 2158 2128 (define-ppc64-vinsn get-single (((target :single-float)) 2159 ((source :lisp))2160 ())2161 (lfs target ppc64:: single-float.value source))2129 ((source :lisp))) 2130 (std source ppc64::tcr.single-float-convert ppc::rcontext) 2131 (lfs target ppc64::tcr.single-float-convert ppc::rcontext)) 2162 2132 2163 2133 ; ... of characters ... 2164 2134 (define-ppc64-vinsn charcode->u16 (((dest :u16)) 2165 ((src :imm))2166 ())2135 ((src :imm)) 2136 ()) 2167 2137 (srwi dest src ppc64::charcode-shift)) 2168 2138 2169 2139 (define-ppc64-vinsn character->fixnum (((dest :lisp)) 2170 ((src :lisp))2171 ())2140 ((src :lisp)) 2141 ()) 2172 2142 (rlwinm dest 2173 2143 src … … 2177 2147 2178 2148 (define-ppc64-vinsn character->code (((dest :u32)) 2179 ((src :lisp)))2149 ((src :lisp))) 2180 2150 (rlwinm dest src ppc64::charcode-shift ppc64::charcode-shift ppc64::least-significant-bit)) 2181 2151 2182 2152 (define-ppc64-vinsn charcode->fixnum (((dest :lisp)) 2183 ((src :imm))2184 ())2153 ((src :imm)) 2154 ()) 2185 2155 (rlwinm dest 2186 2156 src … … 2190 2160 2191 2161 (define-ppc64-vinsn fixnum->char (((dest :lisp)) 2192 ((src :imm))2193 ())2162 ((src :imm)) 2163 ()) 2194 2164 (rlwinm dest src (- ppc64::charcode-shift ppc64::fixnumshift) 8 (1- ppc64::charcode-shift)) 2195 2165 (addi dest dest ppc64::subtag-character)) 2196 2166 2197 2167 (define-ppc64-vinsn u8->char (((dest :lisp)) 2198 ((src :u8))2199 ())2168 ((src :u8)) 2169 ()) 2200 2170 (rlwinm dest src ppc64::charcode-shift 8 (1- ppc64::charcode-shift)) 2201 2171 (addi dest dest ppc64::subtag-character)) … … 2204 2174 2205 2175 (define-ppc64-vinsn deref-macptr (((addr :address)) 2206 ((src :lisp))2207 ())2208 (l wzaddr ppc64::macptr.address src))2176 ((src :lisp)) 2177 ()) 2178 (ld addr ppc64::macptr.address src)) 2209 2179 2210 2180 (define-ppc64-vinsn set-macptr-address (() 2211 ((addr :address)2212 (src :lisp))2213 ())2214 (st waddr ppc64::macptr.address src))2181 ((addr :address) 2182 (src :lisp)) 2183 ()) 2184 (std addr ppc64::macptr.address src)) 2215 2185 2216 2186 2217 2187 (define-ppc64-vinsn macptr->heap (((dest :lisp)) 2218 ((address :address))2219 ((header :u32)))2188 ((address :address)) 2189 ((header :u64))) 2220 2190 (li header (logior (ash ppc64::macptr.element-count ppc64::num-subtag-bits) ppc64::subtag-macptr)) 2221 2191 (la ppc::allocptr (- ppc64::fulltag-misc ppc64::macptr.size) ppc::allocptr) 2222 (t wllt ppc::allocptr ppc::allocbase)2223 (st wheader ppc64::misc-header-offset ppc::allocptr)2192 (tdllt ppc::allocptr ppc::allocbase) 2193 (std header ppc64::misc-header-offset ppc::allocptr) 2224 2194 (mr dest ppc::allocptr) 2225 ( clrrwi ppc::allocptr ppc::allocptr ppc64::ntagbits)2195 (rldicr ppc::allocptr ppc::allocptr 0 (- 63 ppc64::ntagbits)) 2226 2196 ;; It's not necessary to zero out the domain/type fields, since newly 2227 2197 ;; heap-allocated memory's guaranteed to be 0-filled. 2228 (st waddress ppc64::macptr.address dest))2198 (std address ppc64::macptr.address dest)) 2229 2199 2230 2200 (define-ppc64-vinsn macptr->stack (((dest :lisp)) 2231 ((address :address))2232 ((header :u32)))2201 ((address :address)) 2202 ((header :u64))) 2233 2203 (li header ppc64::macptr-header) 2234 (st wu ppc::tsp (- (+ 8ppc64::macptr.size)) ppc::tsp)2235 (st w ppc::tsp 4ppc::tsp)2236 (st w header (+ 8ppc64::fulltag-misc ppc64::macptr.header) ppc::tsp)2237 (st w address (+ 8ppc64::fulltag-misc ppc64::macptr.address) ppc::tsp)2204 (stdu ppc::tsp (- (+ 16 ppc64::macptr.size)) ppc::tsp) 2205 (std ppc::tsp 8 ppc::tsp) 2206 (std header (+ 16 ppc64::fulltag-misc ppc64::macptr.header) ppc::tsp) 2207 (std address (+ 16 ppc64::fulltag-misc ppc64::macptr.address) ppc::tsp) 2238 2208 ;; It -is- necessary to zero out the domain/type fields here, since 2239 2209 ;; stack-allocated memory isn't guaranteed to be 0-filled. 2240 (stfd ppc::fp-zero (+ 8 ppc64::fulltag-misc ppc64::macptr.domain) ppc::tsp) 2241 (la dest (+ 8 ppc64::fulltag-misc) ppc::tsp)) 2210 (std ppc::rzero (+ 16 ppc64::fulltag-misc ppc64::macptr.domain) ppc::tsp) 2211 (std ppc::rzero (+ 16 ppc64::fulltag-misc ppc64::macptr.type) ppc::tsp) 2212 (la dest (+ 16 ppc64::fulltag-misc) ppc::tsp)) 2242 2213 2243 2214 2244 2215 (define-ppc64-vinsn adjust-stack-register (() 2245 ((reg t)2246 (amount :s16const)))2216 ((reg t) 2217 (amount :s16const))) 2247 2218 (la reg amount reg)) 2248 2219 2249 2220 (define-ppc64-vinsn adjust-vsp (() 2250 ((amount :s16const)))2221 ((amount :s16const))) 2251 2222 (la ppc::vsp amount ppc::vsp)) 2252 2223 2253 2224 ;; Arithmetic on fixnums & unboxed numbers 2254 2225 2255 (define-ppc64-vinsn u 32-lognot (((dest :u32))2256 ((src :u32))2257 ())2226 (define-ppc64-vinsn u64-lognot (((dest :u64)) 2227 ((src :u64)) 2228 ()) 2258 2229 (not dest src)) 2259 2230 2260 2231 (define-ppc64-vinsn fixnum-lognot (((dest :imm)) 2261 ((src :imm))2262 ((temp :u32)))2232 ((src :imm)) 2233 ((temp :u64))) 2263 2234 (not temp src) 2264 ( clrrwi dest temp ppc64::nfixnumtagbits))2235 (rldicr dest temp 0 (- 63 ppc64::nfixnumtagbits))) 2265 2236 2266 2237 2267 2238 (define-ppc64-vinsn negate-fixnum-overflow-inline (((dest :lisp)) 2268 ((src :imm))2269 ((unboxed :s32)2270 (header :u32)))2239 ((src :imm)) 2240 ((unboxed :s32) 2241 (header :u32))) 2271 2242 (nego. dest src) 2272 2243 (bns+ :done) … … 2284 2255 2285 2256 (define-ppc64-vinsn negate-fixnum-overflow-ool (() 2286 ((src :imm))2287 )2257 ((src :imm)) 2258 ) 2288 2259 (nego. ppc::arg_z src) 2289 2260 (bsola- .SPfix-overflow) … … 2293 2264 2294 2265 (define-ppc64-vinsn negate-fixnum-no-ovf (((dest :lisp)) 2295 ((src :imm)))2266 ((src :imm))) 2296 2267 2297 2268 (neg dest src)) … … 2299 2270 2300 2271 (define-ppc64-vinsn logior-high (((dest :imm)) 2301 ((src :imm)2302 (high :u16const)))2272 ((src :imm) 2273 (high :u16const))) 2303 2274 (oris dest src high)) 2304 2275 2305 2276 (define-ppc64-vinsn logior-low (((dest :imm)) 2306 ((src :imm)2307 (low :u16const)))2277 ((src :imm) 2278 (low :u16const))) 2308 2279 (ori dest src low)) 2309 2280 … … 2311 2282 2312 2283 (define-ppc64-vinsn %logior2 (((dest :imm)) 2313 ((x :imm)2314 (y :imm))2315 ())2284 ((x :imm) 2285 (y :imm)) 2286 ()) 2316 2287 (or dest x y)) 2317 2288 2318 2289 (define-ppc64-vinsn logand-high (((dest :imm)) 2319 ((src :imm)2320 (high :u16const))2321 ((crf0 (:crf 0))))2290 ((src :imm) 2291 (high :u16const)) 2292 ((crf0 (:crf 0)))) 2322 2293 (andis. dest src high)) 2323 2294 2324 2295 (define-ppc64-vinsn logand-low (((dest :imm)) 2325 ((src :imm)2326 (low :u16const))2327 ((crf0 (:crf 0))))2296 ((src :imm) 2297 (low :u16const)) 2298 ((crf0 (:crf 0)))) 2328 2299 (andi. dest src low)) 2329 2300 2330 2301 2331 2302 (define-ppc64-vinsn %logand2 (((dest :imm)) 2332 ((x :imm)2333 (y :imm))2334 ())2303 ((x :imm) 2304 (y :imm)) 2305 ()) 2335 2306 (and dest x y)) 2336 2307 2337 2308 (define-ppc64-vinsn logxor-high (((dest :imm)) 2338 ((src :imm)2339 (high :u16const)))2309 ((src :imm) 2310 (high :u16const))) 2340 2311 (xoris dest src high)) 2341 2312 2342 2313 (define-ppc64-vinsn logxor-low (((dest :imm)) 2343 ((src :imm)2344 (low :u16const)))2314 ((src :imm) 2315 (low :u16const))) 2345 2316 (xori dest src low)) 2346 2317 … … 2348 2319 2349 2320 (define-ppc64-vinsn %logxor2 (((dest :imm)) 2350 ((x :imm)2351 (y :imm))2352 ())2321 ((x :imm) 2322 (y :imm)) 2323 ()) 2353 2324 (xor dest x y)) 2354 2325 2355 2326 (define-ppc64-vinsn %ilsl (((dest :imm)) 2356 ((count :imm)2357 (src :imm))2358 ((temp :u32)2359 (crx :crf)))2360 (cmp wi crx count (ash 31 ppc64::fixnumshift))2361 (sr wi temp count ppc64::fixnumshift)2362 (sl wdest src temp)2327 ((count :imm) 2328 (src :imm)) 2329 ((temp :u32) 2330 (crx :crf))) 2331 (cmpdi crx count (ash 31 ppc64::fixnumshift)) 2332 (srdi temp count ppc64::fixnumshift) 2333 (sld dest src temp) 2363 2334 (ble+ crx :foo) 2364 2335 (li dest 0) … … 2366 2337 2367 2338 (define-ppc64-vinsn %ilsl-c (((dest :imm)) 2368 ((count :u8const)2369 (src :imm)))2370 ; Hard to use ppcmacroinstructions that expand into expressions involving variables.2371 (rl winm dest src count 0(:apply - ppc64::least-significant-bit count)))2339 ((count :u8const) 2340 (src :imm))) 2341 ;; Hard to use ppcmacroinstructions that expand into expressions involving variables. 2342 (rldicr dest src count (:apply - ppc64::least-significant-bit count))) 2372 2343 2373 2344 2374 2345 (define-ppc64-vinsn %ilsr-c (((dest :imm)) 2375 ((count :u8const)2376 (src :imm)))2346 ((count :u8const) 2347 (src :imm))) 2377 2348 (rlwinm dest src (:apply - ppc64::nbits-in-word count) count (- ppc64::least-significant-bit 2378 ppc64::fixnumshift)))2349 ppc64::fixnumshift))) 2379 2350 2380 2351 … … 2385 2356 2386 2357 (define-ppc64-vinsn %iasr (((dest :imm)) 2387 ((count :imm)2388 (src :imm))2389 ((temp :s32)2390 (crx :crf)))2391 (cmp wi crx count (ash 31ppc64::fixnumshift))2392 (sra wi temp count ppc64::fixnumshift)2393 (sra wtemp src temp)2358 ((count :imm) 2359 (src :imm)) 2360 ((temp :s32) 2361 (crx :crf))) 2362 (cmpdi crx count (ash 63 ppc64::fixnumshift)) 2363 (sradi temp count ppc64::fixnumshift) 2364 (srad temp src temp) 2394 2365 (ble+ crx :foo) 2395 (sra wi temp src 31)2366 (sradi temp src 63) 2396 2367 :foo 2397 ( clrrwi dest temp ppc64::fixnumshift))2368 (rldicr dest temp 0 (- 63 ppc64::fixnumshift))) 2398 2369 2399 2370 (define-ppc64-vinsn %iasr-c (((dest :imm)) 2400 ((count :u8const)2401 (src :imm))2402 ((temp :s32)))2403 (sra wi temp src count)2404 ( clrrwi dest temp ppc64::fixnumshift))2371 ((count :u8const) 2372 (src :imm)) 2373 ((temp :s32))) 2374 (sradi temp src count) 2375 (rldicr dest temp 0 (- 63 ppc64::fixnumshift))) 2405 2376 2406 2377 (define-ppc64-vinsn %ilsr (((dest :imm)) 2407 ((count :imm)2408 (src :imm))2409 ((temp :s32)2410 (crx :crf)))2411 (cmp wi crx count (ash 31ppc64::fixnumshift))2412 (sr wi temp count ppc64::fixnumshift)2413 (sr wtemp src temp)2414 ( clrrwi dest temp ppc64::fixnumshift)2378 ((count :imm) 2379 (src :imm)) 2380 ((temp :s32) 2381 (crx :crf))) 2382 (cmpdi crx count (ash 63 ppc64::fixnumshift)) 2383 (srdi temp count ppc64::fixnumshift) 2384 (srd temp src temp) 2385 (rldicr dest temp 0 (- 63 ppc64::fixnumshift)) 2415 2386 (ble+ crx :foo) 2416 2387 (li dest 0) … … 2419 2390 2420 2391 (define-ppc64-vinsn %ilsr-c (((dest :imm)) 2421 ((count :u8const)2422 (src :imm))2423 ((temp :s32)))2392 ((count :u8const) 2393 (src :imm)) 2394 ((temp :s32))) 2424 2395 (rlwinm temp src (:apply - 32 count) count 31) 2425 ( clrrwi dest temp ppc64::fixnumshift))2396 (rldicr dest temp 0 (- 63 ppc64::fixnumshift))) 2426 2397 2427 2398 (define-ppc64-vinsn u32-shift-left (((dest :u32)) 2428 ((src :u32)2429 (count :u8const)))2399 ((src :u32) 2400 (count :u8const))) 2430 2401 (rlwinm dest src count 0 (:apply - 31 count))) 2431 2402 2432 2403 (define-ppc64-vinsn u32-shift-right (((dest :u32)) 2433 ((src :u32)2434 (count :u8const)))2404 ((src :u32) 2405 (count :u8const))) 2435 2406 (rlwinm dest src (:apply - 32 count) count 31)) 2436 2407 2437 2408 (define-ppc64-vinsn sign-extend-halfword (((dest :imm)) 2438 ((src :imm))) 2439 (slwi dest src (- 16 ppc64::fixnumshift)) 2440 (srawi dest dest (- 16 ppc64::fixnumshift))) 2441 2442 (define-ppc64-vinsn s32-highword (((dest :imm)) 2443 ((src :s32)) 2444 ((temp :s32))) 2445 (srawi temp src 16) 2446 (slwi dest temp ppc64::fixnumshift)) 2447 2448 2409 ((src :imm))) 2410 (sldi dest src (- 48 ppc64::fixnumshift)) 2411 (sradi dest dest (- 48 ppc64::fixnumshift))) 2412 2413 2449 2414 2450 2415 (define-ppc64-vinsn fixnum-add (((dest t)) 2451 ((x t)2452 (y t)))2416 ((x t) 2417 (y t))) 2453 2418 (add dest x y)) 2454 2419 2455 2420 2456 2421 (define-ppc64-vinsn fixnum-add-overflow-ool (() 2457 ((x :imm)2458 (y :imm))2459 ((cr0 (:crf 0))))2422 ((x :imm) 2423 (y :imm)) 2424 ((cr0 (:crf 0)))) 2460 2425 (addo. ppc::arg_z x y) 2461 2426 (bsola- .SPfix-overflow)) 2462 2427 2463 2428 (define-ppc64-vinsn fixnum-add-overflow-inline (((dest :lisp)) 2464 ((x :imm)2465 (y :imm))2466 ((cr0 (:crf 0))2467 (unboxed :s32)2468 (header :u32)))2429 ((x :imm) 2430 (y :imm)) 2431 ((cr0 (:crf 0)) 2432 (unboxed :s32) 2433 (header :u32))) 2469 2434 (addo. dest x y) 2470 2435 (bns+ cr0 :done) … … 2474 2439 (xoris unboxed unboxed (logand #xffff (ash #xffff (- 32 16 ppc64::fixnumshift)))) 2475 2440 (la ppc::allocptr (- ppc64::fulltag-misc 8) ppc::allocptr) 2476 (t wllt ppc::allocptr ppc::allocbase)2477 (st wheader ppc64::misc-header-offset ppc::allocptr)2441 (tdllt ppc::allocptr ppc::allocbase) 2442 (std header ppc64::misc-header-offset ppc::allocptr) 2478 2443 (mr dest ppc::allocptr) 2479 2444 (clrrwi ppc::allocptr ppc::allocptr ppc64::ntagbits) 2480 (st wunboxed ppc64::misc-data-offset dest)2445 (std unboxed ppc64::misc-data-offset dest) 2481 2446 :done) 2482 2447 … … 2486 2451 ; (setq dest (- x y)) 2487 2452 (define-ppc64-vinsn fixnum-sub (((dest t)) 2488 ((x t)2489 (y t)))2453 ((x t) 2454 (y t))) 2490 2455 (subf dest y x)) 2491 2456 2492 2457 (define-ppc64-vinsn fixnum-sub-from-constant (((dest :imm)) 2493 ((x :s16const)2494 (y :imm)))2458 ((x :s16const) 2459 (y :imm))) 2495 2460 (subfic dest y (:apply ash x ppc64::fixnumshift))) 2496 2461 … … 2499 2464 2500 2465 (define-ppc64-vinsn fixnum-sub-overflow-ool (() 2501 ((x :imm)2502 (y :imm)))2466 ((x :imm) 2467 (y :imm))) 2503 2468 (subo. ppc::arg_z x y) 2504 2469 (bsola- .SPfix-overflow)) 2505 2470 2506 2471 (define-ppc64-vinsn fixnum-sub-overflow-inline (((dest :lisp)) 2507 ((x :imm)2508 (y :imm))2509 ((cr0 (:crf 0))2510 (unboxed :s32)2511 (header :u32)))2472 ((x :imm) 2473 (y :imm)) 2474 ((cr0 (:crf 0)) 2475 (unboxed :s32) 2476 (header :u32))) 2512 2477 (subo. dest x y) 2513 2478 (bns+ cr0 :done) … … 2526 2491 ; This is, of course, also "subtract-immediate." 2527 2492 (define-ppc64-vinsn add-immediate (((dest t)) 2528 ((src t)2529 (upper :u32const)2530 (lower :u32const)))2493 ((src t) 2494 (upper :u32const) 2495 (lower :u32const))) 2531 2496 ((:not (:pred = upper 0)) 2532 2497 (addis dest src upper) … … 2539 2504 ;(The one with the smaller absolute value might be) 2540 2505 (define-ppc64-vinsn multiply-fixnums (((dest :imm)) 2541 ((a :imm)2542 (b :imm))2543 ((unboxed :s32)))2544 (sra wi unboxed b ppc64::fixnumshift)2545 (mull wdest a unboxed))2506 ((a :imm) 2507 (b :imm)) 2508 ((unboxed :s32))) 2509 (sradi unboxed b ppc64::fixnumshift) 2510 (mulld dest a unboxed)) 2546 2511 2547 2512 (define-ppc64-vinsn multiply-immediate (((dest :imm)) 2548 ((boxed :imm)2549 (const :s16const)))2513 ((boxed :imm) 2514 (const :s16const))) 2550 2515 (mulli dest boxed const)) 2551 2516 … … 2553 2518 ; should be EXACTLY = to subtag-base-char 2554 2519 (define-ppc64-vinsn mask-base-char (((dest :u32)) 2555 ((src :imm)))2520 ((src :imm))) 2556 2521 (rlwinm dest src 0 (1+ (- ppc64::least-significant-bit ppc64::charcode-shift)) (1- (- ppc64::nbits-in-word (+ ppc64::charcode-shift 8))))) 2557 2522 … … 2576 2541 2577 2542 (define-ppc64-vinsn symbol-function (((val :lisp)) 2578 ((sym (:lisp (:ne val))))2579 ((crf :crf)2580 (tag :u32)))2581 (l wzval ppc64::symbol.fcell sym)2582 (clrl wi tag val (- 32 ppc64::nlisptagbits))2583 (cmp wi crf tag ppc64::tag-misc)2543 ((sym (:lisp (:ne val)))) 2544 ((crf :crf) 2545 (tag :u32))) 2546 (ld val ppc64::symbol.fcell sym) 2547 (clrldi tag val (- 64 ppc64::ntagbits)) 2548 (cmpdi crf tag ppc64::fulltag-misc) 2584 2549 (bne- crf :bad) 2585 2550 (lbz tag ppc64::misc-subtag-offset val) 2586 (cmp wi crf tag ppc64::subtag-function)2551 (cmpdi crf tag ppc64::subtag-function) 2587 2552 (beq+ crf :good) 2588 2553 :bad … … 2592 2557 (define-ppc64-vinsn (temp-push-unboxed-word :push :word :tsp) 2593 2558 (() 2594 ((w :u 32)))2595 (st wu ppc::tsp -16ppc::tsp)2596 (st w ppc::tsp 4ppc::tsp)2597 (st w w 8ppc::tsp))2559 ((w :u64))) 2560 (stdu ppc::tsp -32 ppc::tsp) 2561 (std ppc::tsp 8 ppc::tsp) 2562 (std w 16 ppc::tsp)) 2598 2563 2599 2564 (define-ppc64-vinsn (temp-pop-unboxed-word :pop :word :tsp) 2600 (((w :u 32))2565 (((w :u64)) 2601 2566 ()) 2602 (l wz w 8ppc::tsp)2603 (l wzppc::tsp 0 ppc::tsp))2567 (ld w 16 ppc::tsp) 2568 (ld ppc::tsp 0 ppc::tsp)) 2604 2569 2605 2570 (define-ppc64-vinsn (temp-push-double-float :push :doubleword :tsp) 2606 2571 (((d :double-float)) 2607 2572 ()) 2608 (st wu ppc::tsp -16ppc::tsp)2609 (st w ppc::tsp 4ppc::tsp)2610 (stfd d 8ppc::tsp))2573 (stdu ppc::tsp -32 ppc::tsp) 2574 (std ppc::tsp 8 ppc::tsp) 2575 (stfd d 16 ppc::tsp)) 2611 2576 2612 2577 (define-ppc64-vinsn (temp-pop-double-float :pop :doubleword :tsp) 2613 2578 (() 2614 2579 ((d :double-float))) 2615 (lfd d 8ppc::tsp)2616 (l wzppc::tsp 0 ppc::tsp))2580 (lfd d 16 ppc::tsp) 2581 (ld ppc::tsp 0 ppc::tsp)) 2617 2582 2618 2583 (define-ppc64-vinsn (temp-push-single-float :push :word :tsp) 2619 2584 (((s :single-float)) 2620 2585 ()) 2621 (st wu ppc::tsp -16ppc::tsp)2622 (st w ppc::tsp 4ppc::tsp)2623 (stfs s 8ppc::tsp))2586 (stdu ppc::tsp -32 ppc::tsp) 2587 (std ppc::tsp 8 ppc::tsp) 2588 (stfs s 16 ppc::tsp)) 2624 2589 2625 2590 (define-ppc64-vinsn (temp-pop-single-float :pop :word :tsp) 2626 2591 (() 2627 2592 ((s :single-float))) 2628 (lfs s 8ppc::tsp)2629 (l wzppc::tsp 0 ppc::tsp))2593 (lfs s 16 ppc::tsp) 2594 (ld ppc::tsp 0 ppc::tsp)) 2630 2595 2631 2596 … … 2633 2598 (() 2634 2599 ((first :u8const))) 2635 (st wu ppc::save0 -4ppc::vsp)2600 (stdu ppc::save0 -8 ppc::vsp) 2636 2601 ((:pred <= first ppc::save1) 2637 (st wu ppc::save1 -4ppc::vsp)2602 (stdu ppc::save1 -8 ppc::vsp) 2638 2603 ((:pred <= first ppc::save2) 2639 (st wu ppc::save2 -4ppc::vsp)2604 (stdu ppc::save2 -8 ppc::vsp) 2640 2605 ((:pred <= first ppc::save3) 2641 (st wu ppc::save3 -4ppc::vsp)2642 ((:pred <= first ppc::save4)2643 (stwu ppc::save4 -4ppc::vsp)2644 ((:pred <= first ppc::save5)2645 (stwu ppc::save5 -4ppc::vsp)2646 ((:pred <= first ppc::save6)2647 (stwu ppc::save6 -4ppc::vsp)2648 ((:pred = first ppc::save7)2649 (stwu ppc::save7 -4ppc::vsp)))))))))2606 (stdu ppc::save3 -8 ppc::vsp) 2607 ((:pred <= first ppc::save4) 2608 (stdu ppc::save4 -8 ppc::vsp) 2609 ((:pred <= first ppc::save5) 2610 (stdu ppc::save5 -8 ppc::vsp) 2611 ((:pred <= first ppc::save6) 2612 (stdu ppc::save6 -8 ppc::vsp) 2613 ((:pred = first ppc::save7) 2614 (stdu ppc::save7 -8 ppc::vsp))))))))) 2650 2615 2651 2616 (define-ppc64-vinsn (save-nvrs :push :node :vsp :multiple) 2652 (() 2653 ((first :u8const))) 2654 ((:pred <= first ppc::save3) 2655 (subi ppc::vsp ppc::vsp (:apply * 4 (:apply - 32 first))) 2656 (stmw first 0 ppc::vsp)) 2657 ((:pred >= first ppc::save2) 2658 (stwu ppc::save0 -4 ppc::vsp) 2659 ((:pred <= first ppc::save1) 2660 (stwu ppc::save1 -4 ppc::vsp) 2661 ((:pred = first ppc::save2) 2662 (stwu ppc::save2 -4 ppc::vsp))))) 2617 (() 2618 ((first :u8const))) 2619 ;; There's no "stmd" instruction. 2620 (stdu ppc::save0 -8 ppc::vsp) 2621 ((:pred <= first ppc::save1) 2622 (stdu ppc::save1 -8 ppc::vsp) 2623 ((:pred <= first ppc::save2) 2624 (stdu ppc::save2 -8 ppc::vsp) 2625 ((:pred <= first ppc::save3) 2626 (stdu ppc::save3 -8 ppc::vsp) 2627 ((:pred <= first ppc::save4) 2628 (stdu ppc::save4 -8 ppc::vsp) 2629 ((:pred <= first ppc::save5) 2630 (stdu ppc::save5 -8 ppc::vsp) 2631 ((:pred <= first ppc::save6) 2632 (stdu ppc::save6 -8 ppc::vsp) 2633 ((:pred = first ppc::save7) 2634 (stdu ppc::save7 -8 ppc::vsp))))))))) 2663 2635 2664 2636 … … 2668 2640 (basereg :imm) 2669 2641 (offset :s16const))) 2670 ((:pred <= firstreg ppc::save3) 2671 (lmw firstreg offset basereg)) 2642 ((:pred = firstreg ppc::save7) 2643 (ld ppc::save7 offset basereg) 2644 (ld ppc::save6 (:apply + offset 8) basereg) 2645 (ld ppc::save5 (:apply + offset 16) basereg) 2646 (ld ppc::save4 (:apply + offset 24) basereg) 2647 (ld ppc::save3 (:apply + offset 32) basereg) 2648 (ld ppc::save2 (:apply + offset 40) basereg) 2649 (ld ppc::save1 (:apply + offset 48) basereg) 2650 (ld ppc::save0 (:apply + offset 56) basereg)) 2651 ((:pred = firstreg ppc::save6) 2652 (ld ppc::save6 offset basereg) 2653 (ld ppc::save5 (:apply + offset 8) basereg) 2654 (ld ppc::save4 (:apply + offset 16) basereg) 2655 (ld ppc::save3 (:apply + offset 24) basereg) 2656 (ld ppc::save2 (:apply + offset 32) basereg) 2657 (ld ppc::save1 (:apply + offset 40) basereg) 2658 (ld ppc::save0 (:apply + offset 48) basereg)) 2659 ((:pred = firstreg ppc::save5) 2660 (ld ppc::save5 offset basereg) 2661 (ld ppc::save4 (:apply + offset 8) basereg) 2662 (ld ppc::save3 (:apply + offset 16) basereg) 2663 (ld ppc::save2 (:apply + offset 24) basereg) 2664 (ld ppc::save1 (:apply + offset 32) basereg) 2665 (ld ppc::save0 (:apply + offset 40) basereg)) 2666 ((:pred = firstreg ppc::save4) 2667 (ld ppc::save4 offset basereg) 2668 (ld ppc::save3 (:apply + offset 8) basereg) 2669 (ld ppc::save2 (:apply + offset 16) basereg) 2670 (ld ppc::save1 (:apply + offset 24) basereg) 2671 (ld ppc::save0 (:apply + offset 32) basereg)) 2672 ((:pred = firstreg ppc::save3) 2673 (ld ppc::save3 offset basereg) 2674 (ld ppc::save2 (:apply + offset 8) basereg) 2675 (ld ppc::save1 (:apply + offset 16) basereg) 2676 (ld ppc::save0 (:apply + offset 24) basereg)) 2672 2677 ((:pred = firstreg ppc::save2) 2673 (l wzppc::save2 offset basereg)2674 (l wz ppc::save1 (:apply + offset 4) basereg)2675 (l wz ppc::save0 (:apply + offset 8) basereg))2678 (ld ppc::save2 offset basereg) 2679 (ld ppc::save1 (:apply + offset 8) basereg) 2680 (ld ppc::save0 (:apply + offset 16) basereg)) 2676 2681 ((:pred = firstreg ppc::save1) 2677 (l wzppc::save1 offset basereg)2678 (l wz ppc::save0 (:apply + offset 4) basereg))2682 (ld ppc::save1 offset basereg) 2683 (ld ppc::save0 (:apply + offset 8) basereg)) 2679 2684 ((:pred = firstreg ppc::save0) 2680 (l wzppc::save0 offset basereg)))2685 (ld ppc::save0 offset basereg))) 2681 2686 2682 2687 (define-ppc64-vinsn %current-frame-ptr (((dest :imm)) 2683 ())2688 ()) 2684 2689 (mr dest ppc::sp)) 2685 2690 2686 2691 (define-ppc64-vinsn %current-tcr (((dest :imm)) 2687 ())2692 ()) 2688 2693 (mr dest ppc::rcontext)) 2689 2694 2690 2695 (define-ppc64-vinsn (svar-dpayback :call :subprim-call) (() 2691 ((n :s16const))2692 ((temp (:u32 #.ppc::imm0))))2696 ((n :s16const)) 2697 ((temp (:u32 #.ppc::imm0)))) 2693 2698 ((:pred > n 1) 2694 2699 (li temp n) … … 2709 2714 (define-ppc64-vinsn load-double-float-constant 2710 2715 (((dest :double-float)) 2711 ((high t) 2712 (low t))) 2713 (stwu ppc::tsp -16 ppc::tsp) 2714 (stw ppc::tsp 4 ppc::tsp) 2715 (stw high 8 ppc::tsp) 2716 (stw low 12 ppc::tsp) 2717 (lfd dest 8 ppc::tsp) 2718 (lwz ppc::tsp 0 ppc::tsp)) 2716 ((val t))) 2717 (stdu ppc::tsp -32 ppc::tsp) 2718 (std ppc::tsp 8 ppc::tsp) 2719 (std val 16 ppc::tsp) 2720 (lfd dest 16 ppc::tsp) 2721 (ld ppc::tsp 0 ppc::tsp)) 2719 2722 2720 2723 (define-ppc64-vinsn load-single-float-constant … … 2728 2731 2729 2732 (define-ppc64-vinsn load-indexed-node (((node :lisp)) 2730 ((base :lisp)2731 (offset :s16const)))2732 (l wznode offset base))2733 ((base :lisp) 2734 (offset :s16const))) 2735 (ld node offset base)) 2733 2736 2734 2737 (define-ppc64-vinsn recover-saved-vsp (((dest :imm)) 2735 ())2736 (l wzdest ppc64::lisp-frame.savevsp ppc::sp))2738 ()) 2739 (ld dest ppc64::lisp-frame.savevsp ppc::sp)) 2737 2740 2738 2741 2739 2742 (define-ppc64-vinsn check-exact-nargs (() 2740 ((n :u16const)))2741 (t wnei ppc::nargs (:apply ash n 2)))2743 ((n :u16const))) 2744 (tdnei ppc::nargs (:apply ash n ppc64::word-shift))) 2742 2745 2743 2746 (define-ppc64-vinsn check-min-nargs (() 2744 ((min :u16const)))2745 (t wllti ppc::nargs (:apply ash min 2)))2747 ((min :u16const))) 2748 (tdllti ppc::nargs (:apply ash min ppc64::word-shift))) 2746 2749 2747 2750 (define-ppc64-vinsn check-max-nargs (() 2748 ((max :u16const)))2749 (twlgti ppc::nargs (:apply ash max 2)))2751 ((max :u16const))) 2752 (twlgti ppc::nargs (:apply ash max ppc64::word-shift))) 2750 2753 2751 2754 ; Save context and establish FN. The current VSP is the the 2752 2755 ; same as the caller's, e.g., no arguments were vpushed. 2753 2756 (define-ppc64-vinsn save-lisp-context-vsp (() 2754 ()2755 ((imm :u32)))2756 (st wu ppc::sp (- ppc64::lisp-frame.size) ppc::sp)2757 (st wppc::fn ppc64::lisp-frame.savefn ppc::sp)2758 (st wppc::loc-pc ppc64::lisp-frame.savelr ppc::sp)2759 (st wppc::vsp ppc64::lisp-frame.savevsp ppc::sp)2757 () 2758 ((imm :u64))) 2759 (stdu ppc::sp (- ppc64::lisp-frame.size) ppc::sp) 2760 (std ppc::fn ppc64::lisp-frame.savefn ppc::sp) 2761 (std ppc::loc-pc ppc64::lisp-frame.savelr ppc::sp) 2762 (std ppc::vsp ppc64::lisp-frame.savevsp ppc::sp) 2760 2763 (mr ppc::fn ppc::nfn) 2761 2764 ;; Do a stack-probe ... 2762 (l wzimm ppc64::tcr.cs-limit ppc::rcontext)2763 (t wllt ppc::sp imm))2765 (ld imm ppc64::tcr.cs-limit ppc::rcontext) 2766 (tdllt ppc::sp imm)) 2764 2767 2765 2768 ; Do the same thing via a subprim call. … … 2767 2770 (() 2768 2771 () 2769 ((imm (:u 32#.ppc::imm0))))2772 ((imm (:u64 #.ppc::imm0)))) 2770 2773 (bla .SPsavecontextvsp)) 2771 2774 2772 2775 (define-ppc64-vinsn save-lisp-context-offset (() 2773 ((nbytes-vpushed :u16const))2774 ((imm :u32)))2776 ((nbytes-vpushed :u16const)) 2777 ((imm :u32))) 2775 2778 (la imm nbytes-vpushed ppc::vsp) 2776 (st wu ppc::sp (- ppc64::lisp-frame.size) ppc::sp)2777 (st wppc::fn ppc64::lisp-frame.savefn ppc::sp)2778 (st wppc::loc-pc ppc64::lisp-frame.savelr ppc::sp)2779 (st wimm ppc64::lisp-frame.savevsp ppc::sp)2779 (stdu ppc::sp (- ppc64::lisp-frame.size) ppc::sp) 2780 (std ppc::fn ppc64::lisp-frame.savefn ppc::sp) 2781 (std ppc::loc-pc ppc64::lisp-frame.savelr ppc::sp) 2782 (std imm ppc64::lisp-frame.savevsp ppc::sp) 2780 2783 (mr ppc::fn ppc::nfn) 2781 2784 ;; Do a stack-probe ... 2782 (l wzimm ppc64::tcr.cs-limit ppc::rcontext)2783 (t wllt ppc::sp imm))2785 (ld imm ppc64::tcr.cs-limit ppc::rcontext) 2786 (tdllt ppc::sp imm)) 2784 2787 2785 2788 (define-ppc64-vinsn save-lisp-context-offset-ool (() 2786 ((nbytes-vpushed :u16const))2787 ((imm (:u32#.ppc::imm0))))2789 ((nbytes-vpushed :u16const)) 2790 ((imm (:u64 #.ppc::imm0)))) 2788 2791 (li imm nbytes-vpushed) 2789 2792 (bla .SPsavecontext0)) … … 2791 2794 2792 2795 (define-ppc64-vinsn save-lisp-context-lexpr (() 2793 ()2794 ((imm :u32)))2795 (st wu ppc::sp (- ppc64::lisp-frame.size) ppc::sp)2796 (st wppc::rzero ppc64::lisp-frame.savefn ppc::sp)2797 (st wppc::loc-pc ppc64::lisp-frame.savelr ppc::sp)2798 (st wppc::vsp ppc64::lisp-frame.savevsp ppc::sp)2796 () 2797 ((imm :u64))) 2798 (stdu ppc::sp (- ppc64::lisp-frame.size) ppc::sp) 2799 (std ppc::rzero ppc64::lisp-frame.savefn ppc::sp) 2800 (std ppc::loc-pc ppc64::lisp-frame.savelr ppc::sp) 2801 (std ppc::vsp ppc64::lisp-frame.savevsp ppc::sp) 2799 2802 (mr ppc::fn ppc::nfn) 2800 2803 ;; Do a stack-probe ... 2801 (l wzimm ppc64::tcr.cs-limit ppc::rcontext)2802 (t wllt ppc::sp imm))2804 (ld imm ppc64::tcr.cs-limit ppc::rcontext) 2805 (tdllt ppc::sp imm)) 2803 2806 2804 2807 (define-ppc64-vinsn save-cleanup-context (() 2805 ())2808 ()) 2806 2809 ;; SP was this deep just a second ago, so no need to do a stack-probe. 2807 2810 (mflr ppc::loc-pc) 2808 (st wu ppc::sp (- ppc64::lisp-frame.size) ppc::sp)2809 (st wppc::rzero ppc64::lisp-frame.savefn ppc::sp)2810 (st wppc::loc-pc ppc64::lisp-frame.savelr ppc::sp)2811 (st wppc::vsp ppc64::lisp-frame.savevsp ppc::sp))2811 (stdu ppc::sp (- ppc64::lisp-frame.size) ppc::sp) 2812 (std ppc::rzero ppc64::lisp-frame.savefn ppc::sp) 2813 (std ppc::loc-pc ppc64::lisp-frame.savelr ppc::sp) 2814 (std ppc::vsp ppc64::lisp-frame.savevsp ppc::sp)) 2812 2815 2813 2816 ;; Vpush the argument registers. We got at least "min-fixed" args; … … 2818 2821 ((crfx :crf) 2819 2822 (crfy :crf) 2820 (entry-vsp (:u 32 #.ppc::imm0))2821 (arg-temp :u 32)))2823 (entry-vsp (:u64 ppc::imm0)) 2824 (arg-temp :u64))) 2822 2825 ((:pred >= min-fixed $numppcargregs) 2823 (st wu ppc::arg_x -4ppc::vsp)2824 (st wu ppc::arg_y -4ppc::vsp)2825 (st wu ppc::arg_z -4ppc::vsp))2826 (stdu ppc::arg_x -8 ppc::vsp) 2827 (stdu ppc::arg_y -8 ppc::vsp) 2828 (stdu ppc::arg_z -8 ppc::vsp)) 2826 2829 ((:pred = min-fixed 2) ; at least 2 args 2827 2830 (cmplwi crfx ppc::nargs (ash 2 ppc64::word-shift)) 2828 2831 (beq crfx :yz2) ; skip arg_x if exactly 2 2829 (st wu ppc::arg_x -4ppc::vsp)2832 (stdu ppc::arg_x -8 ppc::vsp) 2830 2833 :yz2 2831 (stwu ppc::arg_y -4 ppc::vsp) 2832 (stwu ppc::arg_z -4 ppc::vsp)) 2834 (stdu ppc::arg_y -8 2835 ppc::vsp) 2836 (stdu ppc::arg_z -8 ppc::vsp)) 2833 2837 ((:pred = min-fixed 1) ; at least one arg 2834 (cmpl wi crfx ppc::nargs (ash 2 ppc64::word-shift))2838 (cmpldi crfx ppc::nargs (ash 2 ppc64::word-shift)) 2835 2839 (blt crfx :z1) ; branch if exactly one 2836 2840 (beq crfx :yz1) ; branch if exactly two 2837 (st wu ppc::arg_x -4ppc::vsp)2841 (stdu ppc::arg_x -8 ppc::vsp) 2838 2842 :yz1 2839 (st wu ppc::arg_y -4ppc::vsp)2843 (stdu ppc::arg_y -8 ppc::vsp) 2840 2844 :z1 2841 (stwu ppc::arg_z - 4ppc::vsp))2845 (stwu ppc::arg_z -8 ppc::vsp)) 2842 2846 ((:pred = min-fixed 0) 2843 (cmpl wi crfx ppc::nargs (ash 2 ppc64::word-shift))2844 (cmpl wi crfy ppc::nargs 0)2847 (cmpldi crfx ppc::nargs (ash 2 ppc64::word-shift)) 2848 (cmpldi crfy ppc::nargs 0) 2845 2849 (beq crfx :yz0) ; exactly two 2846 2850 (beq crfy :none) ; exactly zero … … 2872 2876 (() 2873 2877 ()) 2874 (l wzppc::loc-pc ppc64::lisp-frame.savelr ppc::sp)2875 (l wzppc::vsp ppc64::lisp-frame.savevsp ppc::sp)2876 (l wzppc::fn ppc64::lisp-frame.savefn ppc::sp)2878 (ld ppc::loc-pc ppc64::lisp-frame.savelr ppc::sp) 2879 (ld ppc::vsp ppc64::lisp-frame.savevsp ppc::sp) 2880 (ld ppc::fn ppc64::lisp-frame.savefn ppc::sp) 2877 2881 (mtlr ppc::loc-pc) 2878 2882 (la ppc::sp ppc64::lisp-frame.size ppc::sp)) … … 2892 2896 ; (and a little simpler than) returning from a function. 2893 2897 (define-ppc64-vinsn restore-cleanup-context (() 2894 ())2895 (l wzppc::loc-pc ppc64::lisp-frame.savelr ppc::sp)2898 ()) 2899 (ld ppc::loc-pc ppc64::lisp-frame.savelr ppc::sp) 2896 2900 (mtlr ppc::loc-pc) 2897 2901 (la ppc::sp ppc64::lisp-frame.size ppc::sp)) … … 2900 2904 2901 2905 (define-ppc64-vinsn default-1-arg (() 2902 ((min :u16const))2903 ((crf :crf)))2904 (cmpl wi crf ppc::nargs (:apply ash min 2))2906 ((min :u16const)) 2907 ((crf :crf))) 2908 (cmpldi crf ppc::nargs (:apply ash min ppc64::word-shift)) 2905 2909 (bne crf :done) 2906 2910 ((:pred >= min 3) 2907 (st wu ppc::arg_x -4ppc::vsp))2911 (stdu ppc::arg_x -8 ppc::vsp)) 2908 2912 ((:pred >= min 2) 2909 2913 (mr ppc::arg_x ppc::arg_y)) … … 2914 2918 2915 2919 (define-ppc64-vinsn default-2-args (() 2916 ((min :u16const))2917 ((crf :crf)))2918 (cmpl wi crf ppc::nargs (:apply ash (:apply 1+ min) 2))2920 ((min :u16const)) 2921 ((crf :crf))) 2922 (cmpldi crf ppc::nargs (:apply ash (:apply 1+ min) ppc64::word-shift)) 2919 2923 (bgt crf :done) 2920 2924 (beq crf :one) 2921 2925 ; We got "min" args; arg_y & arg_z default to nil 2922 2926 ((:pred >= min 3) 2923 (st wu ppc::arg_x -4ppc::vsp))2927 (stdu ppc::arg_x -8 ppc::vsp)) 2924 2928 ((:pred >= min 2) 2925 (st wu ppc::arg_y -4ppc::vsp))2929 (stdu ppc::arg_y -8 ppc::vsp)) 2926 2930 ((:pred >= min 1) 2927 2931 (mr ppc::arg_x ppc::arg_z)) … … 2931 2935 ; We got min+1 args: arg_y was supplied, arg_z defaults to nil. 2932 2936 ((:pred >= min 2) 2933 (st wu ppc::arg_x -4ppc::vsp))2937 (stdu ppc::arg_x -8 ppc::vsp)) 2934 2938 ((:pred >= min 1) 2935 2939 (mr ppc::arg_x ppc::arg_y)) … … 2940 2944 2941 2945 (define-ppc64-vinsn default-3-args (() 2942 ((min :u16const))2943 ((crfx :crf)2944 (crfy :crf)))2945 (cmpl wi crfx ppc::nargs (:apply ash (:apply + 2 min) 2))2946 (cmpl wi crfy ppc::nargs (:apply ash min 2))2946 ((min :u16const)) 2947 ((crfx :crf) 2948 (crfy :crf))) 2949 (cmpldi crfx ppc::nargs (:apply ash (:apply + 2 min) ppc64::word-shift)) 2950 (cmpldi crfy ppc::nargs (:apply ash min ppc64::word-shift)) 2947 2951 (bgt crfx :done) 2948 2952 (beq crfx :two) … … 2950 2954 ; The first (of three) &optional args was supplied. 2951 2955 ((:pred >= min 2) 2952 (st wu ppc::arg_x -4ppc::vsp))2956 (stdu ppc::arg_x -8 ppc::vsp)) 2953 2957 ((:pred >= min 1) 2954 (st wu ppc::arg_y -4ppc::vsp))2958 (stdu ppc::arg_y -8 ppc::vsp)) 2955 2959 (mr ppc::arg_x ppc::arg_z) 2956 2960 (b :last-2) … … 2958 2962 ; The first two (of three) &optional args were supplied. 2959 2963 ((:pred >= min 1) 2960 (st wu ppc::arg_x -4ppc::vsp))2964 (stdu ppc::arg_x -8 ppc::vsp)) 2961 2965 (mr ppc::arg_x ppc::arg_y) 2962 2966 (mr ppc::arg_y ppc::arg_z) … … 2965 2969 :none 2966 2970 ((:pred >= min 3) 2967 (st wu ppc::arg_x -4ppc::vsp))2971 (stdu ppc::arg_x -8 ppc::vsp)) 2968 2972 ((:pred >= min 2) 2969 (st wu ppc::arg_y -4ppc::vsp))2973 (stdu ppc::arg_y -8 ppc::vsp)) 2970 2974 ((:pred >= min 1) 2971 2975 (stwu ppc::arg_z -4 ppc::vsp)) … … 2978 2982 2979 2983 (define-ppc64-vinsn save-lr (() 2980 ())2984 ()) 2981 2985 (mflr ppc::loc-pc)) 2982 2986 … … 2984 2988 ;; the number of &optionals. 2985 2989 (define-ppc64-vinsn (default-optionals :call :subprim-call) (() 2986 ((n :u16const)))2987 (li ppc::imm0 (:apply ash n 2))2990 ((n :u16const))) 2991 (li ppc::imm0 (:apply ash n ppc64::word-shift)) 2988 2992 (bla .SPdefault-optional-args)) 2989 2993 2990 2994 ; fname contains a known symbol 2991 2995 (define-ppc64-vinsn (call-known-symbol :call) (((result (:lisp ppc::arg_z))) 2992 ())2993 (l wzppc::nfn ppc64::symbol.fcell ppc::fname)2994 (l wzppc::temp0 ppc64::misc-data-offset ppc::nfn)2996 ()) 2997 (ld ppc::nfn ppc64::symbol.fcell ppc::fname) 2998 (ld ppc::temp0 ppc64::misc-data-offset ppc::nfn) 2995 2999 (mtctr ppc::temp0) 2996 3000 (bctrl)) 2997 3001 2998 3002 (define-ppc64-vinsn (jump-known-symbol :jumplr) (() 2999 ())3000 (l wzppc::nfn ppc64::symbol.fcell ppc::fname)3001 (l wzppc::temp0 ppc64::misc-data-offset ppc::nfn)3003 ()) 3004 (ld ppc::nfn ppc64::symbol.fcell ppc::fname) 3005 (ld ppc::temp0 ppc64::misc-data-offset ppc::nfn) 3002 3006 (mtctr ppc::temp0) 3003 3007 (bctr)) 3004 3008 3005 3009 (define-ppc64-vinsn (call-known-function :call) (() 3006 ())3007 (l wzppc::temp0 ppc64::misc-data-offset ppc::nfn)3010 ()) 3011 (ld ppc::temp0 ppc64::misc-data-offset ppc::nfn) 3008 3012 (mtctr ppc::temp0) 3009 3013 (bctrl)) 3010 3014 3011 3015 (define-ppc64-vinsn (jump-known-function :jumplr) (() 3012 ())3013 (l wzppc::temp0 ppc64::misc-data-offset ppc::nfn)3016 ()) 3017 (ld ppc::temp0 ppc64::misc-data-offset ppc::nfn) 3014 3018 (mtctr ppc::temp0) 3015 3019 (bctr)) 3016 3020 3017 3021 (define-ppc64-vinsn %schar (((char :imm)) 3018 ((str :lisp)3019 (idx :imm))3020 ((imm :u32)3021 (cr0 (:crf 0))))3022 (sr wi imm idx ppc64::fixnumshift)3022 ((str :lisp) 3023 (idx :imm)) 3024 ((imm :u32) 3025 (cr0 (:crf 0)))) 3026 (srdi imm idx ppc64::fixnumshift) 3023 3027 (addi imm imm ppc64::misc-data-offset) 3024 3028 (lbzx imm str imm) 3025 (rl winm imm imm ppc64::charcode-shift 8 (1-ppc64::charcode-shift))3029 (rldicr imm imm ppc64::charcode-shift (- 63 ppc64::charcode-shift)) 3026 3030 (addi char imm ppc64::subtag-character)) 3027 3031 3028 3032 (define-ppc64-vinsn %set-schar (() 3029 ((str :lisp)3030 (idx :imm)3031 (char :imm))3032 ((imm :u32)3033 (imm1 :u32)3034 (cr0 (:crf 0))))3033 ((str :lisp) 3034 (idx :imm) 3035 (char :imm)) 3036 ((imm :u64) 3037 (imm1 :u64) 3038 (cr0 (:crf 0)))) 3035 3039 (srwi imm idx ppc64::fixnumshift) 3036 3040 (addi imm imm ppc64::misc-data-offset) … … 3040 3044 3041 3045 (define-ppc64-vinsn %set-scharcode (() 3042 ((str :lisp)3043 (idx :imm)3044 (code :imm))3045 ((imm :u32)3046 (imm1 :u32)3047 (cr0 (:crf 0))))3046 ((str :lisp) 3047 (idx :imm) 3048 (code :imm)) 3049 ((imm :u32) 3050 (imm1 :u32) 3051 (cr0 (:crf 0)))) 3048 3052 (srwi imm idx ppc64::fixnumshift) 3049 3053 (addi imm imm ppc64::misc-data-offset) … … 3054 3058 3055 3059 (define-ppc64-vinsn %scharcode (((code :imm)) 3056 ((str :lisp)3057 (idx :imm))3058 ((imm :u32)3059 (cr0 (:crf 0))))3060 ((str :lisp) 3061 (idx :imm)) 3062 ((imm :u32) 3063 (cr0 (:crf 0)))) 3060 3064 (srwi imm idx ppc64::fixnumshift) 3061 3065 (addi imm imm ppc64::misc-data-offset) … … 3065 3069 ; Clobbers LR 3066 3070 (define-ppc64-vinsn (%debug-trap :call :subprim-call) (() 3067 ())3071 ()) 3068 3072 (bla .SPbreakpoint) 3069 3073 ) … … 3071 3075 3072 3076 (define-ppc64-vinsn eep.address (((dest t)) 3073 ((src (:lisp (:ne dest )))))3077 ((src (:lisp (:ne dest ))))) 3074 3078 (lwz dest (+ (ash 1 2) ppc64::misc-data-offset) src) 3075 3079 (tweqi dest ppc64::nil-value)) 3076 3080 3077 3081 (define-ppc64-vinsn %u32+ (((dest :u32)) 3078 ((x :u32) (y :u32)))3082 ((x :u32) (y :u32))) 3079 3083 (add dest x y)) 3080 3084 3081 3085 (define-ppc64-vinsn %u32+-c (((dest :u32)) 3082 ((x :u32) (y :u16const)))3086 ((x :u32) (y :u16const))) 3083 3087 (addi dest x y)) 3084 3088 3085 3089 (define-ppc64-vinsn %u32- (((dest :u32)) 3086 ((x :u32) (y :u32)))3090 ((x :u32) (y :u32))) 3087 3091 (sub dest x y)) 3088 3092 3089 3093 (define-ppc64-vinsn %u32--c (((dest :u32)) 3090 ((x :u32) (y :u16const)))3094 ((x :u32) (y :u16const))) 3091 3095 (subi dest x y)) 3092 3096 3093 3097 (define-ppc64-vinsn %u32-logior (((dest :u32)) 3094 ((x :u32) (y :u32)))3098 ((x :u32) (y :u32))) 3095 3099 (or dest x y)) 3096 3100 3097 3101 (define-ppc64-vinsn %u32-logior-c (((dest :u32)) 3098 ((x :u32) (high :u16const) (low :u16const)))3102 ((x :u32) (high :u16const) (low :u16const))) 3099 3103 ((:not (:pred = high 0)) 3100 3104 (oris dest x high)) … … 3103 3107 3104 3108 (define-ppc64-vinsn %u32-logxor (((dest :u32)) 3105 ((x :u32) (y :u32)))3109 ((x :u32) (y :u32))) 3106 3110 (xor dest x y)) 3107 3111 3108 3112 (define-ppc64-vinsn %u32-logxor-c (((dest :u32)) 3109 ((x :u32) (high :u16const) (low :u16const)))3113 ((x :u32) (high :u16const) (low :u16const))) 3110 3114 ((:not (:pred = high 0)) 3111 3115 (xoris dest x high)) … … 3114 3118 3115 3119 (define-ppc64-vinsn %u32-logand (((dest :u32)) 3116 ((x :u32) (y :u32)))3120 ((x :u32) (y :u32))) 3117 3121 (and dest x y)) 3118 3122 3119 3123 (define-ppc64-vinsn %u32-logand-high-c (((dest :u32)) 3120 ((x :u32) (high :u16const))3121 ((cr0 (:crf 0))))3124 ((x :u32) (high :u16const)) 3125 ((cr0 (:crf 0)))) 3122 3126 (andis. dest x high)) 3123 3127 3124 3128 (define-ppc64-vinsn %u32-logand-low-c (((dest :u32)) 3125 ((x :u32) (low :u16const))3126 ((cr0 (:crf 0))))3129 ((x :u32) (low :u16const)) 3130 ((cr0 (:crf 0)))) 3127 3131 (andi. dest x low)) 3128 3132 3129 3133 (define-ppc64-vinsn %u32-logand-mask-c (((dest :u32)) 3130 ((x :u32)3131 (start :u8const)3132 (end :u8const)))3134 ((x :u32) 3135 (start :u8const) 3136 (end :u8const))) 3133 3137 (rlwinm dest x 0 start end)) 3134 3138 3135 3139 (define-ppc64-vinsn disable-interrupts (((dest :lisp)) 3136 ()3137 ((temp :imm)))3140 () 3141 ((temp :imm))) 3138 3142 (li temp -4) 3139 3143 (lwz dest ppc64::tcr.interrupt-level ppc::rcontext) … … 3260 3264 3261 3265 (define-ppc64-vinsn (nth-value :call :subprim-call) (((result :lisp)) 3262 ())3266 ()) 3263 3267 (bla .SPnthvalue)) 3264 3268 … … 3276 3280 ;;; transfer & jump ...) 3277 3281 (define-ppc64-vinsn (throw :jump :jump-unknown) (() 3278 ())3282 ()) 3279 3283 (bla .SPthrow)) 3280 3284 … … 3316 3320 3317 3321 (define-ppc64-vinsn (darwin-syscall :call :subprim-call) (() 3318 ())3322 ()) 3319 3323 (stw ppc::rzero ppc64::c-frame.crsave ppc::sp) 3320 3324 (bla .SPdarwin-syscall)) 3321 3325 3322 3326 (define-ppc64-vinsn (darwin-syscall-s64 :call :subprim-call) (() 3323 ())3327 ()) 3324 3328 (stw ppc::sp ppc64::c-frame.crsave ppc::sp) 3325 3329 (bla .SPdarwin-syscall))
Note:
See TracChangeset
for help on using the changeset viewer.
