1 ! Copyright (C) 2005, 2006 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: compiler errors generic kernel math memory namespaces
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:
18 : insn ( operand opcode -- ) 26 shift bitor , ;
20 : a-form ( d a b c xo rc -- n )
21 >r 1 shift >r 6 shift >r 11 shift >r 16 shift >r 21 shift
22 r> bitor r> bitor r> bitor r> bitor r> bitor ;
24 : b-form ( bo bi bd aa lk -- n )
25 >r 1 shift >r 2 shift >r 16 shift >r 21 shift
26 r> bitor r> bitor r> bitor r> bitor ;
28 : d-form ( d a simm -- n )
29 HEX: ffff bitand >r 16 shift >r 21 shift r> bitor r> bitor ;
31 : i-form ( li aa lk -- n )
32 >r 1 shift bitor r> bitor ;
34 : x-form ( a s b xo rc -- n )
36 >r 1 shift >r 11 shift >r swap 16 shift >r 21 shift
37 r> bitor r> bitor r> bitor r> bitor ;
39 : xfx-form ( d spr xo -- n )
40 1 shift >r 11 shift >r 21 shift r> bitor r> bitor ;
42 : xo-form ( d a b oe rc xo -- n )
44 >r 1 shift >r 10 shift >r 11 shift >r 16 shift >r 21 shift
45 r> bitor r> bitor r> bitor r> bitor r> bitor ;
47 : ADDI d-form 14 insn ; : LI 0 rot ADDI ; : SUBI neg ADDI ;
48 : ADDIS d-form 15 insn ; : LIS 0 rot ADDIS ;
50 : ADDIC d-form 12 insn ; : SUBIC neg ADDIC ;
52 : ADDIC. d-form 13 insn ; : SUBIC. neg ADDIC. ;
54 : MULI d-form 7 insn ;
56 : (ADD) 266 xo-form 31 insn ;
57 : ADD 0 0 (ADD) ; : ADD. 0 1 (ADD) ;
58 : ADDO 1 0 (ADD) ; : ADDO. 1 1 (ADD) ;
60 : (ADDC) 10 xo-form 31 insn ;
61 : ADDC 0 0 (ADDC) ; : ADDC. 0 1 (ADDC) ;
62 : ADDCO 1 0 (ADDC) ; : ADDCO. 1 1 (ADDC) ;
64 : (ADDE) 138 xo-form 31 insn ;
65 : ADDE 0 0 (ADDE) ; : ADDE. 0 1 (ADDE) ;
66 : ADDEO 1 0 (ADDE) ; : ADDEO. 1 1 (ADDE) ;
68 : ANDI d-form 28 insn ;
69 : ANDIS d-form 29 insn ;
71 : (AND) 28 x-form 31 insn ;
72 : AND 0 (AND) ; : AND. 0 (AND) ;
74 : (DIVW) 491 xo-form 31 insn ;
75 : DIVW 0 0 (DIVW) ; : DIVW. 0 1 (DIVW) ;
76 : DIVWO 1 0 (DIVW) ; : DIVWO. 1 1 (DIVW) ;
78 : (DIVWU) 459 xo-form 31 insn ;
79 : DIVWU 0 0 (DIVWU) ; : DIVWU. 0 1 (DIVWU) ;
80 : DIVWUO 1 0 (DIVWU) ; : DIVWUO. 1 1 (DIVWU) ;
82 : (EQV) 284 x-form 31 insn ;
83 : EQV 0 (EQV) ; : EQV. 1 (EQV) ;
85 : (NAND) 476 x-form 31 insn ;
86 : NAND 0 (NAND) ; : NAND. 1 (NAND) ;
88 : (NOR) 124 x-form 31 insn ;
89 : NOR 0 (NOR) ; : NOR. 1 (NOR) ;
91 : NOT dup NOR ; : NOT. dup NOR. ;
93 : ORI d-form 24 insn ; : ORIS d-form 25 insn ;
95 : (OR) 444 x-form 31 insn ;
96 : OR 0 (OR) ; : OR. 1 (OR) ;
98 : (ORC) 412 x-form 31 insn ;
99 : ORC 0 (ORC) ; : ORC. 1 (ORC) ;
101 : MR dup OR ; : MR. dup OR. ;
103 : (MULHW) 75 xo-form 31 insn ;
104 : MULHW 0 0 (MULHW) ; : MULHW. 0 1 (MULHW) ;
106 : MULLI d-form 7 insn ;
108 : (MULHWU) 11 xo-form 31 insn ;
109 : MULHWU 0 0 (MULHWU) ; : MULHWU. 0 1 (MULHWU) ;
111 : (MULLW) 235 xo-form 31 insn ;
112 : MULLW 0 0 (MULLW) ; : MULLW. 0 1 (MULLW) ;
113 : MULLWO 1 0 (MULLW) ; : MULLWO. 1 1 (MULLW) ;
115 : (SLW) 24 x-form 31 insn ;
116 : SLW 0 (SLW) ; : SLW. 1 (SLW) ;
118 : (SRAW) 792 x-form 31 insn ;
119 : SRAW 0 (SRAW) ; : SRAW. 1 (SRAW) ;
121 : (SRW) 536 x-form 31 insn ;
122 : SRW 0 (SRW) ; : SRW. 1 (SRW) ;
124 : SRAWI 0 824 x-form 31 insn ;
126 : (SUBF) 40 xo-form 31 insn ;
127 : SUBF 0 0 (SUBF) ; : SUBF. 0 1 (SUBF) ;
128 : SUBFO 1 0 (SUBF) ; : SUBFO. 1 1 (SUBF) ;
130 : (SUBFC) 8 xo-form 31 insn ;
131 : SUBFC 0 0 (SUBFC) ; : SUBFC. 0 1 (SUBFC) ;
132 : SUBFCO 1 0 (SUBFC) ; : SUBFCO. 1 1 (SUBFC) ;
134 : (SUBFE) 136 xo-form 31 insn ;
135 : SUBFE 0 0 (SUBFE) ; : SUBFE. 0 1 (SUBFE) ;
136 : SUBFEO 1 0 (SUBFE) ; : SUBFEO. 1 1 (SUBFE) ;
138 : XORI d-form 26 insn ;
139 : XORIS d-form 27 insn ;
141 : (XOR) 316 x-form 31 insn ;
142 : XOR 0 (XOR) ; : XOR. 1 (XOR) ;
144 : CMPI d-form 11 insn ;
145 : CMPLI d-form 10 insn ;
147 : CMP 0 0 x-form 31 insn ;
148 : CMPL 0 32 x-form 31 insn ;
150 : (RLWINM) a-form 21 insn ;
151 : RLWINM 0 (RLWINM) ; : RLWINM. 1 (RLWINM) ;
153 : SLWI 0 31 pick - RLWINM ; : SLWI. 0 31 pick - RLWINM. ;
155 : LBZ d-form 34 insn ; : LBZU d-form 35 insn ;
156 : LHA d-form 42 insn ; : LHAU d-form 43 insn ;
157 : LHZ d-form 40 insn ; : LHZU d-form 41 insn ;
158 : LWZ d-form 32 insn ; : LWZU d-form 33 insn ;
160 : STB d-form 38 insn ; : STBU d-form 39 insn ;
161 : STH d-form 44 insn ; : STHU d-form 45 insn ;
162 : STW d-form 36 insn ; : STWU d-form 37 insn ;
164 G: (B) ( dest aa lk -- ) 2 standard-combination ;
165 M: integer (B) i-form 18 insn ;
166 M: word (B) 0 -rot (B) rel-relative-3 rel-word ;
167 M: label (B) 0 -rot (B) rel-relative-3 rel-label ;
169 : B 0 0 (B) ; : BL 0 1 (B) ;
171 GENERIC: BC ( a b c -- )
172 M: integer BC 0 0 b-form 16 insn ;
173 M: word BC >r 0 BC r> rel-relative-2 rel-word ;
174 M: label BC >r 0 BC r> rel-relative-2 rel-label ;
176 : BLT 12 0 rot BC ; : BGE 4 0 rot BC ;
177 : BGT 12 1 rot BC ; : BLE 4 1 rot BC ;
178 : BEQ 12 2 rot BC ; : BNE 4 2 rot BC ;
179 : BO 12 3 rot BC ; : BNO 4 3 rot BC ;
181 : BCLR 0 8 0 0 b-form 19 insn ;
183 : BCLRL 0 8 0 1 b-form 19 insn ;
185 : BCCTR 0 264 0 0 b-form 19 insn ;
188 : MFSPR 5 shift 339 xfx-form 31 insn ;
189 : MFXER 1 MFSPR ; : MFLR 8 MFSPR ; : MFCTR 9 MFSPR ;
191 : MTSPR 5 shift 467 xfx-form 31 insn ;
192 : MTXER 1 MTSPR ; : MTLR 8 MTSPR ; : MTCTR 9 MTSPR ;
194 : LOAD32 >r w>h/h r> tuck LIS dup rot ORI ;
197 #! PowerPC cannot load a 32 bit literal in one instruction.
198 >r dup -32768 32767 between? [ r> LI ] [ r> LOAD32 ] if ;
201 : LFS d-form 48 insn ; : LFSU d-form 49 insn ;
202 : LFD d-form 50 insn ; : LFDU d-form 51 insn ;
203 : STFS d-form 52 insn ; : STFSU d-form 53 insn ;
204 : STFD d-form 54 insn ; : STFDU d-form 55 insn ;
206 : (FMR) >r 0 -rot 72 r> x-form 63 insn ;
207 : FMR 0 (FMR) ; : FMR. 1 (FMR) ;
209 : (FCTIWZ) >r 0 -rot r> 15 x-form 63 insn ;
210 : FCTIWZ 0 (FCTIWZ) ; : FCTIWZ. 1 (FCTIWZ) ;
212 : (FADD) >r 0 21 r> a-form 63 insn ;
213 : FADD 0 (FADD) ; : FADD. 1 (FADD) ;
215 : (FSUB) >r 0 20 r> a-form 63 insn ;
216 : FSUB 0 (FSUB) ; : FSUB. 1 (FSUB) ;
218 : (FMUL) >r 0 swap 25 r> a-form 63 insn ;
219 : FMUL 0 (FMUL) ; : FMUL. 1 (FMUL) ;
221 : (FDIV) >r 0 18 r> a-form 63 insn ;
222 : FDIV 0 (FDIV) ; : FDIV. 1 (FDIV) ;
224 : (FSQRT) >r 0 swap 0 22 r> a-form 63 insn ;
225 : FSQRT 0 (FSQRT) ; : FSQRT. 1 (FSQRT) ;
227 : FCMPU 0 0 x-form 63 insn ;
228 : FCMPO 0 32 x-form 63 insn ;