]> gitweb.factorcode.org Git - factor.git/blob - basis/cpu/ppc/assembler/assembler.factor
Fix permission bits
[factor.git] / basis / cpu / ppc / assembler / assembler.factor
1 ! Copyright (C) 2005, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: compiler.generator.fixup kernel namespaces words
4 io.binary math math.order 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: LHAUX 0 375 31
70 X: LHAX 0 343 31
71 X: LHZUX 0 311 31
72 X: LHZX 0 279 31
73 X: LWZUX 0 55 31
74 X: LWZX 0 23 31
75 X: NAND 0 476 31
76 X: NAND. 1 476 31
77 X: NOR 0 124 31
78 X: NOR. 1 124 31
79 X: OR 0 444 31
80 X: OR. 1 444 31
81 X: ORC 0 412 31
82 X: ORC. 1 412 31
83 X: SLW 0 24 31
84 X: SLW. 1 24 31
85 X: SRAW 0 792 31
86 X: SRAW. 1 792 31
87 X: SRAWI 0 824 31
88 X: SRW 0 536 31
89 X: SRW. 1 536 31
90 X: STBUX 0 247 31
91 X: STBX 0 215 31
92 X: STHUX 0 439 31
93 X: STHX 0 407 31
94 X: STWUX 0 183 31
95 X: STWX 0 151 31
96 X: XOR 0 316 31
97 X: XOR. 1 316 31
98 X1: EXTSB 0 954 31
99 X1: EXTSB. 1 954 31
100 : FMR ( a s -- ) 0 -rot 72 0 63 x-insn ;
101 : FMR. ( a s -- ) 0 -rot 72 1 63 x-insn ;
102 : FCTIWZ ( a s -- ) 0 -rot 0 15 63 x-insn ;
103 : FCTIWZ. ( a s -- ) 0 -rot 1 15 63 x-insn ;
104
105 ! XO-form
106 XO: ADD 0 0 266 31
107 XO: ADD. 0 1 266 31
108 XO: ADDC 0 0 10 31
109 XO: ADDC. 0 1 10 31
110 XO: ADDCO 1 0 10 31
111 XO: ADDCO. 1 1 10 31
112 XO: ADDE 0 0 138 31
113 XO: ADDE. 0 1 138 31
114 XO: ADDEO 1 0 138 31
115 XO: ADDEO. 1 1 138 31
116 XO: ADDO 1 0 266 31
117 XO: ADDO. 1 1 266 31
118 XO: DIVW 0 0 491 31
119 XO: DIVW. 0 1 491 31
120 XO: DIVWO 1 0 491 31
121 XO: DIVWO. 1 1 491 31
122 XO: DIVWU 0 0 459 31
123 XO: DIVWU. 0 1 459 31
124 XO: DIVWUO 1 0 459 31
125 XO: DIVWUO. 1 1 459 31
126 XO: MULHW 0 0 75 31
127 XO: MULHW. 0 1 75 31
128 XO: MULHWU 0 0 11 31
129 XO: MULHWU. 0 1 11 31
130 XO: MULLW 0 0 235 31
131 XO: MULLW. 0 1 235 31
132 XO: MULLWO 1 0 235 31
133 XO: MULLWO. 1 1 235 31
134 XO: SUBF 0 0 40 31
135 XO: SUBF. 0 1 40 31
136 XO: SUBFC 0 0 8 31
137 XO: SUBFC. 0 1 8 31
138 XO: SUBFCO 1 0 8 31
139 XO: SUBFCO. 1 1 8 31
140 XO: SUBFE 0 0 136 31
141 XO: SUBFE. 0 1 136 31
142 XO: SUBFEO 1 0 136 31
143 XO: SUBFEO. 1 1 136 31
144 XO: SUBFO 1 0 40 31
145 XO: SUBFO. 1 1 40 31
146 XO1: NEG 0 0 104 31
147 XO1: NEG. 0 1 104 31
148 XO1: NEGO 1 0 104 31
149 XO1: NEGO. 1 1 104 31
150
151 ! A-form
152 : RLWINM ( d a b c xo -- ) 0 21 a-insn ;
153 : RLWINM. ( d a b c xo -- ) 1 21 a-insn ;
154 : FADD ( d a b -- ) 0 21 0 63 a-insn ;
155 : FADD. ( d a b -- ) 0 21 1 63 a-insn ;
156 : FSUB ( d a b -- ) 0 20 0 63 a-insn ;
157 : FSUB. ( d a b -- ) 0 20 1 63 a-insn ;
158 : FMUL ( d a c -- )  0 swap 25 0 63 a-insn ;
159 : FMUL. ( d a c -- ) 0 swap 25 1 63 a-insn ;
160 : FDIV ( d a b -- ) 0 18 0 63 a-insn ;
161 : FDIV. ( d a b -- ) 0 18 1 63 a-insn ;
162 : FSQRT ( d b -- ) 0 swap 0 22 0 63 a-insn ;
163 : FSQRT. ( d b -- ) 0 swap 0 22 1 63 a-insn ;
164
165 ! Branches
166 : B ( dest -- ) 0 0 (B) ;
167 : BL ( dest -- ) 0 1 (B) ;
168 BC: LT 12 0
169 BC: GE 4 0
170 BC: GT 12 1
171 BC: LE 4 1
172 BC: EQ 12 2
173 BC: NE 4 2
174 BC: O  12 3
175 BC: NO 4 3
176 B: CLR 0 8 0 0 19
177 B: CLRL 0 8 0 1 19
178 B: CCTR 0 264 0 0 19
179 : BLR ( -- ) 20 BCLR ;
180 : BLRL ( -- ) 20 BCLRL ;
181 : BCTR ( -- ) 20 BCCTR ;
182
183 ! Special registers
184 MFSPR: XER 1
185 MFSPR: LR 8
186 MFSPR: CTR 9
187 MTSPR: XER 1
188 MTSPR: LR 8
189 MTSPR: CTR 9
190
191 ! Pseudo-instructions
192 : LI 0 rot ADDI ; inline
193 : SUBI neg ADDI ; inline
194 : LIS 0 rot ADDIS ; inline
195 : SUBIC neg ADDIC ; inline
196 : SUBIC. neg ADDIC. ; inline
197 : NOT dup NOR ; inline
198 : NOT. dup NOR. ; inline
199 : MR dup OR ; inline
200 : MR. dup OR. ; inline
201 : (SLWI) 0 31 pick - ; inline
202 : SLWI ( d a b -- ) (SLWI) RLWINM ;
203 : SLWI. ( d a b -- ) (SLWI) RLWINM. ;
204 : (SRWI) 32 over - swap 31 ; inline
205 : SRWI ( d a b -- ) (SRWI) RLWINM ;
206 : SRWI. ( d a b -- ) (SRWI) RLWINM. ;
207 : LOAD32 ( n r -- ) >r w>h/h r> tuck LIS dup rot ORI ;
208 : immediate? ( n -- ? ) HEX: -8000 HEX: 7fff between? ;
209 : LOAD ( n r -- ) over immediate? [ LI ] [ LOAD32 ] if ;