1 ! Copyright (C) 2005, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: compiler.codegen.fixup kernel namespaces words
4 io.binary math math.order 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 -rot 72 0 63 x-insn ;
101 : FMR. ( a s -- ) 0 -rot 72 1 63 x-insn ;
102 : FCTIWZ ( a s -- ) 0 -rot 0 15 63 x-insn ;
103 : FCTIWZ. ( a s -- ) 0 -rot 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 0 rot ADDI ; inline
193 : SUBI neg ADDI ; inline
194 : LIS 0 rot ADDIS ; inline
195 : SUBIC neg ADDIC ; inline
196 : SUBIC. neg ADDIC. ; inline
197 : NOT dup NOR ; inline
198 : NOT. dup NOR. ; inline
200 : MR. dup OR. ; inline
201 : (SLWI) 0 31 pick - ; inline
202 : SLWI ( d a b -- ) (SLWI) RLWINM ;
203 : SLWI. ( d a b -- ) (SLWI) RLWINM. ;
204 : (SRWI) 32 over - swap 31 ; inline
205 : SRWI ( d a b -- ) (SRWI) RLWINM ;
206 : SRWI. ( d a b -- ) (SRWI) RLWINM. ;
207 : LOAD32 ( n r -- ) >r w>h/h r> tuck LIS dup rot ORI ;
208 : immediate? ( n -- ? ) HEX: -8000 HEX: 7fff between? ;
209 : LOAD ( n r -- ) over immediate? [ LI ] [ LOAD32 ] if ;