]> gitweb.factorcode.org Git - factor.git/blob - basis/cpu/ppc/assembler/assembler.factor
cpu.ppc.assembler: new opcodes: LFDUX LFDX LFSUX LFSX STFDUX STFDX STFSUX STFSX
[factor.git] / basis / cpu / ppc / assembler / assembler.factor
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 ;
5 IN: cpu.ppc.assembler
6
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:
11 !
12 ! stw r14,10(r15)
13 !
14 ! In Factor, we write:
15 !
16 ! 14 15 10 STW
17
18 ! D-form
19 D: ADDI 14
20 D: ADDIC 12
21 D: ADDIC. 13
22 D: ADDIS 15
23 D: CMPI 11
24 D: CMPLI 10
25 D: LBZ 34
26 D: LBZU 35
27 D: LFD 50
28 D: LFDU 51
29 D: LFS 48
30 D: LFSU 49
31 D: LHA 42
32 D: LHAU 43
33 D: LHZ 40
34 D: LHZU 41
35 D: LWZ 32
36 D: LWZU 33
37 D: MULI 7
38 D: MULLI 7
39 D: STB 38
40 D: STBU 39
41 D: STFD 54
42 D: STFDU 55
43 D: STFS 52
44 D: STFSU 53
45 D: STH 44
46 D: STHU 45
47 D: STW 36
48 D: STWU 37
49
50 ! SD-form
51 SD: ANDI 28
52 SD: ANDIS 29
53 SD: ORI 24
54 SD: ORIS 25
55 SD: XORI 26
56 SD: XORIS 27
57
58 ! X-form
59 X: AND 0 28 31
60 X: AND. 1 28 31
61 X: CMP 0 0 31
62 X: CMPL 0 32 31
63 X: EQV 0 284 31
64 X: EQV. 1 284 31
65 X: FCMPO 0 32 63
66 X: FCMPU 0 0 63
67 X: LBZUX 0 119 31
68 X: LBZX 0 87 31
69 X: LFDUX 0 631 31
70 X: LFDX 0 599 31
71 X: LFSUX 0 567 31
72 X: LFSX 0 535 31
73 X: LHAUX 0 375 31
74 X: LHAX 0 343 31
75 X: LHZUX 0 311 31
76 X: LHZX 0 279 31
77 X: LWZUX 0 55 31
78 X: LWZX 0 23 31
79 X: NAND 0 476 31
80 X: NAND. 1 476 31
81 X: NOR 0 124 31
82 X: NOR. 1 124 31
83 X: OR 0 444 31
84 X: OR. 1 444 31
85 X: ORC 0 412 31
86 X: ORC. 1 412 31
87 X: SLW 0 24 31
88 X: SLW. 1 24 31
89 X: SRAW 0 792 31
90 X: SRAW. 1 792 31
91 X: SRAWI 0 824 31
92 X: SRW 0 536 31
93 X: SRW. 1 536 31
94 X: STBUX 0 247 31
95 X: STBX 0 215 31
96 X: STFDUX 0 759 31
97 X: STFDX 0 727 31
98 X: STFSUX 0 695 31
99 X: STFSX 0 663 31
100 X: STHUX 0 439 31
101 X: STHX 0 407 31
102 X: STWUX 0 183 31
103 X: STWX 0 151 31
104 X: XOR 0 316 31
105 X: XOR. 1 316 31
106 X1: EXTSB 0 954 31
107 X1: EXTSB. 1 954 31
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 ;
114
115 ! XO-form
116 XO: ADD 0 0 266 31
117 XO: ADD. 0 1 266 31
118 XO: ADDC 0 0 10 31
119 XO: ADDC. 0 1 10 31
120 XO: ADDCO 1 0 10 31
121 XO: ADDCO. 1 1 10 31
122 XO: ADDE 0 0 138 31
123 XO: ADDE. 0 1 138 31
124 XO: ADDEO 1 0 138 31
125 XO: ADDEO. 1 1 138 31
126 XO: ADDO 1 0 266 31
127 XO: ADDO. 1 1 266 31
128 XO: DIVW 0 0 491 31
129 XO: DIVW. 0 1 491 31
130 XO: DIVWO 1 0 491 31
131 XO: DIVWO. 1 1 491 31
132 XO: DIVWU 0 0 459 31
133 XO: DIVWU. 0 1 459 31
134 XO: DIVWUO 1 0 459 31
135 XO: DIVWUO. 1 1 459 31
136 XO: MULHW 0 0 75 31
137 XO: MULHW. 0 1 75 31
138 XO: MULHWU 0 0 11 31
139 XO: MULHWU. 0 1 11 31
140 XO: MULLW 0 0 235 31
141 XO: MULLW. 0 1 235 31
142 XO: MULLWO 1 0 235 31
143 XO: MULLWO. 1 1 235 31
144 XO: SUBF 0 0 40 31
145 XO: SUBF. 0 1 40 31
146 XO: SUBFC 0 0 8 31
147 XO: SUBFC. 0 1 8 31
148 XO: SUBFCO 1 0 8 31
149 XO: SUBFCO. 1 1 8 31
150 XO: SUBFE 0 0 136 31
151 XO: SUBFE. 0 1 136 31
152 XO: SUBFEO 1 0 136 31
153 XO: SUBFEO. 1 1 136 31
154 XO: SUBFO 1 0 40 31
155 XO: SUBFO. 1 1 40 31
156 XO1: NEG 0 0 104 31
157 XO1: NEG. 0 1 104 31
158 XO1: NEGO 1 0 104 31
159 XO1: NEGO. 1 1 104 31
160
161 ! A-form
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 ;
174
175 ! Branches
176 : B ( dest -- ) 0 0 (B) ;
177 : BL ( dest -- ) 0 1 (B) ;
178 BC: LT 12 0
179 BC: GE 4 0
180 BC: GT 12 1
181 BC: LE 4 1
182 BC: EQ 12 2
183 BC: NE 4 2
184 BC: O  12 3
185 BC: NO 4 3
186 B: CLR 0 8 0 0 19
187 B: CLRL 0 8 0 1 19
188 B: CCTR 0 264 0 0 19
189 : BLR ( -- ) 20 BCLR ;
190 : BLRL ( -- ) 20 BCLRL ;
191 : BCTR ( -- ) 20 BCCTR ;
192
193 ! Special registers
194 MFSPR: XER 1
195 MFSPR: LR 8
196 MFSPR: CTR 9
197 MTSPR: XER 1
198 MTSPR: LR 8
199 MTSPR: CTR 9
200
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. ;
217 :: LOAD32 ( n r -- )
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 ;
222
223 ! Altivec/VMX instructions
224 VA: VMHADDSHS  32 4
225 VA: VMHRADDSHS 33 4
226 VA: VMLADDUHM  34 4
227 VA: VMSUMUBM   36 4
228 VA: VMSUMMBM   37 4
229 VA: VMSUMUHM   38 4
230 VA: VMSUMUHS   39 4
231 VA: VMSUMSHM   40 4
232 VA: VMSUMSHS   41 4
233 VA: VSEL       42 4
234 VA: VPERM      43 4
235 VA: VSLDOI     44 4
236 VA: VMADDFP    46 4
237 VA: VNMSUBFP   47 4
238
239 VX: VADDUBM    0 4
240 VX: VADDUHM   64 4
241 VX: VADDUWM  128 4
242 VX: VADDCUW  384 4
243 VX: VADDUBS  512 4
244 VX: VADDUHS  576 4
245 VX: VADDUWS  640 4
246 VX: VADDSBS  768 4
247 VX: VADDSHS  832 4
248 VX: VADDSWS  896 4
249
250 VX: VSUBUBM 1024 4
251 VX: VSUBUHM 1088 4
252 VX: VSUBUWM 1152 4
253 VX: VSUBCUW 1408 4
254 VX: VSUBUBS 1536 4
255 VX: VSUBUHS 1600 4
256 VX: VSUBUWS 1664 4
257 VX: VSUBSBS 1792 4
258 VX: VSUBSHS 1856 4
259 VX: VSUBSWS 1920 4
260
261 VX: VMAXUB    2 4
262 VX: VMAXUH   66 4
263 VX: VMAXUW  130 4
264 VX: VMAXSB  258 4
265 VX: VMAXSH  322 4
266 VX: VMAXSW  386 4
267
268 VX: VMINUB  514 4
269 VX: VMINUH  578 4
270 VX: VMINUW  642 4
271 VX: VMINSB  770 4
272 VX: VMINSH  834 4
273 VX: VMINSW  898 4
274
275 VX: VAVGUB 1026 4
276 VX: VAVGUH 1090 4
277 VX: VAVGUW 1154 4
278 VX: VAVGSB 1282 4
279 VX: VAVGSH 1346 4
280 VX: VAVGSW 1410 4
281
282 VX: VRLB      4 4
283 VX: VRLH     68 4
284 VX: VRLW    132 4
285 VX: VSLB    260 4
286 VX: VSLH    324 4
287 VX: VSLW    388 4
288 VX: VSL     452 4
289 VX: VSRB    516 4
290 VX: VSRH    580 4
291 VX: VSRW    644 4
292 VX: VSR     708 4
293 VX: VSRAB   772 4
294 VX: VSRAH   836 4
295 VX: VSRAW   900 4
296
297 VX: VAND   1028 4
298 VX: VANDC  1092 4
299 VX: VOR    1156 4
300 VX: VNOR   1284 4
301 VX: VXOR   1220 4
302
303 VXD: MFVSCR 1540 4
304 VXB: MTVSCR 1604 4
305
306 VX: VMULOUB     8 4
307 VX: VMULOUH    72 4
308 VX: VMULOSB   264 4
309 VX: VMULOSH   328 4
310 VX: VMULEUB   520 4
311 VX: VMULEUH   584 4
312 VX: VMULESB   776 4
313 VX: VMULESH   840 4
314 VX: VSUM4UBS 1544 4
315 VX: VSUM4SBS 1800 4
316 VX: VSUM4SHS 1608 4
317 VX: VSUM2SWS 1672 4
318 VX: VSUMSWS  1928 4
319
320 VX: VADDFP        10 4
321 VX: VSUBFP        74 4
322
323 VXDB: VREFP      266 4
324 VXDB: VRSQRTEFP  330 4
325 VXDB: VEXPTEFP   394 4
326 VXDB: VLOGEFP    458 4
327 VXDB: VRFIN      522 4
328 VXDB: VRFIZ      586 4
329 VXDB: VRFIP      650 4
330 VXDB: VRFIM      714 4
331
332 VX: VCFUX        778 4
333 VX: VCFSX        842 4
334 VX: VCTUXS       906 4
335 VX: VCTSXS       970 4
336
337 VX: VMAXFP      1034 4
338 VX: VMINFP      1098 4
339
340 VX: VMRGHB        12 4
341 VX: VMRGHH        76 4
342 VX: VMRGHW       140 4
343 VX: VMRGLB       268 4
344 VX: VMRGLH       332 4
345 VX: VMRGLW       396 4
346
347 VX: VSPLTB       524 4
348 VX: VSPLTH       588 4
349 VX: VSPLTW       652 4
350
351 VXA: VSPLTISB    780 4
352 VXA: VSPLTISH    844 4
353 VXA: VSPLTISW    908 4
354
355 VX: VSLO       1036 4
356 VX: VSRO       1100 4
357
358 VX: VPKUHUM      14 4 
359 VX: VPKUWUM      78 4 
360 VX: VPKUHUS     142 4 
361 VX: VPKUWUS     206 4 
362 VX: VPKSHUS     270 4 
363 VX: VPKSWUS     334 4 
364 VX: VPKSHSS     398 4 
365 VX: VPKSWSS     462 4 
366 VX: VPKPX       782 4 
367
368 VXDB: VUPKHSB   526 4 
369 VXDB: VUPKHSH   590 4 
370 VXDB: VUPKLSB   654 4 
371 VXDB: VUPKLSH   718 4 
372 VXDB: VUPKHPX   846 4 
373 VXDB: VUPKLPX   974 4 
374
375 : -T ( strm a b -- strm-t a b ) [ 16 bitor ] 2dip ;
376
377 XD: DST 0 342 31
378 : DSTT ( strm a b -- ) -T DST ;
379
380 XD: DSTST 0 374 31
381 : DSTSTT ( strm a b -- ) -T DSTST ;
382
383 XD: (DSS) 0 822 31
384 : DSS ( strm -- ) 0 0 (DSS) ;
385 : DSSALL ( -- ) 16 0 0 (DSS) ;
386
387 XD: LVEBX 0    7 31
388 XD: LVEHX 0   39 31
389 XD: LVEWX 0   71 31
390 XD: LVSL  0    6 31
391 XD: LVSR  0   38 31
392 XD: LVX   0  103 31
393 XD: LVXL  0  359 31
394
395 XD: STVEBX 0  135 31
396 XD: STVEHX 0  167 31
397 XD: STVEWX 0  199 31
398 XD: STVX   0  231 31
399 XD: STVXL  0  487 31
400
401 VXR: VCMPBFP   0  966 4
402 VXR: VCMPEQFP  0  198 4
403 VXR: VCMPEQUB  0    6 4
404 VXR: VCMPEQUH  0   70 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
414
415 VXR: VCMPBFP.  1  966 4
416 VXR: VCMPEQFP. 1  198 4
417 VXR: VCMPEQUB. 1    6 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
428