diff options
author | Trevor Saunders <tbsaunde+binutils@tbsaunde.org> | 2016-03-20 01:21:48 -0400 |
---|---|---|
committer | Trevor Saunders <tbsaunde+binutils@tbsaunde.org> | 2016-03-25 20:26:56 -0400 |
commit | 9202e88a2a1ebbfa1e312f5875420e027e35cc45 (patch) | |
tree | 5ab4f5234b5cdd6eb2b4763f0f46a2ecbdeb91fe /gas/config/tc-cr16.c | |
parent | a90fb5e33ba890eb9427b9ba3d529729b018b474 (diff) | |
download | fsf-binutils-gdb-9202e88a2a1ebbfa1e312f5875420e027e35cc45.zip fsf-binutils-gdb-9202e88a2a1ebbfa1e312f5875420e027e35cc45.tar.gz fsf-binutils-gdb-9202e88a2a1ebbfa1e312f5875420e027e35cc45.tar.bz2 |
split up cr16s md_assemble ()
gas/ChangeLog:
2016-03-25 Trevor Saunders <tbsaunde+binutils@tbsaunde.org>
* config/tc-cr16.c (cr16_assemble): New function.
(md_assemble): Call cr16_assemble.
Diffstat (limited to 'gas/config/tc-cr16.c')
-rw-r--r-- | gas/config/tc-cr16.c | 62 |
1 files changed, 37 insertions, 25 deletions
diff --git a/gas/config/tc-cr16.c b/gas/config/tc-cr16.c index b3e0924..8a92025 100644 --- a/gas/config/tc-cr16.c +++ b/gas/config/tc-cr16.c @@ -2195,7 +2195,7 @@ adjust_if_needed (ins *insn ATTRIBUTE_UNUSED) Returns 1 upon success, 0 upon failure. */ static int -assemble_insn (char *mnemonic, ins *insn) +assemble_insn (const char *mnemonic, ins *insn) { /* Type of each operand in the current template. */ argtype cur_type[MAX_OPERANDS]; @@ -2487,6 +2487,35 @@ print_insn (ins *insn) } } +/* Actually assemble an instruction. */ + +static void +cr16_assemble (const char *op, char *param) +{ + ins cr16_ins; + + /* Find the instruction. */ + instruction = (const inst *) hash_find (cr16_inst_hash, op); + if (instruction == NULL) + { + as_bad (_("Unknown opcode: `%s'"), op); + return; + } + + /* Tie dwarf2 debug info to the address at the start of the insn. */ + dwarf2_emit_insn (0); + + /* Parse the instruction's operands. */ + parse_insn (&cr16_ins, param); + + /* Assemble the instruction - return upon failure. */ + if (assemble_insn (op, &cr16_ins) == 0) + return; + + /* Print the instruction. */ + print_insn (&cr16_ins); +} + /* This is the guts of the machine-dependent assembler. OP points to a machine dependent instruction. This function is supposed to emit the frags/bytes it assembles to. */ @@ -2509,10 +2538,11 @@ md_assemble (char *op) if (is_bcc_insn (op)) { strcpy (param1, get_b_cc (op)); - op = "b"; strcat (param1,","); strcat (param1, param); param = (char *) ¶m1; + cr16_assemble ("b", param); + return; } /* Checking the cinv options and adjust the mnemonic by removing the @@ -2538,32 +2568,14 @@ md_assemble (char *op) && ((&cr16_ins)->arg[0].constant >= 0)) { if (streq ("lshb", op)) - op = "ashub"; + cr16_assemble ("ashub", param); else if (streq ("lshd", op)) - op = "ashud"; + cr16_assemble ("ashud", param); else - op = "ashuw"; + cr16_assemble ("ashuw", param); + return; } } - /* Find the instruction. */ - instruction = (const inst *) hash_find (cr16_inst_hash, op); - if (instruction == NULL) - { - as_bad (_("Unknown opcode: `%s'"), op); - return; - } - - /* Tie dwarf2 debug info to the address at the start of the insn. */ - dwarf2_emit_insn (0); - - /* Parse the instruction's operands. */ - parse_insn (&cr16_ins, param); - - /* Assemble the instruction - return upon failure. */ - if (assemble_insn (op, &cr16_ins) == 0) - return; - - /* Print the instruction. */ - print_insn (&cr16_ins); + cr16_assemble (op, param); } |