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:
108 : FRSP ( a s -- ) [ 0 ] 2dip 0 12 63 x-insn ;
109 : FRSP. ( a s -- ) [ 0 ] 2dip 1 12 63 x-insn ;
110 : FMR ( a s -- ) [ 0 ] 2dip 0 72 63 x-insn ;
111 : FMR. ( a s -- ) [ 0 ] 2dip 1 72 63 x-insn ;
112 : FCTIWZ ( a s -- ) [ 0 ] 2dip 0 15 63 x-insn ;
113 : FCTIWZ. ( a s -- ) [ 0 ] 2dip 1 15 63 x-insn ;
125 XO: ADDEO. 1 1 138 31
131 XO: DIVWO. 1 1 491 31
133 XO: DIVWU. 0 1 459 31
134 XO: DIVWUO 1 0 459 31
135 XO: DIVWUO. 1 1 459 31
139 XO: MULHWU. 0 1 11 31
141 XO: MULLW. 0 1 235 31
142 XO: MULLWO 1 0 235 31
143 XO: MULLWO. 1 1 235 31
151 XO: SUBFE. 0 1 136 31
152 XO: SUBFEO 1 0 136 31
153 XO: SUBFEO. 1 1 136 31
159 XO1: NEGO. 1 1 104 31
162 : RLWINM ( d a b c xo -- ) 0 21 a-insn ;
163 : RLWINM. ( d a b c xo -- ) 1 21 a-insn ;
164 : FADD ( d a b -- ) 0 21 0 63 a-insn ;
165 : FADD. ( d a b -- ) 0 21 1 63 a-insn ;
166 : FSUB ( d a b -- ) 0 20 0 63 a-insn ;
167 : FSUB. ( d a b -- ) 0 20 1 63 a-insn ;
168 : FMUL ( d a c -- ) 0 swap 25 0 63 a-insn ;
169 : FMUL. ( d a c -- ) 0 swap 25 1 63 a-insn ;
170 : FDIV ( d a b -- ) 0 18 0 63 a-insn ;
171 : FDIV. ( d a b -- ) 0 18 1 63 a-insn ;
172 : FSQRT ( d b -- ) 0 swap 0 22 0 63 a-insn ;
173 : FSQRT. ( d b -- ) 0 swap 0 22 1 63 a-insn ;
176 : B ( dest -- ) 0 0 (B) ;
177 : BL ( dest -- ) 0 1 (B) ;
189 : BLR ( -- ) 20 BCLR ;
190 : BLRL ( -- ) 20 BCLRL ;
191 : BCTR ( -- ) 20 BCCTR ;
201 ! Pseudo-instructions
202 : LI ( value dst -- ) swap [ 0 ] dip ADDI ; inline
203 : SUBI ( dst src1 src2 -- ) neg ADDI ; inline
204 : LIS ( value dst -- ) swap [ 0 ] dip ADDIS ; inline
205 : SUBIC ( dst src1 src2 -- ) neg ADDIC ; inline
206 : SUBIC. ( dst src1 src2 -- ) neg ADDIC. ; inline
207 : NOT ( dst src -- ) dup NOR ; inline
208 : NOT. ( dst src -- ) dup NOR. ; inline
209 : MR ( dst src -- ) dup OR ; inline
210 : MR. ( dst src -- ) dup OR. ; inline
211 : (SLWI) ( d a b -- d a b x y ) 0 31 pick - ; inline
212 : SLWI ( d a b -- ) (SLWI) RLWINM ;
213 : SLWI. ( d a b -- ) (SLWI) RLWINM. ;
214 : (SRWI) ( d a b -- d a b x y ) 32 over - swap 31 ; inline
215 : SRWI ( d a b -- ) (SRWI) RLWINM ;
216 : SRWI. ( d a b -- ) (SRWI) RLWINM. ;
218 n -16 shift HEX: ffff bitand r LIS
219 r r n HEX: ffff bitand ORI ;
220 : immediate? ( n -- ? ) HEX: -8000 HEX: 7fff between? ;
221 : LOAD ( n r -- ) over immediate? [ LI ] [ LOAD32 ] if ;
223 ! Altivec/VMX instructions
324 VXDB: VRSQRTEFP 330 4
375 : -T ( strm a b -- strm-t a b ) [ 16 bitor ] 2dip ;
378 : DSTT ( strm a b -- ) -T DST ;
381 : DSTSTT ( strm a b -- ) -T DSTST ;
384 : DSS ( strm -- ) 0 0 (DSS) ;
385 : DSSALL ( -- ) 16 0 0 (DSS) ;
402 VXR: VCMPEQFP 0 198 4
405 VXR: VCMPEQUW 0 134 4
406 VXR: VCMPGEFP 0 454 4
407 VXR: VCMPGTFP 0 710 4
408 VXR: VCMPGTSB 0 774 4
409 VXR: VCMPGTSH 0 838 4
410 VXR: VCMPGTSW 0 902 4
411 VXR: VCMPGTUB 0 518 4
412 VXR: VCMPGTUH 0 582 4
413 VXR: VCMPGTUW 0 646 4
415 VXR: VCMPBFP. 1 966 4
416 VXR: VCMPEQFP. 1 198 4
418 VXR: VCMPEQUH. 1 70 4
419 VXR: VCMPEQUW. 1 134 4
420 VXR: VCMPGEFP. 1 454 4
421 VXR: VCMPGTFP. 1 710 4
422 VXR: VCMPGTSB. 1 774 4
423 VXR: VCMPGTSH. 1 838 4
424 VXR: VCMPGTSW. 1 902 4
425 VXR: VCMPGTUB. 1 518 4
426 VXR: VCMPGTUH. 1 582 4
427 VXR: VCMPGTUW. 1 646 4