1 #ifndef _HPPA_CODEGEN_H_
2 #define _HPPA_CODEGEN_H_
77 #define hppa_opcode(op) ((op) << 26)
78 #define hppa_opcode_alu(op1, op2) (((op1) << 26) | ((op2) << 6))
79 #define hppa_op_r1(r) ((r) << 21)
80 #define hppa_op_r2(r) ((r) << 16)
81 #define hppa_op_r3(r) (r)
83 /* imm5, imm11 and imm14 are encoded by putting the sign bit in the LSB */
84 #define hppa_op_imm5(im5) ((((im5) & 0xf) << 1) | (((int)(im5)) < 0))
85 #define hppa_op_imm11(im11) ((((im11) & 0x3ff) << 1) | (((int)(im11)) < 0))
86 #define hppa_op_imm14(im14) ((((im14) & 0x1fff) << 1) | (((int)(im14)) < 0))
88 /* HPPA uses "selectors" for some operations. The two we need are L% and R% */
89 /* lsel: select left 21 bits */
90 #define hppa_lsel(v) (((int)(v))>>11)
91 /* rsel: select right 11 bits */
92 #define hppa_rsel(v) (((int)(v))&0x7ff)
94 /* imm12 is used by the conditional branch insns
97 * value = assemble_12(w1,w) = cat(w,w1{10},w1{0..9})
98 * (note PA bit numbering)
100 * if the original number is:
104 * 10987654321098765432109876543210
107 static inline int hppa_op_imm12(int im12)
109 unsigned int a = im12 < 0;
110 unsigned int b = (im12 >> 10) & 0x1;
111 unsigned int cdefghijkl = im12 & 0x3ff;
113 return (cdefghijkl << 3) | (b << 2) | a;
117 * imm17 is used by the BL insn, which has
121 * value = assemble_17(w1,w2,w) = cat(w,w1,w2{10},w2{0..9})
122 * (note PA bit numbering)
124 * if the original number is:
128 * 10987654321098765432109876543210
129 * bcdef hijklmnopqg a
131 static inline int hppa_op_imm17(int im17)
133 unsigned int a = im17 < 0;
134 unsigned int bcdef = (im17 >> 11) & 0x1f;
135 unsigned int g = (im17 >> 10) & 0x1;
136 unsigned int hijklmnopq = im17 & 0x3ff;
138 return (bcdef << 16) | (hijklmnopq << 3) | (g << 2) | a;
141 /* imm21 is used by addil and ldil
143 * value = assemble_21(x) = cat(x{20},x{9..19},x{5..6},x{0..4},x{7..8})
144 * (note PA bit numbering)
146 * if the original number is:
147 * abcdefghijklmnopqrstu
150 * 10987654321098765432109876543210
151 * opqrsmntubcdefghijkla
153 static inline int hppa_op_imm21(int im21)
155 unsigned int a = im21 < 0;
156 unsigned int bcdefghijkl = (im21 >> 9) & 0x7ff;
157 unsigned int mn = (im21 >> 7) & 0x3;
158 unsigned int opqrs = (im21 >> 2) & 0x1f;
159 unsigned int tu = im21 & 0x3;
161 return (opqrs << 16) | (mn << 14) | (tu << 12) | (bcdefghijkl << 1) | a;
164 /* returns 1 if VAL can fit in BITS */
165 static inline int hppa_check_bits(int val, int bits)
167 /* positive offset */
168 if (!(val & (1 << (bits - 1))) && (val >> bits) != 0)
170 /* negative offset */
171 if ((val & (1 << (bits - 1))) && ((val >> bits) != (-1 >>(bits+2))))
176 static inline void *hppa_emit(void *inp, unsigned int insn)
178 unsigned int *code = inp;
180 return ((char *)code) + 4;
183 /* Table 5-3: Compare conditons */
184 #define HPPA_CMP_COND_NEVER (0)
185 #define HPPA_CMP_COND_EQ (1)
186 #define HPPA_CMP_COND_SLT (2)
187 #define HPPA_CMP_COND_SLE (3)
188 #define HPPA_CMP_COND_ULT (4)
189 #define HPPA_CMP_COND_ULE (5)
190 #define HPPA_CMP_COND_OV (6)
191 #define HPPA_CMP_COND_ODD (7)
193 /* Table 5-3: Subtaction conditions */
194 #define HPPA_SUB_COND_NEVER ((0 << 1) | 0)
195 #define HPPA_SUB_COND_EQ ((1 << 1) | 0)
196 #define HPPA_SUB_COND_SLT ((2 << 1) | 0)
197 #define HPPA_SUB_COND_SLE ((3 << 1) | 0)
198 #define HPPA_SUB_COND_ULT ((4 << 1) | 0)
199 #define HPPA_SUB_COND_ULE ((5 << 1) | 0)
200 #define HPPA_SUB_COND_SV ((6 << 1) | 0)
201 #define HPPA_SUB_COND_OD ((7 << 1) | 0)
202 #define HPPA_SUB_COND_ALWAYS ((0 << 1) | 1)
203 #define HPPA_SUB_COND_NE ((1 << 1) | 1)
204 #define HPPA_SUB_COND_SGE ((2 << 1) | 1)
205 #define HPPA_SUB_COND_SGT ((3 << 1) | 1)
206 #define HPPA_SUB_COND_UGE ((4 << 1) | 1)
207 #define HPPA_SUB_COND_UGT ((5 << 1) | 1)
208 #define HPPA_SUB_COND_NSV ((6 << 1) | 1)
209 #define HPPA_SUB_COND_EV ((7 << 1) | 1)
211 /* Table 5-4: Addition conditions */
212 #define HPPA_ADD_COND_NEVER ((0 << 1) | 0)
213 #define HPPA_ADD_COND_EQ ((1 << 1) | 0)
214 #define HPPA_ADD_COND_LT ((2 << 1) | 0)
215 #define HPPA_ADD_COND_LE ((3 << 1) | 0)
216 #define HPPA_ADD_COND_NUV ((4 << 1) | 0)
217 #define HPPA_ADD_COND_ZUV ((5 << 1) | 0)
218 #define HPPA_ADD_COND_SV ((6 << 1) | 0)
219 #define HPPA_ADD_COND_OD ((7 << 1) | 0)
220 #define HPPA_ADD_COND_ALWAYS ((0 << 1) | 1)
221 #define HPPA_ADD_COND_NE ((1 << 1) | 1)
222 #define HPPA_ADD_COND_GE ((2 << 1) | 1)
223 #define HPPA_ADD_COND_GT ((3 << 1) | 1)
224 #define HPPA_ADD_COND_UV ((4 << 1) | 1)
225 #define HPPA_ADD_COND_VNZ ((5 << 1) | 1)
226 #define HPPA_ADD_COND_NSV ((6 << 1) | 1)
227 #define HPPA_ADD_COND_EV ((7 << 1) | 1)
229 /* Table 5-5: Logical instruction conditions */
230 #define HPPA_LOGICAL_COND_NEVER ((0 << 1) | 0)
231 #define HPPA_LOGICAL_COND_ZERO ((1 << 1) | 0)
232 #define HPPA_LOGICAL_COND_MSB_SET ((2 << 1) | 0)
233 #define HPPA_LOGICAL_COND_MSB_SET_OR_ZERO ((3 << 1) | 0)
234 #define HPPA_LOGICAL_COND_LSB_SET ((7 << 1) | 0)
235 #define HPPA_LOGICAL_COND_ALWAYS ((0 << 1) | 1)
236 #define HPPA_LOGICAL_COND_NZ ((1 << 1) | 1)
237 #define HPPA_LOGICAL_COND_MSB_CLR ((2 << 1) | 1)
238 #define HPPA_LOGICAL_COND_MSB_CLR_AND_NZ ((3 << 1) | 1)
239 #define HPPA_LOGICAL_COND_LSB_CLR ((7 << 1) | 1)
241 /* Table 5-6: Unit Conditions */
242 #define HPPA_UNIT_COND_NEVER ((0 << 1) | 0)
243 #define HPPA_UNIT_COND_SBZ ((2 << 1) | 0)
244 #define HPPA_UNIT_COND_SHZ ((3 << 1) | 0)
245 #define HPPA_UNIT_COND_SDC ((4 << 1) | 0)
246 #define HPPA_UNIT_COND_SBC ((6 << 1) | 0)
247 #define HPPA_UNIT_COND_SHC ((7 << 1) | 0)
248 #define HPPA_UNIT_COND_ALWAYS ((0 << 1) | 1)
249 #define HPPA_UNIT_COND_NBZ ((2 << 1) | 1)
250 #define HPPA_UNIT_COND_NHZ ((3 << 1) | 1)
251 #define HPPA_UNIT_COND_NDC ((4 << 1) | 1)
252 #define HPPA_UNIT_COND_NBC ((6 << 1) | 1)
253 #define HPPA_UNIT_COND_NHC ((7 << 1) | 1)
255 /* Table 5-7: Shift/Extract/Deposit Conditions */
256 #define HPPA_BIT_COND_NEVER (0)
257 #define HPPA_BIT_COND_ZERO (1)
258 #define HPPA_BIT_COND_MSB_SET (2)
259 #define HPPA_BIT_COND_LSB_SET (3)
260 #define HPPA_BIT_COND_ALWAYS (4)
261 #define HPPA_BIT_COND_SOME_SET (5)
262 #define HPPA_BIT_COND_MSB_CLR (6)
263 #define HPPA_BIT_COND_LSB_CLR (7)
265 #define hppa_mtsar(p, r) \
266 p = hppa_emit (p, hppa_opcode(0x00) | hppa_op_r1(11) | hppa_op_r2(r) | (0xC2 << 5))
268 #define hppa_bl_full(p, n, target, t) do { \
269 g_assert (hppa_check_bits (target, 17)); \
270 p = hppa_emit (p, hppa_opcode(0x3A) | hppa_op_r1(t) | hppa_op_imm17(((int)(((target) - 8)>>2))) | ((n) << 1)); \
273 #define hppa_bl(p, target, t) hppa_bl_full(p, 0, target, t)
274 #define hppa_bl_n(p, target, t) hppa_bl_full(p, 1, target, t)
276 #define hppa_bv(p, x, b) \
277 p = hppa_emit (p, hppa_opcode(0x3A) | hppa_op_r1(b) | hppa_op_r2(x) | (6 << 13))
279 #define hppa_blr(p, x, t) \
280 p = hppa_emit (p, hppa_opcode(0x3A) | hppa_op_r1(t) | hppa_op_r2(x) | (2 << 13))
282 /* hardcoded sr = sr4 */
283 #define hppa_ble_full(p, n, d, b) \
284 p = hppa_emit (p, hppa_opcode(0x39) | hppa_op_r1(b) | hppa_op_imm17(((int)(d)) >> 2) | (1 << 13) | ((n) << 1))
286 #define hppa_ble(p, d, b) hppa_ble_full(p, 0, d, b)
287 #define hppa_ble_n(p, d, b) hppa_ble_full(p, 1, d, b)
289 #define hppa_be_full(p, n, d, b) \
290 p = hppa_emit (p, hppa_opcode(0x38) | hppa_op_r1(b) | hppa_op_imm17(((int)(d)) >> 2) | (1 << 13) | ((n) << 1))
292 #define hppa_be(p, d, b) hppa_be_full(p, 0, d, b)
293 #define hppa_be_n(p, d, b) hppa_be_full(p, 1, d, b)
295 #define hppa_bb_full(p, cond, n, r, b, t) \
296 p = hppa_emit (p, hppa_opcode(0x31) | hppa_op_r1(b) | hppa_op_r2(r) | ((cond) << 13) | ((n) << 1) | hppa_op_imm12((int)(t)))
298 #define hppa_bb(p, cond, r, b, t) hppa_bb_full(p, cond, 0, r, b, t)
299 #define hppa_bb_n(p, cond, r, b, t) hppa_bb_full(p, cond, 1, r, b, t)
302 #define hppa_movb(p, r1, r2, cond, target) do { \
303 g_assert (hppa_check_bits (target, 12)); \
304 p = hppa_emit (p, hppa_opcode(0x32) | hppa_op_r1(r2) | hppa_op_r2(r1) | ((cond) << 13) | hppa_op_imm12(((int)(target)))); \
307 #define hppa_movib(p, i, r, cond, target) do { \
308 g_assert (hppa_check_bits (target, 12)); \
309 p = hppa_emit (p, hppa_opcode(0x33) | hppa_op_r1(r) | (hppa_op_imm5(((int)(i))) << 16) | ((cond) << 13) | hppa_op_imm12(((int)(target)))); \
312 #define hppa_combt(p, r1, r2, cond, target) do { \
313 g_assert (hppa_check_bits (target, 12)); \
314 p = hppa_emit (p, hppa_opcode(0x20) | hppa_op_r1(r2) | hppa_op_r2(r1) | ((cond) << 13) | hppa_op_imm12(((int)(target)))); \
317 #define hppa_combf(p, r1, r2, cond, target) do { \
318 g_assert (hppa_check_bits (target, 12)); \
319 p = hppa_emit (p, hppa_opcode(0x22) | hppa_op_r1(r2) | hppa_op_r2(r1) | ((cond) << 13) | hppa_op_imm12(((int)(target)))); \
322 #define hppa_combit(p, i, r, cond, target) do { \
323 g_assert (hppa_check_bits (target, 12)); \
324 p = hppa_emit (p, hppa_opcode(0x21) | hppa_op_r1(r) | (hppa_op_imm5(((int)(i))) << 16) | ((cond) << 13) | hppa_op_imm12(((int)(target)))); \
327 #define hppa_combif(p, i, r, cond, target) do { \
328 g_assert (hppa_check_bits (target, 12)); \
329 p = hppa_emit (p, hppa_opcode(0x23) | hppa_op_r1(r) | (hppa_op_imm5(((int)(i))) << 16) | ((cond) << 13) | hppa_op_imm12(((int)(target)))); \
332 /* TODO: addbt, addbf, addbit, addbif */
334 /* Load/store insns */
335 #define hppa_ld_disp(p, op, d, b, t) do { \
336 g_assert (hppa_check_bits (d, 14)); \
337 p = hppa_emit (p, hppa_opcode(op) | hppa_op_r1(b) | hppa_op_r2(t) | hppa_op_imm14(((int)(d)))); \
340 #define hppa_ldb(p, d, b, t) hppa_ld_disp(p, 0x10, d, b, t)
341 #define hppa_ldh(p, d, b, t) hppa_ld_disp(p, 0x11, d, b, t)
342 #define hppa_ldw(p, d, b, t) hppa_ld_disp(p, 0x12, d, b, t)
344 #define hppa_ldwm(p, d, b, t) \
345 p = hppa_emit (p, hppa_opcode(0x13) | hppa_op_r1(b) | hppa_op_r2(t) | hppa_op_imm14(d)); \
347 #define hppa_ldbx(p, x, b, t) hppa_ld_indexed(p, 0, x, b, t)
349 #define hppa_st_disp(p, op, r, d, b) do { \
350 g_assert (hppa_check_bits (d, 14)); \
351 p = hppa_emit (p, hppa_opcode(op) | hppa_op_r1(b) | hppa_op_r2(r) | hppa_op_imm14(((int)(d)))); \
354 #define hppa_stb(p, r, d, b) hppa_st_disp(p, 0x18, r, d, b)
355 #define hppa_sth(p, r, d, b) hppa_st_disp(p, 0x19, r, d, b)
356 #define hppa_stw(p, r, d, b) hppa_st_disp(p, 0x1A, r, d, b)
358 #define hppa_stwm(p, r, d, b) \
359 p = hppa_emit (p, hppa_opcode(0x1B) | hppa_op_r1(b) | hppa_op_r2(r) | hppa_op_imm14(d))
361 #define hppa_ldbx(p, x, b, t) hppa_ld_indexed(p, 0, x, b, t)
363 /* s = 0, u = 0, cc = 0, m = 0 */
364 #define hppa_ld_indexed(p, op, x, b, t) \
365 p = hppa_emit (p, hppa_opcode(0x03) | hppa_op_r1(b) | hppa_op_r2(x) | hppa_op_r3(t) | (op << 6))
367 #define hppa_ldbx(p, x, b, t) hppa_ld_indexed(p, 0, x, b, t)
368 #define hppa_ldhx(p, x, b, t) hppa_ld_indexed(p, 1, x, b, t)
369 #define hppa_ldwx(p, x, b, t) hppa_ld_indexed(p, 2, x, b, t)
371 #define hppa_ldil(p, i, t) \
372 p = hppa_emit (p, hppa_opcode(0x08) | hppa_op_r1(t) | hppa_op_imm21(((int)(i))))
374 #define hppa_ldo(p, d, b, t) \
375 p = hppa_emit (p, hppa_opcode(0x0D) | hppa_op_r1(b) | hppa_op_r2(t) | hppa_op_imm14((int)(d)))
377 #define hppa_set(p, imm, t) do { \
378 if (hppa_check_bits ((int)(imm), 14)) \
379 hppa_ldo (p, (int)(imm), hppa_r0, t); \
381 hppa_ldil (p, hppa_lsel (imm), t); \
382 hppa_ldo (p, hppa_rsel (imm), t, t); \
386 /* addil's destination is always r1 */
387 #define hppa_addil(p, i, r) \
388 p = hppa_emit (p, hppa_opcode(0x0A) | hppa_op_r1(r) | hppa_op_imm21(i))
390 #define hppa_alu_op(p, op, cond, r1, r2, t) \
391 p = hppa_emit (p, hppa_opcode_alu(0x02, op) | hppa_op_r1(r2) | hppa_op_r2(r1) | hppa_op_r3(t) | ((cond) << 12))
393 #define hppa_add_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x18, cond, r1, r2, t)
394 #define hppa_add(p, r1, r2, t) hppa_add_cond(p, HPPA_ADD_COND_NEVER, r1, r2, t)
395 #define hppa_addl_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x28, cond, r1, r2, t)
396 #define hppa_addl(p, r1, r2, t) hppa_addl_cond(p, HPPA_ADD_COND_NEVER, r1, r2, t)
397 #define hppa_addo_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x38, cond, r1, r2, t)
398 #define hppa_addo(p, r1, r2, t) hppa_addo_cond(p, HPPA_ADD_COND_NEVER, r1, r2, t)
399 #define hppa_addc_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x1C, cond, r1, r2, t)
400 #define hppa_addc(p, r1, r2, t) hppa_addc_cond(p, HPPA_ADD_COND_NEVER, r1, r2, t)
401 #define hppa_addco_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x3C, cond, r1, r2, t)
402 #define hppa_addco(p, r1, r2, t) hppa_addco_cond(p, HPPA_ADD_COND_NEVER, r1, r2, t)
403 #define hppa_sh1add_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x19, cond, r1, r2, t)
404 #define hppa_sh1add(p, r1, r2, t) hppa_sh1add_cond(p, HPPA_ADD_COND_NEVER, r1, r2, t)
405 #define hppa_sh1addl_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x29, cond, r1, r2, t)
406 #define hppa_sh1addl(p, r1, r2, t) hppa_sh1addl_cond(p, HPPA_ADD_COND_NEVER, r1, r2, t)
407 #define hppa_sh1addo_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x39, cond, r1, r2, t)
408 #define hppa_sh1addo(p, r1, r2, t) hppa_sh1addo_cond(p, HPPA_ADD_COND_NEVER, r1, r2, t)
409 #define hppa_sh2add_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x1A, cond, r1, r2, t)
410 #define hppa_sh2add(p, r1, r2, t) hppa_sh2add_cond(p, HPPA_ADD_COND_NEVER, r1, r2, t)
411 #define hppa_sh2addl_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x2A, cond, r1, r2, t)
412 #define hppa_sh2addl(p, r1, r2, t) hppa_sh2addl_cond(p, HPPA_ADD_COND_NEVER, r1, r2, t)
413 #define hppa_sh2addo_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x3A, cond, r1, r2, t)
414 #define hppa_sh2addo(p, r1, r2, t) hppa_sh2addo_cond(p, HPPA_ADD_COND_NEVER, r1, r2, t)
415 #define hppa_sh3add_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x1B, cond, r1, r2, t)
416 #define hppa_sh3add(p, r1, r2, t) hppa_sh3add_cond(p, HPPA_ADD_COND_NEVER, r1, r2, t)
417 #define hppa_sh3addl_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x2B, cond, r1, r2, t)
418 #define hppa_sh3addl(p, r1, r2, t) hppa_add_cond(p, HPPA_ADD_COND_NEVER, r1, r2, t)
419 #define hppa_sh3addo_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x3B, cond, r1, r2, t)
420 #define hppa_sh3addo(p, r1, r2, t) hppa_sh3addo_cond(p, HPPA_ADD_COND_NEVER, r1, r2, t)
422 #define hppa_sub_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x10, cond, r1, r2, t)
423 #define hppa_sub(p, r1, r2, t) hppa_sub_cond(p, HPPA_SUB_COND_NEVER, r1, r2, t)
424 #define hppa_subo_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x30, cond, r1, r2, t)
425 #define hppa_subo(p, r1, r2, t) hppa_subo_cond(p, HPPA_SUB_COND_NEVER, r1, r2, t)
426 #define hppa_subb_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x14, cond, r1, r2, t)
427 #define hppa_subb(p, r1, r2, t) hppa_subb_cond(p, HPPA_SUB_COND_NEVER, r1, r2, t)
428 #define hppa_subbo_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x34, cond, r1, r2, t)
429 #define hppa_subbo(p, r1, r2, t) hppa_subbo_cond(p, HPPA_SUB_COND_NEVER, r1, r2, t)
430 #define hppa_subt_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x13, cond, r1, r2, t)
431 #define hppa_subt(p, r1, r2, t) hppa_subt_cond(p, HPPA_SUB_COND_NEVER, r1, r2, t)
432 #define hppa_subto_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x33, cond, r1, r2, t)
433 #define hppa_subto(p, r1, r2, t) hppa_subto_cond(p, HPPA_SUB_COND_NEVER, r1, r2, t)
434 #define hppa_ds_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x11, cond, r1, r2, t)
435 #define hppa_ds(p, r1, r2, t) hppa_ds_cond(p, HPPA_SUB_COND_NEVER, r1, r2, t)
436 #define hppa_comclr_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x22, cond, r1, r2, t)
437 #define hppa_comclr(p, r1, r2, t) hppa_comclr_cond(p, HPPA_SUB_COND_NEVER, r1, r2, t)
439 #define hppa_or_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x09, cond, r1, r2, t)
440 #define hppa_or(p, r1, r2, t) hppa_or_cond(p, HPPA_LOGICAL_COND_NEVER, r1, r2, t)
441 #define hppa_copy(p, r1, r2) hppa_or(p, r1, hppa_r0, r2)
442 #define hppa_nop(p) hppa_or(p, hppa_r0, hppa_r0, hppa_r0)
443 #define hppa_xor_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x0A, cond, r1, r2, t)
444 #define hppa_xor(p, r1, r2, t) hppa_xor_cond(p, HPPA_LOGICAL_COND_NEVER, r1, r2, t)
445 #define hppa_and_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x08, cond, r1, r2, t)
446 #define hppa_and(p, r1, r2, t) hppa_and_cond(p, HPPA_LOGICAL_COND_NEVER, r1, r2, t)
447 #define hppa_andcm_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x00, cond, r1, r2, t)
448 #define hppa_andcm(p, r1, r2, t) hppa_andcm_cond(p, HPPA_LOGICAL_COND_NEVER, r1, r2, t)
450 #define hppa_uxor_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x0E, cond, r1, r2, t)
451 #define hppa_uxor(p, r1, r2, t) hppa_uxor_cond(p, HPPA_UNIT_COND_NEVER, r1, r2, t)
452 #define hppa_uaddcm_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x26, cond, r1, r2, t)
453 #define hppa_uaddcm(p, r1, r2, t) hppa_uaddcm_cond(p, HPPA_UNIT_COND_NEVER, r1, r2, t)
454 #define hppa_uaddcmt_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x27, cond, r1, r2, t)
455 #define hppa_uaddcmt(p, r1, r2, t) hppa_uaddcmt_cond(p, HPPA_UNIT_COND_NEVER, r1, r2, t)
456 #define hppa_dcor_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x2E, cond, r1, r2, t)
457 #define hppa_dcor(p, r1, r2, t) hppa_dcor_cond(p, HPPA_UNIT_COND_NEVER, r1, r2, t)
458 #define hppa_idcor_cond(p, cond, r1, r2, t) hppa_alu_op(p, 0x2F, cond, r1, r2, t)
459 #define hppa_idcor(p, r1, r2, t) hppa_idcor_cond(p, HPPA_UNIT_COND_NEVER, r1, r2, t)
461 #define hppa_addi(p, i, r, t) \
462 p = hppa_emit (p, hppa_opcode(0x2D) | hppa_op_r1(r) | hppa_op_r2(t) | hppa_op_imm11(((int)(i))))
464 #define hppa_subi(p, i, r, t) \
465 p = hppa_emit (p, hppa_opcode(0x25) | hppa_op_r1(r) | hppa_op_r2(t) | hppa_op_imm11(((int)(i))))
467 #define hppa_not(p, r, t) hppa_subi(p, -1, r, t)
469 #define hppa_comiclr(p, i, r, t) \
470 p = hppa_emit (p, hppa_opcode(0x24) | hppa_op_r1(r) | hppa_op_r2(t) | hppa_op_imm11(((int)(i))))
472 #define hppa_vshd(p, r1, r2, t) \
473 p = hppa_emit (p, hppa_opcode(0x34) | hppa_op_r1(r2) | hppa_op_r2(r1) | hppa_op_r3(t))
475 /* shift is a register */
476 #define hppa_lshr(p, r, shift, t) \
478 hppa_mtsar(p, shift); \
479 hppa_vshd(p, hppa_r0, r, t); \
482 /* shift is a constant */
483 #define hppa_shd(p, r1, r2, shift, t) \
484 p = hppa_emit (p, hppa_opcode(0x34) | hppa_op_r1(r2) | hppa_op_r2(r1) | hppa_op_r3(t) | (2 << 10) | ((31 - (shift)) << 5))
486 #define hppa_vextru(p, r, len, t) \
487 p = hppa_emit (p, hppa_opcode(0x34) | hppa_op_r1(r) | hppa_op_r2(t) | (4 << 10) | (32 - (len)))
489 #define hppa_vextrs(p, r, len, t) \
490 p = hppa_emit (p, hppa_opcode(0x34) | hppa_op_r1(r) | hppa_op_r2(t) | (5 << 10) | (32 - (len)))
492 /* shift is a register */
493 #define hppa_shr(p, r, shift, t) \
495 hppa_subi(p, 31, shift, t); \
497 hppa_vextrs(p, r, 32, t); \
500 /* shift is a constant */
501 #define hppa_extru(p, r, shift, len, t) \
502 p = hppa_emit (p, hppa_opcode(0x34) | hppa_op_r1(r) | hppa_op_r2(t) | (6 << 10) | ((shift) << 5) | (32 - (len)))
504 #define hppa_extrs(p, r, shift, len, t) \
505 p = hppa_emit (p, hppa_opcode(0x34) | hppa_op_r1(r) | hppa_op_r2(t) | (7 << 10) | ((shift) << 5) | (32 - (len)))
507 #define hppa_vdep(p, r, len, t) \
508 p = hppa_emit (p, hppa_opcode(0x35) | hppa_op_r1(r) | hppa_op_r2(t) | (1 << 10) | (32 - (len)))
510 #define hppa_dep(p, r, pos, len, t) \
511 p = hppa_emit (p, hppa_opcode(0x35) | hppa_op_r1(t) | hppa_op_r2(r) | (3 << 10) | ((31 - (pos)) << 5) | (32 - (len)))
513 #define hppa_vdepi(p, i, len, t) \
514 p = hppa_emit (p, hppa_opcode(0x35) | hppa_op_r1(t) | (hppa_op_imm5(((int)(i))) << 16) | (5 << 10) | (32 - (len)))
516 #define hppa_depi(p, i, pos, len, t) \
517 p = hppa_emit (p, hppa_opcode(0x35) | hppa_op_r1(t) | (hppa_op_imm5(((int)(i))) << 16) | (7 << 10) | ((31 - (pos)) << 5) | (32 - (len)))
519 #define hppa_zvdep(p, r, len, t) \
520 p = hppa_emit (p, hppa_opcode(0x35) | hppa_op_r1(t) | hppa_op_r2(r) | (0 << 10) | (32 - (len)))
522 /* shift is a register */
523 #define hppa_shl(p, r, shift, t) \
525 hppa_subi(p, 31, shift, t); \
527 hppa_zvdep(p, r, 32, t); \
530 #define hppa_zdep(p, r, pos, len, t) \
531 p = hppa_emit (p, hppa_opcode(0x35) | hppa_op_r1(t) | hppa_op_r2(r) | (2 << 10) | ((31 - (pos)) << 5) | (32 - (len)))
533 #define hppa_zvdepi(p, i, len, t) \
534 p = hppa_emit (p, hppa_opcode(0x35) | hppa_op_r1(t) | (hppa_op_imm5(((int)(i))) << 16) | (4 << 10) | (32 - (len)))
536 #define hppa_zdepi(p, i, pos, len, t) \
537 p = hppa_emit (p, hppa_opcode(0x35) | hppa_op_r1(t) | (hppa_op_imm5(((int)(i))) << 16) | (6 << 10) | ((31 - (pos)) << 5) | (32 - (len)))
540 /* These are valid for op == 0x0C only, for op == 0x0E there is an extra bit for
542 #define hppa_fpu_class0(p, r, sub, fmt, t) \
543 p = hppa_emit (p, hppa_opcode(0x0C) | hppa_op_r1(r) | hppa_op_r3(t) | ((sub) << 13) | ((fmt) << 11))
545 #define hppa_fpu_class1(p, r, sub, df, sf, t) \
546 p = hppa_emit (p, hppa_opcode(0x0C) | hppa_op_r1(r) | hppa_op_r3(t) | ((sub) << 15) | ((df) << 13) | ((sf) << 11) | (1 << 9))
548 #define hppa_fpu_class2(p, r1, r2, sub, fmt, n, cond) \
549 p = hppa_emit (p, hppa_opcode(0x0C) | hppa_op_r1(r1) | hppa_op_r2(r2) | hppa_op_r3(cond) | ((sub) << 13) | ((fmt) << 11) | (2 << 9) | ((n) << 5))
551 #define hppa_fpu_class3(p, r1, r2, sub, fmt, t) \
552 p = hppa_emit (p, hppa_opcode(0x0C) | hppa_op_r1(r1) | hppa_op_r2(r2) | hppa_op_r3(t) | ((sub) << 13) | ((fmt) << 11) | (3 << 9))
554 #define HPPA_FP_FMT_SGL 0
555 #define HPPA_FP_FMT_DBL 1
556 #define HPPA_FP_FMT_QUAD 3
558 #define hppa_fcpy(p, fmt, r, t) hppa_fpu_class0(p, r, 2, fmt, t)
559 #define hppa_fabs(p, fmt, r, t) hppa_fpu_class0(p, r, 3, fmt, t)
560 #define hppa_fsqrt(p, fmt, r, t) hppa_fpu_class0(p, r, 4, fmt, t)
561 #define hppa_frnd(p, fmt, r, t) hppa_fpu_class0(p, r, 5, fmt, t)
563 #define hppa_fcnvff(p, sf, df, r, t) hppa_fpu_class1(p, r, 0, df, sf, t)
564 #define hppa_fcnvxf(p, sf, df, r, t) hppa_fpu_class1(p, r, 1, df, sf, t)
565 #define hppa_fcnvfx(p, sf, df, r, t) hppa_fpu_class1(p, r, 2, df, sf, t)
566 #define hppa_fcnvfxt(p, sf, df, r, t) hppa_fpu_class1(p, r, 3, df, sf, t)
568 #define hppa_fcmp(p, fmt, cond, r1, r2) hppa_fpu_class2(p, r1, r2, 0, fmt, 0, cond)
569 #define hppa_ftest(p, cond) hppa_fpu_class2(p, 0, 0, 1, 0, 1, cond)
571 #define hppa_fadd(p, fmt, r1, r2, t) hppa_fpu_class3(p, r1, r2, 0, fmt, t)
572 #define hppa_fsub(p, fmt, r1, r2, t) hppa_fpu_class3(p, r1, r2, 1, fmt, t)
573 #define hppa_fmul(p, fmt, r1, r2, t) hppa_fpu_class3(p, r1, r2, 2, fmt, t)
574 #define hppa_fdiv(p, fmt, r1, r2, t) hppa_fpu_class3(p, r1, r2, 3, fmt, t)
576 /* Note: fmpyadd and fmpysub have different fmt encodings as the other
579 #define hppa_fmpyadd(p, fmt, rm1, rm2, tm, ra, ta) \
580 p = hppa_emit (p, hppa_opcode(0x06) | hppa_op_r1(rm1) | hppa_op_r2(rm2) | hppa_op_r3(tm) | ((ta) << 11) | ((ra) << 6) | ((fmt) << 5))
582 #define hppa_fmpyadd_sgl(p, rm1, rm2, tm, ra, ta) \
583 hppa_fmpyadd(p, 1, rm1, rm2, tm, ra, ta)
585 #define hppa_fmpyadd_dbl(p, rm1, rm2, tm, ra, ta) \
586 hppa_fmpyadd(p, 0, rm1, rm2, tm, ra, ta)
588 #define hppa_fmpysub(p, fmt, rm1, rm2, tm, ra, ta) \
589 p = hppa_emit (p, hppa_opcode(0x06) | hppa_op_r1(rm1) | hppa_op_r2(rm2) | hppa_op_r3(tm) | ((ta) << 11) | ((ra) << 6) | ((fmt) << 5))
591 #define hppa_fmpysub_sgl(p, rm1, rm2, tm, ra, ta) \
592 hppa_fmpysub(p, 1, rm1, rm2, tm, ra, ta)
594 #define hppa_fmpysub_dbl(p, rm1, rm2, tm, ra, ta) \
595 hppa_fmpysub(p, 0, rm1, rm2, tm, ra, ta)
597 #define hppa_xmpyu(p, r1, r2, t) \
598 p = hppa_emit (p, hppa_opcode(0x0E) | hppa_op_r1(r1) | hppa_op_r2(r2) | hppa_op_r3(t) | (2 << 13) | (3 << 9) | (1 << 8))
600 #define hppa_fldwx(p, x, b, t, half) \
601 p = hppa_emit (p, hppa_opcode(0x09) | hppa_op_r1(b) | hppa_op_r2(x) | hppa_op_r3(t) | ((half) << 6))
603 #define hppa_flddx(p, x, b, t) \
604 p = hppa_emit (p, hppa_opcode(0x0B) | hppa_op_r1(b) | hppa_op_r2(x) | hppa_op_r3(t))
606 #define hppa_fstwx(p, r, half, x, b) \
607 p = hppa_emit (p, hppa_opcode(0x09) | hppa_op_r1(b) | hppa_op_r2(x) | hppa_op_r3(r) | ((half) << 6) | (1 << 9))
609 #define hppa_fstdx(p, r, x, b) \
610 p = hppa_emit (p, hppa_opcode(0x0B) | hppa_op_r1(b) | hppa_op_r2(x) | hppa_op_r3(r) | (1 << 9))
612 #define hppa_fldws(p, d, b, t, half) \
613 p = hppa_emit (p, hppa_opcode(0x09) | hppa_op_r1(b) | (hppa_op_imm5(((int)(d))) << 16) | hppa_op_r3(t) | ((half) << 6) | (1 << 12))
615 #define hppa_fldds(p, d, b, t) \
616 p = hppa_emit (p, hppa_opcode(0x0B) | hppa_op_r1(b) | (hppa_op_imm5(((int)(d))) << 16) | hppa_op_r3(t) | (1 << 12))
618 #define hppa_fstws(p, r, half, d, b) \
619 p = hppa_emit (p, hppa_opcode(0x09) | hppa_op_r1(b) | (hppa_op_imm5(((int)(d))) << 16) | hppa_op_r3(r) | ((half) << 6) | (1 << 12) | (1 << 9))
621 #define hppa_fstds(p, r, d, b) \
622 p = hppa_emit (p, hppa_opcode(0x0B) | hppa_op_r1(b) | (hppa_op_imm5(((int)(d))) << 16) | hppa_op_r3(r) | (1 << 12) | (1 << 9))
625 /* Not yet converted old macros - used by interpreter */
626 #define hppa_ldd_with_flags(p, disp, base, dest, m, a) \
628 unsigned int *c = (unsigned int *)(p); \
629 int neg = (disp) < 0; \
630 int im10a = (disp) >> 3; \
631 g_assert(((disp) & 7) == 0); \
632 *c++ = (0x50000000 | (((im10a) & 0x3ff) << 4) | ((base) << 21) | ((dest) << 16) | neg | (m ? 0x8 : 0) | (a ? 0x4 : 0)); \
636 #define hppa_ldd(p, disp, base, dest) \
637 hppa_ldd_with_flags(p, disp, base, dest, 0, 0)
639 #define hppa_ldd_mb(p, disp, base, dest) \
640 hppa_ldd_with_flags(p, disp, base, dest, 1, 1)
642 #define hppa_std_with_flags(p, src, disp, base, m, a) \
644 unsigned int *c = (unsigned int *)(p); \
645 int neg = (disp) < 0; \
646 int im10a = (disp) >> 3; \
647 g_assert(((disp) & 7) == 0); \
648 *c++ = (0x70000000 | (((im10a) & 0x3ff) << 4) | ((base) << 21) | ((src) << 16) | neg | (m ? 0x8 : 0) | (a ? 0x4 : 0)); \
652 #define hppa_std(p, disp, base, dest) \
653 hppa_std_with_flags(p, disp, base, dest, 0, 0)
655 #define hppa_std_ma(p, disp, base, dest) \
656 hppa_std_with_flags(p, disp, base, dest, 1, 0)
658 #define hppa_fldd_with_flags(p, disp, base, dest, m, a) \
660 unsigned int *c = (unsigned int *)(p); \
661 int neg = (disp) < 0; \
662 int im10a = (disp) >> 3; \
663 *c++ = (0x50000002 | (((im10a) & 0x3ff) << 4) | ((base) << 21) | ((dest) << 16) | neg | (m ? 0x8 : 0) | (a ? 0x4 : 0)); \
667 #define hppa_fldd(p, disp, base, dest) \
668 hppa_fldd_with_flags(p, disp, base, dest, 0, 0)
670 #define hppa_fstd_with_flags(p, src, disp, base, m, a) \
672 unsigned int *c = (unsigned int *)(p); \
673 int neg = (disp) < 0; \
674 int im10a = (disp) >> 3; \
675 *c++ = (0x70000002 | (((im10a) & 0x3ff) << 4) | ((base) << 21) | ((src) << 16) | neg | (m ? 0x8 : 0) | (a ? 0x4 : 0)); \
679 #define hppa_fstd(p, disp, base, dest) \
680 hppa_fstd_with_flags(p, disp, base, dest, 0, 0)
683 #define hppa_fldw_with_flags(p, im11a, base, dest, r) \
685 unsigned int *c = (unsigned int *)(p); \
686 int neg = (disp) < 0; \
687 int im11a = (disp) >> 2; \
688 *c++ = (0x5c000000 | (((im11a) & 0x7ff) << 3) | ((base) << 21) | ((dest) << 16) | neg | ((r) ? 0x2 : 0)); \
692 #define hppa_fldw(p, disp, base, dest) \
693 hppa_fldw_with_flags(p, disp, base, dest, 1)
695 #define hppa_fstw_with_flags(p, src, disp, base, r) \
697 unsigned int *c = (unsigned int *)(p); \
698 int neg = (disp) < 0; \
699 int im11a = (disp) >> 2; \
700 *c++ = (0x7c000000 | (((im11a) & 0x7ff) << 3) | ((base) << 21) | ((src) << 16) | neg | ((r) ? 0x2 : 0)); \
704 #define hppa_fstw(p, src, disp, base) \
705 hppa_fstw_with_flags(p, src, disp, base, 1)
707 /* only works on right half SP registers */
708 #define hppa_fcnv(p, src, ssng, dest, dsng) \
710 unsigned int *c = (unsigned int *)(p); \
711 *c++ = (0x38000200 | ((src) << 21) | ((ssng) ? 0x80 : 0x800) | (dest) | ((dsng) ? 0x40 : 0x2000)); \
715 #define hppa_fcnv_sng_dbl(p, src, dest) \
716 hppa_fcnv(p, src, 1, dest, 0)
718 #define hppa_fcnv_dbl_sng(p, src, dest) \
719 hppa_fcnv(p, src, 0, dest, 1)
721 #define hppa_extrdu(p, src, pos, len, dest) \
723 unsigned int *c = (unsigned int *)(p); \
724 *c++ = (0xd8000000 | ((src) << 21) | ((dest) << 16) | ((pos) > 32 ? 0x800 : 0) | (((pos) & 31) << 5) | ((len) > 32 ? 0x1000 : 0) | (32 - (len & 31))); \
728 #define hppa_bve(p, reg, link) \
730 *(p) = (0xE8001000 | ((link ? 7 : 6) << 13) | ((reg) << 21)); \
734 #define hppa_blve(p, reg) \