4 # inssel-sparc.brg: burg file for special sparc instructions
7 # Dietmar Maurer (dietmar@ximian.com)
8 # Paolo Molaro (lupus@ximian.com)
10 # (C) 2002 Ximian, Inc.
13 stmt: CEE_STIND_I8 (OP_REGVAR, lreg) {
14 /* this should only happen for methods returning a long */
15 MONO_EMIT_NEW_UNALU (s, OP_MOVE, sparc_o0, state->right->reg1);
16 MONO_EMIT_NEW_UNALU (s, OP_MOVE, sparc_o1, state->right->reg2);
19 #lreg: OP_LNEG (lreg) "2" {
20 # MONO_EMIT_NEW_BIALU_IMM (s, OP_PPC_SUBFIC, state->reg1, state->left->reg1, 0);
21 # MONO_EMIT_UNALU (s, tree, OP_PPC_SUBFZE, state->reg2, state->left->reg2);
24 freg: OP_LCONV_TO_R8 (lreg) {
25 mono_bblock_add_inst (s->cbb, tree);
28 freg: OP_LCONV_TO_R4 (lreg) {
29 mono_bblock_add_inst (s->cbb, tree);
32 freg: CEE_CONV_R_UN (reg) {
33 mono_bblock_add_inst (s->cbb, tree);
36 reg: OP_LOCALLOC (OP_ICONST) {
37 /* microcoded in mini-sparc.c */
38 tree->sreg1 = mono_regstate_next_int (s->rs);
39 MONO_EMIT_NEW_ICONST (s, tree->sreg1, state->left->tree->inst_c0);
40 mono_bblock_add_inst (s->cbb, tree);
43 reg: OP_LOCALLOC (reg) {
44 mono_bblock_add_inst (s->cbb, tree);
47 stmt: OP_SETRET (reg) {
48 tree->opcode = OP_MOVE;
49 tree->sreg1 = state->left->reg1;
50 tree->dreg = sparc_o0;
51 mono_bblock_add_inst (s->cbb, tree);
54 stmt: OP_SETRET (lreg) {
55 MONO_EMIT_NEW_UNALU (s, OP_MOVE, sparc_o0, state->left->reg2);
56 tree->opcode = OP_MOVE;
57 tree->sreg1 = state->left->reg1;
58 tree->dreg = sparc_o1;
59 mono_bblock_add_inst (s->cbb, tree);
62 stmt: OP_SETRET (freg) {
66 stmt: OP_SETRET (OP_ICONST) {
67 tree->opcode = OP_ICONST;
68 tree->inst_c0 = state->left->tree->inst_c0;
69 tree->dreg = sparc_o0;
70 mono_bblock_add_inst (s->cbb, tree);
73 stmt: OP_OUTARG (reg) {
74 tree->opcode = OP_SETREG;
75 tree->dreg = tree->unused;
76 tree->sreg1 = state->left->reg1;
77 mono_bblock_add_inst (s->cbb, tree);
80 stmt: OP_OUTARG (OP_REGVAR) {
81 tree->opcode = OP_SETREG;
82 tree->dreg = tree->unused;
83 tree->sreg1 = state->left->tree->dreg;
84 mono_bblock_add_inst (s->cbb, tree);
87 stmt: OP_OUTARG (lreg) {
88 MONO_EMIT_NEW_UNALU (s, OP_SETREG, tree->unused, state->left->reg2);
89 tree->opcode = OP_SETREG;
90 tree->dreg = tree->unused + 1;
91 mono_bblock_add_inst (s->cbb, tree);
94 stmt: OP_OUTARG (OP_ICONST) {
95 tree->opcode = OP_SETREGIMM;
96 tree->dreg = tree->unused;
97 tree->inst_c0 = state->left->tree->inst_c0;
98 mono_bblock_add_inst (s->cbb, tree);
101 #stmt: OP_OUTARG (CEE_LDIND_I4 (base)) {
102 # tree->opcode = OP_X86_PUSH_MEMBASE;
103 # tree->inst_basereg = state->left->left->tree->inst_basereg;
104 # tree->inst_offset = state->left->left->tree->inst_offset;
105 # mono_bblock_add_inst (s->cbb, tree);
108 #stmt: OP_OUTARG (CEE_LDIND_U4 (base)) {
109 # tree->opcode = OP_X86_PUSH_MEMBASE;
110 # tree->inst_basereg = state->left->left->tree->inst_basereg;
111 # tree->inst_offset = state->left->left->tree->inst_offset;
112 # mono_bblock_add_inst (s->cbb, tree);
115 #stmt: OP_OUTARG (CEE_LDIND_I (base)) {
116 # tree->opcode = OP_X86_PUSH_MEMBASE;
117 # tree->inst_basereg = state->left->left->tree->inst_basereg;
118 # tree->inst_offset = state->left->left->tree->inst_offset;
119 # mono_bblock_add_inst (s->cbb, tree);
122 #stmt: OP_OUTARG (CEE_LDIND_REF (base)) {
123 # tree->opcode = OP_X86_PUSH_MEMBASE;
124 # tree->inst_basereg = state->left->left->tree->inst_basereg;
125 # tree->inst_offset = state->left->left->tree->inst_offset;
126 # mono_bblock_add_inst (s->cbb, tree);
129 stmt: OP_OUTARG (CEE_LDIND_REF (OP_REGVAR)) {
130 tree->opcode = OP_SETREG;
131 tree->sreg1 = state->left->left->tree->dreg;
132 tree->dreg = tree->unused;
133 mono_bblock_add_inst (s->cbb, tree);
136 stmt: OP_OUTARG_VT (OP_ICONST) {
137 tree->opcode = OP_SETREGIMM;
138 tree->dreg = tree->unused;
139 tree->inst_imm = state->left->tree->inst_c0;
140 mono_bblock_add_inst (s->cbb, tree);
143 stmt: CEE_STIND_R8 (OP_REGVAR, freg) {
144 /* nothing to do: the value is already on the FP stack */
147 stmt: CEE_BNE_UN (fpcflags) {
148 tree->opcode = OP_FBNE_UN;
149 mono_bblock_add_inst (s->cbb, tree);
152 stmt: CEE_BEQ (fpcflags) {
153 tree->opcode = OP_FBEQ;
154 mono_bblock_add_inst (s->cbb, tree);
157 stmt: CEE_BLT (fpcflags) {
158 tree->opcode = OP_FBLT;
159 mono_bblock_add_inst (s->cbb, tree);
162 stmt: CEE_BLT_UN (fpcflags) {
163 tree->opcode = OP_FBLT_UN;
164 mono_bblock_add_inst (s->cbb, tree);
167 stmt: CEE_BGT (fpcflags) {
168 tree->opcode = OP_FBGT;
169 mono_bblock_add_inst (s->cbb, tree);
172 stmt: CEE_BGT_UN (fpcflags) {
173 tree->opcode = OP_FBGT_UN;
174 mono_bblock_add_inst (s->cbb, tree);
177 stmt: CEE_BGE (fpcflags) {
178 tree->opcode = OP_FBGE;
179 mono_bblock_add_inst (s->cbb, tree);
182 stmt: CEE_BGE_UN (fpcflags) {
183 tree->opcode = OP_FBGE_UN;
184 mono_bblock_add_inst (s->cbb, tree);
187 stmt: CEE_BLE (fpcflags) {
188 tree->opcode = OP_FBLE;
189 mono_bblock_add_inst (s->cbb, tree);
192 stmt: CEE_BLE_UN (fpcflags) {
193 tree->opcode = OP_FBLE_UN;
194 mono_bblock_add_inst (s->cbb, tree);
197 stmt: CEE_POP (freg) "0" {