2009-08-25 20:38:48 -04:00
|
|
|
! Copyright (C) 2005, 2009 Slava Pestov.
|
2007-09-20 18:09:08 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2009-08-25 20:38:48 -04:00
|
|
|
USING: kernel namespaces words math math.order locals
|
2009-05-06 17:14:53 -04:00
|
|
|
cpu.ppc.assembler.backend ;
|
2008-04-26 12:06:46 -04:00
|
|
|
IN: cpu.ppc.assembler
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
! See the Motorola or IBM documentation for details. The opcode
|
|
|
|
! names are standard, and the operand order is the same as in
|
|
|
|
! the docs, except a few differences, namely, in IBM/Motorola
|
|
|
|
! assembler syntax, loads and stores are written like:
|
|
|
|
!
|
|
|
|
! stw r14,10(r15)
|
|
|
|
!
|
|
|
|
! In Factor, we write:
|
|
|
|
!
|
|
|
|
! 14 15 10 STW
|
|
|
|
|
2008-07-14 18:05:56 -04:00
|
|
|
! D-form
|
|
|
|
D: ADDI 14
|
|
|
|
D: ADDIC 12
|
|
|
|
D: ADDIC. 13
|
|
|
|
D: ADDIS 15
|
|
|
|
D: CMPI 11
|
|
|
|
D: CMPLI 10
|
|
|
|
D: LBZ 34
|
|
|
|
D: LBZU 35
|
|
|
|
D: LFD 50
|
|
|
|
D: LFDU 51
|
|
|
|
D: LFS 48
|
|
|
|
D: LFSU 49
|
|
|
|
D: LHA 42
|
|
|
|
D: LHAU 43
|
|
|
|
D: LHZ 40
|
|
|
|
D: LHZU 41
|
|
|
|
D: LWZ 32
|
|
|
|
D: LWZU 33
|
|
|
|
D: MULI 7
|
|
|
|
D: MULLI 7
|
|
|
|
D: STB 38
|
|
|
|
D: STBU 39
|
|
|
|
D: STFD 54
|
|
|
|
D: STFDU 55
|
|
|
|
D: STFS 52
|
|
|
|
D: STFSU 53
|
|
|
|
D: STH 44
|
|
|
|
D: STHU 45
|
|
|
|
D: STW 36
|
|
|
|
D: STWU 37
|
|
|
|
|
|
|
|
! SD-form
|
|
|
|
SD: ANDI 28
|
|
|
|
SD: ANDIS 29
|
|
|
|
SD: ORI 24
|
|
|
|
SD: ORIS 25
|
|
|
|
SD: XORI 26
|
|
|
|
SD: XORIS 27
|
|
|
|
|
|
|
|
! X-form
|
|
|
|
X: AND 0 28 31
|
|
|
|
X: AND. 1 28 31
|
|
|
|
X: CMP 0 0 31
|
|
|
|
X: CMPL 0 32 31
|
|
|
|
X: EQV 0 284 31
|
|
|
|
X: EQV. 1 284 31
|
|
|
|
X: FCMPO 0 32 63
|
|
|
|
X: FCMPU 0 0 63
|
|
|
|
X: LBZUX 0 119 31
|
|
|
|
X: LBZX 0 87 31
|
|
|
|
X: LHAUX 0 375 31
|
|
|
|
X: LHAX 0 343 31
|
|
|
|
X: LHZUX 0 311 31
|
|
|
|
X: LHZX 0 279 31
|
|
|
|
X: LWZUX 0 55 31
|
|
|
|
X: LWZX 0 23 31
|
|
|
|
X: NAND 0 476 31
|
|
|
|
X: NAND. 1 476 31
|
|
|
|
X: NOR 0 124 31
|
|
|
|
X: NOR. 1 124 31
|
|
|
|
X: OR 0 444 31
|
|
|
|
X: OR. 1 444 31
|
|
|
|
X: ORC 0 412 31
|
|
|
|
X: ORC. 1 412 31
|
|
|
|
X: SLW 0 24 31
|
|
|
|
X: SLW. 1 24 31
|
|
|
|
X: SRAW 0 792 31
|
|
|
|
X: SRAW. 1 792 31
|
|
|
|
X: SRAWI 0 824 31
|
|
|
|
X: SRW 0 536 31
|
|
|
|
X: SRW. 1 536 31
|
|
|
|
X: STBUX 0 247 31
|
|
|
|
X: STBX 0 215 31
|
|
|
|
X: STHUX 0 439 31
|
|
|
|
X: STHX 0 407 31
|
|
|
|
X: STWUX 0 183 31
|
|
|
|
X: STWX 0 151 31
|
|
|
|
X: XOR 0 316 31
|
|
|
|
X: XOR. 1 316 31
|
|
|
|
X1: EXTSB 0 954 31
|
|
|
|
X1: EXTSB. 1 954 31
|
2009-10-17 01:13:50 -04:00
|
|
|
: FRSP ( a s -- ) [ 0 ] 2dip 0 12 63 x-insn ;
|
|
|
|
: FRSP. ( a s -- ) [ 0 ] 2dip 1 12 63 x-insn ;
|
2009-08-25 20:33:35 -04:00
|
|
|
: FMR ( a s -- ) [ 0 ] 2dip 0 72 63 x-insn ;
|
|
|
|
: FMR. ( a s -- ) [ 0 ] 2dip 1 72 63 x-insn ;
|
2009-01-23 19:20:47 -05:00
|
|
|
: FCTIWZ ( a s -- ) [ 0 ] 2dip 0 15 63 x-insn ;
|
|
|
|
: FCTIWZ. ( a s -- ) [ 0 ] 2dip 1 15 63 x-insn ;
|
2008-07-14 18:05:56 -04:00
|
|
|
|
|
|
|
! XO-form
|
|
|
|
XO: ADD 0 0 266 31
|
|
|
|
XO: ADD. 0 1 266 31
|
|
|
|
XO: ADDC 0 0 10 31
|
|
|
|
XO: ADDC. 0 1 10 31
|
|
|
|
XO: ADDCO 1 0 10 31
|
|
|
|
XO: ADDCO. 1 1 10 31
|
|
|
|
XO: ADDE 0 0 138 31
|
|
|
|
XO: ADDE. 0 1 138 31
|
|
|
|
XO: ADDEO 1 0 138 31
|
|
|
|
XO: ADDEO. 1 1 138 31
|
|
|
|
XO: ADDO 1 0 266 31
|
|
|
|
XO: ADDO. 1 1 266 31
|
|
|
|
XO: DIVW 0 0 491 31
|
|
|
|
XO: DIVW. 0 1 491 31
|
|
|
|
XO: DIVWO 1 0 491 31
|
|
|
|
XO: DIVWO. 1 1 491 31
|
|
|
|
XO: DIVWU 0 0 459 31
|
|
|
|
XO: DIVWU. 0 1 459 31
|
|
|
|
XO: DIVWUO 1 0 459 31
|
|
|
|
XO: DIVWUO. 1 1 459 31
|
|
|
|
XO: MULHW 0 0 75 31
|
|
|
|
XO: MULHW. 0 1 75 31
|
|
|
|
XO: MULHWU 0 0 11 31
|
|
|
|
XO: MULHWU. 0 1 11 31
|
|
|
|
XO: MULLW 0 0 235 31
|
|
|
|
XO: MULLW. 0 1 235 31
|
|
|
|
XO: MULLWO 1 0 235 31
|
|
|
|
XO: MULLWO. 1 1 235 31
|
|
|
|
XO: SUBF 0 0 40 31
|
|
|
|
XO: SUBF. 0 1 40 31
|
|
|
|
XO: SUBFC 0 0 8 31
|
|
|
|
XO: SUBFC. 0 1 8 31
|
|
|
|
XO: SUBFCO 1 0 8 31
|
|
|
|
XO: SUBFCO. 1 1 8 31
|
|
|
|
XO: SUBFE 0 0 136 31
|
|
|
|
XO: SUBFE. 0 1 136 31
|
|
|
|
XO: SUBFEO 1 0 136 31
|
|
|
|
XO: SUBFEO. 1 1 136 31
|
|
|
|
XO: SUBFO 1 0 40 31
|
|
|
|
XO: SUBFO. 1 1 40 31
|
|
|
|
XO1: NEG 0 0 104 31
|
|
|
|
XO1: NEG. 0 1 104 31
|
|
|
|
XO1: NEGO 1 0 104 31
|
|
|
|
XO1: NEGO. 1 1 104 31
|
|
|
|
|
|
|
|
! A-form
|
|
|
|
: RLWINM ( d a b c xo -- ) 0 21 a-insn ;
|
|
|
|
: RLWINM. ( d a b c xo -- ) 1 21 a-insn ;
|
|
|
|
: FADD ( d a b -- ) 0 21 0 63 a-insn ;
|
|
|
|
: FADD. ( d a b -- ) 0 21 1 63 a-insn ;
|
|
|
|
: FSUB ( d a b -- ) 0 20 0 63 a-insn ;
|
|
|
|
: FSUB. ( d a b -- ) 0 20 1 63 a-insn ;
|
|
|
|
: FMUL ( d a c -- ) 0 swap 25 0 63 a-insn ;
|
|
|
|
: FMUL. ( d a c -- ) 0 swap 25 1 63 a-insn ;
|
|
|
|
: FDIV ( d a b -- ) 0 18 0 63 a-insn ;
|
|
|
|
: FDIV. ( d a b -- ) 0 18 1 63 a-insn ;
|
|
|
|
: FSQRT ( d b -- ) 0 swap 0 22 0 63 a-insn ;
|
|
|
|
: FSQRT. ( d b -- ) 0 swap 0 22 1 63 a-insn ;
|
|
|
|
|
|
|
|
! Branches
|
|
|
|
: B ( dest -- ) 0 0 (B) ;
|
|
|
|
: BL ( dest -- ) 0 1 (B) ;
|
|
|
|
BC: LT 12 0
|
|
|
|
BC: GE 4 0
|
|
|
|
BC: GT 12 1
|
|
|
|
BC: LE 4 1
|
|
|
|
BC: EQ 12 2
|
|
|
|
BC: NE 4 2
|
|
|
|
BC: O 12 3
|
|
|
|
BC: NO 4 3
|
|
|
|
B: CLR 0 8 0 0 19
|
|
|
|
B: CLRL 0 8 0 1 19
|
|
|
|
B: CCTR 0 264 0 0 19
|
|
|
|
: BLR ( -- ) 20 BCLR ;
|
|
|
|
: BLRL ( -- ) 20 BCLRL ;
|
|
|
|
: BCTR ( -- ) 20 BCCTR ;
|
|
|
|
|
|
|
|
! Special registers
|
|
|
|
MFSPR: XER 1
|
|
|
|
MFSPR: LR 8
|
|
|
|
MFSPR: CTR 9
|
|
|
|
MTSPR: XER 1
|
|
|
|
MTSPR: LR 8
|
|
|
|
MTSPR: CTR 9
|
|
|
|
|
|
|
|
! Pseudo-instructions
|
2009-08-25 20:38:48 -04:00
|
|
|
: LI ( value dst -- ) swap [ 0 ] dip ADDI ; inline
|
2008-12-15 21:31:55 -05:00
|
|
|
: SUBI ( dst src1 src2 -- ) neg ADDI ; inline
|
2009-08-25 20:38:48 -04:00
|
|
|
: LIS ( value dst -- ) swap [ 0 ] dip ADDIS ; inline
|
2008-12-15 21:31:55 -05:00
|
|
|
: SUBIC ( dst src1 src2 -- ) neg ADDIC ; inline
|
|
|
|
: SUBIC. ( dst src1 src2 -- ) neg ADDIC. ; inline
|
|
|
|
: NOT ( dst src -- ) dup NOR ; inline
|
|
|
|
: NOT. ( dst src -- ) dup NOR. ; inline
|
|
|
|
: MR ( dst src -- ) dup OR ; inline
|
|
|
|
: MR. ( dst src -- ) dup OR. ; inline
|
|
|
|
: (SLWI) ( d a b -- d a b x y ) 0 31 pick - ; inline
|
2008-07-14 18:05:56 -04:00
|
|
|
: SLWI ( d a b -- ) (SLWI) RLWINM ;
|
|
|
|
: SLWI. ( d a b -- ) (SLWI) RLWINM. ;
|
2008-12-15 21:31:55 -05:00
|
|
|
: (SRWI) ( d a b -- d a b x y ) 32 over - swap 31 ; inline
|
2008-07-14 18:05:56 -04:00
|
|
|
: SRWI ( d a b -- ) (SRWI) RLWINM ;
|
|
|
|
: SRWI. ( d a b -- ) (SRWI) RLWINM. ;
|
2009-08-25 20:38:48 -04:00
|
|
|
:: LOAD32 ( n r -- )
|
2009-08-25 23:37:10 -04:00
|
|
|
n -16 shift HEX: ffff bitand r LIS
|
|
|
|
r r n HEX: ffff bitand ORI ;
|
2008-07-14 18:05:56 -04:00
|
|
|
: immediate? ( n -- ? ) HEX: -8000 HEX: 7fff between? ;
|
|
|
|
: LOAD ( n r -- ) over immediate? [ LI ] [ LOAD32 ] if ;
|
2009-09-09 18:14:36 -04:00
|
|
|
|
|
|
|
! Altivec/VMX instructions
|
|
|
|
VA: VMHADDSHS 32 4
|
|
|
|
VA: VMHRADDSHS 33 4
|
|
|
|
VA: VMLADDUHM 34 4
|
|
|
|
VA: VMSUMUBM 36 4
|
|
|
|
VA: VMSUMMBM 37 4
|
|
|
|
VA: VMSUMUHM 38 4
|
|
|
|
VA: VMSUMUHS 39 4
|
|
|
|
VA: VMSUMSHM 40 4
|
|
|
|
VA: VMSUMSHS 41 4
|
|
|
|
VA: VSEL 42 4
|
|
|
|
VA: VPERM 43 4
|
|
|
|
VA: VSLDOI 44 4
|
|
|
|
VA: VMADDFP 46 4
|
|
|
|
VA: VNMSUBFP 47 4
|
|
|
|
|
|
|
|
VX: VADDUBM 0 4
|
|
|
|
VX: VADDUHM 64 4
|
|
|
|
VX: VADDUWM 128 4
|
|
|
|
VX: VADDCUW 384 4
|
|
|
|
VX: VADDUBS 512 4
|
|
|
|
VX: VADDUHS 576 4
|
|
|
|
VX: VADDUWS 640 4
|
|
|
|
VX: VADDSBS 768 4
|
|
|
|
VX: VADDSHS 832 4
|
|
|
|
VX: VADDSWS 896 4
|
|
|
|
|
|
|
|
VX: VSUBUBM 1024 4
|
|
|
|
VX: VSUBUHM 1088 4
|
|
|
|
VX: VSUBUWM 1152 4
|
|
|
|
VX: VSUBCUW 1408 4
|
|
|
|
VX: VSUBUBS 1536 4
|
|
|
|
VX: VSUBUHS 1600 4
|
|
|
|
VX: VSUBUWS 1664 4
|
|
|
|
VX: VSUBSBS 1792 4
|
|
|
|
VX: VSUBSHS 1856 4
|
|
|
|
VX: VSUBSWS 1920 4
|
|
|
|
|
|
|
|
VX: VMAXUB 2 4
|
|
|
|
VX: VMAXUH 66 4
|
|
|
|
VX: VMAXUW 130 4
|
|
|
|
VX: VMAXSB 258 4
|
|
|
|
VX: VMAXSH 322 4
|
|
|
|
VX: VMAXSW 386 4
|
|
|
|
|
|
|
|
VX: VMINUB 514 4
|
|
|
|
VX: VMINUH 578 4
|
|
|
|
VX: VMINUW 642 4
|
|
|
|
VX: VMINSB 770 4
|
|
|
|
VX: VMINSH 834 4
|
|
|
|
VX: VMINSW 898 4
|
|
|
|
|
|
|
|
VX: VAVGUB 1026 4
|
|
|
|
VX: VAVGUH 1090 4
|
|
|
|
VX: VAVGUW 1154 4
|
|
|
|
VX: VAVGSB 1282 4
|
|
|
|
VX: VAVGSH 1346 4
|
|
|
|
VX: VAVGSW 1410 4
|
|
|
|
|
|
|
|
VX: VRLB 4 4
|
|
|
|
VX: VRLH 68 4
|
|
|
|
VX: VRLW 132 4
|
|
|
|
VX: VSLB 260 4
|
|
|
|
VX: VSLH 324 4
|
|
|
|
VX: VSLW 388 4
|
|
|
|
VX: VSL 452 4
|
|
|
|
VX: VSRB 516 4
|
|
|
|
VX: VSRH 580 4
|
|
|
|
VX: VSRW 644 4
|
|
|
|
VX: VSR 708 4
|
|
|
|
VX: VSRAB 772 4
|
|
|
|
VX: VSRAH 836 4
|
|
|
|
VX: VSRAW 900 4
|
|
|
|
|
|
|
|
VX: VAND 1028 4
|
|
|
|
VX: VANDC 1092 4
|
|
|
|
VX: VOR 1156 4
|
|
|
|
VX: VNOR 1284 4
|
|
|
|
VX: VXOR 1220 4
|
|
|
|
|
|
|
|
VXD: MFVSCR 1540 4
|
|
|
|
VXB: MTVSCR 1604 4
|
|
|
|
|
|
|
|
VX: VMULOUB 8 4
|
|
|
|
VX: VMULOUH 72 4
|
|
|
|
VX: VMULOSB 264 4
|
|
|
|
VX: VMULOSH 328 4
|
|
|
|
VX: VMULEUB 520 4
|
|
|
|
VX: VMULEUH 584 4
|
|
|
|
VX: VMULESB 776 4
|
|
|
|
VX: VMULESH 840 4
|
|
|
|
VX: VSUM4UBS 1544 4
|
|
|
|
VX: VSUM4SBS 1800 4
|
|
|
|
VX: VSUM4SHS 1608 4
|
|
|
|
VX: VSUM2SWS 1672 4
|
|
|
|
VX: VSUMSWS 1928 4
|
|
|
|
|
|
|
|
VX: VADDFP 10 4
|
|
|
|
VX: VSUBFP 74 4
|
|
|
|
|
|
|
|
VXDB: VREFP 266 4
|
|
|
|
VXDB: VRSQRTEFP 330 4
|
|
|
|
VXDB: VEXPTEFP 394 4
|
|
|
|
VXDB: VLOGEFP 458 4
|
|
|
|
VXDB: VRFIN 522 4
|
|
|
|
VXDB: VRFIZ 586 4
|
|
|
|
VXDB: VRFIP 650 4
|
|
|
|
VXDB: VRFIM 714 4
|
|
|
|
|
|
|
|
VX: VCFUX 778 4
|
|
|
|
VX: VCFSX 842 4
|
|
|
|
VX: VCTUXS 906 4
|
|
|
|
VX: VCTSXS 970 4
|
|
|
|
|
|
|
|
VX: VMAXFP 1034 4
|
|
|
|
VX: VMINFP 1098 4
|
|
|
|
|
|
|
|
VX: VMRGHB 12 4
|
|
|
|
VX: VMRGHH 76 4
|
|
|
|
VX: VMRGHW 140 4
|
|
|
|
VX: VMRGLB 268 4
|
|
|
|
VX: VMRGLH 332 4
|
|
|
|
VX: VMRGLW 396 4
|
|
|
|
|
|
|
|
VX: VSPLTB 524 4
|
|
|
|
VX: VSPLTH 588 4
|
|
|
|
VX: VSPLTW 652 4
|
|
|
|
|
|
|
|
VXA: VSPLTISB 780 4
|
|
|
|
VXA: VSPLTISH 844 4
|
|
|
|
VXA: VSPLTISW 908 4
|
|
|
|
|
|
|
|
VX: VSLO 1036 4
|
|
|
|
VX: VSRO 1100 4
|
|
|
|
|
|
|
|
VX: VPKUHUM 14 4
|
|
|
|
VX: VPKUWUM 78 4
|
|
|
|
VX: VPKUHUS 142 4
|
|
|
|
VX: VPKUWUS 206 4
|
|
|
|
VX: VPKSHUS 270 4
|
|
|
|
VX: VPKSWUS 334 4
|
|
|
|
VX: VPKSHSS 398 4
|
|
|
|
VX: VPKSWSS 462 4
|
|
|
|
VX: VPKPX 782 4
|
|
|
|
|
|
|
|
VXDB: VUPKHSB 526 4
|
|
|
|
VXDB: VUPKHSH 590 4
|
|
|
|
VXDB: VUPKLSB 654 4
|
|
|
|
VXDB: VUPKLSH 718 4
|
|
|
|
VXDB: VUPKHPX 846 4
|
|
|
|
VXDB: VUPKLPX 974 4
|
|
|
|
|
|
|
|
: -T ( strm a b -- strm-t a b ) [ 16 bitor ] 2dip ;
|
|
|
|
|
|
|
|
XD: DST 0 342 31
|
|
|
|
: DSTT ( strm a b -- ) -T DST ;
|
|
|
|
|
|
|
|
XD: DSTST 0 374 31
|
|
|
|
: DSTSTT ( strm a b -- ) -T DSTST ;
|
|
|
|
|
|
|
|
XD: (DSS) 0 822 31
|
|
|
|
: DSS ( strm -- ) 0 0 (DSS) ;
|
|
|
|
: DSSALL ( -- ) 16 0 0 (DSS) ;
|
|
|
|
|
|
|
|
XD: LVEBX 0 7 31
|
|
|
|
XD: LVEHX 0 39 31
|
|
|
|
XD: LVEWX 0 71 31
|
|
|
|
XD: LVSL 0 6 31
|
|
|
|
XD: LVSR 0 38 31
|
|
|
|
XD: LVX 0 103 31
|
|
|
|
XD: LVXL 0 359 31
|
|
|
|
|
|
|
|
XD: STVEBX 0 135 31
|
|
|
|
XD: STVEHX 0 167 31
|
|
|
|
XD: STVEWX 0 199 31
|
|
|
|
XD: STVX 0 231 31
|
|
|
|
XD: STVXL 0 487 31
|
|
|
|
|
|
|
|
VXR: VCMPBFP 0 966 4
|
|
|
|
VXR: VCMPEQFP 0 198 4
|
|
|
|
VXR: VCMPEQUB 0 6 4
|
|
|
|
VXR: VCMPEQUH 0 70 4
|
|
|
|
VXR: VCMPEQUW 0 134 4
|
|
|
|
VXR: VCMPGEFP 0 454 4
|
|
|
|
VXR: VCMPGTFP 0 710 4
|
|
|
|
VXR: VCMPGTSB 0 774 4
|
|
|
|
VXR: VCMPGTSH 0 838 4
|
|
|
|
VXR: VCMPGTSW 0 902 4
|
|
|
|
VXR: VCMPGTUB 0 518 4
|
|
|
|
VXR: VCMPGTUH 0 582 4
|
|
|
|
VXR: VCMPGTUW 0 646 4
|
|
|
|
|
|
|
|
VXR: VCMPBFP. 1 966 4
|
|
|
|
VXR: VCMPEQFP. 1 198 4
|
|
|
|
VXR: VCMPEQUB. 1 6 4
|
|
|
|
VXR: VCMPEQUH. 1 70 4
|
|
|
|
VXR: VCMPEQUW. 1 134 4
|
|
|
|
VXR: VCMPGEFP. 1 454 4
|
|
|
|
VXR: VCMPGTFP. 1 710 4
|
|
|
|
VXR: VCMPGTSB. 1 774 4
|
|
|
|
VXR: VCMPGTSH. 1 838 4
|
|
|
|
VXR: VCMPGTSW. 1 902 4
|
|
|
|
VXR: VCMPGTUB. 1 518 4
|
|
|
|
VXR: VCMPGTUH. 1 582 4
|
|
|
|
VXR: VCMPGTUW. 1 646 4
|
|
|
|
|