1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: compiler.codegen.fixup cpu.architecture
4 compiler.constants kernel namespaces make sequences words math
5 math.bitwise io.binary parser lexer ;
6 IN: cpu.ppc.assembler.backend
8 : insn ( operand opcode -- ) { 26 0 } bitfield , ;
10 : a-insn ( d a b c xo rc opcode -- )
11 [ { 0 1 6 11 16 21 } bitfield ] dip insn ;
13 : b-insn ( bo bi bd aa lk opcode -- )
14 [ { 0 1 2 16 21 } bitfield ] dip insn ;
16 : s>u16 ( s -- u ) HEX: ffff bitand ;
18 : d-insn ( d a simm opcode -- )
19 [ s>u16 { 0 16 21 } bitfield ] dip insn ;
21 : define-d-insn ( word opcode -- )
22 [ d-insn ] curry (( d a simm -- )) define-declared ;
24 : D: CREATE scan-word define-d-insn ; parsing
26 : sd-insn ( d a simm opcode -- )
27 [ s>u16 { 0 21 16 } bitfield ] dip insn ;
29 : define-sd-insn ( word opcode -- )
30 [ sd-insn ] curry (( d a simm -- )) define-declared ;
32 : SD: CREATE scan-word define-sd-insn ; parsing
34 : i-insn ( li aa lk opcode -- )
35 [ { 0 1 0 } bitfield ] dip insn ;
37 : x-insn ( a s b rc xo opcode -- )
38 [ { 1 0 11 21 16 } bitfield ] dip insn ;
40 : (X) ( -- word quot )
41 CREATE scan-word scan-word scan-word [ x-insn ] 3curry ;
43 : X: (X) (( a s b -- )) define-declared ; parsing
45 : (1) ( quot -- quot' ) [ 0 ] prepose ;
47 : X1: (X) (1) (( a s -- )) define-declared ; parsing
49 : xfx-insn ( d spr xo opcode -- )
50 [ { 1 11 21 } bitfield ] dip insn ;
52 : CREATE-MF ( -- word ) scan "MF" prepend create-in ;
55 CREATE-MF scan-word 5 shift [ 339 31 xfx-insn ] curry
56 (( d -- )) define-declared ; parsing
58 : CREATE-MT ( -- word ) scan "MT" prepend create-in ;
61 CREATE-MT scan-word 5 shift [ 467 31 xfx-insn ] curry
62 (( d -- )) define-declared ; parsing
64 : xo-insn ( d a b oe rc xo opcode -- )
65 [ { 1 0 10 11 16 21 } bitfield ] dip insn ;
67 : (XO) ( -- word quot )
68 CREATE scan-word scan-word scan-word scan-word
69 [ xo-insn ] 2curry 2curry ;
71 : XO: (XO) (( a s b -- )) define-declared ; parsing
73 : XO1: (XO) (1) (( a s -- )) define-declared ; parsing
75 GENERIC# (B) 2 ( dest aa lk -- )
76 M: integer (B) 18 i-insn ;
77 M: word (B) [ 0 ] 2dip (B) rc-relative-ppc-3 rel-word ;
78 M: label (B) [ 0 ] 2dip (B) rc-relative-ppc-3 label-fixup ;
80 GENERIC: BC ( a b c -- )
81 M: integer BC 0 0 16 b-insn ;
82 M: word BC [ 0 BC ] dip rc-relative-ppc-2 rel-word ;
83 M: label BC [ 0 BC ] dip rc-relative-ppc-2 label-fixup ;
85 : CREATE-B ( -- word ) scan "B" prepend create-in ;
88 CREATE-B scan-word scan-word
89 [ rot BC ] 2curry (( c -- )) define-declared ; parsing
92 CREATE-B scan-word scan-word scan-word scan-word scan-word
93 [ b-insn ] curry curry curry curry curry
94 (( bo -- )) define-declared ; parsing