diff -r 83ab05171362 gas/ChangeLog.ggx --- a/gas/ChangeLog.ggx Wed Mar 12 17:25:07 2008 -0700 +++ b/gas/ChangeLog.ggx Thu Mar 13 04:04:49 2008 -0700 @@ -1,3 +1,8 @@ 2008-03-11 Anthony Green + + * config/tc-ggx.c (parse_register_operand): New function. + (md_assemble): Use it. Also parse GGX_F1_AB instructions. + 2008-03-11 Anthony Green * config/tc-ggx.c (md_assemble): Encode different forms of diff -r 83ab05171362 gas/config/tc-ggx.c --- a/gas/config/tc-ggx.c Wed Mar 12 17:25:07 2008 -0700 +++ b/gas/config/tc-ggx.c Thu Mar 13 04:04:49 2008 -0700 @@ -81,6 +81,31 @@ parse_exp_save_ilp (char *s, expressionS s = input_line_pointer; input_line_pointer = save; return s; +} + +static int +parse_register_operand (char **ptr) +{ + int reg; + char *s = *ptr; + + if ((*s != '$') || (*(s+1) != 'r')) + { + as_bad ("expecting register"); + ignore_rest_of_line (); + return -1; + } + reg = s[2] - '0'; + if ((reg < 1) || (reg > 7)) + { + as_bad ("illegal register number"); + ignore_rest_of_line (); + return -1; + } + + *ptr += 3; + + return reg; } /* This is the guts of the machine-dependent assembler. STR points to @@ -143,6 +168,21 @@ md_assemble (char *str) break; case GGX_F1_AB: iword = opcode->opcode << 9; + while (ISSPACE (*op_end)) + op_end++; + { + int dest, src; + dest = parse_register_operand (&op_end); + if (*op_end != ',') + as_warn ("expecting comma delimeted register operands"); + op_end++; + src = parse_register_operand (&op_end); + iword += (dest << 6) + (src << 3); + while (ISSPACE (*op_end)) + op_end++; + if (*op_end != 0) + as_warn ("extra stuff on line ignored"); + } break; case GGX_F1_ABC: iword = opcode->opcode << 9; @@ -156,21 +196,7 @@ md_assemble (char *str) char *where; int regnum; - if ((*op_end != '$') || (*(op_end+1) != 'r')) - { - as_bad ("expecting register"); - ignore_rest_of_line (); - return; - } - regnum = op_end[2] - '0'; - if ((regnum < 1) || (regnum > 7)) - { - as_bad ("illegal register number"); - ignore_rest_of_line (); - return; - } - - op_end += 3; + regnum = parse_register_operand (&op_end); while (ISSPACE (*op_end)) op_end++; diff -r 83ab05171362 opcodes/ChangeLog.ggx --- a/opcodes/ChangeLog.ggx Wed Mar 12 17:25:07 2008 -0700 +++ b/opcodes/ChangeLog.ggx Thu Mar 13 04:04:49 2008 -0700 @@ -1,3 +1,9 @@ 2008-03-11 Anthony Green + + * ggx-dis.c (print_insn_ggx): Add GGX_F1_AB support. + * ggx-opc.c (ggx_form1_opc_info): Add mov instruction. + Fix comment. + 2008-03-11 Anthony Green * ggx-dis.c (OP_A, OP_B, OP_C): Define. Disassemble GGX_F1_A4 diff -r 83ab05171362 opcodes/ggx-dis.c --- a/opcodes/ggx-dis.c Wed Mar 12 17:25:07 2008 -0700 +++ b/opcodes/ggx-dis.c Thu Mar 13 04:04:49 2008 -0700 @@ -60,6 +60,10 @@ print_insn_ggx (bfd_vma addr, struct dis case GGX_F1_NARG: fpr (stream, "%s", opcode->name); break; + case GGX_F1_AB: + fpr (stream, "%s\t$r%d, $r%d", opcode->name, + OP_A(iword), OP_B(iword)); + break; case GGX_F1_A4: { unsigned imm; diff -r 83ab05171362 opcodes/ggx-opc.c --- a/opcodes/ggx-opc.c Wed Mar 12 17:25:07 2008 -0700 +++ b/opcodes/ggx-opc.c Thu Mar 13 04:04:49 2008 -0700 @@ -48,7 +48,7 @@ const ggx_opc_info_t ggx_form1_opc_info[ const ggx_opc_info_t ggx_form1_opc_info[64] = { { 0x00, GGX_F1_A4, "ldi.l" }, - { 0x01, GGX_F1_NARG, "bad" }, + { 0x01, GGX_F1_AB, "mov" }, { 0x02, GGX_F1_NARG, "bad" }, { 0x03, GGX_F1_NARG, "bad" }, { 0x04, GGX_F1_NARG, "bad" },