Wed Jun 11 18:01:06 CEST 2003 Paolo Molaro <lupus@ximian.com>
[mono.git] / mono / mini / inssel-float.brg
1 %%
2
3 #
4 # inssel-float.brg: burg file for floating point instructions
5 #
6 # Author:
7 #   Dietmar Maurer (dietmar@ximian.com)
8 #
9 # (C) 2002 Ximian, Inc.
10 #
11
12 #
13 # load/store
14 #
15
16 freg: CEE_LDIND_R4 (base) {
17         MONO_EMIT_LOAD_MEMBASE_OP (s, tree, OP_LOADR4_MEMBASE, state->reg1, 
18                                    state->left->tree->inst_basereg, state->left->tree->inst_offset);
19 }
20
21 freg: CEE_LDIND_R8 (base) {
22         MONO_EMIT_LOAD_MEMBASE_OP (s, tree, OP_LOADR8_MEMBASE, state->reg1, 
23                                    state->left->tree->inst_basereg, state->left->tree->inst_offset);
24 }
25
26 stmt: CEE_STIND_R4 (base, freg) {
27         MONO_EMIT_STORE_MEMBASE (s, tree, OP_STORER4_MEMBASE_REG, state->left->tree->inst_basereg,
28                                  state->left->tree->inst_offset, state->right->reg1);
29 }
30
31 stmt: CEE_STIND_R8 (base, freg) {
32         MONO_EMIT_STORE_MEMBASE (s, tree, OP_STORER8_MEMBASE_REG, state->left->tree->inst_basereg,
33                                  state->left->tree->inst_offset, state->right->reg1);
34 }
35
36 freg: OP_R4CONST {
37         tree->dreg = state->reg1;
38         mono_bblock_add_inst (s->cbb, tree);
39 }
40
41 freg: OP_R8CONST {
42         tree->dreg = state->reg1;
43         mono_bblock_add_inst (s->cbb, tree);
44 }
45
46 #
47 # fp alu operations 
48
49
50 freg: OP_FADD (freg, freg) {
51         MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
52 }
53
54 freg: OP_FSUB (freg, freg) {
55         MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
56 }
57
58 freg: OP_FMUL (freg, freg) {
59         MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
60 }
61
62 freg: OP_FDIV (freg, freg) {
63         MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
64 }
65
66 freg: OP_FREM (freg, freg) {
67         MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
68 }
69
70 freg: OP_FNEG (freg) {
71         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
72 }
73
74 freg: CEE_CKFINITE (freg) {
75         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
76 }
77
78 freg: OP_SIN (freg) {
79         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
80 }
81
82 freg: OP_COS (freg) {
83         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
84 }
85
86 freg: OP_ABS (freg) {
87         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
88 }
89
90 freg: OP_TAN (freg) {
91         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
92 }
93
94 freg: OP_ATAN (freg) {
95         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
96 }
97
98 freg: OP_SQRT (freg) {
99         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
100 }
101
102 #
103 # floating point conversions
104 #
105
106 reg: OP_FCONV_TO_I4 (freg) {
107         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
108 }
109
110 reg: OP_FCONV_TO_U4 (freg) {
111         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
112 }
113
114 reg: OP_FCONV_TO_OVF_I4 (freg) {
115         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
116 }
117
118 reg: OP_FCONV_TO_OVF_U4 (freg) {
119         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
120 }
121
122 reg: OP_FCONV_TO_OVF_I8 (freg) {
123         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
124 }
125
126 reg: OP_FCONV_TO_OVF_U8 (freg) {
127         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
128 }
129
130 reg: OP_FCONV_TO_OVF_I (freg) {
131         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
132 }
133
134 reg: OP_FCONV_TO_OVF_U (freg) {
135         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
136 }
137
138 reg: OP_FCONV_TO_I (freg) {
139         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
140 }
141
142 reg: OP_FCONV_TO_U (freg) {
143         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
144 }
145
146 reg: OP_FCONV_TO_I2 (freg) {
147         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
148 }
149
150 reg: OP_FCONV_TO_U2 (freg) {
151         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
152 }
153
154 reg: OP_FCONV_TO_I1 (freg) {
155         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
156 }
157
158 reg: OP_FCONV_TO_U1 (freg) {
159         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
160 }
161
162 freg: OP_FCONV_TO_R8 (freg) {
163         /* nothing to do */
164 }
165
166 freg: OP_FCONV_TO_R4 (freg) {
167         /* fixme: nothing to do ??*/
168 }
169
170 freg: CEE_CONV_R4 (reg) "2" {
171         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
172 }
173
174 freg: CEE_CONV_R8 (reg) "2" {
175         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
176 }
177
178 freg: CEE_CONV_R_UN (reg) "2" {
179         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
180 }
181
182 #
183 # control flow
184 #
185
186 # CPUs using the same condition flags for integers and float
187 # can use the following chain rule:
188 # cflags: fpcflags "0"
189 # that way all branches are handled by inssel.brg
190
191 fpcflags: OP_COMPARE (freg, freg) {
192         tree->opcode = OP_FCOMPARE;
193         tree->sreg1 = state->left->reg1;
194         tree->sreg2 = state->right->reg1;
195         mono_bblock_add_inst (s->cbb, tree);
196 }
197
198 #
199 # miscellaneous fp operations
200 #
201
202 stmt: CEE_POP (freg) {
203         /* do nothing */
204 }     
205
206
207 freg: CEE_CKFINITE (freg) {
208         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
209 }
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233 %%