]> gitweb.factorcode.org Git - factor.git/blob - core/compiler/ppc/assembler.factor
6dc9ca4e80fd09e5847721d8a0f63ec8627606f8
[factor.git] / core / compiler / ppc / assembler.factor
1 ! Copyright (C) 2005, 2006 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 IN: assembler
4 USING: compiler errors generic kernel math memory namespaces
5 words ;
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 : insn ( operand opcode -- ) 26 shift bitor , ;
19
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 ;
23
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 ;
27
28 : d-form ( d a simm -- n )
29     HEX: ffff bitand >r 16 shift >r 21 shift r> bitor r> bitor ;
30
31 : i-form ( li aa lk -- n )
32     >r 1 shift bitor r> bitor ;
33
34 : x-form ( a s b xo rc -- n )
35     swap
36     >r 1 shift >r 11 shift >r swap 16 shift >r 21 shift
37     r> bitor r> bitor r> bitor r> bitor ;
38
39 : xfx-form ( d spr xo -- n )
40     1 shift >r 11 shift >r 21 shift r> bitor r> bitor ;
41
42 : xo-form ( d a b oe rc xo -- n )
43     swap
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 ;
46
47 : ADDI d-form 14 insn ;   : LI 0 rot ADDI ;   : SUBI neg ADDI ;
48 : ADDIS d-form 15 insn ;  : LIS 0 rot ADDIS ;
49
50 : ADDIC d-form 12 insn ;  : SUBIC neg ADDIC ;
51
52 : ADDIC. d-form 13 insn ; : SUBIC. neg ADDIC. ;
53
54 : MULI d-form 7 insn ;
55
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) ;
59
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) ;
63
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) ;
67
68 : ANDI d-form 28 insn ;
69 : ANDIS d-form 29 insn ;
70
71 : (AND) 28 x-form 31 insn ;
72 : AND 0 (AND) ;  : AND. 0 (AND) ;
73
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) ;
77
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) ;
81
82 : (EQV) 284 x-form 31 insn ;
83 : EQV 0 (EQV) ;  : EQV. 1 (EQV) ;
84
85 : (NAND) 476 x-form 31 insn ;
86 : NAND 0 (NAND) ;  : NAND. 1 (NAND) ;
87
88 : (NOR) 124 x-form 31 insn ;
89 : NOR 0 (NOR) ;  : NOR. 1 (NOR) ;
90
91 : NOT dup NOR ;   : NOT. dup NOR. ;
92
93 : ORI d-form 24 insn ;  : ORIS d-form 25 insn ;
94
95 : (OR) 444 x-form 31 insn ;
96 : OR 0 (OR) ;  : OR. 1 (OR) ;
97
98 : (ORC) 412 x-form 31 insn ;
99 : ORC 0 (ORC) ;  : ORC. 1 (ORC) ;
100
101 : MR dup OR ;  : MR. dup OR. ;
102
103 : (MULHW) 75 xo-form 31 insn ;
104 : MULHW 0 0 (MULHW) ;  : MULHW. 0 1 (MULHW) ;
105
106 : MULLI d-form 7 insn ;
107
108 : (MULHWU) 11 xo-form 31 insn ;
109 : MULHWU 0 0 (MULHWU) ;  : MULHWU. 0 1 (MULHWU) ;
110
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) ;
114
115 : (SLW) 24 x-form 31 insn ;
116 : SLW 0 (SLW) ;  : SLW. 1 (SLW) ;
117
118 : (SRAW) 792 x-form 31 insn ;
119 : SRAW 0 (SRAW) ;  : SRAW. 1 (SRAW) ;
120
121 : (SRW) 536 x-form 31 insn ;
122 : SRW 0 (SRW) ;  : SRW. 1 (SRW) ;
123
124 : SRAWI 0 824 x-form 31 insn ;
125
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) ;
129
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) ;
133
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) ;
137
138 : XORI d-form 26 insn ;
139 : XORIS d-form 27 insn ;
140
141 : (XOR) 316 x-form 31 insn ;
142 : XOR 0 (XOR) ;  : XOR. 1 (XOR) ;
143
144 : CMPI d-form 11 insn ;
145 : CMPLI d-form 10 insn ;
146
147 : CMP 0 0 x-form 31 insn ;
148 : CMPL 0 32 x-form 31 insn ;
149
150 : (RLWINM) a-form 21 insn ;
151 : RLWINM 0 (RLWINM) ;  : RLWINM. 1 (RLWINM) ;
152
153 : SLWI 0 31 pick - RLWINM ;  : SLWI. 0 31 pick - RLWINM. ;
154
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 ;
159
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 ;
163
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 ;
168
169 : B 0 0 (B) ; : BL 0 1 (B) ;
170
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 ;
175
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 ;
180
181 : BCLR 0 8 0 0 b-form 19 insn ;
182 : BLR 20 BCLR ;
183 : BCLRL 0 8 0 1 b-form 19 insn ;
184 : BLRL 20 BCLRL ;
185 : BCCTR 0 264 0 0 b-form 19 insn ;
186 : BCTR 20 BCCTR ;
187
188 : MFSPR 5 shift 339 xfx-form 31 insn ;
189 : MFXER 1 MFSPR ;  : MFLR 8 MFSPR ;  : MFCTR 9 MFSPR ;
190
191 : MTSPR 5 shift 467 xfx-form 31 insn ;
192 : MTXER 1 MTSPR ;  : MTLR 8 MTSPR ;  : MTCTR 9 MTSPR ;
193
194 : LOAD32 >r w>h/h r> tuck LIS dup rot ORI ;
195
196 : LOAD ( n r -- )
197     #! PowerPC cannot load a 32 bit literal in one instruction.
198    >r dup -32768 32767 between? [ r> LI ] [ r> LOAD32 ] if ;
199
200 ! Floating point
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 ;
205
206 : (FMR) >r 0 -rot 72 r> x-form 63 insn ;
207 : FMR 0 (FMR) ;  : FMR. 1 (FMR) ;
208
209 : (FCTIWZ) >r 0 -rot r> 15 x-form 63 insn ;
210 : FCTIWZ 0 (FCTIWZ) ;  : FCTIWZ. 1 (FCTIWZ) ;
211
212 : (FADD) >r 0 21 r> a-form 63 insn ;
213 : FADD 0 (FADD) ;  : FADD. 1 (FADD) ;
214
215 : (FSUB) >r 0 20 r> a-form 63 insn ;
216 : FSUB 0 (FSUB) ;  : FSUB. 1 (FSUB) ;
217
218 : (FMUL) >r 0 swap 25 r> a-form 63 insn ;
219 : FMUL 0 (FMUL) ;  : FMUL. 1 (FMUL) ;
220
221 : (FDIV) >r 0 18 r> a-form 63 insn ;
222 : FDIV 0 (FDIV) ;  : FDIV. 1 (FDIV) ;
223
224 : (FSQRT) >r 0 swap 0 22 r> a-form 63 insn ;
225 : FSQRT 0 (FSQRT) ;  : FSQRT. 1 (FSQRT) ;
226
227 : FCMPU 0 0 x-form 63 insn ;
228 : FCMPO 0 32 x-form 63 insn ;