diff options
author | Kazu Hirata <kazu@codesourcery.com> | 2000-09-21 20:26:34 +0000 |
---|---|---|
committer | Kazu Hirata <kazu@codesourcery.com> | 2000-09-21 20:26:34 +0000 |
commit | 0b7410c4da367d0c92c8e6cf17c866f04fe41039 (patch) | |
tree | 81f96cd203a9d26bedbf3b8ab2b4b3b538885875 /gas/config/tc-ns32k.c | |
parent | 6d5e62f8b559ccc0be3f1eb0a4cb90cb9dba0c79 (diff) | |
download | gdb-0b7410c4da367d0c92c8e6cf17c866f04fe41039.zip gdb-0b7410c4da367d0c92c8e6cf17c866f04fe41039.tar.gz gdb-0b7410c4da367d0c92c8e6cf17c866f04fe41039.tar.bz2 |
2000-09-21 Kazu Hirata <kazu@hxi.com>
* config/tc-ns32k.c: Fix formatting.
* config/tc-ns32k.h: Likewise.
Diffstat (limited to 'gas/config/tc-ns32k.c')
-rw-r--r-- | gas/config/tc-ns32k.c | 239 |
1 files changed, 119 insertions, 120 deletions
diff --git a/gas/config/tc-ns32k.c b/gas/config/tc-ns32k.c index de4bbc5..88e4018 100644 --- a/gas/config/tc-ns32k.c +++ b/gas/config/tc-ns32k.c @@ -130,7 +130,7 @@ typedef struct struct int_ins_form { - int instr_size; /* Max size of instruction in bytes. */ + int instr_size; /* Max size of instruction in bytes. */ iif_entryT iifP[IIF_ENTRIES + 1]; }; @@ -152,20 +152,20 @@ char *input_line_pointer; 9 imm_b 10 implied1 11 implied2 - + For every entry there is a datalength in bytes. This is stored in size[n]. 0, the objectlength is not explicitly given by the instruction and the operand is undefined. This is a case for relaxation. Reserve 4 bytes for the final object. - + 1, the entry contains one byte 2, the entry contains two bytes 3, the entry contains three bytes 4, the entry contains four bytes etc - + Furthermore, every entry has a data type identifier in type[n]. - + 0, the entry is void, ignore it. 1, the entry is a binary number. 2, the entry is a pointer at an expression. @@ -173,10 +173,9 @@ char *input_line_pointer; and as complicated as foo-bar+12, foo and bar may be undefined but suffixed by :{b|w|d} to control the length of the object. - + 3, the entry is a pointer at a bignum struct - - + The low-order-byte coresponds to low physical memory. Obviously a FRAGment must be created for each valid disp in PART whose datalength is undefined (to bad) . @@ -391,7 +390,7 @@ addr_mode (operand, addr_modeP, recursive_level) register int strl; register int mode; int j; - + mode = DEFAULT; /* default */ addr_modeP->scaled_mode = 0; /* why not */ addr_modeP->scaled_reg = 0; /* if 0, not scaled index */ @@ -404,12 +403,12 @@ addr_mode (operand, addr_modeP, recursive_level) addr_modeP->disp[0] = NULL; addr_modeP->disp[1] = NULL; str = operand; - + if (str[0] == 0) return 0; strl = strlen (str); - + switch (str[0]) { /* The following three case statements controls the mode-chars @@ -478,13 +477,13 @@ addr_mode (operand, addr_modeP, recursive_level) } } break; - + default: ; } - + strl = strlen (str); - + switch (strl) { case 2: @@ -504,7 +503,7 @@ addr_mode (operand, addr_modeP, recursive_level) break; } /* Drop through. */ - + case 3: if (!strncmp (str, "tos", 3)) { @@ -512,11 +511,11 @@ addr_mode (operand, addr_modeP, recursive_level) return -1; } break; - + default: break; } - + if (strl > 4) { if (str[strl - 1] == ')') @@ -535,7 +534,7 @@ addr_mode (operand, addr_modeP, recursive_level) addr_modeP->mode = mode; j = strl - 5; /* Temp for end of disp[0]. */ i = 0; - + do { strl -= 1; @@ -545,22 +544,22 @@ addr_mode (operand, addr_modeP, recursive_level) i--; } while (strl > -1 && i != 0); - + if (i != 0) { as_warn (_("Invalid syntax in Memory Relative addressing mode")); return (0); } - + addr_modeP->disp[1] = str; addr_modeP->disp[0] = str + strl + 1; - str[j] = '\000'; /* Null terminate disp[0] . */ + str[j] = '\000'; /* Null terminate disp[0] . */ str[strl] = '\000'; /* Null terminate disp[1]. */ - + return -1; } } - + switch (str[strl - 3]) { case 'r': @@ -575,7 +574,7 @@ addr_mode (operand, addr_modeP, recursive_level) return -1; /* reg rel */ } /* Drop through. */ - + default: if (!strncmp (&str[strl - 4], "(fp", 3)) mode = 24; @@ -585,18 +584,18 @@ addr_mode (operand, addr_modeP, recursive_level) mode = 26; else if (!strncmp (&str[strl - 4], "(pc", 3)) mode = 27; - + if (mode != DEFAULT) { addr_modeP->mode = mode; addr_modeP->disp[0] = str; str[strl - 4] = '\0'; - + return -1; /* Memory space. */ } } } - + /* No trailing ')' do we have a ']' ? */ if (str[strl - 1] == ']') { @@ -616,7 +615,7 @@ addr_mode (operand, addr_modeP, recursive_level) break; default: as_warn (_("Invalid scaled-indexed mode, use (b,w,d,q)")); - + if (str[strl - 3] != ':' || str[strl - 6] != '[' || str[strl - 5] == 'r' || str[strl - 4] < '0' || str[strl - 4] > '7') @@ -628,29 +627,29 @@ addr_mode (operand, addr_modeP, recursive_level) as_warn (_("Scaled-indexed addressing mode combined with scaled-index")); return 0; } - + addr_modeP->am_size += 1; /* scaled index byte */ j = str[strl - 4] - '0'; /* store temporary */ str[strl - 6] = '\000'; /* nullterminate for recursive call */ i = addr_mode (str, addr_modeP, 1); - + if (!i || addr_modeP->mode == 20) { as_warn (_("Invalid or illegal addressing mode combined with scaled-index")); return 0; } - + addr_modeP->scaled_mode = addr_modeP->mode; /* Store the inferior mode. */ addr_modeP->mode = mode; addr_modeP->scaled_reg = j + 1; - + return -1; } } - + addr_modeP->mode = DEFAULT; /* Default to whatever. */ addr_modeP->disp[0] = str; - + return -1; } @@ -666,9 +665,9 @@ get_addr_mode (ptr, addr_modeP) addr_modeS *addr_modeP; { int tmp; - + addr_mode (ptr, addr_modeP, 0); - + if (addr_modeP->mode == DEFAULT || addr_modeP->scaled_mode == -1) { /* Resolve ambigious operands, this shouldn't be necessary if @@ -676,7 +675,7 @@ get_addr_mode (ptr, addr_modeP) compiler doesn't!!! This finds a proper addressinging mode if it is implicitly stated. See ns32k-opcode.h. */ (void) evaluate_expr (&exprP, ptr); /* This call takes time Sigh! */ - + if (addr_modeP->mode == DEFAULT) { if (exprP.X_add_symbol || exprP.X_op_symbol) @@ -691,11 +690,11 @@ get_addr_mode (ptr, addr_modeP) else addr_modeP->scaled_mode = desc->default_modec; } - + /* Must put this mess down in addr_mode to handle the scaled case better. */ } - + /* It appears as the sequent compiler wants an absolute when we have a label without @. Constants becomes immediates besides the addr case. Think it does so with local labels too, not optimum, pcrel @@ -709,7 +708,7 @@ get_addr_mode (ptr, addr_modeP) addr_modeP->index_byte = (char) tmp; addr_modeP->am_size += 1; } - + if (disp_test[addr_modeP->mode]) { register char c; @@ -721,25 +720,25 @@ get_addr_mode (ptr, addr_modeP) /* There was a displacement, probe for length specifying suffix. */ addr_modeP->pcrel = 0; - + if (disp_test[addr_modeP->mode]) { /* There is a displacement. */ if (addr_modeP->mode == 27 || addr_modeP->scaled_mode == 27) /* Do we have pcrel. mode. */ addr_modeP->pcrel = 1; - + addr_modeP->im_disp = 1; - + for (i = 0; i < 2; i++) { suffix_sub = suffix = 0; - + if (toP = addr_modeP->disp[i]) { /* Suffix of expression, the largest size rules. */ fromP = toP; - + while (c = *fromP++) { *toP++ = c; @@ -764,15 +763,15 @@ get_addr_mode (ptr, addr_modeP) as_warn (_("Bad suffix after ':' use {b|w|d} Defaulting to d")); suffix = 4; } - + fromP ++; toP --; /* So we write over the ':' */ - + if (suffix < suffix_sub) suffix = suffix_sub; } } - + *toP = '\0'; /* Terminate properly. */ addr_modeP->disp_suffix[i] = suffix; addr_modeP->am_size += suffix ? suffix : 4; @@ -789,7 +788,7 @@ get_addr_mode (ptr, addr_modeP) addr_modeP->im_disp = 0; } } - + return addr_modeP->mode; } @@ -803,27 +802,27 @@ optlist (str, optionP, default_map) { register int i, j, k, strlen1, strlen2; register char *patternP, *strP; - + strlen1 = strlen (str); - + if (strlen1 < 1) as_fatal (_("Very short instr to option, ie you can't do it on a NULLstr")); - + for (i = 0; optionP[i].pattern != 0; i++) { strlen2 = strlen (optionP[i].pattern); - + for (j = 0; j < strlen1; j++) { patternP = optionP[i].pattern; strP = &str[j]; - + for (k = 0; k < strlen2; k++) { if (*(strP++) != *(patternP++)) break; } - + if (k == strlen2) { /* match */ *default_map |= optionP[i].or; @@ -845,7 +844,7 @@ list_search (str, optionP, default_map) unsigned long *default_map; /* Default pattern and output. */ { register int i; - + for (i = 0; optionP[i].pattern != 0; i++) { if (!strncmp (optionP[i].pattern, str, 20)) @@ -853,11 +852,11 @@ list_search (str, optionP, default_map) /* Use strncmp to be safe. */ *default_map |= optionP[i].or; *default_map &= optionP[i].and; - + return -1; } } - + as_warn (_("No such entry in list. (cpu/mmu register)")); return 0; } @@ -893,18 +892,18 @@ encode_operand (argc, argv, operandsP, suffixP, im_size, opcode_bit_ptr) register int i, j; char d; int pcrel, tmp, b, loop, pcrel_adjust; - + for (loop = 0; loop < argc; loop++) { /* What operand are we supposed to work on. */ i = operandsP[loop << 1] - '1'; if (i > 3) as_fatal (_("Internal consistency error. check ns32k-opcode.h")); - + pcrel = 0; pcrel_adjust = 0; tmp = 0; - + switch ((d = operandsP[(loop << 1) + 1])) { case 'f': /* operand of sfsr turns out to be a nasty @@ -920,7 +919,7 @@ encode_operand (argc, argv, operandsP, suffixP, im_size, opcode_bit_ptr) case 'A': /* double-word gen-address-form ie no regs allowed */ get_addr_mode (argv[i], &addr_modeP); - + if ((addr_modeP.mode == 20) && (d == 'I' || d == 'Z' || d == 'A')) as_fatal (d == 'A'? _("Address of immediate operand"): @@ -930,7 +929,7 @@ encode_operand (argc, argv, operandsP, suffixP, im_size, opcode_bit_ptr) b = 4; else b = 6; - + for (j = b; j < (b + 2); j++) { if (addr_modeP.disp[j - b]) @@ -950,10 +949,10 @@ encode_operand (argc, argv, operandsP, suffixP, im_size, opcode_bit_ptr) 0); } } - + opcode_bit_ptr -= 5; iif.iifP[1].object |= ((long) addr_modeP.mode) << opcode_bit_ptr; - + if (addr_modeP.scaled_reg) { j = b / 2; @@ -961,7 +960,7 @@ encode_operand (argc, argv, operandsP, suffixP, im_size, opcode_bit_ptr) 0, 0, 0, 0, 0, NULL, -1, 0); } break; - + case 'b': /* multiple instruction disp */ freeptr++; /* OVE:this is an useful hack */ sprintf (freeptr, "((%s-1)*%d)\000", argv[i], desc->im_size); @@ -1076,16 +1075,16 @@ parse (line, recursive_level) int argc, arg_type; char sqr, sep; char suffix[MAX_ARGS], *argv[MAX_ARGS]; /* No more than 4 operands. */ - + if (recursive_level <= 0) { /* Called from md_assemble. */ for (lineptr = line; (*lineptr) != '\0' && (*lineptr) != ' '; lineptr++) continue; - + c = *lineptr; *lineptr = '\0'; - + if (!(desc = (struct ns32k_opcode *) hash_find (inst_hash_handle, line))) as_fatal (_("No such opcode")); @@ -1095,23 +1094,23 @@ parse (line, recursive_level) { lineptr = line; } - + argc = 0; - + if (*desc->operands) { if (*lineptr++ != '\0') { sqr = '['; sep = ','; - + while (*lineptr != '\0') { if (desc->operands[argc << 1]) { suffix[argc] = 0; arg_type = desc->operands[(argc << 1) + 1]; - + switch (arg_type) { case 'd': @@ -1128,11 +1127,11 @@ parse (line, recursive_level) suffix_separator = '\255'; break; } - + suffix[argc] = 0; /* 0 when no ':' is encountered */ argv[argc] = freeptr; *freeptr = '\0'; - + while ((c = *lineptr) != '\0' && c != sep) { if (c == sqr) @@ -1148,7 +1147,7 @@ parse (line, recursive_level) sep = ','; } } - + if (c == suffix_separator) { /* ':' - label/suffix separator. */ @@ -1173,21 +1172,21 @@ parse (line, recursive_level) } break; } - + lineptr += 2; continue; } - + *freeptr++ = c; lineptr++; } - + *freeptr++ = '\0'; argc += 1; - + if (*lineptr == '\0') continue; - + lineptr += 1; } else @@ -1197,7 +1196,7 @@ parse (line, recursive_level) } } } - + if (argc != strlen (desc->operands) / 2) { if (strlen (desc->default_args)) @@ -1212,7 +1211,7 @@ parse (line, recursive_level) as_fatal (_("Wrong number of operands")); } } - + for (i = 0; i < IIF_ENTRIES; i++) /* Mark all entries as void. */ iif.iifP[i].type = 0; @@ -1292,7 +1291,7 @@ convert_iif () /* Expand fx_bit_base to point at opcode. */ iif.iifP[i].bit_fixP->fx_bit_base = (long) inst_opcode; /* Fall through. */ - + case 8: /* bignum or doublefloat */ case 1: case 2: @@ -1301,7 +1300,7 @@ convert_iif () /* The final size in objectmemory is known. */ memP = frag_more(size); j = iif.iifP[i].bit_fixP; - + switch (type) { case 1: /* The object is pure binary. */ @@ -1334,7 +1333,7 @@ convert_iif () } } break; - + case 2: /* The object is a pointer at an expression, so unpack it, note that bignums may result from the @@ -1348,10 +1347,10 @@ convert_iif () happens in a long suffixed instruction. */ if (k * 2 > size) as_warn (_("Bignum too big for long")); - + if (k == 3) memP += 2; - + for (l = 0; k > 0; k--, l += 2) { md_number_to_chars (memP + l, @@ -1433,7 +1432,7 @@ convert_iif () as_fatal (_("Internal logic error in iif.iifP[n].type")); } break; - + case 0: /* Too bad, the object may be undefined as far as its final nsize in object memory is concerned. The size @@ -1442,7 +1441,7 @@ convert_iif () determined and a fix can replace the frag. */ { evaluate_expr (&exprP, (char *) iif.iifP[i].object); - + if ((exprP.X_add_symbol || exprP.X_op_symbol) && !iif.iifP[i].pcrel) { @@ -1521,13 +1520,13 @@ convert_iif () } } } - + memP = frag_more (size); md_number_to_disp (memP, exprP.X_add_number, size); } } break; - + default: as_fatal (_("Internal logic error in iif.iifP[].type")); } @@ -1566,7 +1565,7 @@ reloc (int size, int pcrel, int type) BFD_RELOC_16_PCREL, BFD_RELOC_32_PCREL }; - + switch (size) { case 1: @@ -1582,19 +1581,19 @@ reloc (int size, int pcrel, int type) length = -1; break; } - + index = length + 3 * pcrel + 6 * type; - + if (index >= 0 && index < sizeof (relocs) / sizeof (relocs[0])) return relocs[index]; - + if (pcrel) as_bad (_("Can not do %d byte pc-relative relocation for storage type %d"), size, type); else as_bad (_("Can not do %d byte relocation for storage type %d"), size, type); - + return BFD_RELOC_NONE; } @@ -1663,19 +1662,19 @@ md_atof (type, litP, sizeP) *sizeP = 0; return _("Bad call to MD_ATOF()"); } - + t = atof_ieee (input_line_pointer, type, words); if (t) input_line_pointer = t; *sizeP = prec * sizeof (LITTLENUM_TYPE); - + for (wordP = words + prec; prec--;) { md_number_to_chars (litP, (long) (*--wordP), sizeof (LITTLENUM_TYPE)); litP += sizeof (LITTLENUM_TYPE); } - + return 0; } @@ -1862,7 +1861,7 @@ md_number_to_field (buf, val, field_ptr) mem_ptr = (unsigned long *) field_ptr->fx_bit_base; else mem_ptr = (unsigned long *) buf; - + mem_ptr = ((unsigned long *) ((char *) mem_ptr + field_ptr->fx_bit_base_adj)); #else @@ -1918,14 +1917,14 @@ md_pcrel_adjust (fragP) fragS *opcode_frag; addressT opcode_address; unsigned int offset; - + opcode_frag = frag_opcode_frag (fragP); if (opcode_frag == 0) return 0; - + offset = frag_opcode_offset (fragP); opcode_address = offset + opcode_frag->fr_address; - + return fragP->fr_address + fragP->fr_fix - opcode_address; } @@ -1937,14 +1936,14 @@ md_fix_pcrel_adjust (fixP) fragS *opcode_frag; addressT opcode_address; unsigned int offset; - + opcode_frag = fix_opcode_frag (fixP); if (opcode_frag == 0) return 0; - + offset = fix_opcode_offset (fixP); opcode_address = offset + opcode_frag->fr_address; - + return fixP->fx_where + fixP->fx_frag->fr_address - opcode_address; } @@ -2048,7 +2047,7 @@ md_convert_frag (abfd, sec, fragP) know (fragP->fr_symbol); object_address = fragP->fr_fix + fragP->fr_address; - + /* The displacement of the address, from current location. */ disp = (S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset) - object_address; #ifdef BFD_ASSEMBLER @@ -2070,9 +2069,9 @@ md_estimate_size_before_relax (fragP, segment) segT segment; { int old_fix; - + old_fix = fragP->fr_fix; - + switch (fragP->fr_subtype) { case IND (BRANCH, UNDEF): @@ -2109,7 +2108,7 @@ md_estimate_size_before_relax (fragP, segment) default: break; } - + return fragP->fr_var + fragP->fr_fix - old_fix; } @@ -2230,10 +2229,10 @@ fix_new_ns32k (frag, where, size, add_symbol, offset, pcrel, im_disp, bit_fixP, bsr, opcode_frag, opcode_offset) fragS *frag; /* Which frag? */ int where; /* Where in that frag? */ - int size; /* 1, 2 or 4 usually. */ - symbolS *add_symbol; /* X_add_symbol. */ - long offset; /* X_add_number. */ - int pcrel; /* TRUE if PC-relative relocation. */ + int size; /* 1, 2 or 4 usually. */ + symbolS *add_symbol; /* X_add_symbol. */ + long offset; /* X_add_number. */ + int pcrel; /* TRUE if PC-relative relocation. */ char im_disp; /* true if the value to write is a displacement */ bit_fixS *bit_fixP; /* pointer at struct of bit_fix's, ignored if @@ -2264,9 +2263,9 @@ fix_new_ns32k_exp (frag, where, size, exp, pcrel, im_disp, bit_fixP, bsr, opcode_frag, opcode_offset) fragS *frag; /* Which frag? */ int where; /* Where in that frag? */ - int size; /* 1, 2 or 4 usually. */ - expressionS *exp; /* Expression. */ - int pcrel; /* TRUE if PC-relative relocation. */ + int size; /* 1, 2 or 4 usually. */ + expressionS *exp; /* Expression. */ + int pcrel; /* TRUE if PC-relative relocation. */ char im_disp; /* true if the value to write is a displacement */ bit_fixS *bit_fixP; /* pointer at struct of bit_fix's, ignored if @@ -2297,8 +2296,8 @@ void cons_fix_new_ns32k (frag, where, size, exp) fragS *frag; /* Which frag? */ int where; /* Where in that frag? */ - int size; /* 1, 2 or 4 usually. */ - expressionS *exp; /* Expression. */ + int size; /* 1, 2 or 4 usually. */ + expressionS *exp; /* Expression. */ { fix_new_ns32k_exp (frag, where, size, exp, 0, 2, 0, 0, 0, 0); |