BSD 4_3_Net_2 development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Wed, 1 Mar 1989 07:49:39 +0000 (23:49 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Wed, 1 Mar 1989 07:49:39 +0000 (23:49 -0800)
Work on file usr/src/usr.bin/gas/config/m-sun3.h
Work on file usr/src/usr.bin/gas/config/m68k.h
Work on file usr/src/usr.bin/gas/input-file.h
Work on file usr/src/usr.bin/gas/config/i386.h
Work on file usr/src/usr.bin/gas/hash.h
Work on file usr/src/usr.bin/gas/frags.h
Work on file usr/src/usr.bin/gas/flonum-copy.c
Work on file usr/src/usr.bin/gas/expr.h
Work on file usr/src/usr.bin/gas/bignum-copy.c
Work on file usr/src/usr.bin/gas/append.c

Synthesized-from: CSRG/cd2/net.2

usr/src/usr.bin/gas/append.c [new file with mode: 0644]
usr/src/usr.bin/gas/bignum-copy.c [new file with mode: 0644]
usr/src/usr.bin/gas/config/i386.h [new file with mode: 0644]
usr/src/usr.bin/gas/config/m-sun3.h [new file with mode: 0644]
usr/src/usr.bin/gas/config/m68k.h [new file with mode: 0644]
usr/src/usr.bin/gas/expr.h [new file with mode: 0644]
usr/src/usr.bin/gas/flonum-copy.c [new file with mode: 0644]
usr/src/usr.bin/gas/frags.h [new file with mode: 0644]
usr/src/usr.bin/gas/hash.h [new file with mode: 0644]
usr/src/usr.bin/gas/input-file.h [new file with mode: 0644]

diff --git a/usr/src/usr.bin/gas/append.c b/usr/src/usr.bin/gas/append.c
new file mode 100644 (file)
index 0000000..d51a27f
--- /dev/null
@@ -0,0 +1,37 @@
+/* Append a string ontp another string
+   Copyright (C) 1987 Free Software Foundation, Inc.
+
+This file is part of GAS, the GNU Assembler.
+
+GAS is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 1, or (at your option)
+any later version.
+
+GAS is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GAS; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/* JF:  This is silly.  Why not stuff this in some other file? */
+#ifdef USG
+#define bcopy(from,to,n) memcpy(to,from,n)
+#endif
+
+void
+append (charPP, fromP, length)
+char   **charPP;
+char   *fromP;
+unsigned long length;
+{
+       if (length) {           /* Don't trust bcopy() of 0 chars. */
+               bcopy (fromP, * charPP,(int) length);
+               *charPP += length;
+       }
+}
+
+/* end: append.c */
diff --git a/usr/src/usr.bin/gas/bignum-copy.c b/usr/src/usr.bin/gas/bignum-copy.c
new file mode 100644 (file)
index 0000000..2640121
--- /dev/null
@@ -0,0 +1,75 @@
+/* bignum_copy.c - copy a bignum
+   Copyright (C) 1987 Free Software Foundation, Inc.
+
+This file is part of GAS, the GNU Assembler.
+
+GAS is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 1, or (at your option)
+any later version.
+
+GAS is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GAS; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#include "bignum.h"
+
+#ifdef USG
+#define bzero(s,n) memset(s,0,n)
+#define bcopy(from,to,n) memcpy(to,from,n)
+#endif
+
+/*
+ *                     bignum_copy ()
+ *
+ * Copy a bignum from in to out.
+ * If the output is shorter than the input, copy lower-order littlenums.
+ * Return 0 or the number of significant littlenums dropped.
+ * Assumes littlenum arrays are densely packed: no unused chars between
+ * the littlenums. Uses bcopy() to move littlenums, and wants to
+ * know length (in chars) of the input bignum.
+ */
+
+/* void */
+int
+bignum_copy (in, in_length, out, out_length)
+     register LITTLENUM_TYPE * in;
+     register int              in_length; /* in sizeof(littlenum)s */
+     register LITTLENUM_TYPE * out;
+     register int              out_length; /* in sizeof(littlenum)s */
+{
+  register int significant_littlenums_dropped;
+
+  if (out_length < in_length)
+    {
+      register LITTLENUM_TYPE *        p; /* -> most significant (non-zero) input littlenum. */
+
+      bcopy ((char *)in, (char *)out, out_length << LITTLENUM_SHIFT);
+      for (p = in + in_length - 1;   p >= in;   -- p)
+       {
+         if (* p) break;
+       }
+      significant_littlenums_dropped = p - in - in_length + 1;
+      if (significant_littlenums_dropped < 0)
+       {
+         significant_littlenums_dropped = 0;
+       }
+    }
+  else
+    {
+      bcopy ((char *)in, (char *)out, in_length << LITTLENUM_SHIFT);
+      if (out_length > in_length)
+       {
+         bzero ((char *)(out + out_length), (out_length - in_length) << LITTLENUM_SHIFT);
+       }
+      significant_littlenums_dropped = 0;
+    }
+  return (significant_littlenums_dropped);
+}
+
+/* end: bignum_copy.c */
diff --git a/usr/src/usr.bin/gas/config/i386.h b/usr/src/usr.bin/gas/config/i386.h
new file mode 100644 (file)
index 0000000..c569c1c
--- /dev/null
@@ -0,0 +1,296 @@
+/* i386.h -- Header file for i386.c
+   Copyright (C) 1989, Free Software Foundation.
+
+This file is part of GAS, the GNU Assembler.
+
+GAS is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 1, or (at your option)
+any later version.
+
+GAS is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GAS; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+   
+#define MAX_OPERANDS 3         /* max operands per insn */
+#define MAX_PREFIXES 4         /* max prefixes per opcode */
+#define MAX_IMMEDIATE_OPERANDS 2 /* max immediates per insn */
+#define MAX_MEMORY_OPERANDS 2  /* max memory ref per insn
+                                * lcall uses 2
+                                */
+/* we define the syntax here (modulo base,index,scale syntax) */
+#define REGISTER_PREFIX '%'
+#define IMMEDIATE_PREFIX '$'
+#define ABSOLUTE_PREFIX '*'
+#define PREFIX_SEPERATOR '/'
+
+#define TWO_BYTE_OPCODE_ESCAPE 0x0f
+
+/* register numbers */
+#define EBP_REG_NUM 5
+#define ESP_REG_NUM 4
+
+/* modrm_byte.regmem for twobyte escape */
+#define ESCAPE_TO_TWO_BYTE_ADDRESSING ESP_REG_NUM
+/* index_base_byte.index for no index register addressing */
+#define NO_INDEX_REGISTER ESP_REG_NUM
+/* index_base_byte.base for no base register addressing */
+#define NO_BASE_REGISTER EBP_REG_NUM
+
+/* these are the att as opcode suffixes, making movl --> mov, for example */
+#define DWORD_OPCODE_SUFFIX 'l'
+#define WORD_OPCODE_SUFFIX  'w'
+#define BYTE_OPCODE_SUFFIX  'b'
+
+/* modrm.mode = REGMEM_FIELD_HAS_REG when a register is in there */
+#define REGMEM_FIELD_HAS_REG 0x3                /* always = 0x3 */
+#define REGMEM_FIELD_HAS_MEM (~REGMEM_FIELD_HAS_REG)
+
+#define END_OF_INSN '\0'
+
+/*
+When an operand is read in it is classified by its type.  This type includes
+all the possible ways an operand can be used.  Thus, '%eax' is both 'register
+# 0' and 'The Accumulator'.  In our language this is expressed by OR'ing
+'Reg32' (any 32 bit register) and 'Acc' (the accumulator).
+Operands are classified so that we can match given operand types with
+the opcode table in i386-opcode.h.
+ */
+#define Unknown 0x0
+/* register */
+#define Reg8    0x1            /* 8 bit reg */
+#define Reg16   0x2            /* 16 bit reg */
+#define Reg32   0x4            /* 32 bit reg */
+#define Reg     (Reg8|Reg16|Reg32)    /* gen'l register */
+#define WordReg (Reg16|Reg32)  /* for push/pop operands */
+/* immediate */
+#define Imm8    0x8            /* 8 bit immediate */
+#define Imm8S  0x10            /* 8 bit immediate sign extended */
+#define Imm16   0x20           /* 16 bit immediate */
+#define Imm32   0x40           /* 32 bit immediate */
+#define Imm1    0x80           /* 1 bit immediate */
+#define ImmUnknown Imm32       /* for unknown expressions */
+#define Imm     (Imm8|Imm8S|Imm16|Imm32)    /* gen'l immediate */
+/* memory */
+#define Disp8   0x200          /* 8 bit displacement (for jumps) */
+#define Disp16  0x400          /* 16 bit displacement */
+#define Disp32  0x800          /* 32 bit displacement */
+#define Disp    (Disp8|Disp16|Disp32) /* General displacement */
+#define DispUnknown Disp32     /* for unknown size displacements */
+#define Mem8    0x1000
+#define Mem16   0x2000
+#define Mem32   0x4000
+#define BaseIndex 0x8000
+#define Mem     (Disp|Mem8|Mem16|Mem32|BaseIndex) /* General memory */
+#define WordMem   (Mem16|Mem32|Disp|BaseIndex)
+#define ByteMem   (Mem8|Disp|BaseIndex)
+/* specials */
+#define InOutPortReg 0x10000   /* register to hold in/out port addr = dx */
+#define ShiftCount 0x20000     /* register to hold shift cound = cl */
+#define Control 0x40000                /* Control register */
+#define Debug   0x80000                /* Debug register */
+#define Test    0x100000               /* Test register */
+#define FloatReg 0x200000      /* Float register */
+#define FloatAcc 0x400000      /* Float stack top %st(0) */
+#define SReg2   0x800000               /* 2 bit segment register */
+#define SReg3   0x1000000              /* 3 bit segment register */
+#define Acc     0x2000000              /* Accumulator %al or %ax or %eax */
+#define ImplicitRegister (InOutPortReg|ShiftCount|Acc|FloatAcc)
+#define JumpAbsolute 0x4000000
+#define Abs8  0x08000000
+#define Abs16 0x10000000
+#define Abs32 0x20000000
+#define Abs (Abs8|Abs16|Abs32)
+
+#define MODE_FROM_DISP_SIZE(t) \
+      ((t&(Disp8)) ? 1 : \
+       ((t&(Disp32)) ? 2 : 0))
+
+#define Byte (Reg8|Imm8|Imm8S)
+#define Word (Reg16|Imm16)
+#define DWord (Reg32|Imm32)
+
+/* convert opcode suffix ('b' 'w' 'l' typically) into type specifyer */
+#define OPCODE_SUFFIX_TO_TYPE(s)                 \
+  (s == BYTE_OPCODE_SUFFIX ? Byte : \
+   (s == WORD_OPCODE_SUFFIX ? Word : DWord))
+
+#define FITS_IN_SIGNED_BYTE(num) ((num) >= -128 && (num) <= 127)
+#define FITS_IN_UNSIGNED_BYTE(num) ((num) >= 0 && (num) <= 255)
+#define FITS_IN_UNSIGNED_WORD(num) ((num) >= 0 && (num) <= 65535)
+#define FITS_IN_SIGNED_WORD(num) ((num) >= -32768 && (num) <= 32767)
+
+#define SMALLEST_DISP_TYPE(num) \
+  FITS_IN_SIGNED_BYTE(num) ? (Disp8|Disp32|Abs8|Abs32) : (Disp32|Abs32)
+
+#define SMALLEST_IMM_TYPE(num) \
+  (num == 1) ? (Imm1|Imm8|Imm8S|Imm16|Imm32): \
+  FITS_IN_SIGNED_BYTE(num) ? (Imm8S|Imm8|Imm16|Imm32) : \
+  FITS_IN_UNSIGNED_BYTE(num) ? (Imm8|Imm16|Imm32): \
+  (FITS_IN_SIGNED_WORD(num)||FITS_IN_UNSIGNED_WORD(num)) ? (Imm16|Imm32) : \
+  (Imm32)
+
+typedef unsigned char uchar;
+typedef unsigned int uint;
+
+typedef struct {
+  /* instruction name sans width suffix ("mov" for movl insns) */
+  char          *name;
+
+  /* how many operands */
+  uint    operands;
+
+  /* base_opcode is the fundamental opcode byte with a optional prefix(es). */
+  uint    base_opcode;
+
+  /* extension_opcode is the 3 bit extension for group <n> insns.
+     If this template has no extension opcode (the usual case) use None */
+  uchar    extension_opcode;
+#define None 0xff              /* If no extension_opcode is possible. */
+
+  /* the bits in opcode_modifier are used to generate the final opcode from
+     the base_opcode.  These bits also are used to detect alternate forms of
+     the same instruction */
+  uint    opcode_modifier;
+
+/* opcode_modifier bits: */
+#define W        0x1   /* set if operands are words or dwords */
+#define D        0x2   /* D = 0 if Reg --> Regmem; D = 1 if Regmem --> Reg */
+/* direction flag for floating insns:  MUST BE 0x400 */
+#define FloatD 0x400
+/* shorthand */
+#define DW (D|W)
+#define ShortForm 0x10         /* register is in low 3 bits of opcode */
+#define ShortFormW 0x20                /* ShortForm and W bit is 0x8 */
+#define Seg2ShortForm 0x40     /* encoding of load segment reg insns */
+#define Seg3ShortForm 0x80     /* fs/gs segment register insns. */
+#define Jump 0x100             /* special case for jump insns. */
+#define JumpInterSegment 0x200 /* special case for intersegment leaps/calls */
+/* 0x400 CANNOT BE USED since it's already used by FloatD above */
+#define DONT_USE 0x400
+#define NoModrm 0x800
+#define Modrm 0x1000
+#define imulKludge 0x2000
+#define JumpByte 0x4000
+#define JumpDword 0x8000
+#define ReverseRegRegmem 0x10000
+
+  /* (opcode_modifier & COMES_IN_ALL_SIZES) is true if the
+     instuction comes in byte, word, and dword sizes and is encoded into
+     machine code in the canonical way. */
+#define COMES_IN_ALL_SIZES (W)
+
+  /* (opcode_modifier & COMES_IN_BOTH_DIRECTIONS) indicates that the
+     source and destination operands can be reversed by setting either
+     the D (for integer insns) or the FloatD (for floating insns) bit
+     in base_opcode. */
+#define COMES_IN_BOTH_DIRECTIONS (D|FloatD)
+
+  /* operand_types[i] describes the type of operand i.  This is made
+     by OR'ing together all of the possible type masks.  (e.g.
+     'operand_types[i] = Reg|Imm' specifies that operand i can be
+     either a register or an immediate operand */
+  uint operand_types[3];
+} template;
+
+/*
+  'templates' is for grouping together 'template' structures for opcodes
+  of the same name.  This is only used for storing the insns in the grand
+  ole hash table of insns.
+  The templates themselves start at START and range up to (but not including)
+  END.
+*/
+typedef struct {
+  template      *start;
+  template      *end;
+} templates;
+
+/* these are for register name --> number & type hash lookup */
+typedef struct {
+  char * reg_name;
+  uint   reg_type;
+  uint   reg_num;
+} reg_entry;
+
+typedef struct {
+  char * seg_name;
+  uint   seg_prefix;
+} seg_entry;
+
+/* these are for prefix name --> prefix code hash lookup */
+typedef struct {
+  char * prefix_name;
+  uchar  prefix_code;
+} prefix_entry;
+
+/* 386 operand encoding bytes:  see 386 book for details of this. */
+typedef struct {
+  unsigned regmem:3;        /* codes register or memory operand */
+  unsigned reg:3;           /* codes register operand (or extended opcode) */
+  unsigned mode:2;          /* how to interpret regmem & reg */
+} modrm_byte;
+
+/* 386 opcode byte to code indirect addressing. */
+typedef struct {
+  unsigned base:3;
+  unsigned index:3;
+  unsigned scale:2;
+} base_index_byte;
+
+/* 'md_assemble ()' gathers together information and puts it into a
+   i386_insn. */
+
+typedef struct {
+  /* TM holds the template for the insn were currently assembling. */
+  template          tm;
+  /* SUFFIX holds the opcode suffix (e.g. 'l' for 'movl') if given. */
+  char              suffix;
+  /* Operands are coded with OPERANDS, TYPES, DISPS, IMMS, and REGS. */
+
+  /* OPERANDS gives the number of given operands. */
+  uint               operands;
+
+  /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number of
+     given register, displacement, memory operands and immediate operands. */
+  uint               reg_operands, disp_operands, mem_operands, imm_operands;
+
+  /* TYPES [i] is the type (see above #defines) which tells us how to
+     search through DISPS [i] & IMMS [i] & REGS [i] for the required
+     operand. */
+  uint               types [MAX_OPERANDS];
+
+  /* Displacements (if given) for each operand. */
+  expressionS       * disps [MAX_OPERANDS];
+
+  /* Immediate operands (if given) for each operand. */
+  expressionS       * imms [MAX_OPERANDS];
+
+  /* Register operands (if given) for each operand. */
+  reg_entry         * regs [MAX_OPERANDS];
+
+  /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
+     the base index byte below.  */
+  reg_entry         * base_reg;
+  reg_entry         * index_reg;
+  uint                log2_scale_factor;
+
+  /* SEG gives the seg_entry of this insn.  It is equal to zero unless
+     an explicit segment override is given. */
+  seg_entry         * seg;     /* segment for memory operands (if given) */
+
+  /* PREFIX holds all the given prefix opcodes (usually null).
+     PREFIXES is the size of PREFIX. */
+  char              prefix [MAX_PREFIXES];
+  uint              prefixes;
+
+  /* RM and IB are the modrm byte and the base index byte where the addressing
+     modes of this insn are encoded. */
+
+  modrm_byte        rm;
+  base_index_byte   bi;
+} i386_insn;
diff --git a/usr/src/usr.bin/gas/config/m-sun3.h b/usr/src/usr.bin/gas/config/m-sun3.h
new file mode 100644 (file)
index 0000000..85a9554
--- /dev/null
@@ -0,0 +1,31 @@
+/* m-sun3.h -- 68020 version of the assembler for the Sun-3
+   Copyright (C) 1987 Free Software Foundation, Inc.
+
+This file is part of GAS, the GNU Assembler.
+
+GAS is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 1, or (at your option)
+any later version.
+
+GAS is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GAS; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+
+
+/* This header file contains the #defines specific
+   to SUN computer SUN 3 series computers.  (The only kind
+   we have around here, unfortunatly.)
+   
+   Rumor has it that this file will work on the Sun-2 if the assembler
+   is called with -m68010  This is not tested.  */
+
+
+#define M_SUN  1
+#define SUN_ASM_SYNTAX
diff --git a/usr/src/usr.bin/gas/config/m68k.h b/usr/src/usr.bin/gas/config/m68k.h
new file mode 100644 (file)
index 0000000..2e4709e
--- /dev/null
@@ -0,0 +1,20 @@
+/* m-generic.h  Generic machine-specific header file.
+   Copyright (C) 1987 Free Software Foundation, Inc.
+
+This file is part of GAS, the GNU Assembler.
+
+GAS is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 1, or (at your option)
+any later version.
+
+GAS is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GAS; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#define M_GENERIC 1
diff --git a/usr/src/usr.bin/gas/expr.h b/usr/src/usr.bin/gas/expr.h
new file mode 100644 (file)
index 0000000..964d3b9
--- /dev/null
@@ -0,0 +1,69 @@
+/* expr.h -> header file for expr.c
+   Copyright (C) 1987 Free Software Foundation, Inc.
+
+This file is part of GAS, the GNU Assembler.
+
+GAS is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 1, or (at your option)
+any later version.
+
+GAS is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GAS; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/*
+ * Abbreviations (mnemonics).
+ *
+ *     O       operator
+ *     Q       quantity,  operand
+ *     X       eXpression
+ */
+
+/*
+ * By popular demand, we define a struct to represent an expression.
+ * This will no doubt mutate as expressions become baroque.
+ *
+ * Currently, we support expressions like "foo-bar+42".
+ * In other words we permit a (possibly undefined) minuend, a
+ * (possibly undefined) subtrahend and an (absolute) augend.
+ * RMS says this is so we can have 1-pass assembly for any compiler
+ * emmissions, and a 'case' statement might emit 'undefined1 - undefined2'.
+ *
+ * To simplify table-driven dispatch, we also have a "segment" for the
+ * entire expression. That way we don't require complex reasoning about
+ * whether particular components are defined; and we can change component
+ * semantics without re-working all the dispatch tables in the assembler.
+ * In other words the "type" of an expression is its segment.
+ */
+
+typedef struct
+{
+       symbolS *X_add_symbol;          /* foo */
+       symbolS *X_subtract_symbol;     /* bar */
+       long int X_add_number;          /* 42.    Must be signed. */
+       segT    X_seg;                  /* What segment (expr type)? */
+}
+expressionS;
+
+                               /* result should be type (expressionS *). */
+#define expression(result) expr(0,result)
+
+                               /* If an expression is SEG_BIG, look here */
+                               /* for its value. These common data may */
+                               /* be clobbered whenever expr() is called. */
+extern FLONUM_TYPE generic_floating_point_number; /* Flonums returned here. */
+                               /* Enough to hold most precise flonum. */
+extern LITTLENUM_TYPE generic_bignum []; /* Bignums returned here. */
+#define SIZE_OF_LARGE_NUMBER (20)      /* Number of littlenums in above. */
+
+
+segT           expr();
+char           get_symbol_end();
+
+/* end: expr.h */
diff --git a/usr/src/usr.bin/gas/flonum-copy.c b/usr/src/usr.bin/gas/flonum-copy.c
new file mode 100644 (file)
index 0000000..3a51f06
--- /dev/null
@@ -0,0 +1,76 @@
+/* flonum_copy.c - copy a flonum
+   Copyright (C) 1987 Free Software Foundation, Inc.
+
+This file is part of GAS, the GNU Assembler.
+
+GAS is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 1, or (at your option)
+any later version.
+
+GAS is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GAS; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#include "flonum.h"
+#ifdef USG
+#define bzero(s,n) memset(s,0,n)
+#define bcopy(from,to,n) memcpy(to,from,n)
+#endif
+
+void
+flonum_copy (in, out)
+     FLONUM_TYPE *     in;
+     FLONUM_TYPE *     out;
+{
+  int                  in_length;      /* 0 origin */
+  int                  out_length;     /* 0 origin */
+
+  out -> sign = in -> sign;
+  in_length = in  -> leader - in -> low;
+  if (in_length < 0)
+    {
+      out -> leader = out -> low - 1; /* 0.0 case */
+    }
+  else
+    {
+      out_length = out -> high - out -> low;
+      /*
+       * Assume no GAPS in packing of littlenums.
+       * I.e. sizeof(array) == sizeof(element) * number_of_elements.
+       */
+      if (in_length <= out_length)
+       {
+         {
+           /*
+            * For defensive programming, zero any high-order littlenums we don't need.
+            * This is destroying evidence and wasting time, so why bother???
+            */
+           if (in_length < out_length)
+             {
+               bzero ((char *)(out->low + in_length + 1), out_length - in_length);
+             }
+         }
+         bcopy ((char *)(in->low), (char *)(out->low), (int)((in_length + 1) * sizeof(LITTLENUM_TYPE)));
+         out -> exponent = in -> exponent;
+         out -> leader   = in -> leader - in -> low + out -> low;
+       }
+      else
+       {
+         int   shorten;                /* 1-origin. Number of littlenums we drop. */
+
+         shorten = in_length - out_length;
+         /* Assume out_length >= 0 ! */
+         bcopy ((char *)(in->low + shorten),(char *)( out->low), (int)((out_length + 1) * sizeof(LITTLENUM_TYPE)));
+         out -> leader = out -> high;
+         out -> exponent = in -> exponent + shorten;
+       }
+    }                          /* if any significant bits */
+}
+
+/* end: flonum_copy.c */
diff --git a/usr/src/usr.bin/gas/frags.h b/usr/src/usr.bin/gas/frags.h
new file mode 100644 (file)
index 0000000..6d7310b
--- /dev/null
@@ -0,0 +1,41 @@
+/* frags.h - Header file for the frag concept.
+   Copyright (C) 1987 Free Software Foundation, Inc.
+
+This file is part of GAS, the GNU Assembler.
+
+GAS is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 1, or (at your option)
+any later version.
+
+GAS is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GAS; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+extern struct obstack  frags;
+                               /* Frags ONLY live in this obstack. */
+                               /* We use obstack_next_free() macro */
+                               /* so please don't put any other objects */
+                               /* on this stack! */
+
+/*
+ * A macro to speed up appending exactly 1 char
+ * to current frag.
+ */
+/* JF changed < 1 to <= 1 to avoid a race conditon */
+#define FRAG_APPEND_1_CHAR(datum)      \
+{                                      \
+       if (obstack_room( &frags ) <= 1) {\
+               frag_wane (frag_now);   \
+               frag_new (0);           \
+       }                               \
+       obstack_1grow( &frags, datum ); \
+}
+      
+
+/* end: frags.h */
diff --git a/usr/src/usr.bin/gas/hash.h b/usr/src/usr.bin/gas/hash.h
new file mode 100644 (file)
index 0000000..fb68fd3
--- /dev/null
@@ -0,0 +1,59 @@
+/* hash.h - for hash.c
+   Copyright (C) 1987 Free Software Foundation, Inc.
+
+This file is part of GAS, the GNU Assembler.
+
+GAS is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 1, or (at your option)
+any later version.
+
+GAS is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GAS; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifndef hashH
+#define hashH
+
+struct hash_entry
+{
+  char *      hash_string;     /* points to where the symbol string is */
+                               /* NULL means slot is not used */
+                               /* DELETED means slot was deleted */
+  char *      hash_value;      /* user's datum, associated with symbol */
+};
+
+
+#define HASH_STATLENGTH        (6)
+struct hash_control
+{
+  struct hash_entry * hash_where; /* address of hash table */
+  int         hash_sizelog;    /* Log of ( hash_mask + 1 ) */
+  int         hash_mask;       /* masks a hash into index into table */
+  int         hash_full;       /* when hash_stat[STAT_USED] exceeds this, */
+                               /* grow table */
+  struct hash_entry * hash_wall; /* point just after last (usable) entry */
+                               /* here we have some statistics */
+  int hash_stat[HASH_STATLENGTH]; /* lies & statistics */
+                               /* we need STAT_USED & STAT_SIZE */
+};
+
+
+/*                                             returns           */
+struct hash_control *  hash_new();     /* [control block]        */
+void                   hash_die();
+void                   hash_say();
+char *                 hash_delete();  /* previous value         */
+char *                 hash_relpace(); /* previous value         */
+char *                 hash_insert();  /* error string           */
+char *                 hash_apply();   /* 0 means OK             */
+char *                 hash_find();    /* value                  */
+char *                 hash_jam();     /* error text (internal)  */
+#endif                         /* #ifdef hashH */
+
+/* end: hash.c */
diff --git a/usr/src/usr.bin/gas/input-file.h b/usr/src/usr.bin/gas/input-file.h
new file mode 100644 (file)
index 0000000..42f490a
--- /dev/null
@@ -0,0 +1,57 @@
+/* input_file.h header for input-file.c
+   Copyright (C) 1987 Free Software Foundation, Inc.
+
+This file is part of GAS, the GNU Assembler.
+
+GAS is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 1, or (at your option)
+any later version.
+
+GAS is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GAS; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/*"input_file.c":Operating-system dependant functions to read source files.*/
+
+
+/*
+ * No matter what the operating system, this module must provide the
+ * following services to its callers.
+ *
+ * input_file_begin()                  Call once before anything else.
+ *
+ * input_file_end()                    Call once after everything else.
+ *
+ * input_file_buffer_size()            Call anytime. Returns largest possible
+ *                                     delivery from
+ *                                     input_file_give_next_buffer().
+ *
+ * input_file_open(name)               Call once for each input file.
+ *
+ * input_file_give_next_buffer(where)  Call once to get each new buffer.
+ *                                     Return 0: no more chars left in file,
+ *                                        the file has already been closed.
+ *                                     Otherwise: return a pointer to just
+ *                                        after the last character we read
+ *                                        into the buffer.
+ *                                     If we can only read 0 characters, then
+ *                                     end-of-file is faked.
+ *
+ * All errors are reported (using as_perror) so caller doesn't have to think
+ * about I/O errors. No I/O errors are fatal: an end-of-file may be faked.
+ */
+
+void   input_file_begin();
+void   input_file_end();
+int    input_file_buffer_size();
+int    input_file_is_open();
+void   input_file_open();
+char * input_file_give_next_buffer();
+
+/* end: input_file.h */