New test.
[mono.git] / mono / arch / arm / arm-vfp-codegen.h
1 #ifndef __MONO_ARM_VFP_CODEGEN_H__
2 #define __MONO_ARM_VFP_CODEGEN_H__
3
4 #include "arm-codegen.h"
5
6 enum {
7         /* FPA registers */
8         ARM_VFP_F0,
9         ARM_VFP_F1,
10         ARM_VFP_F2,
11         ARM_VFP_F3,
12         ARM_VFP_F4,
13         ARM_VFP_F5,
14         ARM_VFP_F6,
15         ARM_VFP_F7,
16         ARM_VFP_F8,
17         ARM_VFP_F9,
18         ARM_VFP_F10,
19         ARM_VFP_F11,
20         ARM_VFP_F12,
21         ARM_VFP_F13,
22         ARM_VFP_F14,
23         ARM_VFP_F15,
24         ARM_VFP_F16,
25         ARM_VFP_F17,
26         ARM_VFP_F18,
27         ARM_VFP_F19,
28         ARM_VFP_F20,
29         ARM_VFP_F21,
30         ARM_VFP_F22,
31         ARM_VFP_F23,
32         ARM_VFP_F24,
33         ARM_VFP_F25,
34         ARM_VFP_F26,
35         ARM_VFP_F27,
36         ARM_VFP_F28,
37         ARM_VFP_F29,
38         ARM_VFP_F30,
39         ARM_VFP_F31,
40
41         ARM_VFP_D0 = ARM_VFP_F0,
42         ARM_VFP_D1 = ARM_VFP_F2,
43         ARM_VFP_D2 = ARM_VFP_F4,
44         ARM_VFP_D3 = ARM_VFP_F6,
45         ARM_VFP_D4 = ARM_VFP_F8,
46         ARM_VFP_D5 = ARM_VFP_F10,
47         ARM_VFP_D6 = ARM_VFP_F12,
48         ARM_VFP_D7 = ARM_VFP_F14,
49         ARM_VFP_D8 = ARM_VFP_F16,
50         ARM_VFP_D9 = ARM_VFP_F18,
51         ARM_VFP_D10 = ARM_VFP_F20,
52         ARM_VFP_D11 = ARM_VFP_F22,
53         ARM_VFP_D12 = ARM_VFP_F24,
54         ARM_VFP_D13 = ARM_VFP_F26,
55         ARM_VFP_D14 = ARM_VFP_F28,
56         ARM_VFP_D15 = ARM_VFP_F30,
57
58         ARM_VFP_COPROC_SINGLE = 10,
59         ARM_VFP_COPROC_DOUBLE = 11,
60
61 #define ARM_VFP_OP(p,q,r,s) (((p) << 23) | ((q) << 21) | ((r) << 20) | ((s) << 6))
62 #define ARM_VFP_OP2(Fn,N) (ARM_VFP_OP (1,1,1,1) | ((Fn) << 16) | ((N) << 7))
63
64         ARM_VFP_MUL = ARM_VFP_OP (0,1,0,0),
65         ARM_VFP_NMUL = ARM_VFP_OP (0,1,0,1),
66         ARM_VFP_ADD = ARM_VFP_OP (0,1,1,0),
67         ARM_VFP_SUB = ARM_VFP_OP (0,1,1,1),
68         ARM_VFP_DIV = ARM_VFP_OP (1,0,0,0),
69
70         ARM_VFP_CPY = ARM_VFP_OP2 (0,0),
71         ARM_VFP_ABS = ARM_VFP_OP2 (0,1),
72         ARM_VFP_NEG = ARM_VFP_OP2 (1,0),
73         ARM_VFP_SQRT = ARM_VFP_OP2 (1,1),
74         ARM_VFP_CMP = ARM_VFP_OP2 (4,0),
75         ARM_VFP_CMPE = ARM_VFP_OP2 (4,1),
76         ARM_VFP_CMPZ = ARM_VFP_OP2 (5,0),
77         ARM_VFP_CMPEZ = ARM_VFP_OP2 (5,1),
78         ARM_VFP_CVT = ARM_VFP_OP2 (7,1),
79         ARM_VFP_UITO = ARM_VFP_OP2 (8,0),
80         ARM_VFP_SITO = ARM_VFP_OP2 (8,1),
81         ARM_VFP_TOUI = ARM_VFP_OP2 (12,0),
82         ARM_VFP_TOSI = ARM_VFP_OP2 (13,0),
83         ARM_VFP_TOUIZ = ARM_VFP_OP2 (12,1),
84         ARM_VFP_TOSIZ = ARM_VFP_OP2 (13,1),
85
86         ARM_VFP_SID = 0,
87         ARM_VFP_SCR = 1 << 1,
88         ARM_VFP_EXC = 8 << 1
89 };
90
91 #define ARM_DEF_VFP_DYADIC(cond,cp,op,Fd,Fn,Fm) \
92         (14 << 24)                              |       \
93         ((cp) << 8)                             |       \
94         (op)                                    |       \
95         (((Fd) >> 1) << 12)                     |       \
96         (((Fd) & 1) << 22)                      |       \
97         (((Fn) >> 1) << 16)                     |       \
98         (((Fn) & 1) << 7)                       |       \
99         (((Fm) >> 1) << 0)                      |       \
100         (((Fm) & 1) << 5)                       |       \
101         ARM_DEF_COND(cond)
102
103 #define ARM_DEF_VFP_MONADIC(cond,cp,op,Fd,Fm)   \
104         (14 << 24)                              |       \
105         ((cp) << 8)                             |       \
106         (op)                                    |       \
107         (((Fd) >> 1) << 12)                     |       \
108         (((Fd) & 1) << 22)                      |       \
109         (((Fm) >> 1) << 0)                      |       \
110         (((Fm) & 1) << 5)                       |       \
111         ARM_DEF_COND(cond)
112
113 #define ARM_DEF_VFP_LSF(cond,cp,post,ls,wback,basereg,Fd,offset)        \
114         ((offset) >= 0? (offset)>>2: -(offset)>>2)      |       \
115         ((6 << 25)                                      |       \
116         ((cp) << 8)                                     |       \
117         (((Fd) >> 1) << 12)                             |       \
118         (((Fd) & 1) << 22)                              |       \
119         ((basereg) << 16)                               |       \
120         ((ls) << 20)                                    |       \
121         ((wback) << 21)                                 |       \
122         (((offset) >= 0) << 23)                         |       \
123         ((wback) << 21)                                 |       \
124         ((post) << 24)                                  |       \
125         ARM_DEF_COND(cond)
126
127 #define ARM_DEF_VFP_CPT(cond,cp,op,L,Fn,Rd)     \
128         (14 << 24)                              |       \
129         (1 << 4)                                |       \
130         ((cp) << 8)                             |       \
131         ((op) << 21)                            |       \
132         ((L) << 20)                             |       \
133         ((Rd) << 12)                            |       \
134         (((Fn) >> 1) << 16)                     |       \
135         (((Fn) & 1) << 7)                       |       \
136         ARM_DEF_COND(cond)
137
138 /* FP load and stores */
139 #define ARM_FLDS_COND(p,freg,base,offset,cond)  \
140         ARM_EMIT((p), ARM_DEF_VFP_LSF((cond),ARM_VFP_COPROC_SINGLE,1,ARMOP_LDR,0,(base),(freg),(offset)))
141 #define ARM_FLDS(p,freg,base,offset)    \
142         ARM_FLDS_COND(p,freg,base,offset,ARMCOND_AL)
143
144 #define ARM_FLDD_COND(p,freg,base,offset,cond)  \
145         ARM_EMIT((p), ARM_DEF_VFP_LSF((cond),ARM_VFP_COPROC_DOUBLE,1,ARMOP_LDR,0,(base),(freg),(offset)))
146 #define ARM_FLDD(p,freg,base,offset)    \
147         ARM_FLDD_COND(p,freg,base,offset,ARMCOND_AL)
148
149 #define ARM_FSTS_COND(p,freg,base,offset,cond)  \
150         ARM_EMIT((p), ARM_DEF_VFP_LSF((cond),ARM_VFP_COPROC_SINGLE,1,ARMOP_STR,0,(base),(freg),(offset)))
151 #define ARM_FSTS(p,freg,base,offset)    \
152         ARM_FSTS_COND(p,freg,base,offset,ARMCOND_AL)
153
154 #define ARM_FSTD_COND(p,freg,base,offset,cond)  \
155         ARM_EMIT((p), ARM_DEF_VFP_LSF((cond),ARM_VFP_COPROC_DOUBLE,1,ARMOP_STR,0,(base),(freg),(offset)))
156 #define ARM_FSTD(p,freg,base,offset)    \
157         ARM_FSTD_COND(p,freg,base,offset,ARMCOND_AL)
158
159 #include "arm_vfpmacros.h"
160
161 #define ARM_DEF_VFP_CPT(cond,cp,op,L,Fn,Rd)
162 /* coprocessor register transfer */
163 #define ARM_FMSR(p,freg,reg)    \
164         ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_SINGLE,0,0,(freg),(reg)))
165 #define ARM_FMRS(p,reg,freg)    \
166         ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_SINGLE,0,1,(freg),(reg)))
167
168 #define ARM_FMDLR(p,freg,reg)   \
169         ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_DOUBLE,0,0,(freg),(reg)))
170 #define ARM_FMRDL(p,reg,freg)   \
171         ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_DOUBLE,0,1,(freg),(reg)))
172 #define ARM_FMDHR(p,freg,reg)   \
173         ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_DOUBLE,1,0,(freg),(reg)))
174 #define ARM_FMRDH(p,reg,freg)   \
175         ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_DOUBLE,1,1,(freg),(reg)))
176
177 #define ARM_FMXR(p,freg,reg)    \
178         ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_SINGLE,7,0,(freg),(reg)))
179 #define ARM_FMRX(p,reg,freg)    \
180         ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_SINGLE,7,1,(freg),(reg)))
181
182 #endif /* __MONO_ARM_VFP_CODEGEN_H__ */
183