PageRenderTime 47ms CodeModel.GetById 1ms app.highlight 42ms RepoModel.GetById 2ms app.codeStats 0ms

/extra/cpu/ppc/assembler/assembler.factor

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