Use AM_CPPFLAGS instead of INCLUDES in Makefile.am files, as the later is no longer...
[mono.git] / mono / arch / sparc / sparc-codegen.h
1 #ifndef __SPARC_CODEGEN_H__
2 #define __SPARC_CODEGEN_H__
3
4 #if SIZEOF_VOID_P == 8
5 #define SPARCV9 1
6 #else
7 #endif
8
9 typedef enum {
10         sparc_r0 = 0,
11         sparc_r1 = 1,
12         sparc_r2 = 2,
13         sparc_r3 = 3,
14         sparc_r4 = 4,
15         sparc_r5 = 5,
16         sparc_r6 = 6,
17         sparc_r7 = 7,
18         sparc_r8 = 8,
19         sparc_r9 = 9,
20         sparc_r10 = 10,
21         sparc_r11 = 11,
22         sparc_r12 = 12,
23         sparc_r13 = 13,
24         sparc_r14 = 14,
25         sparc_r15 = 15,
26         sparc_r16 = 16,
27         sparc_r17 = 17,
28         sparc_r18 = 18,
29         sparc_r19 = 19,
30         sparc_r20 = 20,
31         sparc_r21 = 21,
32         sparc_r22 = 22,
33         sparc_r23 = 23,
34         sparc_r24 = 24,
35         sparc_r25 = 25,
36         sparc_r26 = 26,
37         sparc_r27 = 27,
38         sparc_r28 = 28,
39         sparc_r29 = 29,
40         sparc_r30 = 30,
41         sparc_r31 = 31,
42         /* aliases */
43         /* global registers */
44         sparc_g0 = 0, sparc_zero = 0,
45         sparc_g1 = 1,
46         sparc_g2 = 2,
47         sparc_g3 = 3,
48         sparc_g4 = 4,
49         sparc_g5 = 5,
50         sparc_g6 = 6,
51         sparc_g7 = 7,
52         /* out registers */
53         sparc_o0 = 8,
54         sparc_o1 = 9,
55         sparc_o2 = 10,
56         sparc_o3 = 11,
57         sparc_o4 = 12,
58         sparc_o5 = 13,
59         sparc_o6 = 14, sparc_sp = 14,
60         sparc_o7 = 15, sparc_callsite = 15,
61         /* local registers */
62         sparc_l0 = 16,
63         sparc_l1 = 17,
64         sparc_l2 = 18,
65         sparc_l3 = 19,
66         sparc_l4 = 20,
67         sparc_l5 = 21,
68         sparc_l6 = 22,
69         sparc_l7 = 23,
70         /* in registers */
71         sparc_i0 = 24,
72         sparc_i1 = 25,
73         sparc_i2 = 26,
74         sparc_i3 = 27,
75         sparc_i4 = 28,
76         sparc_i5 = 29,
77         sparc_i6 = 30, sparc_fp = 30,
78         sparc_i7 = 31,
79         sparc_nreg = 32,
80         /* floating point registers */
81         sparc_f0 = 0,
82         sparc_f1 = 1,
83         sparc_f2 = 2,
84         sparc_f3 = 3,
85         sparc_f4 = 4,
86         sparc_f5 = 5,
87         sparc_f6 = 6,
88         sparc_f7 = 7,
89         sparc_f8 = 8,
90         sparc_f9 = 9,
91         sparc_f10 = 10,
92         sparc_f11 = 11,
93         sparc_f12 = 12,
94         sparc_f13 = 13,
95         sparc_f14 = 14,
96         sparc_f15 = 15,
97         sparc_f16 = 16,
98         sparc_f17 = 17,
99         sparc_f18 = 18,
100         sparc_f19 = 19,
101         sparc_f20 = 20,
102         sparc_f21 = 21,
103         sparc_f22 = 22,
104         sparc_f23 = 23,
105         sparc_f24 = 24,
106         sparc_f25 = 25,
107         sparc_f26 = 26,
108         sparc_f27 = 27,
109         sparc_f28 = 28,
110         sparc_f29 = 29,
111         sparc_f30 = 30,
112         sparc_f31 = 31,
113 } SparcRegister;
114
115 typedef enum {
116         sparc_bn   = 0, sparc_bnever = 0,
117         sparc_be   = 1,
118         sparc_ble  = 2,
119         sparc_bl   = 3,
120         sparc_bleu = 4,
121         sparc_bcs  = 5, sparc_blu = 5,
122         sparc_bneg = 6,
123         sparc_bvs  = 7, sparc_boverflow = 7,
124         sparc_ba   = 8, sparc_balways = 8,
125         sparc_bne  = 9,
126         sparc_bg   = 10,
127         sparc_bge  = 11,
128         sparc_bgu  = 12,
129         sparc_bcc  = 13, sparc_beu = 13,
130         sparc_bpos = 14,
131         sparc_bvc  = 15
132 } SparcCond;
133
134 typedef enum {
135         /* with fcmp */
136         sparc_feq = 0,
137         sparc_fl  = 1,
138         sparc_fg  = 2,
139         sparc_unordered = 3,
140         /* branch ops */
141         sparc_fba   = 8,
142         sparc_fbn   = 0,
143         sparc_fbu   = 7,
144         sparc_fbg   = 6,
145         sparc_fbug  = 5,
146         sparc_fbl   = 4,
147         sparc_fbul  = 3,
148         sparc_fblg  = 2,
149         sparc_fbne  = 1,
150         sparc_fbe   = 9,
151         sparc_fbue  = 10,
152         sparc_fbge  = 11,
153         sparc_fbuge = 12,
154         sparc_fble  = 13,
155         sparc_fbule = 14,
156         sparc_fbo   = 15
157 } SparcFCond;
158
159 typedef enum {
160         sparc_icc = 4,
161     sparc_xcc = 6,
162     sparc_fcc0 = 0,
163         sparc_fcc1 = 1,
164         sparc_fcc2 = 2,
165         sparc_fcc3 = 3
166 } SparcCC;
167
168 typedef enum {
169         sparc_icc_short = 0,
170     sparc_xcc_short = 2
171 } SparcCCShort;
172
173 typedef enum {
174         /* fop1 format */
175         sparc_fitos_val = 196,
176         sparc_fitod_val = 200,
177         sparc_fitoq_val = 204,
178         sparc_fxtos_val = 132,
179         sparc_fxtod_val = 136,
180         sparc_fxtoq_val = 140,
181         sparc_fstoi_val = 209,
182         sparc_fdtoi_val = 210,
183         sparc_fqtoi_val = 211,
184         sparc_fstod_val = 201,
185         sparc_fstoq_val = 205,
186         sparc_fdtos_val = 198,
187         sparc_fdtoq_val = 206,
188         sparc_fqtos_val = 199,
189         sparc_fqtod_val = 203,
190         sparc_fmovs_val  = 1,
191         sparc_fmovd_val  = 2,
192         sparc_fnegs_val  = 5,
193         sparc_fnegd_val  = 6,
194         sparc_fabss_val  = 9,
195         sparc_fabsd_val  = 10,
196         sparc_fsqrts_val = 41,
197         sparc_fsqrtd_val = 42,
198         sparc_fsqrtq_val = 43,
199         sparc_fadds_val  = 65,
200         sparc_faddd_val  = 66,
201         sparc_faddq_val  = 67,
202         sparc_fsubs_val  = 69,
203         sparc_fsubd_val  = 70,
204         sparc_fsubq_val  = 71,
205         sparc_fmuls_val  = 73,
206         sparc_fmuld_val  = 74,
207         sparc_fmulq_val  = 75,
208         sparc_fsmuld_val = 105,
209         sparc_fdmulq_val = 111,
210         sparc_fdivs_val  = 77,
211         sparc_fdivd_val  = 78,
212         sparc_fdivq_val  = 79,
213         /* fop2 format */
214         sparc_fcmps_val  = 81,
215         sparc_fcmpd_val  = 82,
216         sparc_fcmpq_val  = 83,
217         sparc_fcmpes_val = 85,
218         sparc_fcmped_val = 86,
219         sparc_fcmpeq_val = 87
220 } SparcFOp;
221
222 typedef enum {
223         sparc_membar_load_load = 0x1,
224         sparc_membar_store_load = 0x2,
225         sparc_membar_load_store = 0x4,
226         sparc_membar_store_store = 0x8,
227    
228         sparc_membar_lookaside = 0x10,
229         sparc_membar_memissue = 0x20,
230         sparc_membar_sync = 0x40,
231
232     sparc_membar_all = 0x4f
233 } SparcMembarFlags;
234
235 typedef struct {
236         unsigned int op   : 2; /* always 1 */
237         unsigned int disp : 30;
238 } sparc_format1;
239
240 typedef struct {
241         unsigned int op   : 2; /* always 0 */
242         unsigned int rd   : 5;
243         unsigned int op2  : 3;
244         unsigned int disp : 22;
245 } sparc_format2a;
246
247 typedef struct {
248         unsigned int op   : 2; /* always 0 */
249         unsigned int a    : 1;
250         unsigned int cond : 4;
251         unsigned int op2  : 3;
252         unsigned int disp : 22;
253 } sparc_format2b;
254
255 typedef struct {
256         unsigned int op   : 2; /* always 0 */
257         unsigned int a    : 1;
258         unsigned int cond : 4;
259         unsigned int op2  : 3;
260         unsigned int cc01 : 2;
261         unsigned int p    : 1;
262         unsigned int d19  : 19;
263 } sparc_format2c;
264
265 typedef struct {
266         unsigned int op   : 2; /* always 0 */
267         unsigned int a    : 1;
268         unsigned int res  : 1;
269         unsigned int rcond: 3;
270         unsigned int op2  : 3;
271         unsigned int d16hi: 2;
272         unsigned int p    : 1;
273         unsigned int rs1  : 5;
274         unsigned int d16lo: 14;
275 } sparc_format2d;
276
277 typedef struct {
278         unsigned int op   : 2; /* 2 or 3 */
279         unsigned int rd   : 5;
280         unsigned int op3  : 6;
281         unsigned int rs1  : 5;
282         unsigned int i    : 1;
283         unsigned int asi  : 8;
284         unsigned int rs2  : 5;
285 } sparc_format3a;
286
287 typedef struct {
288         unsigned int op   : 2; /* 2 or 3 */
289         unsigned int rd   : 5;
290         unsigned int op3  : 6;
291         unsigned int rs1  : 5;
292         unsigned int i    : 1;
293         unsigned int x    : 1;
294         unsigned int asi  : 7;
295         unsigned int rs2  : 5;
296 } sparc_format3ax;
297
298 typedef struct {
299         unsigned int op   : 2; /* 2 or 3 */
300         unsigned int rd   : 5;
301         unsigned int op3  : 6;
302         unsigned int rs1  : 5;
303         unsigned int i    : 1;
304         unsigned int imm  : 13;
305 } sparc_format3b;
306
307 typedef struct {
308         unsigned int op   : 2; /* 2 or 3 */
309         unsigned int rd   : 5;
310         unsigned int op3  : 6;
311         unsigned int rs1  : 5;
312         unsigned int i    : 1;
313         unsigned int x    : 1;
314         unsigned int imm  : 12;
315 } sparc_format3bx;
316
317 typedef struct {
318         unsigned int op   : 2; /* 2 or 3 */
319         unsigned int rd   : 5;
320         unsigned int op3  : 6;
321         unsigned int rs1  : 5;
322         unsigned int opf  : 9;
323         unsigned int rs2  : 5;
324 } sparc_format3c;
325
326 typedef struct {
327         unsigned int op   : 2;
328         unsigned int rd   : 5;
329         unsigned int op3  : 6;
330         unsigned int rs1  : 5;
331         unsigned int i    : 1;
332         unsigned int cc01 : 2;
333         unsigned int res  : 6;
334         unsigned int rs2  : 5;
335 } sparc_format4a;
336
337 typedef struct {
338         unsigned int op   : 2;
339         unsigned int rd   : 5;
340         unsigned int op3  : 6;
341         unsigned int rs1  : 5;
342         unsigned int i    : 1;
343         unsigned int cc01 : 2;
344         unsigned int simm : 11;
345 } sparc_format4b;
346
347 typedef struct {
348         unsigned int op   : 2;
349         unsigned int rd   : 5;
350         unsigned int op3  : 6;
351         unsigned int cc2  : 1;
352         unsigned int cond : 4;
353         unsigned int i    : 1;
354         unsigned int cc01 : 2;
355         unsigned int res  : 6;
356         unsigned int rs2  : 5;
357 } sparc_format4c;
358
359 typedef struct {
360         unsigned int op   : 2;
361         unsigned int rd   : 5;
362         unsigned int op3  : 6;
363         unsigned int cc2  : 1;
364         unsigned int cond : 4;
365         unsigned int i    : 1;
366         unsigned int cc01 : 2;
367         unsigned int simm : 11;
368 } sparc_format4d;
369
370 /* for use in logical ops, use 0 to not set flags */
371 #define sparc_cc 16
372
373 #define sparc_is_imm13(val) ((glong)val >= (glong)-(1<<12) && (glong)val <= (glong)((1<<12)-1))
374 #define sparc_is_imm22(val) ((glong)val >= (glong)-(1<<21) && (glong)val <= (glong)((1<<21)-1))
375 #define sparc_is_imm16(val) ((glong)val >= (glong)-(1<<15) && (glong)val <= (glong)((1<<15)-1))
376 #define sparc_is_imm19(val) ((glong)val >= (glong)-(1<<18) && (glong)val <= (glong)((1<<18)-1))
377 #define sparc_is_imm30(val) ((glong)val >= (glong)-(1<<29) && (glong)val <= (glong)((1<<29)-1))
378
379 /* disassembly */
380 #define sparc_inst_op(inst) ((inst) >> 30)
381 #define sparc_inst_op2(inst) (((inst) >> 22) & 0x7)
382 #define sparc_inst_rd(inst) (((inst) >> 25) & 0x1f)
383 #define sparc_inst_op3(inst) (((inst) >> 19) & 0x3f)
384 #define sparc_inst_i(inst) (((inst) >> 13) & 0x1)
385 #define sparc_inst_rs1(inst) (((inst) >> 14) & 0x1f)
386 #define sparc_inst_rs2(inst) (((inst) >> 0) & 0x1f)
387 #define sparc_inst_imm(inst) (((inst) >> 13) & 0x1)
388 #define sparc_inst_imm13(inst) (((inst) >> 0) & 0x1fff)
389
390 #define sparc_encode_call(ins,addr) \
391         do {    \
392                 sparc_format1 *__f = (sparc_format1*)(ins);     \
393                 __f->op = 1;    \
394                 __f->disp = ((unsigned int)(addr) >> 2);        \
395                 (ins) = (unsigned int*)__f + 1; \
396         } while (0)
397
398 #define sparc_encode_format2a(ins,val,oper,dest) \
399         do {    \
400                 sparc_format2a *__f = (sparc_format2a*)(ins);   \
401                 __f->op = 0;    \
402                 __f->rd = (dest);       \
403                 __f->op2 = (oper);      \
404                 __f->disp = (val) & 0x3fffff;   \
405                 (ins) = (unsigned int*)__f + 1; \
406         } while (0)
407
408 #define sparc_encode_format2b(ins,aval,bcond,oper,disp22) \
409         do {    \
410                 sparc_format2b *__f = (sparc_format2b*)(ins);   \
411                 __f->op = 0;    \
412                 __f->a = (aval);        \
413                 __f->cond = (bcond);    \
414                 __f->op2 = (oper);      \
415                 __f->disp = (disp22);   \
416                 (ins) = (unsigned int*)__f + 1; \
417         } while (0)
418
419 #define sparc_encode_format2c(ins,aval,bcond,oper,xcc,predict,disp19) \
420         do {    \
421                 sparc_format2c *__f = (sparc_format2c*)(ins);   \
422                 __f->op = 0;    \
423                 __f->a = (aval);        \
424                 __f->cond = (bcond);    \
425                 __f->op2 = (oper);      \
426         __f->cc01 = (xcc); \
427         __f->p = (predict); \
428         __f->d19 = (disp19); \
429                 (ins) = (unsigned int*)__f + 1; \
430         } while (0)
431
432 #define sparc_encode_format2d(ins,aval,bcond,oper,predict,r1,disp16) \
433         do {    \
434                 sparc_format2d *__f = (sparc_format2d*)(ins);   \
435                 __f->op = 0;    \
436                 __f->a = (aval);        \
437         __f->res = 0;       \
438                 __f->rcond = (bcond);   \
439                 __f->op2 = (oper);      \
440         __f->d16hi = ((disp16) >> 14); \
441         __f->p = (predict); \
442         __f->rs1 = (r1);    \
443                 __f->d16lo = ((disp16) & 0x3fff);       \
444                 (ins) = (unsigned int*)__f + 1; \
445         } while (0)
446
447 #define sparc_encode_format3a(ins,opval,asival,r1,r2,oper,dest) \
448         do {    \
449                 sparc_format3a *__f = (sparc_format3a*)(ins);   \
450                 __f->op = (opval);      \
451                 __f->asi = (asival);    \
452                 __f->i = 0;     \
453                 __f->rd = (dest);       \
454                 __f->rs1 = (r1);        \
455                 __f->rs2 = (r2);        \
456                 __f->op3 = (oper);      \
457                 (ins) = (unsigned int*)__f + 1; \
458         } while (0)
459
460 #define sparc_encode_format3ax(ins,opval,asival,r1,r2,oper,dest) \
461         do {    \
462                 sparc_format3ax *__f = (sparc_format3ax*)(ins); \
463                 __f->op = (opval);      \
464                 __f->asi = (asival);    \
465                 __f->i = 0;     \
466                 __f->x = 1;     \
467                 __f->rd = (dest);       \
468                 __f->rs1 = (r1);        \
469                 __f->rs2 = (r2);        \
470                 __f->op3 = (oper);      \
471                 (ins) = (unsigned int*)__f + 1; \
472         } while (0)
473
474 #define sparc_encode_format3b(ins,opval,r1,val,oper,dest) \
475         do {    \
476                 sparc_format3b *__f = (sparc_format3b*)(ins);   \
477                 __f->op = (opval);      \
478                 __f->imm = (val);       \
479                 __f->i = 1;     \
480                 __f->rd = (dest);       \
481                 __f->rs1 = (r1);        \
482                 __f->op3 = (oper);      \
483                 (ins) = (unsigned int*)__f + 1; \
484         } while (0)
485
486 #define sparc_encode_format3bx(ins,opval,r1,val,oper,dest) \
487         do {    \
488                 sparc_format3bx *__f = (sparc_format3bx*)(ins); \
489                 __f->op = (opval);      \
490                 __f->imm = (val);       \
491                 __f->i = 1;     \
492                 __f->x = 1;     \
493                 __f->rd = (dest);       \
494                 __f->rs1 = (r1);        \
495                 __f->op3 = (oper);      \
496                 (ins) = (unsigned int*)__f + 1; \
497         } while (0)
498
499 #define sparc_encode_format3c(ins,opval,opfval,r1,oper,r2,dest) \
500         do {    \
501                 sparc_format3c *__f = (sparc_format3c*)(ins);   \
502                 __f->op = (opval);      \
503                 __f->opf = (opfval);    \
504                 __f->rd = (dest);       \
505                 __f->rs1 = (r1);        \
506                 __f->rs2 = (r2);        \
507                 __f->op3 = (oper);      \
508                 (ins) = (unsigned int*)__f + 1; \
509         } while (0)
510
511 #define sparc_encode_format4a(ins,opval,oper,cc,r1,r2,dest) \
512         do {    \
513                 sparc_format4a *__f = (sparc_format4a*)(ins);   \
514                 __f->op = (opval);      \
515                 __f->rd = (dest);       \
516                 __f->op3 = (oper);      \
517                 __f->rs1 = (r1);        \
518         __f->i   = 0;       \
519         __f->cc01= (cc) & 0x3; \
520         __f->res = 0;       \
521                 __f->rs2 = (r2);        \
522                 (ins) = (unsigned int*)__f + 1; \
523         } while (0)
524
525 #define sparc_encode_format4b(ins,opval,oper,cc,r1,imm,dest) \
526         do {    \
527                 sparc_format4b *__f = (sparc_format4b*)(ins);   \
528                 __f->op = (opval);      \
529                 __f->rd = (dest);       \
530                 __f->op3 = (oper);      \
531                 __f->rs1 = (r1);        \
532         __f->i   = 1;       \
533         __f->cc01= (cc) & 0x3; \
534                 __f->simm = (imm);      \
535                 (ins) = (unsigned int*)__f + 1; \
536         } while (0)
537
538 #define sparc_encode_format4c(ins,opval,oper,cc,bcond,r2,dest) \
539         do {    \
540                 sparc_format4c *__f = (sparc_format4c*)(ins);   \
541                 __f->op = (opval);      \
542                 __f->rd = (dest);       \
543                 __f->op3 = (oper);      \
544         __f->cc2 = ((xcc) >> 2) & 0x1; \
545         __f->cond = bcond;  \
546         __f->i   = 0;       \
547         __f->cc01= (xcc) & 0x3; \
548         __f->res = 0;       \
549                 __f->rs2 = (r2);        \
550                 (ins) = (unsigned int*)__f + 1; \
551         } while (0)
552
553 #define sparc_encode_format4d(ins,opval,oper,xcc,bcond,imm,dest) \
554         do {    \
555                 sparc_format4d *__f = (sparc_format4d*)(ins);   \
556                 __f->op = (opval);      \
557                 __f->rd = (dest);       \
558                 __f->op3 = (oper);      \
559         __f->cc2 = ((xcc) >> 2) & 0x1; \
560         __f->cond = bcond;  \
561         __f->i   = 1;       \
562         __f->cc01= (xcc) & 0x3; \
563                 __f->simm = (imm);      \
564                 (ins) = (unsigned int*)__f + 1; \
565         } while (0)
566
567 /* is it useful to provide a non-default value? */
568 #define sparc_asi 0x0
569
570 /* load */
571 #define sparc_ldsb(ins,base,disp,dest) sparc_encode_format3a((ins),3,sparc_asi,(base),(disp),9,(dest))
572 #define sparc_ldsb_imm(ins,base,disp,dest) sparc_encode_format3b((ins),3,(base),(disp),9,(dest))
573
574 #define sparc_ldsh(ins,base,disp,dest) sparc_encode_format3a((ins),3,sparc_asi,(base),(disp),10,(dest))
575 #define sparc_ldsh_imm(ins,base,disp,dest) sparc_encode_format3b((ins),3,(base),(disp),10,(dest))
576
577 #define sparc_ldub(ins,base,disp,dest) sparc_encode_format3a((ins),3,sparc_asi,(base),(disp),1,(dest))
578 #define sparc_ldub_imm(ins,base,disp,dest) sparc_encode_format3b((ins),3,(base),(disp),1,(dest))
579
580 #define sparc_lduh(ins,base,disp,dest) sparc_encode_format3a((ins),3,sparc_asi,(base),(disp),2,(dest))
581 #define sparc_lduh_imm(ins,base,disp,dest) sparc_encode_format3b((ins),3,(base),(disp),2,(dest))
582
583 #define sparc_ld(ins,base,disp,dest) sparc_encode_format3a((ins),3,sparc_asi,(base),(disp),0,(dest))
584 #define sparc_ld_imm(ins,base,disp,dest) sparc_encode_format3b((ins),3,(base),(disp),0,(dest))
585
586 /* Sparc V9 */
587 #define sparc_ldx(ins,base,disp,dest) sparc_encode_format3a((ins),3,sparc_asi,(base),(disp),11,(dest))
588 #define sparc_ldx_imm(ins,base,disp,dest) sparc_encode_format3b((ins),3,(base),(disp),11,(dest))
589
590 #define sparc_ldsw(ins,base,disp,dest) sparc_encode_format3a((ins),3,sparc_asi,(base),(disp),8,(dest))
591 #define sparc_ldsw_imm(ins,base,disp,dest) sparc_encode_format3b((ins),3,(base),(disp),8,(dest))
592
593 #define sparc_ldd(ins,base,disp,dest) sparc_encode_format3a((ins),3,sparc_asi,(base),(disp),3,(dest))
594 #define sparc_ldd_imm(ins,base,disp,dest) sparc_encode_format3b((ins),3,(base),(disp),3,(dest))
595
596 #define sparc_ldf(ins,base,disp,dest) sparc_encode_format3a((ins),3,0,(base),(disp),32,(dest))
597 #define sparc_ldf_imm(ins,base,disp,dest) sparc_encode_format3b((ins),3,(base),(disp),32,(dest))
598
599 #define sparc_lddf(ins,base,disp,dest) sparc_encode_format3a((ins),3,0,(base),(disp),35,(dest))
600 #define sparc_lddf_imm(ins,base,disp,dest) sparc_encode_format3b((ins),3,(base),(disp),35,(dest))
601
602 /* store */
603 #define sparc_stb(ins,src,base,disp) sparc_encode_format3a((ins),3,sparc_asi,(base),(disp),5,(src))
604 #define sparc_stb_imm(ins,src,base,disp) sparc_encode_format3b((ins),3,(base),(disp),5,(src))
605
606 #define sparc_sth(ins,src,base,disp) sparc_encode_format3a((ins),3,sparc_asi,(base),(disp),6,(src))
607 #define sparc_sth_imm(ins,src,base,disp) sparc_encode_format3b((ins),3,(base),(disp),6,(src))
608
609 #define sparc_st(ins,src,base,disp) sparc_encode_format3a((ins),3,sparc_asi,(base),(disp),4,(src))
610 #define sparc_st_imm(ins,src,base,disp) sparc_encode_format3b((ins),3,(base),(disp),4,(src))
611
612 /* Sparc V9 */
613 #define sparc_stx(ins,src,base,disp) sparc_encode_format3a((ins),3,sparc_asi,(base),(disp),14,(src))
614 #define sparc_stx_imm(ins,src,base,disp) sparc_encode_format3b((ins),3,(base),(disp),14,(src))
615
616 #define sparc_std(ins,src,base,disp) sparc_encode_format3a((ins),3,sparc_asi,(base),(disp),7,(src))
617 #define sparc_std_imm(ins,src,base,disp) sparc_encode_format3b((ins),3,(base),(disp),7,(src))
618
619 #define sparc_stf(ins,src,base,disp) sparc_encode_format3a((ins),3,sparc_asi,(base),(disp),36,(src))
620 #define sparc_stf_imm(ins,src,base,disp) sparc_encode_format3b((ins),3,(base),(disp),36,(src))
621
622 #define sparc_stdf(ins,src,base,disp) sparc_encode_format3a((ins),3,sparc_asi,(base),(disp),39,(src))
623 #define sparc_stdf_imm(ins,src,base,disp) sparc_encode_format3b((ins),3,(base),(disp),39,(src))
624
625 /* swap */
626 #define sparc_ldstub(ins,base,disp,dest) sparc_encode_format3a((ins),3,sparc_asi,(base),(disp),13,(dest))
627 #define sparc_ldstub_imm(ins,base,disp,dest) sparc_encode_format3b((ins),3,(base),(disp),13,(dest))
628
629 #define sparc_swap(ins,base,disp,dest) sparc_encode_format3a((ins),3,sparc_asi,(base),(disp),15,(dest))
630 #define sparc_swap_imm(ins,base,disp,dest) sparc_encode_format3b((ins),3,(base),(disp),15,(dest))
631
632 /* misc */
633 /* note: with sethi val is the full 32 bit value (think of it as %hi(val)) */
634 #define sparc_sethi(ins,val,dest) sparc_encode_format2a((ins),((val)>>10),4,(dest))
635
636 #define sparc_nop(ins) sparc_sethi((ins),0,sparc_zero)
637
638 #define sparc_save(ins,src,disp,dest) sparc_encode_format3a((ins),2,0,(src),(disp),60,(dest))
639 #define sparc_save_imm(ins,src,disp,dest) sparc_encode_format3b((ins),2,(src),(disp),60,(dest))
640
641 #define sparc_restore(ins,src,disp,dest) sparc_encode_format3a((ins),2,0,(src),(disp),61,(dest))
642 #define sparc_restore_imm(ins,src,disp,dest) sparc_encode_format3b((ins),2,(src),(disp),61,(dest))
643
644 #define sparc_rett(ins,src,disp) sparc_encode_format3a((ins),2,0,(src),(disp),0x39,0)
645 #define sparc_rett_imm(ins,src,disp) sparc_encode_format3b((ins),2,(src),(disp),0x39,0)
646
647 #define sparc_jmpl(ins,base,disp,dest) sparc_encode_format3a((ins),2,0,(base),(disp),56,(dest))
648 #define sparc_jmpl_imm(ins,base,disp,dest) sparc_encode_format3b((ins),2,(base),(disp),56,(dest))
649
650 #define sparc_call_simple(ins,disp) sparc_encode_call((ins),((unsigned int)(disp)))
651
652 #define sparc_rdy(ins,dest) sparc_encode_format3a((ins),2,0,0,0,40,(dest))
653
654 #define sparc_wry(ins,base,disp) sparc_encode_format3a((ins),2,0,(base),(disp),48,0)
655 #define sparc_wry_imm(ins,base,disp) sparc_encode_format3b((ins),2,(base),(disp),48,0)
656
657 /* stbar, unimp, flush */
658 #define sparc_stbar(ins) sparc_encode_format3a((ins),2,0,15,0,40,0)
659 #define sparc_unimp(ins,val) sparc_encode_format2b((ins),0,0,0,(val))
660
661 #define sparc_flush(ins,base,disp) sparc_encode_format3a((ins),2,0,(base),(disp),59,0)
662 #define sparc_flush_imm(ins,base,disp) sparc_encode_format3b((ins),2,(base),(disp),59,0)
663
664 #define sparc_flushw(ins) sparc_encode_format3a((ins),2,0,0,0,43,0)
665
666 #define sparc_membar(ins,flags) sparc_encode_format3b ((ins), 2, 0xf, (flags), 0x28, 0)
667
668 /* trap */
669
670 #define sparc_ta(ins,tt) sparc_encode_format3b((ins),2,0,(tt),58,0x8)
671
672 /* alu fop */
673 /* provide wrappers for: fitos, fitod, fstoi, fdtoi, fstod, fdtos, fmov, fneg, fabs */
674
675 #define sparc_fop(ins,r1,op,r2,dest) sparc_encode_format3c((ins),2,(op),(r1),52,(r2),(dest))
676 #define sparc_fcmp(ins,r1,op,r2) sparc_encode_format3c((ins),2,(op),(r1),53,(r2),0)
677
678 /* format 1 fops */
679 #define sparc_fadds(ins, r1, r2, dest) sparc_fop( ins, r1, sparc_fadds_val, r2, dest )
680 #define sparc_faddd(ins, r1, r2, dest) sparc_fop( ins, r1, sparc_faddd_val, r2, dest )
681 #define sparc_faddq(ins, r1, r2, dest) sparc_fop( ins, r1, sparc_faddq_val, r2, dest )
682
683 #define sparc_fsubs(ins, r1, r2, dest) sparc_fop( ins, r1, sparc_fsubs_val, r2, dest ) 
684 #define sparc_fsubd(ins, r1, r2, dest) sparc_fop( ins, r1, sparc_fsubd_val, r2, dest ) 
685 #define sparc_fsubq(ins, r1, r2, dest) sparc_fop( ins, r1, sparc_fsubq_val, r2, dest ) 
686
687 #define sparc_fmuls( ins, r1, r2, dest ) sparc_fop( ins, r1, sparc_fmuls_val, r2, dest )
688 #define sparc_fmuld( ins, r1, r2, dest ) sparc_fop( ins, r1, sparc_fmuld_val, r2, dest )
689 #define sparc_fmulq( ins, r1, r2, dest ) sparc_fop( ins, r1, sparc_fmulq_val, r2, dest )
690
691 #define sparc_fsmuld( ins, r1, r2, dest ) sparc_fop( ins, r1, sparc_fsmuld_val, r2, dest )
692 #define sparc_fdmulq( ins, r1, r2, dest ) sparc_fop( ins, r1, sparc_fdmulq_val, r2, dest )
693
694 #define sparc_fdivs( ins, r1, r2, dest ) sparc_fop( ins, r1, sparc_fdivs_val, r2, dest )
695 #define sparc_fdivd( ins, r1, r2, dest ) sparc_fop( ins, r1, sparc_fdivd_val, r2, dest )
696 #define sparc_fdivq( ins, r1, r2, dest ) sparc_fop( ins, r1, sparc_fdivq_val, r2, dest )
697
698 #define sparc_fitos( ins, r2, dest ) sparc_fop( ins, 0, sparc_fitos_val, r2, dest )
699 #define sparc_fitod( ins, r2, dest ) sparc_fop( ins, 0, sparc_fitod_val, r2, dest )
700 #define sparc_fitoq( ins, r2, dest ) sparc_fop( ins, 0, sparc_fitoq_val, r2, dest )
701
702 #define sparc_fxtos( ins, r2, dest) sparc_fop( ins, 0, sparc_fxtos_val, r2, dest )
703 #define sparc_fxtod( ins, r2, dest) sparc_fop( ins, 0, sparc_fxtod_val, r2, dest )
704 #define sparc_fxtoq( ins, r2, dest) sparc_fop( ins, 0, sparc_fxtoq_val, r2, dest )
705
706 #define sparc_fstoi( ins, r2, dest ) sparc_fop( ins, 0, sparc_fstoi_val, r2, dest )
707 #define sparc_fdtoi( ins, r2, dest ) sparc_fop( ins, 0, sparc_fdtoi_val, r2, dest )
708 #define sparc_fqtoi( ins, r2, dest ) sparc_fop( ins, 0, sparc_fqtoi_val, r2, dest )
709
710 #define sparc_fstod( ins, r2, dest ) sparc_fop( ins, 0, sparc_fstod_val, r2, dest )
711 #define sparc_fstoq( ins, r2, dest ) sparc_fop( ins, 0, sparc_fstoq_val, r2, dest )
712
713 #define sparc_fdtos( ins, r2, dest ) sparc_fop( ins, 0, sparc_fdtos_val, r2, dest )
714 #define sparc_fdtoq( ins, r2, dest ) sparc_fop( ins, 0, sparc_fdtoq_val, r2, dest )
715
716 #define sparc_fqtos( ins, r2, dest ) sparc_fop( ins, 0, sparc_fqtos_val, r2, dest )
717 #define sparc_fqtod( ins, r2, dest ) sparc_fop( ins, 0, sparc_fqtod_val, r2, dest )
718
719 #define sparc_fmovs( ins, r2, dest ) sparc_fop( ins, 0, sparc_fmovs_val, r2, dest )
720 #define sparc_fnegs( ins, r2, dest ) sparc_fop( ins, 0, sparc_fnegs_val, r2, dest )
721 #define sparc_fabss( ins, r2, dest ) sparc_fop( ins, 0, sparc_fabss_val, r2, dest )
722
723 #define sparc_fmovd( ins, r2, dest) sparc_fop (ins, 0, sparc_fmovd_val, r2, dest);
724 #define sparc_fnegd( ins, r2, dest) sparc_fop (ins, 0, sparc_fnegd_val, r2, dest);
725 #define sparc_fabsd( ins, r2, dest) sparc_fop (ins, 0, sparc_fabsd_val, r2, dest);
726
727 #define sparc_fsqrts( ins, r2, dest ) sparc_fop( ins, 0, sparc_fsqrts_val, r2, dest )
728 #define sparc_fsqrtd( ins, r2, dest ) sparc_fop( ins, 0, sparc_fsqrtd_val, r2, dest )
729 #define sparc_fsqrtq( ins, r2, dest ) sparc_fop( ins, 0, sparc_fsqrtq_val, r2, dest )
730
731 /* format 2 fops */
732
733 #define sparc_fcmps( ins, r1, r2 ) sparc_fcmp( ins, r1, sparc_fcmps_val, r2 )
734 #define sparc_fcmpd( ins, r1, r2 ) sparc_fcmp( ins, r1, sparc_fcmpd_val, r2 )
735 #define sparc_fcmpq( ins, r1, r2 ) sparc_fcmp( ins, r1, sparc_fcmpq_val, r2 )
736 #define sparc_fcmpes( ins, r1, r2 ) sparc_fcmpes( ins, r1, sparc_fcmpes_val, r2 )
737 #define sparc_fcmped( ins, r1, r2 ) sparc_fcmped( ins, r1, sparc_fcmped_val, r2 )
738 #define sparc_fcmpeq( ins, r1, r2 ) sparc_fcmpeq( ins, r1, sparc_fcmpeq_val, r2 ) 
739
740 /* logical */
741
742 /* FIXME: condense this using macros */
743 /* FIXME: the setcc stuff is wrong in lots of places */
744
745 #define sparc_logic(ins,op,setcc,r1,r2,dest) sparc_encode_format3a((ins),2,0,(r1),(r2),((setcc) ? 0x10 : 0) | (op), (dest))
746 #define sparc_logic_imm(ins,op,setcc,r1,imm,dest) sparc_encode_format3b((ins),2,(r1),(imm),((setcc) ? 0x10 : 0) | (op), (dest))
747
748 #define sparc_and(ins,setcc,r1,r2,dest) sparc_logic(ins,1,setcc,r1,r2,dest)
749 #define sparc_and_imm(ins,setcc,r1,imm,dest) sparc_logic_imm(ins,1,setcc,r1,imm,dest)
750
751 #define sparc_andn(ins,setcc,r1,r2,dest) sparc_encode_format3a((ins),2,0,(r1),(r2),(setcc)|5,(dest))
752 #define sparc_andn_imm(ins,setcc,r1,imm,dest) sparc_encode_format3b((ins),2,(r1),(imm),(setcc)|5,(dest))
753
754 #define sparc_or(ins,setcc,r1,r2,dest) sparc_encode_format3a((ins),2,0,(r1),(r2),(setcc)|2,(dest))
755 #define sparc_or_imm(ins,setcc,r1,imm,dest) sparc_encode_format3b((ins),2,(r1),(imm),(setcc)|2,(dest))
756
757 #define sparc_orn(ins,setcc,r1,r2,dest) sparc_encode_format3a((ins),2,0,(r1),(r2),(setcc)|6,(dest))
758 #define sparc_orn_imm(ins,setcc,r1,imm,dest) sparc_encode_format3b((ins),2,(r1),(imm),(setcc)|6,(dest))
759
760 #define sparc_xor(ins,setcc,r1,r2,dest) sparc_encode_format3a((ins),2,0,(r1),(r2),(setcc)|3,(dest))
761 #define sparc_xor_imm(ins,setcc,r1,imm,dest) sparc_encode_format3b((ins),2,(r1),(imm), (setcc)|3,(dest))
762
763 #define sparc_xnor(ins,setcc,r1,r2,dest) sparc_encode_format3a((ins),2,0,(r1),(r2),(setcc)|7,(dest))
764 #define sparc_xnor_imm(ins,setcc,r1,imm,dest) sparc_encode_format3b((ins),2,(r1),(imm),(setcc)|7,(dest))
765
766 /* shift */
767 #define sparc_sll(ins,src,disp,dest) sparc_encode_format3a((ins),2,0,(src),(disp),37,(dest))
768 #define sparc_sll_imm(ins,src,disp,dest) sparc_encode_format3b((ins),2,(src),(disp),37,(dest))
769
770 /* Sparc V9 */
771 #define sparc_sllx(ins,src,disp,dest) sparc_encode_format3ax((ins),2,0,(src),(disp),37,(dest))
772 #define sparc_sllx_imm(ins,src,disp,dest) sparc_encode_format3bx((ins),2,(src),(disp),37,(dest))
773
774 #define sparc_srl(ins,src,disp,dest) sparc_encode_format3a((ins),2,0,(src),(disp),38,(dest))
775 #define sparc_srl_imm(ins,src,disp,dest) sparc_encode_format3b((ins),2,(src),(disp),38,(dest))
776
777 /* Sparc V9 */
778 #define sparc_srlx(ins,src,disp,dest) sparc_encode_format3ax((ins),2,0,(src),(disp),38,(dest))
779 #define sparc_srlx_imm(ins,src,disp,dest) sparc_encode_format3bx((ins),2,(src),(disp),38,(dest))
780
781 #define sparc_sra(ins,src,disp,dest) sparc_encode_format3a((ins),2,0,(src),(disp),39,(dest))
782 #define sparc_sra_imm(ins,src,disp,dest) sparc_encode_format3b((ins),2,(src),(disp),39,(dest))
783
784 /* Sparc V9 */
785 #define sparc_srax(ins,src,disp,dest) sparc_encode_format3ax((ins),2,0,(src),(disp),39,(dest))
786 #define sparc_srax_imm(ins,src,disp,dest) sparc_encode_format3bx((ins),2,(src),(disp),39,(dest))
787
788 /* alu */
789
790 #define sparc_alu_reg(ins,op,setcc,r1,r2,dest) sparc_encode_format3a((ins),2,0,(r1),(r2),op|((setcc) ? 0x10 : 0),(dest))
791 #define sparc_alu_imm(ins,op,setcc,r1,imm,dest) sparc_encode_format3b((ins),2,(r1),(imm),op|((setcc) ? 0x10 : 0),(dest))
792
793 #define sparc_add(ins,setcc,r1,r2,dest) sparc_alu_reg((ins),0,(setcc),(r1),(r2),(dest))
794 #define sparc_add_imm(ins,setcc,r1,imm,dest) sparc_alu_imm((ins),0,(setcc),(r1),(imm),(dest))
795
796 #define sparc_addx(ins,setcc,r1,r2,dest) sparc_alu_reg((ins),0x8,(setcc),(r1),(r2),(dest))
797 #define sparc_addx_imm(ins,setcc,r1,imm,dest) sparc_alu_imm((ins),0x8,(setcc),(r1),(imm),(dest))
798
799 #define sparc_sub(ins,setcc,r1,r2,dest) sparc_alu_reg((ins),0x4,(setcc),(r1),(r2),(dest))
800 #define sparc_sub_imm(ins,setcc,r1,imm,dest) sparc_alu_imm((ins),0x4,(setcc),(r1),(imm),(dest))
801
802 #define sparc_subx(ins,setcc,r1,r2,dest) sparc_alu_reg((ins),0xc,(setcc),(r1),(r2),(dest))
803 #define sparc_subx_imm(ins,setcc,r1,imm,dest) sparc_alu_imm((ins),0xc,(setcc),(r1),(imm),(dest))
804
805 #define sparc_muls(ins,r1,r2,dest) sparc_encode_format3a((ins),2,0,(r1),(r2),36,(dest))
806 #define sparc_muls_imm(ins,r1,imm,dest) sparc_encode_format3b((ins),2,(r1),(imm),36,(dest))
807
808 #define sparc_umul(ins,setcc,r1,r2,dest) sparc_alu_reg((ins),0xa,(setcc),(r1),(r2),(dest))
809 #define sparc_umul_imm(ins,setcc,r1,imm,dest) sparc_alu_imm((ins),0xa,(setcc),(r1),(imm),(dest))
810
811 #define sparc_smul(ins,setcc,r1,r2,dest) sparc_alu_reg((ins),0xb,(setcc),(r1),(r2),(dest))
812 #define sparc_smul_imm(ins,setcc,r1,imm,dest) sparc_alu_imm((ins),0xb,(setcc),(r1),(imm),(dest))
813
814 #define sparc_udiv(ins,setcc,r1,r2,dest) sparc_alu_reg((ins),0xe,(setcc),(r1),(r2),(dest))
815 #define sparc_udiv_imm(ins,setcc,r1,imm,dest) sparc_alu_imm((ins),0xe,(setcc),(r1),(imm),(dest))
816
817 #define sparc_sdiv(ins,setcc,r1,r2,dest) sparc_alu_reg((ins),0xf,(setcc),(r1),(r2),(dest))
818 #define sparc_sdiv_imm(ins,setcc,r1,imm,dest) sparc_alu_imm((ins),0xf,(setcc),(r1),(imm),(dest))
819
820
821 /* branch */
822 #define sparc_branch(ins,aval,condval,displ) sparc_encode_format2b((ins),(aval),(condval),2,(displ))
823 /* FIXME: float condition codes are different: unify. */
824 #define sparc_fbranch(ins,aval,condval,displ) sparc_encode_format2b((ins),(aval),(condval),6,(displ))
825 #define sparc_branchp(ins,aval,condval,xcc,predict,displ) sparc_encode_format2c((ins),(aval),(condval),0x1,(xcc),(predict),(displ))
826
827 #define sparc_brz(ins,aval,predict,rs1,disp) sparc_encode_format2d((ins), (aval),0x1,0x3,(predict),(rs1),(disp))
828 #define sparc_brlez(ins,aval,predict,rs1,disp) sparc_encode_format2d((ins), (aval),0x2,0x3,(predict),(rs1),(disp))
829 #define sparc_brlz(ins,aval,predict,rs1,disp) sparc_encode_format2d((ins), (aval),0x3,0x3,(predict),(rs1),(disp))
830 #define sparc_brnz(ins,aval,predict,rs1,disp) sparc_encode_format2d((ins), (aval),0x5,0x3,(predict),(rs1),(disp))
831 #define sparc_brgz(ins,aval,predict,rs1,disp) sparc_encode_format2d((ins), (aval),0x6,0x3,(predict),(rs1),(disp))
832 #define sparc_brgez(ins,aval,predict,rs1,disp) sparc_encode_format2d((ins), (aval),0x7,0x3,(predict),(rs1),(disp))
833
834 /* conditional moves */
835 #define sparc_movcc(ins,cc,condval,r1,dest) sparc_encode_format4c((ins), 0x2, 0x2c, cc, condval, r1, dest)
836
837 #define sparc_movcc_imm(ins,cc,condval,imm,dest) sparc_encode_format4d((ins), 0x2, 0x2c, cc, condval, imm, dest)
838
839 /* synthetic instructions */
840 #define sparc_cmp(ins,r1,r2) sparc_sub((ins),sparc_cc,(r1),(r2),sparc_g0)
841 #define sparc_cmp_imm(ins,r1,imm) sparc_sub_imm((ins),sparc_cc,(r1),(imm),sparc_g0)
842 #define sparc_jmp(ins,base,disp) sparc_jmpl((ins),(base),(disp),sparc_g0)
843 #define sparc_jmp_imm(ins,base,disp) sparc_jmpl_imm((ins),(base),(disp),sparc_g0)
844 #define sparc_call(ins,base,disp) sparc_jmpl((ins),(base),(disp),sparc_o7)
845 #define sparc_call_imm(ins,base,disp) sparc_jmpl_imm((ins),(base),(disp),sparc_o7)
846
847 #define sparc_test(ins,reg) sparc_or ((ins),sparc_cc,sparc_g0,(reg),sparc_g0)
848
849 #define sparc_ret(ins) sparc_jmpl_imm((ins),sparc_i7,8,sparc_g0)
850 #define sparc_retl(ins) sparc_jmpl_imm((ins),sparc_o7,8,sparc_g0)
851 #define sparc_restore_simple(ins) sparc_restore((ins),sparc_g0,sparc_g0,sparc_g0)
852 #define sparc_rett_simple(ins) sparc_rett_imm((ins),sparc_i7,8)
853
854 #define sparc_set32(ins,val,reg)        \
855         do {    \
856         if ((val) == 0) \
857             sparc_clr_reg((ins),(reg)); \
858                else if (((guint32)(val) & 0x3ff) == 0) \
859                         sparc_sethi((ins),(guint32)(val),(reg));        \
860                 else if (((gint32)(val) >= -4096) && ((gint32)(val) <= 4095))   \
861                         sparc_or_imm((ins),FALSE,sparc_g0,(gint32)(val),(reg)); \
862                 else {  \
863                         sparc_sethi((ins),(guint32)(val),(reg));        \
864                         sparc_or_imm((ins),FALSE,(reg),(guint32)(val)&0x3ff,(reg));     \
865                 }       \
866         } while (0)
867
868 #ifdef SPARCV9
869 #define SPARC_SET_MAX_SIZE (6 * 4)
870 #else
871 #define SPARC_SET_MAX_SIZE (2 * 4)
872 #endif
873
874 #if SPARCV9
875 #define sparc_set(ins,ptr,reg) \
876         do {    \
877         g_assert ((reg) != sparc_g1); \
878         gint64 val = (gint64)ptr; \
879                 guint32 top_word = (val) >> 32; \
880                 guint32 bottom_word = (val) & 0xffffffff; \
881         if (val == 0) \
882            sparc_clr_reg ((ins), reg); \
883                 else if ((val >= -4096) && ((val) <= 4095))     \
884                         sparc_or_imm((ins),FALSE,sparc_g0,bottom_word,(reg));   \
885         else if ((val >= 0) && (val <= 4294967295L)) {   \
886                sparc_sethi((ins),bottom_word,(reg));   \
887                if (bottom_word & 0x3ff) \
888                         sparc_or_imm((ins),FALSE,(reg),bottom_word&0x3ff,(reg));        \
889         } \
890         else if ((val >= 0) && (val <= (1L << 44) - 1)) {  \
891             sparc_sethi ((ins), (val >> 12), (reg)); \
892             sparc_or_imm ((ins), FALSE, (reg), (val >> 12) & 0x3ff, (reg)); \
893             sparc_sllx_imm ((ins),(reg), 12, (reg)); \
894             sparc_or_imm ((ins), FALSE, (reg), (val) & 0xfff, (reg)); \
895         } \
896         else if (top_word == 0xffffffff) { \
897             sparc_xnor ((ins), FALSE, sparc_g0, sparc_g0, sparc_g1);    \
898                         sparc_sethi((ins),bottom_word,(reg));   \
899                     sparc_sllx_imm((ins),sparc_g1,32,sparc_g1); \
900                         sparc_or_imm((ins),FALSE,(reg),bottom_word&0x3ff,(reg));        \
901                     sparc_or((ins),FALSE,(reg),sparc_g1,(reg)); \
902         } \
903         else { \
904                         sparc_sethi((ins),top_word,sparc_g1);   \
905                         sparc_sethi((ins),bottom_word,(reg));   \
906                         sparc_or_imm((ins),FALSE,sparc_g1,top_word&0x3ff,sparc_g1);     \
907                         sparc_or_imm((ins),FALSE,(reg),bottom_word&0x3ff,(reg));        \
908                     sparc_sllx_imm((ins),sparc_g1,32,sparc_g1); \
909                     sparc_or((ins),FALSE,(reg),sparc_g1,(reg)); \
910         } \
911         } while (0)
912 #else
913 #define sparc_set(ins,val,reg)  \
914         do {    \
915         if ((val) == 0) \
916             sparc_clr_reg((ins),(reg)); \
917                else if (((guint32)(val) & 0x3ff) == 0) \
918                         sparc_sethi((ins),(guint32)(val),(reg));        \
919                 else if (((gint32)(val) >= -4096) && ((gint32)(val) <= 4095))   \
920                         sparc_or_imm((ins),FALSE,sparc_g0,(gint32)(val),(reg)); \
921                 else {  \
922                         sparc_sethi((ins),(guint32)(val),(reg));        \
923                         sparc_or_imm((ins),FALSE,(reg),(guint32)(val)&0x3ff,(reg));     \
924                 }       \
925         } while (0)
926 #endif
927
928 #define sparc_set_ptr(ins,val,reg) sparc_set(ins,val,reg)
929
930 #ifdef SPARCV9
931 #define sparc_set_template(ins,reg) sparc_set (ins,0x7fffffff7fffffff, reg)
932 #else
933 #define sparc_set_template(ins,reg) sparc_set (ins,0x7fffffff, reg)
934 #endif
935
936 #define sparc_not(ins,reg) sparc_xnor((ins),FALSE,(reg),sparc_g0,(reg))
937 #define sparc_neg(ins,reg) sparc_sub((ins),FALSE,sparc_g0,(reg),(reg))
938 #define sparc_clr_reg(ins,reg) sparc_or((ins),FALSE,sparc_g0,sparc_g0,(reg))
939
940 #define sparc_mov_reg_reg(ins,src,dest) sparc_or((ins),FALSE,sparc_g0,(src),(dest))
941
942 #ifdef SPARCV9
943 #define sparc_sti_imm sparc_stx_imm
944 #define sparc_ldi_imm sparc_ldx_imm
945 #define sparc_sti sparc_stx
946 #define sparc_ldi sparc_ldx
947 #else
948 #define sparc_sti_imm sparc_st_imm
949 #define sparc_ldi_imm sparc_ld_imm
950 #define sparc_sti sparc_st
951 #define sparc_ldi sparc_ld
952 #endif
953
954 #endif /* __SPARC_CODEGEN_H__ */
955