1 ! Copyright (C) 2005, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel namespaces words io.binary math math.order
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 72 0 63 x-insn ;
101 : FMR. ( a s -- ) [ 0 ] 2dip 72 1 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 -- ) 0 rot ADDI ; inline
193 : SUBI ( dst src1 src2 -- ) neg ADDI ; inline
194 : LIS ( value dst -- ) 0 rot 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. ;
207 : LOAD32 ( n r -- ) [ w>h/h ] dip tuck LIS dup rot ORI ;
208 : immediate? ( n -- ? ) HEX: -8000 HEX: 7fff between? ;
209 : LOAD ( n r -- ) over immediate? [ LI ] [ LOAD32 ] if ;