2002-02-17 Radek Doulik <rodo@ximian.com>
[mono.git] / mono / arch / ppc / ppc-codegen.h
1 /*
2    Copyright (C)  2001 Radek Doulik
3 */
4
5 #ifndef PPC_H
6 #define PPC_H
7 #include <glib.h>
8 #include <assert.h>
9
10 typedef enum {
11         ppc_r0 = 0,
12         ppc_r1,
13         ppc_r2,
14         ppc_r3,
15         ppc_r4,
16         ppc_r5,
17         ppc_r6,
18         ppc_r7,
19         ppc_r8,
20         ppc_r9,
21         ppc_r10,
22         ppc_r11,
23         ppc_r12,
24         ppc_r13,
25         ppc_r14,
26         ppc_r15,
27         ppc_r16,
28         ppc_r17,
29         ppc_r18,
30         ppc_r19,
31         ppc_r20,
32         ppc_r21,
33         ppc_r22,
34         ppc_r23,
35         ppc_r24,
36         ppc_r25,
37         ppc_r26,
38         ppc_r27,
39         ppc_r28,
40         ppc_r29,
41         ppc_r30,
42         ppc_r31
43 } PPCIntRegister;
44
45 typedef enum {
46         ppc_f0 = 0,
47         ppc_f1,
48         ppc_f2,
49         ppc_f3,
50         ppc_f4,
51         ppc_f5,
52         ppc_f6,
53         ppc_f7,
54         ppc_f8,
55         ppc_f9,
56         ppc_f10,
57         ppc_f11,
58         ppc_f12,
59         ppc_f13,
60         ppc_f14,
61         ppc_f15,
62         ppc_f16,
63         ppc_f17,
64         ppc_f18,
65         ppc_f19,
66         ppc_f20,
67         ppc_f21,
68         ppc_f22,
69         ppc_f23,
70         ppc_f24,
71         ppc_f25,
72         ppc_f26,
73         ppc_f27,
74         ppc_f28,
75         ppc_f29,
76         ppc_f30,
77         ppc_f31
78 } PPCFloatRegister;
79
80 typedef enum {
81         ppc_lr = 256,
82 } PPCSpecialRegister;
83
84 #define ppc_emit32(c,x) *((guint32 *) c) = x; ((guint32 *)c)++
85
86 #define  ppc_addi(c,D,A,d) ppc_emit32 (c, (14 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d))
87 #define ppc_addis(c,D,A,d) ppc_emit32 (c, (15 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d))
88 #define    ppc_li(c,D,v)   ppc_addi   (c, D, 0, v);
89 #define   ppc_lis(c,D,v)   ppc_addis  (c, D, 0, v);
90 #define   ppc_lwz(c,D,d,a) ppc_emit32 (c, (32 << 26) | ((D) << 21) | ((a) << 16) | (guint16)(d))
91 #define   ppc_lhz(c,D,d,a) ppc_emit32 (c, (40 << 26) | ((D) << 21) | ((a) << 16) | (guint16)(d))
92 #define   ppc_lbz(c,D,d,a) ppc_emit32 (c, (34 << 26) | ((D) << 21) | ((a) << 16) | (guint16)(d))
93 #define   ppc_stw(c,S,d,a) ppc_emit32 (c, (36 << 26) | ((S) << 21) | ((a) << 16) | (guint16)(d))
94 #define   ppc_sth(c,S,d,a) ppc_emit32 (c, (44 << 26) | ((S) << 21) | ((a) << 16) | (guint16)(d))
95 #define   ppc_stb(c,S,d,a) ppc_emit32 (c, (38 << 26) | ((S) << 21) | ((a) << 16) | (guint16)(d))
96 #define  ppc_stwu(c,s,d,a) ppc_emit32 (c, (37 << 26) | ((s) << 21) | ((a) << 16) | (guint16)(d))
97 #define    ppc_or(c,a,s,b) ppc_emit32 (c, (31 << 26) | ((s) << 21) | ((a) << 16) | ((b) << 11) | 888)
98 #define   ppc_ori(c,S,A,u) ppc_emit32 (c, (24 << 26) | ((S) << 21) | ((A) << 16) | (guint16)(u))
99 #define    ppc_mr(c,a,s)   ppc_or     (c, a, s, s)
100 #define ppc_mfspr(c,D,spr) ppc_emit32 (c, (31 << 26) | ((D) << 21) | ((spr) << 11) | (339 << 1))
101 #define  ppc_mflr(c,D)     ppc_mfspr  (c, D, ppc_lr)
102 #define ppc_mtspr(c,spr,S) ppc_emit32 (c, (31 << 26) | ((S) << 21) | ((spr) << 11) | (467 << 1))
103 #define  ppc_mtlr(c,S)     ppc_mtspr  (c, ppc_lr, S)
104
105 #define  ppc_blrl(c)       ppc_emit32 (c, 0x4e800021)
106 #define   ppc_blr(c)       ppc_emit32 (c, 0x4e800020)
107
108 #define   ppc_lfs(c,D,d,A) ppc_emit32 (c, (48 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d))
109 #define   ppc_lfd(c,D,d,A) ppc_emit32 (c, (50 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d))
110 #define  ppc_stfs(c,S,d,a) ppc_emit32 (c, (52 << 26) | ((S) << 21) | ((a) << 16) | (guint16)(d))
111 #define  ppc_stfd(c,S,d,a) ppc_emit32 (c, (54 << 26) | ((S) << 21) | ((a) << 16) | (guint16)(d))
112
113
114 #endif