7 # define szof_ui szof_i
21 muli %r0 %r0 szof##T \
25 bger fill##T##done %v0 %v1 \
28 addi %v0 %v0 szof##T \
41 muli %r0 %r0 szof##T \
45 bger fill##T##done %v0 %v1 \
48 addi %v0 %v0 szof##T \
54 #define fill_uc fill_c
55 #define fill_us fill_s
56 #define fill_ui fill_i
58 #define ARG( T, N) arg##T $arg##T##N
59 #define ARGF( T, N) arg##T $arg##T##N
60 #define ARG1( K, T) ARG##K(T, 0)
61 #define ARG2( K, T) ARG1( K, T) ARG##K(T, 1)
62 #define ARG3( K, T) ARG2( K, T) ARG##K(T, 2)
63 #define ARG4( K, T) ARG3( K, T) ARG##K(T, 3)
64 #define ARG5( K, T) ARG4( K, T) ARG##K(T, 4)
65 #define ARG6( K, T) ARG5( K, T) ARG##K(T, 5)
66 #define ARG7( K, T) ARG6( K, T) ARG##K(T, 6)
67 #define ARG8( K, T) ARG7( K, T) ARG##K(T, 7)
68 #define ARG9( K, T) ARG8( K, T) ARG##K(T, 8)
69 #define ARG10(K, T) ARG9( K, T) ARG##K(T, 9)
70 #define ARG11(K, T) ARG10(K, T) ARG##K(T, 10)
71 #define ARG12(K, T) ARG11(K, T) ARG##K(T, 11)
72 #define ARG13(K, T) ARG12(K, T) ARG##K(T, 12)
73 #define ARG14(K, T) ARG13(K, T) ARG##K(T, 13)
74 #define ARG15(K, T) ARG14(K, T) ARG##K(T, 14)
75 #define ARG16(K, T) ARG15(K, T) ARG##K(T, 15)
76 #define ARG_c(N) ARG##N( , _c)
77 #define ARG_uc(N) ARG##N( , _c)
78 #define ARG_s(N) ARG##N( , _s)
79 #define ARG_us(N) ARG##N( , _s)
80 #define ARG_i(N) ARG##N( , _i)
81 #define ARG_ui(N) ARG##N( , _i)
82 #define ARG_l(N) ARG##N( , _l)
83 #define ARG_f(N) ARG##N(F, _f)
84 #define ARG_d(N) ARG##N(F, _d)
86 #define CHK(N, T, TT, V) \
87 getarg##T %r0 $arg##TT##V \
88 ldxi##T %r1 %v0 $(V * szof##T) \
89 beqr N##T##V %r0 %r1 \
92 #define CHKF(N, T, TT, V) \
93 getarg##T %f0 $arg##TT##V \
94 ldxi##T %f1 %v0 $(V * szof##T) \
95 beqr##T N##T##V %f0 %f1 \
99 #define GET1( K, N, T, TT, V) CHK##K(N, T, TT, 0)
100 #define GET2( K, N, T, TT, V) GET1( K, N, T, TT, V) CHK##K(N, T, TT, 1)
101 #define GET3( K, N, T, TT, V) GET2( K, N, T, TT, V) CHK##K(N, T, TT, 2)
102 #define GET4( K, N, T, TT, V) GET3( K, N, T, TT, V) CHK##K(N, T, TT, 3)
103 #define GET5( K, N, T, TT, V) GET4( K, N, T, TT, V) CHK##K(N, T, TT, 4)
104 #define GET6( K, N, T, TT, V) GET5( K, N, T, TT, V) CHK##K(N, T, TT, 5)
105 #define GET7( K, N, T, TT, V) GET6( K, N, T, TT, V) CHK##K(N, T, TT, 6)
106 #define GET8( K, N, T, TT, V) GET7( K, N, T, TT, V) CHK##K(N, T, TT, 7)
107 #define GET9( K, N, T, TT, V) GET8( K, N, T, TT, V) CHK##K(N, T, TT, 8)
108 #define GET10(K, N, T, TT, V) GET9( K, N, T, TT, V) CHK##K(N, T, TT, 9)
109 #define GET11(K, N, T, TT, V) GET10(K, N, T, TT, V) CHK##K(N, T, TT, 10)
110 #define GET12(K, N, T, TT, V) GET11(K, N, T, TT, V) CHK##K(N, T, TT, 11)
111 #define GET13(K, N, T, TT, V) GET12(K, N, T, TT, V) CHK##K(N, T, TT, 12)
112 #define GET14(K, N, T, TT, V) GET13(K, N, T, TT, V) CHK##K(N, T, TT, 13)
113 #define GET15(K, N, T, TT, V) GET14(K, N, T, TT, V) CHK##K(N, T, TT, 14)
114 #define GET16(K, N, T, TT, V) GET15(K, N, T, TT, V) CHK##K(N, T, TT, 15)
116 #define GET_c(N, M) GET##N( , c##N, _c, _c, M)
117 #define GET_uc(N, M) GET##N( , uc##N, _uc, _c, M)
118 #define GET_s(N, M) GET##N( , s##N, _s, _s, M)
119 #define GET_us(N, M) GET##N( , us##N, _us, _s, M)
120 #define GET_i(N, M) GET##N( , i##N, _i, _i, M)
121 #define GET_ui(N, M) GET##N( , ui##N, _ui, _i, M)
122 #define GET_l(N, M) GET##N( , l##N, _l, _l, M)
123 #define GET_f(N, M) GET##N(F, f##N, _f, _f, M)
124 #define GET_d(N, M) GET##N(F, d##N, _d, _d, M)
126 #define PUSH( T, V) pushargi##T V
127 #define PUSHF( T, V) pushargi##T V
128 #define PUSH0( K, T) /**/
129 #define PUSH1( K, T) PUSH##K(T, 0)
130 #define PUSH2( K, T) PUSH1( K, T) PUSH##K(T, 1)
131 #define PUSH3( K, T) PUSH2( K, T) PUSH##K(T, 2)
132 #define PUSH4( K, T) PUSH3( K, T) PUSH##K(T, 3)
133 #define PUSH5( K, T) PUSH4( K, T) PUSH##K(T, 4)
134 #define PUSH6( K, T) PUSH5( K, T) PUSH##K(T, 5)
135 #define PUSH7( K, T) PUSH6( K, T) PUSH##K(T, 6)
136 #define PUSH8( K, T) PUSH7( K, T) PUSH##K(T, 7)
137 #define PUSH9( K, T) PUSH8( K, T) PUSH##K(T, 8)
138 #define PUSH10(K, T) PUSH9( K, T) PUSH##K(T, 9)
139 #define PUSH11(K, T) PUSH10(K, T) PUSH##K(T, 10)
140 #define PUSH12(K, T) PUSH11(K, T) PUSH##K(T, 11)
141 #define PUSH13(K, T) PUSH12(K, T) PUSH##K(T, 12)
142 #define PUSH14(K, T) PUSH13(K, T) PUSH##K(T, 13)
143 #define PUSH15(K, T) PUSH14(K, T) PUSH##K(T, 14)
144 #define PUSH16(K, T) PUSH15(K, T) PUSH##K(T, 15)
146 #define PUSH_c( N) PUSH##N( , _c)
147 #define PUSH_uc(N) PUSH##N( , _uc)
148 #define PUSH_s( N) PUSH##N( , _s)
149 #define PUSH_us(N) PUSH##N( , _us)
150 #define PUSH_i( N) PUSH##N( , _i)
151 #define PUSH_ui(N) PUSH##N( , _ui)
152 #define PUSH_l( N) PUSH##N( , _l)
153 #define PUSH_f( N) PUSH##N(F, _f)
154 #define PUSH_d( N) PUSH##N(F, _d)
156 /* bottom function */
164 #define DEFN(N, M, T, TT) \
169 /* stack buffer in %v0 */ \
172 /* validate arguments */ \
174 /* heap buffer in %v1 */ \
176 pushargi $(N * szof##T) \
179 /* copy stack bufer to heap buffer */ \
183 pushargi $(N * szof##T) \
185 /* stack buffer for next function in %v2 */ \
186 movi %r0 $(M * szof##T) \
189 /* fill stack buffer for next function */ \
194 /* call next function */ \
198 finishi test##T##_##M \
199 /* validate stack buffer */ \
203 pushargi $(N * szof##T) \
206 beqi test##T##_##N##_done %r0 0 \
208 test##T##_##N##_done: \
209 /* release heap bufer */ \
221 /* heap buffer in %v1 */ \
223 pushargi $(16 * szof##T) \
226 /* stack buffer for next function in %v2 */ \
227 movi %r0 $(16 * szof##T) \
230 /* fill stack buffer for next function */ \
235 /* copy stack buffer to heap buffer */ \
239 pushargi $(16 * szof##T) \
241 /* call next function */ \
245 finishi test##T##_16 \
246 /* validate stack buffer */ \
250 pushargi $(16 * szof##T) \
253 beqi test##T##_17_done %r0 0 \
256 /* release heap bufer */ \
263 #define DEF( T, TT) \
275 DEFN(11, 10, T, TT) \
276 DEFN(12, 11, T, TT) \
277 DEFN(13, 12, T, TT) \
278 DEFN(14, 13, T, TT) \
279 DEFN(15, 14, T, TT) \
280 DEFN(16, 15, T, TT) \
283 #define CALL(T) calli test##T##_17
292 # define MEMCPY memcpy
293 /* error: Function not implemented (memcpy) */
304 blti memcpy_done %r2 1
309 bgti memcpy_loop %r2 0
314 # define MEMCPY @memcpy
357 // loop a few times calling allocar