3 /* Handle shigh(), high(). */
6 parse_h_hi16 (strp, opindex, min, max, valuep)
9 unsigned long min, max;
10 unsigned long *valuep;
13 enum cgen_parse_operand_result result_type;
15 /* FIXME: Need # in assembler syntax (means '#' is optional). */
19 if (strncmp (*strp, "high(", 5) == 0)
22 errmsg = cgen_parse_address (strp, opindex, BFD_RELOC_M32R_HI16_ULO,
23 &result_type, valuep);
28 && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
32 else if (strncmp (*strp, "shigh(", 6) == 0)
35 errmsg = cgen_parse_address (strp, opindex, BFD_RELOC_M32R_HI16_SLO,
36 &result_type, valuep);
41 && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
42 *valuep = (*valuep >> 16) + ((*valuep) & 0x8000 ? 1 : 0);
46 return cgen_parse_unsigned_integer (strp, opindex, min, max, valuep);
49 /* Handle low() in a signed context. Also handle sda().
50 The signedness of the value doesn't matter to low(), but this also
51 handles the case where low() isn't present. */
54 parse_h_slo16 (strp, opindex, min, max, valuep)
61 enum cgen_parse_operand_result result_type;
63 /* FIXME: Need # in assembler syntax (means '#' is optional). */
67 if (strncmp (*strp, "low(", 4) == 0)
70 errmsg = cgen_parse_address (strp, opindex, BFD_RELOC_M32R_LO16,
71 &result_type, valuep);
78 if (strncmp (*strp, "sda(", 4) == 0)
81 errmsg = cgen_parse_address (strp, opindex, BFD_RELOC_M32R_SDA16, NULL, valuep);
88 return cgen_parse_signed_integer (strp, opindex, min, max, valuep);
91 /* Handle low() in an unsigned context.
92 The signedness of the value doesn't matter to low(), but this also
93 handles the case where low() isn't present. */
96 parse_h_ulo16 (strp, opindex, min, max, valuep)
99 unsigned long min, max;
100 unsigned long *valuep;
103 enum cgen_parse_operand_result result_type;
105 /* FIXME: Need # in assembler syntax (means '#' is optional). */
109 if (strncmp (*strp, "low(", 4) == 0)
112 errmsg = cgen_parse_address (strp, opindex, BFD_RELOC_M32R_LO16,
113 &result_type, valuep);
115 return "missing `)'";
120 return cgen_parse_unsigned_integer (strp, opindex, min, max, valuep);
125 /* Main entry point for operand parsing.
127 This function is basically just a big switch statement. Earlier versions
128 used tables to look up the function to use, but
129 - if the table contains both assembler and disassembler functions then
130 the disassembler contains much of the assembler and vice-versa,
131 - there's a lot of inlining possibilities as things grow,
132 - using a switch statement avoids the function call overhead.
134 This function could be moved into `parse_insn_normal', but keeping it
135 separate makes clear the interface between `parse_insn_normal' and each of
139 CGEN_INLINE const char *
140 m32r_cgen_parse_operand (opindex, strp, fields)
149 case M32R_OPERAND_SR :
150 errmsg = cgen_parse_keyword (strp, & m32r_cgen_opval_h_gr, &fields->f_r2);
152 case M32R_OPERAND_DR :
153 errmsg = cgen_parse_keyword (strp, & m32r_cgen_opval_h_gr, &fields->f_r1);
155 case M32R_OPERAND_SRC1 :
156 errmsg = cgen_parse_keyword (strp, & m32r_cgen_opval_h_gr, &fields->f_r1);
158 case M32R_OPERAND_SRC2 :
159 errmsg = cgen_parse_keyword (strp, & m32r_cgen_opval_h_gr, &fields->f_r2);
161 case M32R_OPERAND_SCR :
162 errmsg = cgen_parse_keyword (strp, & m32r_cgen_opval_h_cr, &fields->f_r2);
164 case M32R_OPERAND_DCR :
165 errmsg = cgen_parse_keyword (strp, & m32r_cgen_opval_h_cr, &fields->f_r1);
167 case M32R_OPERAND_SIMM8 :
168 errmsg = cgen_parse_signed_integer (strp, 7, -128, 127, &fields->f_simm8);
170 case M32R_OPERAND_SIMM16 :
171 errmsg = cgen_parse_signed_integer (strp, 8, -32768, 32767, &fields->f_simm16);
173 case M32R_OPERAND_UIMM4 :
174 errmsg = cgen_parse_unsigned_integer (strp, 9, 0, 15, &fields->f_uimm4);
176 case M32R_OPERAND_UIMM5 :
177 errmsg = cgen_parse_unsigned_integer (strp, 10, 0, 31, &fields->f_uimm5);
179 case M32R_OPERAND_UIMM16 :
180 errmsg = cgen_parse_unsigned_integer (strp, 11, 0, 65535, &fields->f_uimm16);
182 case M32R_OPERAND_ACC_S :
183 errmsg = cgen_parse_keyword (strp, & m32r_cgen_opval_h_accums, &fields->f_acc_s);
185 case M32R_OPERAND_ACC :
186 errmsg = cgen_parse_keyword (strp, & m32r_cgen_opval_h_accums, &fields->f_acc);
188 case M32R_OPERAND_HI16 :
189 errmsg = parse_h_hi16 (strp, 14, 0, 65535, &fields->f_hi16);
191 case M32R_OPERAND_SLO16 :
192 errmsg = parse_h_slo16 (strp, 15, -32768, 32767, &fields->f_simm16);
194 case M32R_OPERAND_ULO16 :
195 errmsg = parse_h_ulo16 (strp, 16, 0, 65535, &fields->f_uimm16);
197 case M32R_OPERAND_UIMM24 :
198 errmsg = cgen_parse_address (strp, 17, 0, NULL, &fields->f_uimm24);
200 case M32R_OPERAND_DISP8 :
201 errmsg = cgen_parse_address (strp, 18, 0, NULL, &fields->f_disp8);
203 case M32R_OPERAND_DISP16 :
204 errmsg = cgen_parse_address (strp, 19, 0, NULL, &fields->f_disp16);
206 case M32R_OPERAND_DISP24 :
207 errmsg = cgen_parse_address (strp, 20, 0, NULL, &fields->f_disp24);
211 fprintf (stderr, "Unrecognized field %d while parsing.\n", opindex);
218 /* Main entry point for operand insertion.
220 This function is basically just a big switch statement. Earlier versions
221 used tables to look up the function to use, but
222 - if the table contains both assembler and disassembler functions then
223 the disassembler contains much of the assembler and vice-versa,
224 - there's a lot of inlining possibilities as things grow,
225 - using a switch statement avoids the function call overhead.
227 This function could be moved into `parse_insn_normal', but keeping it
228 separate makes clear the interface between `parse_insn_normal' and each of
229 the handlers. It's also needed by GAS to insert operands that couldn't be
230 resolved during parsing.
234 m32r_cgen_insert_operand (opindex, fields, buffer)
241 case M32R_OPERAND_SR :
242 insert_normal (fields->f_r2, 0|(1<<CGEN_OPERAND_UNSIGNED), 12, 4, 0, CGEN_FIELDS_BITSIZE (fields), buffer);
244 case M32R_OPERAND_DR :
245 insert_normal (fields->f_r1, 0|(1<<CGEN_OPERAND_UNSIGNED), 4, 4, 0, CGEN_FIELDS_BITSIZE (fields), buffer);
247 case M32R_OPERAND_SRC1 :
248 insert_normal (fields->f_r1, 0|(1<<CGEN_OPERAND_UNSIGNED), 4, 4, 0, CGEN_FIELDS_BITSIZE (fields), buffer);
250 case M32R_OPERAND_SRC2 :
251 insert_normal (fields->f_r2, 0|(1<<CGEN_OPERAND_UNSIGNED), 12, 4, 0, CGEN_FIELDS_BITSIZE (fields), buffer);
253 case M32R_OPERAND_SCR :
254 insert_normal (fields->f_r2, 0|(1<<CGEN_OPERAND_UNSIGNED), 12, 4, 0, CGEN_FIELDS_BITSIZE (fields), buffer);
256 case M32R_OPERAND_DCR :
257 insert_normal (fields->f_r1, 0|(1<<CGEN_OPERAND_UNSIGNED), 4, 4, 0, CGEN_FIELDS_BITSIZE (fields), buffer);
259 case M32R_OPERAND_SIMM8 :
260 insert_normal (fields->f_simm8, 0, 8, 8, 0, CGEN_FIELDS_BITSIZE (fields), buffer);
262 case M32R_OPERAND_SIMM16 :
263 insert_normal (fields->f_simm16, 0, 16, 16, 0, CGEN_FIELDS_BITSIZE (fields), buffer);
265 case M32R_OPERAND_UIMM4 :
266 insert_normal (fields->f_uimm4, 0|(1<<CGEN_OPERAND_UNSIGNED), 12, 4, 0, CGEN_FIELDS_BITSIZE (fields), buffer);
268 case M32R_OPERAND_UIMM5 :
269 insert_normal (fields->f_uimm5, 0|(1<<CGEN_OPERAND_UNSIGNED), 11, 5, 0, CGEN_FIELDS_BITSIZE (fields), buffer);
271 case M32R_OPERAND_UIMM16 :
272 insert_normal (fields->f_uimm16, 0|(1<<CGEN_OPERAND_UNSIGNED), 16, 16, 0, CGEN_FIELDS_BITSIZE (fields), buffer);
274 case M32R_OPERAND_ACC_S :
275 insert_normal (fields->f_acc_s, 0|(1<<CGEN_OPERAND_UNSIGNED), 12, 2, 0, CGEN_FIELDS_BITSIZE (fields), buffer);
277 case M32R_OPERAND_ACC :
278 insert_normal (fields->f_acc, 0|(1<<CGEN_OPERAND_UNSIGNED), 8, 1, 0, CGEN_FIELDS_BITSIZE (fields), buffer);
280 case M32R_OPERAND_HI16 :
281 insert_normal (fields->f_hi16, 0|(1<<CGEN_OPERAND_SIGN_OPT)|(1<<CGEN_OPERAND_UNSIGNED), 16, 16, 0, CGEN_FIELDS_BITSIZE (fields), buffer);
283 case M32R_OPERAND_SLO16 :
284 insert_normal (fields->f_simm16, 0, 16, 16, 0, CGEN_FIELDS_BITSIZE (fields), buffer);
286 case M32R_OPERAND_ULO16 :
287 insert_normal (fields->f_uimm16, 0|(1<<CGEN_OPERAND_UNSIGNED), 16, 16, 0, CGEN_FIELDS_BITSIZE (fields), buffer);
289 case M32R_OPERAND_UIMM24 :
290 insert_normal (fields->f_uimm24, 0|(1<<CGEN_OPERAND_RELOC)|(1<<CGEN_OPERAND_ABS_ADDR)|(1<<CGEN_OPERAND_UNSIGNED), 8, 24, 0, CGEN_FIELDS_BITSIZE (fields), buffer);
292 case M32R_OPERAND_DISP8 :
293 insert_normal (fields->f_disp8, 0|(1<<CGEN_OPERAND_RELAX)|(1<<CGEN_OPERAND_RELOC)|(1<<CGEN_OPERAND_PCREL_ADDR), 8, 8, 2, CGEN_FIELDS_BITSIZE (fields), buffer);
295 case M32R_OPERAND_DISP16 :
296 insert_normal (fields->f_disp16, 0|(1<<CGEN_OPERAND_RELOC)|(1<<CGEN_OPERAND_PCREL_ADDR), 16, 16, 2, CGEN_FIELDS_BITSIZE (fields), buffer);
298 case M32R_OPERAND_DISP24 :
299 insert_normal (fields->f_disp24, 0|(1<<CGEN_OPERAND_RELAX)|(1<<CGEN_OPERAND_RELOC)|(1<<CGEN_OPERAND_PCREL_ADDR), 8, 24, 2, CGEN_FIELDS_BITSIZE (fields), buffer);
303 fprintf (stderr, "Unrecognized field %d while building insn.\n",
309 /* Main entry point for operand validation.
311 This function is called from GAS when it has fully resolved an operand
312 that couldn't be resolved during parsing.
314 The result is NULL for success or an error message (which may be
315 computed into a static buffer).
318 CGEN_INLINE const char *
319 m32r_cgen_validate_operand (opindex, fields)
321 const CGEN_FIELDS *fields;
323 const char *errmsg = NULL;
327 case M32R_OPERAND_SR :
330 case M32R_OPERAND_DR :
333 case M32R_OPERAND_SRC1 :
336 case M32R_OPERAND_SRC2 :
339 case M32R_OPERAND_SCR :
342 case M32R_OPERAND_DCR :
345 case M32R_OPERAND_SIMM8 :
346 errmsg = cgen_validate_signed_integer (fields->f_simm8, -128, 127);
348 case M32R_OPERAND_SIMM16 :
349 errmsg = cgen_validate_signed_integer (fields->f_simm16, -32768, 32767);
351 case M32R_OPERAND_UIMM4 :
352 errmsg = cgen_validate_unsigned_integer (fields->f_uimm4, 0, 15);
354 case M32R_OPERAND_UIMM5 :
355 errmsg = cgen_validate_unsigned_integer (fields->f_uimm5, 0, 31);
357 case M32R_OPERAND_UIMM16 :
358 errmsg = cgen_validate_unsigned_integer (fields->f_uimm16, 0, 65535);
360 case M32R_OPERAND_ACC_S :
363 case M32R_OPERAND_ACC :
366 case M32R_OPERAND_HI16 :
367 errmsg = cgen_validate_unsigned_integer (fields->f_hi16, 0, 65535);
369 case M32R_OPERAND_SLO16 :
370 errmsg = cgen_validate_signed_integer (fields->f_simm16, -32768, 32767);
372 case M32R_OPERAND_ULO16 :
373 errmsg = cgen_validate_unsigned_integer (fields->f_uimm16, 0, 65535);
375 case M32R_OPERAND_UIMM24 :
378 case M32R_OPERAND_DISP8 :
381 case M32R_OPERAND_DISP16 :
384 case M32R_OPERAND_DISP24 :
389 fprintf (stderr, "Unrecognized field %d while validating operand.\n",
397 cgen_parse_fn *m32r_cgen_parse_handlers[] = {
402 cgen_insert_fn *m32r_cgen_insert_handlers[] = {
408 m32r_cgen_init_asm (mach, endian)
410 enum cgen_endian endian;
412 m32r_cgen_init_tables (mach);
413 cgen_set_cpu (& m32r_cgen_opcode_data, mach, endian);