1 ! Copyright (C) 2005, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel namespaces words math math.order locals
4 cpu.ppc.assembler.backend ;
7 ! See the Motorola or IBM documentation for details. The opcode
8 ! names are standard, and the operand order is the same as in
9 ! the docs, except a few differences, namely, in IBM/Motorola
10 ! assembler syntax, loads and stores are written like:
14 ! In Factor, we write:
100 : FMR ( a s -- ) [ 0 ] 2dip 0 72 63 x-insn ;
101 : FMR. ( a s -- ) [ 0 ] 2dip 1 72 63 x-insn ;
102 : FCTIWZ ( a s -- ) [ 0 ] 2dip 0 15 63 x-insn ;
103 : FCTIWZ. ( a s -- ) [ 0 ] 2dip 1 15 63 x-insn ;
115 XO: ADDEO. 1 1 138 31
121 XO: DIVWO. 1 1 491 31
123 XO: DIVWU. 0 1 459 31
124 XO: DIVWUO 1 0 459 31
125 XO: DIVWUO. 1 1 459 31
129 XO: MULHWU. 0 1 11 31
131 XO: MULLW. 0 1 235 31
132 XO: MULLWO 1 0 235 31
133 XO: MULLWO. 1 1 235 31
141 XO: SUBFE. 0 1 136 31
142 XO: SUBFEO 1 0 136 31
143 XO: SUBFEO. 1 1 136 31
149 XO1: NEGO. 1 1 104 31
152 : RLWINM ( d a b c xo -- ) 0 21 a-insn ;
153 : RLWINM. ( d a b c xo -- ) 1 21 a-insn ;
154 : FADD ( d a b -- ) 0 21 0 63 a-insn ;
155 : FADD. ( d a b -- ) 0 21 1 63 a-insn ;
156 : FSUB ( d a b -- ) 0 20 0 63 a-insn ;
157 : FSUB. ( d a b -- ) 0 20 1 63 a-insn ;
158 : FMUL ( d a c -- ) 0 swap 25 0 63 a-insn ;
159 : FMUL. ( d a c -- ) 0 swap 25 1 63 a-insn ;
160 : FDIV ( d a b -- ) 0 18 0 63 a-insn ;
161 : FDIV. ( d a b -- ) 0 18 1 63 a-insn ;
162 : FSQRT ( d b -- ) 0 swap 0 22 0 63 a-insn ;
163 : FSQRT. ( d b -- ) 0 swap 0 22 1 63 a-insn ;
166 : B ( dest -- ) 0 0 (B) ;
167 : BL ( dest -- ) 0 1 (B) ;
179 : BLR ( -- ) 20 BCLR ;
180 : BLRL ( -- ) 20 BCLRL ;
181 : BCTR ( -- ) 20 BCCTR ;
191 ! Pseudo-instructions
192 : LI ( value dst -- ) swap [ 0 ] dip ADDI ; inline
193 : SUBI ( dst src1 src2 -- ) neg ADDI ; inline
194 : LIS ( value dst -- ) swap [ 0 ] dip ADDIS ; inline
195 : SUBIC ( dst src1 src2 -- ) neg ADDIC ; inline
196 : SUBIC. ( dst src1 src2 -- ) neg ADDIC. ; inline
197 : NOT ( dst src -- ) dup NOR ; inline
198 : NOT. ( dst src -- ) dup NOR. ; inline
199 : MR ( dst src -- ) dup OR ; inline
200 : MR. ( dst src -- ) dup OR. ; inline
201 : (SLWI) ( d a b -- d a b x y ) 0 31 pick - ; inline
202 : SLWI ( d a b -- ) (SLWI) RLWINM ;
203 : SLWI. ( d a b -- ) (SLWI) RLWINM. ;
204 : (SRWI) ( d a b -- d a b x y ) 32 over - swap 31 ; inline
205 : SRWI ( d a b -- ) (SRWI) RLWINM ;
206 : SRWI. ( d a b -- ) (SRWI) RLWINM. ;
208 n -16 shift HEX: ffff bitand r LIS
209 r r n HEX: ffff bitand ORI ;
210 : immediate? ( n -- ? ) HEX: -8000 HEX: 7fff between? ;
211 : LOAD ( n r -- ) over immediate? [ LI ] [ LOAD32 ] if ;
213 ! Altivec/VMX instructions
314 VXDB: VRSQRTEFP 330 4
365 : -T ( strm a b -- strm-t a b ) [ 16 bitor ] 2dip ;
368 : DSTT ( strm a b -- ) -T DST ;
371 : DSTSTT ( strm a b -- ) -T DSTST ;
374 : DSS ( strm -- ) 0 0 (DSS) ;
375 : DSSALL ( -- ) 16 0 0 (DSS) ;
392 VXR: VCMPEQFP 0 198 4
395 VXR: VCMPEQUW 0 134 4
396 VXR: VCMPGEFP 0 454 4
397 VXR: VCMPGTFP 0 710 4
398 VXR: VCMPGTSB 0 774 4
399 VXR: VCMPGTSH 0 838 4
400 VXR: VCMPGTSW 0 902 4
401 VXR: VCMPGTUB 0 518 4
402 VXR: VCMPGTUH 0 582 4
403 VXR: VCMPGTUW 0 646 4
405 VXR: VCMPBFP. 1 966 4
406 VXR: VCMPEQFP. 1 198 4
408 VXR: VCMPEQUH. 1 70 4
409 VXR: VCMPEQUW. 1 134 4
410 VXR: VCMPGEFP. 1 454 4
411 VXR: VCMPGTFP. 1 710 4
412 VXR: VCMPGTSB. 1 774 4
413 VXR: VCMPGTSH. 1 838 4
414 VXR: VCMPGTSW. 1 902 4
415 VXR: VCMPGTUB. 1 518 4
416 VXR: VCMPGTUH. 1 582 4
417 VXR: VCMPGTUW. 1 646 4