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 : FRSP ( a s -- ) [ 0 ] 2dip 0 12 63 x-insn ;
101 : FRSP. ( a s -- ) [ 0 ] 2dip 1 12 63 x-insn ;
102 : FMR ( a s -- ) [ 0 ] 2dip 0 72 63 x-insn ;
103 : FMR. ( a s -- ) [ 0 ] 2dip 1 72 63 x-insn ;
104 : FCTIWZ ( a s -- ) [ 0 ] 2dip 0 15 63 x-insn ;
105 : FCTIWZ. ( a s -- ) [ 0 ] 2dip 1 15 63 x-insn ;
117 XO: ADDEO. 1 1 138 31
123 XO: DIVWO. 1 1 491 31
125 XO: DIVWU. 0 1 459 31
126 XO: DIVWUO 1 0 459 31
127 XO: DIVWUO. 1 1 459 31
131 XO: MULHWU. 0 1 11 31
133 XO: MULLW. 0 1 235 31
134 XO: MULLWO 1 0 235 31
135 XO: MULLWO. 1 1 235 31
143 XO: SUBFE. 0 1 136 31
144 XO: SUBFEO 1 0 136 31
145 XO: SUBFEO. 1 1 136 31
151 XO1: NEGO. 1 1 104 31
154 : RLWINM ( d a b c xo -- ) 0 21 a-insn ;
155 : RLWINM. ( d a b c xo -- ) 1 21 a-insn ;
156 : FADD ( d a b -- ) 0 21 0 63 a-insn ;
157 : FADD. ( d a b -- ) 0 21 1 63 a-insn ;
158 : FSUB ( d a b -- ) 0 20 0 63 a-insn ;
159 : FSUB. ( d a b -- ) 0 20 1 63 a-insn ;
160 : FMUL ( d a c -- ) 0 swap 25 0 63 a-insn ;
161 : FMUL. ( d a c -- ) 0 swap 25 1 63 a-insn ;
162 : FDIV ( d a b -- ) 0 18 0 63 a-insn ;
163 : FDIV. ( d a b -- ) 0 18 1 63 a-insn ;
164 : FSQRT ( d b -- ) 0 swap 0 22 0 63 a-insn ;
165 : FSQRT. ( d b -- ) 0 swap 0 22 1 63 a-insn ;
168 : B ( dest -- ) 0 0 (B) ;
169 : BL ( dest -- ) 0 1 (B) ;
181 : BLR ( -- ) 20 BCLR ;
182 : BLRL ( -- ) 20 BCLRL ;
183 : BCTR ( -- ) 20 BCCTR ;
193 ! Pseudo-instructions
194 : LI ( value dst -- ) swap [ 0 ] dip ADDI ; inline
195 : SUBI ( dst src1 src2 -- ) neg ADDI ; inline
196 : LIS ( value dst -- ) swap [ 0 ] dip ADDIS ; inline
197 : SUBIC ( dst src1 src2 -- ) neg ADDIC ; inline
198 : SUBIC. ( dst src1 src2 -- ) neg ADDIC. ; inline
199 : NOT ( dst src -- ) dup NOR ; inline
200 : NOT. ( dst src -- ) dup NOR. ; inline
201 : MR ( dst src -- ) dup OR ; inline
202 : MR. ( dst src -- ) dup OR. ; inline
203 : (SLWI) ( d a b -- d a b x y ) 0 31 pick - ; inline
204 : SLWI ( d a b -- ) (SLWI) RLWINM ;
205 : SLWI. ( d a b -- ) (SLWI) RLWINM. ;
206 : (SRWI) ( d a b -- d a b x y ) 32 over - swap 31 ; inline
207 : SRWI ( d a b -- ) (SRWI) RLWINM ;
208 : SRWI. ( d a b -- ) (SRWI) RLWINM. ;
210 n -16 shift HEX: ffff bitand r LIS
211 r r n HEX: ffff bitand ORI ;
212 : immediate? ( n -- ? ) HEX: -8000 HEX: 7fff between? ;
213 : LOAD ( n r -- ) over immediate? [ LI ] [ LOAD32 ] if ;
215 ! Altivec/VMX instructions
316 VXDB: VRSQRTEFP 330 4
367 : -T ( strm a b -- strm-t a b ) [ 16 bitor ] 2dip ;
370 : DSTT ( strm a b -- ) -T DST ;
373 : DSTSTT ( strm a b -- ) -T DSTST ;
376 : DSS ( strm -- ) 0 0 (DSS) ;
377 : DSSALL ( -- ) 16 0 0 (DSS) ;
394 VXR: VCMPEQFP 0 198 4
397 VXR: VCMPEQUW 0 134 4
398 VXR: VCMPGEFP 0 454 4
399 VXR: VCMPGTFP 0 710 4
400 VXR: VCMPGTSB 0 774 4
401 VXR: VCMPGTSH 0 838 4
402 VXR: VCMPGTSW 0 902 4
403 VXR: VCMPGTUB 0 518 4
404 VXR: VCMPGTUH 0 582 4
405 VXR: VCMPGTUW 0 646 4
407 VXR: VCMPBFP. 1 966 4
408 VXR: VCMPEQFP. 1 198 4
410 VXR: VCMPEQUH. 1 70 4
411 VXR: VCMPEQUW. 1 134 4
412 VXR: VCMPGEFP. 1 454 4
413 VXR: VCMPGTFP. 1 710 4
414 VXR: VCMPGTSB. 1 774 4
415 VXR: VCMPGTSH. 1 838 4
416 VXR: VCMPGTSW. 1 902 4
417 VXR: VCMPGTUB. 1 518 4
418 VXR: VCMPGTUH. 1 582 4
419 VXR: VCMPGTUW. 1 646 4