]> gitweb.factorcode.org Git - factor.git/blob - basis/bootstrap/assembler/arm.64.factor
factor: trim using lists
[factor.git] / basis / bootstrap / assembler / arm.64.factor
1 ! Copyright (C) 2020 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: bootstrap.image.private compiler.codegen.relocation
4 compiler.constants compiler.units cpu.arm.assembler
5 cpu.arm.assembler.opcodes generic.single.private
6 kernel kernel.private layouts locals.backend
7 math math.private memory namespaces sequences slots.private
8 strings.private threads.private vocabs ;
9 IN: bootstrap.arm
10
11 8 \ cell set
12
13 : ds-reg ( -- reg ) X5 ;
14 : rs-reg ( -- reg ) X6 ;
15
16 ! caller-saved registers X9-X15
17 ! callee-saved registers X19-X29
18 : temp0 ( -- reg ) X9 ;
19 : temp1 ( -- reg ) X10 ;
20 : temp2 ( -- reg ) X11 ;
21 : temp3 ( -- reg ) X12 ;
22
23
24 [
25 ] JIT-SAFEPOINT jit-define
26
27 [
28 ] JIT-PRIMITIVE jit-define
29
30 [
31 ] JIT-WORD-JUMP jit-define
32
33 [
34 ] PIC-CHECK-TUPLE jit-define
35
36 [
37 ] CALLBACK-STUB jit-define
38
39 [
40 ] JIT-PUSH-LITERAL jit-define
41
42 [
43 ] JIT-WORD-CALL jit-define
44
45 [
46 ] JIT-IF jit-define
47
48 : jit->r ( -- )
49     1 bootstrap-cells rs-reg rs-reg ADDi64
50     -1 bootstrap-cells ds-reg rs-reg LDR-post ;
51
52 : jit-r> ( -- )
53     1 bootstrap-cells ds-reg ds-reg ADDi64
54     -1 bootstrap-cells rs-reg ds-reg LDR-post ;
55
56 : jit-2>r ( -- )
57     1 bootstrap-cells rs-reg rs-reg ADDi64
58     -1 bootstrap-cells ds-reg rs-reg LDR-post
59     1 bootstrap-cells rs-reg rs-reg ADDi64
60     -1 bootstrap-cells ds-reg rs-reg LDR-post ;
61
62 : jit-2r> ( -- )
63     1 bootstrap-cells ds-reg ds-reg ADDi64
64     -1 bootstrap-cells rs-reg ds-reg LDR-post
65     1 bootstrap-cells ds-reg ds-reg ADDi64
66     -1 bootstrap-cells rs-reg ds-reg LDR-post ;
67
68 : jit-3>r ( -- )
69     1 bootstrap-cells rs-reg rs-reg ADDi64
70     -1 bootstrap-cells ds-reg rs-reg LDR-post
71     1 bootstrap-cells rs-reg rs-reg ADDi64
72     -1 bootstrap-cells ds-reg rs-reg LDR-post
73     1 bootstrap-cells rs-reg rs-reg ADDi64
74     -1 bootstrap-cells ds-reg rs-reg LDR-post ;
75
76 : jit-3r> ( -- )
77     1 bootstrap-cells ds-reg ds-reg ADDi64
78     -1 bootstrap-cells rs-reg ds-reg LDR-post
79     1 bootstrap-cells ds-reg ds-reg ADDi64
80     -1 bootstrap-cells rs-reg ds-reg LDR-post
81     1 bootstrap-cells ds-reg ds-reg ADDi64
82     -1 bootstrap-cells rs-reg ds-reg LDR-post ;
83
84 [
85     ! jit->r
86     ! 0 CALL f rc-relative rel-word
87     ! jit-r>
88 ] JIT-DIP jit-define
89
90 [
91 ] JIT-2DIP jit-define
92
93 [
94 ] JIT-3DIP jit-define
95
96 [
97 ] JIT-EXECUTE jit-define
98
99 [
100 ] JIT-PROLOG jit-define
101
102 [
103 ] JIT-EPILOG jit-define
104
105 [
106 ] JIT-RETURN jit-define
107
108
109 ! ! ! Polymorphic inline caches
110 ! The PIC stubs are not permitted to touch pic-tail-reg.
111
112 ! Load a value from a stack position
113 [
114 ] PIC-LOAD jit-define
115
116 [
117 ] PIC-TAG jit-define
118
119
120 [
121 ] PIC-TUPLE jit-define
122
123 [
124 ] PIC-CHECK-TAG jit-define
125
126 [
127 ] PIC-HIT jit-define
128
129 [
130 ] MEGA-LOOKUP jit-define
131
132
133 {
134     ! ## Fixnums
135
136     ! ### Add
137     { fixnum+fast [
138     ] }
139
140     ! ### Bit stuff
141     { fixnum-bitand [
142     ] }
143     { fixnum-bitnot [
144     ] }
145     { fixnum-bitor [
146     ] }
147     { fixnum-bitxor [
148     ] }
149     { fixnum-shift-fast [
150     ] }
151
152     ! ### Comparisons
153     { both-fixnums? [
154     ] }
155     { eq? [
156     ] }
157     { fixnum> [
158     ] }
159     { fixnum>= [
160     ] }
161     { fixnum< [
162     ] }
163     { fixnum<= [
164     ] }
165
166     ! ### Div/mod
167     { fixnum-mod [
168     ] }
169     { fixnum/i-fast [
170     ] }
171     { fixnum/mod-fast [
172     ] }
173
174     ! ### Mul
175     { fixnum*fast [
176     ] }
177
178     ! ### Sub
179     { fixnum-fast [
180     ] }
181
182     ! ## Locals
183     { drop-locals [
184     ] }
185     { get-local [
186     ] }
187     { load-local [
188     ] }
189
190     ! ## Objects
191     { slot [
192     ] }
193     { string-nth-fast [
194     ] }
195     { tag [
196     ] }
197
198     ! ## Shufflers
199
200     ! ### Drops
201     { drop [ ] } ! ds-reg SUBi64 ] } ! ds-reg bootstrap-cell SUB ] }
202     { 2drop [ ] } ! ds-reg 2 bootstrap-cells SUB ] }
203     { 3drop [ ] } ! ds-reg 3 bootstrap-cells SUB ] }
204     { 4drop [ ] } ! ds-reg 4 bootstrap-cells SUB ] }
205
206     ! ### Dups
207     { dup [
208     ] }
209     { 2dup [
210     ] }
211     { 3dup [
212     ] }
213     { 4dup [
214     ] }
215     { dupd [
216     ] }
217
218     ! ### Misc shufflers
219     { over [
220     ] }
221     { pick [
222     ] }
223
224     ! ### Nips
225     { nip [
226     ] }
227     { 2nip [
228     ] }
229
230     ! ### Swaps
231     { -rot [
232     ] }
233     { rot [
234     ] }
235     { swap [
236     ] }
237     { swapd [
238     ] }
239
240     ! ## Signal handling
241     { leaf-signal-handler [
242     ] }
243     { signal-handler [
244     ] }
245
246
247 } define-sub-primitives