many modyfications in search for more speed
This commit is contained in:
parent
63f793aff3
commit
7851ff900f
|
@ -26,6 +26,8 @@ extern holno, procno;
|
|||
|
||||
#define swtxt() switchseg( SEGTXT)
|
||||
|
||||
#define switchseg(seg) if ((seg) != cur_seg) swtchsg(seg); else
|
||||
|
||||
#define PC_REL 1
|
||||
#define ABSOLUTE !PC_REL
|
||||
|
||||
|
@ -34,8 +36,7 @@ extern holno, procno;
|
|||
|
||||
#define MAXTEXT 4096
|
||||
#define MAXDATA 2048
|
||||
#define MAXRELO 100
|
||||
#define MAXNAME 100
|
||||
#define MAXSTRING 2048
|
||||
#define MAXHASH 256
|
||||
#define MAXRELO 512
|
||||
#define MAXNAME 512
|
||||
#define MAXSTRING 4096
|
||||
|
||||
|
|
|
@ -9,9 +9,9 @@ arith n;
|
|||
register struct outname *nm = &symbol_table[Label];
|
||||
|
||||
if (label_waiting && (nm->on_type & S_EXT)) {
|
||||
symbol_table[Label].on_type |= S_COM | (S_MIN+SEGBSS);
|
||||
if (n > symbol_table[Label].on_valu) {
|
||||
symbol_table[Label].on_valu = n;
|
||||
nm->on_type |= S_COM | (S_MIN+SEGBSS);
|
||||
if (n > nm->on_valu) {
|
||||
nm->on_valu = n;
|
||||
}
|
||||
label_waiting = 0;
|
||||
return;
|
||||
|
|
|
@ -6,11 +6,11 @@ TWO_BYTES w;
|
|||
{
|
||||
if ((_data_cnt -= 2) < 0) mem_data();
|
||||
#ifdef BYTES_REVERSED
|
||||
*data++ = ( unsigned short)w>>8;
|
||||
*data++ = w>>8;
|
||||
*data++ = w;
|
||||
#else
|
||||
*data++ = w;
|
||||
*data++ = ( unsigned short)w>>8;
|
||||
*data++ = w>>8;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -1,14 +1,22 @@
|
|||
#include "mach.h"
|
||||
#include "back.h"
|
||||
|
||||
#ifdef BYTES_REVERSED
|
||||
#define con2(w) { *data++ = ((w) >> 8); *data++ = (w);}
|
||||
#else
|
||||
#define con2(w) { *data++ = (w); *data++ = ((w)>>8);}
|
||||
#endif
|
||||
|
||||
con4( l)
|
||||
FOUR_BYTES l;
|
||||
{
|
||||
if ((_data_cnt -= 4) < 0) mem_data();
|
||||
#ifdef WORDS_REVERSED
|
||||
con2( (short) ((unsigned long)l>>16));
|
||||
con2( (short) l);
|
||||
con2( (int)(l>>16));
|
||||
con2( (int) l);
|
||||
#else
|
||||
con2( (short) l);
|
||||
con2( (short) ((unsigned long)l>>16));
|
||||
con2( (int) l);
|
||||
con2( (int) (l>>16));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include <system.h>
|
||||
#include <out.h>
|
||||
#include "data.h"
|
||||
#include "mach.h"
|
||||
|
||||
/* Global datastructures :
|
||||
|
@ -36,26 +37,17 @@ long nbss = 0, size_text, size_data, size_reloc, size_symbol,
|
|||
size_string, _text_cnt, _data_cnt;
|
||||
|
||||
|
||||
put1(sect,addr,b)
|
||||
char *sect;
|
||||
long addr;
|
||||
char b;
|
||||
{
|
||||
sect[addr] = b;
|
||||
}
|
||||
|
||||
|
||||
put2(sect,addr,w)
|
||||
char *sect;
|
||||
long addr;
|
||||
int w;
|
||||
{
|
||||
#ifdef BYTES_REVERSED
|
||||
put1(sect,addr,(char) (w>>8));
|
||||
put1(sect,addr+1,(char) w);
|
||||
put1(sect, addr, (w>>8));
|
||||
put1(sect, addr+1, w);
|
||||
#else
|
||||
put1(sect,addr,(char) w);
|
||||
put1(sect,addr+1,(char) (w>>8));
|
||||
put1(sect, addr, w);
|
||||
put1(sect, addr+1, (w>>8));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -66,37 +58,23 @@ long addr;
|
|||
long l;
|
||||
{
|
||||
#ifdef WORDS_REVERSED
|
||||
put2(sect,addr,(short) (l>>16));
|
||||
put2(sect,addr+2,(short) l);
|
||||
put2(sect,addr,(int) (l>>16));
|
||||
put2(sect,addr+2,(int) l);
|
||||
#else
|
||||
put2(sect,addr,(short) l);
|
||||
put2(sect,addr+2,(short) (l>>16));
|
||||
put2(sect,addr,(int) l);
|
||||
put2(sect,addr+2,(int) (l>>16));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
char get1( sect, addr)
|
||||
int get2(sect,addr)
|
||||
char *sect;
|
||||
long addr;
|
||||
{
|
||||
return( sect[addr]);
|
||||
}
|
||||
|
||||
|
||||
short get2(sect,addr)
|
||||
char *sect;
|
||||
long addr;
|
||||
{
|
||||
short h,l;
|
||||
|
||||
#ifdef BYTES_REVERSED
|
||||
h = sect[addr];
|
||||
l = sect[addr+1];
|
||||
return (get1(sect,addr) << 8) | (get1(sect,addr+1) & 255);
|
||||
#else
|
||||
l = sect[addr];
|
||||
h = sect[addr+1];
|
||||
return (get1(sect,addr+1) << 8) | (get1(sect,addr) & 255);
|
||||
#endif
|
||||
return( ( h << 8) | ( l & 255));
|
||||
}
|
||||
|
||||
|
||||
|
@ -104,14 +82,9 @@ long get4(sect,addr)
|
|||
char *sect;
|
||||
long addr;
|
||||
{
|
||||
long l,h;
|
||||
|
||||
#ifdef WORDS_REVERSED
|
||||
h = get2(sect,addr);
|
||||
l = get2(sect,addr+2);
|
||||
return ((long)get2(sect,addr) << 16) | get2(sect, addr+2);
|
||||
#else
|
||||
l = get2(sect,addr);
|
||||
h = get2(sect,addr+2);
|
||||
return ((long)get2(sect,addr+2) << 16) | get2(sect, addr);
|
||||
#endif
|
||||
return( ( h << 16) | ( l & 65535L));
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* The global datastructures (see "data.c"). */
|
||||
|
||||
extern long cur_value();
|
||||
extern long get4();
|
||||
|
||||
extern int cur_seg;
|
||||
|
||||
|
@ -13,3 +14,5 @@ extern char *text_area, *data_area, *string_area;
|
|||
extern struct outrelo *reloc_info, *relo;
|
||||
extern struct outname *symbol_table;
|
||||
|
||||
#define put1(buf, off, w) ((buf)[off] = (w))
|
||||
#define get1(buf, off) ((buf)[off])
|
||||
|
|
|
@ -2,15 +2,30 @@
|
|||
#include "mach.h"
|
||||
#include "back.h"
|
||||
|
||||
gen2( c)
|
||||
TWO_BYTES c;
|
||||
gen2( w)
|
||||
TWO_BYTES w;
|
||||
{
|
||||
switch ( cur_seg) {
|
||||
case SEGTXT : text2( c);
|
||||
return;
|
||||
case SEGCON : con2( c);
|
||||
return;
|
||||
case SEGROM : rom2( c);
|
||||
case SEGTXT :
|
||||
if ((_text_cnt -= 2) < 0) mem_text();
|
||||
#ifdef BYTES_REVERSED
|
||||
*text++ = w>>8;
|
||||
*text++ = w;
|
||||
#else
|
||||
*text++ = w;
|
||||
*text++ = w>>8;
|
||||
#endif
|
||||
return;
|
||||
case SEGCON :
|
||||
case SEGROM :
|
||||
if ((_data_cnt -= 2) < 0) mem_data();
|
||||
#ifdef BYTES_REVERSED
|
||||
*data++ = w>>8;
|
||||
*data++ = w;
|
||||
#else
|
||||
*data++ = w;
|
||||
*data++ = w>>8;
|
||||
#endif
|
||||
return;
|
||||
case SEGBSS : bss( 2);
|
||||
return;
|
||||
|
|
|
@ -1,17 +1,39 @@
|
|||
#include <system.h>
|
||||
#include "mach.h"
|
||||
#include "back.h"
|
||||
#ifdef BYTES_REVERSED
|
||||
#define text2(w) { *text++ = ((w) >> 8); *text++ = (w);}
|
||||
#define con2(w) { *data++ = ((w) >> 8); *data++ = (w);}
|
||||
#else
|
||||
#define text2(w) { *text++ = (w); *text++ = ((w)>>8);}
|
||||
#define con2(w) { *data++ = (w); *data++ = ((w)>>8);}
|
||||
#endif
|
||||
|
||||
gen4( c)
|
||||
FOUR_BYTES c;
|
||||
gen4( l)
|
||||
FOUR_BYTES l;
|
||||
{
|
||||
switch ( cur_seg) {
|
||||
case SEGTXT : text4( c);
|
||||
return;
|
||||
case SEGCON : con4( c);
|
||||
return;
|
||||
case SEGROM : rom4( c);
|
||||
return;
|
||||
case SEGTXT :
|
||||
if ((_text_cnt -= 4) < 0) mem_text();
|
||||
#ifdef WORDS_REVERSED
|
||||
text2( (int) (l>>16));
|
||||
text2( (int) l);
|
||||
#else
|
||||
text2( (int) l);
|
||||
text2( (int) (l>>16));
|
||||
#endif
|
||||
return;
|
||||
case SEGCON :
|
||||
case SEGROM :
|
||||
if ((_data_cnt -= 4) < 0) mem_data();
|
||||
#ifdef WORDS_REVERSED
|
||||
con2( (int)(l>>16));
|
||||
con2( (int) l);
|
||||
#else
|
||||
con2( (int) l);
|
||||
con2( (int) (l>>16));
|
||||
#endif
|
||||
return;
|
||||
case SEGBSS : bss( 4);
|
||||
return;
|
||||
default : fprint( STDERR, "gen4() : bad seg number\n");
|
||||
|
|
|
@ -3,9 +3,12 @@
|
|||
#include <varargs.h>
|
||||
|
||||
/* Mysprint() stores the string directly in the string_arae. This saves
|
||||
* a copy action.
|
||||
* a copy action. It is assumed that the strings stored in the string-table
|
||||
* are never longer than MAXSTRLEN bytes.
|
||||
*/
|
||||
|
||||
#define MAXSTRLEN 1024
|
||||
|
||||
/*VARARGS*/
|
||||
int mysprint(va_alist)
|
||||
va_dcl
|
||||
|
@ -16,7 +19,7 @@ int mysprint(va_alist)
|
|||
|
||||
va_start(args);
|
||||
fmt = va_arg(args, char *);
|
||||
while (string + 1024 - string_area > size_string)
|
||||
while (string + MAXSTRLEN - string_area > size_string)
|
||||
mem_string();
|
||||
retval = _format(string, fmt, args);
|
||||
string[retval] = '\0';
|
||||
|
|
|
@ -8,26 +8,36 @@
|
|||
* absolute.
|
||||
*/
|
||||
|
||||
#ifdef WORDS_REVERSED
|
||||
#ifdef BYTES_REVERSED
|
||||
#define RRR (RELO1|RELBR|RELWR)
|
||||
#else
|
||||
#define RRR (RELO1|RELWR)
|
||||
#endif
|
||||
#else
|
||||
#ifdef BYTES_REVERSED
|
||||
#define RRR (RELO1|RELBR)
|
||||
#else
|
||||
#define RRR (RELO1)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
reloc1( sym, off, pcrel)
|
||||
char *sym;
|
||||
arith off;
|
||||
int pcrel;
|
||||
{
|
||||
register struct outrelo *r;
|
||||
|
||||
if ( relo - reloc_info >= size_reloc)
|
||||
mem_relo();
|
||||
|
||||
relo->or_type = RELO1;
|
||||
#ifdef BYTES_REVERSED
|
||||
relo->or_type |= RELBR;
|
||||
#endif
|
||||
#ifdef WORDS_REVERSED
|
||||
relo->or_type |= RELWR;
|
||||
#endif
|
||||
relo->or_type |= ( pcrel) ? RELPC : S_UND;
|
||||
relo->or_sect = S_MIN + conv_seg( cur_seg);
|
||||
relo->or_nami = find_sym(sym, REFERENCE);
|
||||
relo->or_addr = cur_value();
|
||||
gen1( (pcrel) ? off - ( cur_value() + 1) : off);
|
||||
r = relo;
|
||||
r->or_type |= ( pcrel) ? RELPC|RRR : RRR;
|
||||
r->or_sect = S_MIN + conv_seg( cur_seg);
|
||||
r->or_nami = find_sym(sym, REFERENCE);
|
||||
r->or_addr = cur_value();
|
||||
gen1( (pcrel) ? off - ( r->or_addr + 1) : off);
|
||||
|
||||
relo++;
|
||||
}
|
||||
|
|
|
@ -8,26 +8,36 @@
|
|||
* absolute.
|
||||
*/
|
||||
|
||||
#ifdef WORDS_REVERSED
|
||||
#ifdef BYTES_REVERSED
|
||||
#define RRR (RELO2|RELBR|RELWR)
|
||||
#else
|
||||
#define RRR (RELO2|RELWR)
|
||||
#endif
|
||||
#else
|
||||
#ifdef BYTES_REVERSED
|
||||
#define RRR (RELO2|RELBR)
|
||||
#else
|
||||
#define RRR (RELO2)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
reloc2( sym, off, pcrel)
|
||||
char *sym;
|
||||
arith off;
|
||||
int pcrel;
|
||||
{
|
||||
register struct outrelo *r;
|
||||
|
||||
if ( relo - reloc_info >= size_reloc)
|
||||
mem_relo();
|
||||
|
||||
relo->or_type = RELO2;
|
||||
#ifdef BYTES_REVERSED
|
||||
relo->or_type |= RELBR;
|
||||
#endif
|
||||
#ifdef WORDS_REVERSED
|
||||
relo->or_type |= RELWR;
|
||||
#endif
|
||||
relo->or_type |= ( pcrel) ? RELPC : S_UND;
|
||||
relo->or_sect = S_MIN + conv_seg( cur_seg);
|
||||
relo->or_nami = find_sym(sym, REFERENCE);
|
||||
relo->or_addr = cur_value();
|
||||
gen2( (pcrel) ? off - ( cur_value() + 2) : off);
|
||||
r = relo;
|
||||
r->or_type = ( pcrel) ? RELPC|RRR : RRR;
|
||||
r->or_sect = S_MIN + conv_seg( cur_seg);
|
||||
r->or_nami = find_sym(sym, REFERENCE);
|
||||
r->or_addr = cur_value();
|
||||
gen2( (pcrel) ? off - ( r->or_addr + 2) : off);
|
||||
|
||||
relo++;
|
||||
}
|
||||
|
|
|
@ -9,29 +9,40 @@
|
|||
* absolute.
|
||||
*/
|
||||
|
||||
#ifdef WORDS_REVERSED
|
||||
#ifdef BYTES_REVERSED
|
||||
#define RRR (RELO4|RELBR|RELWR)
|
||||
#else
|
||||
#define RRR (RELO4|RELWR)
|
||||
#endif
|
||||
#else
|
||||
#ifdef BYTES_REVERSED
|
||||
#define RRR (RELO4|RELBR)
|
||||
#else
|
||||
#define RRR (RELO4)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
reloc4( sym, off, pcrel)
|
||||
char *sym;
|
||||
arith off;
|
||||
int pcrel;
|
||||
{
|
||||
register struct outrelo *r;
|
||||
|
||||
if ( relo - reloc_info >= size_reloc)
|
||||
mem_relo();
|
||||
|
||||
relo->or_type = RELO4;
|
||||
#ifdef BYTES_REVERSED
|
||||
relo->or_type |= RELBR;
|
||||
#endif
|
||||
#ifdef WORDS_REVERSED
|
||||
relo->or_type |= RELWR;
|
||||
#endif
|
||||
relo->or_type |= ( pcrel) ? RELPC : S_UND;
|
||||
relo->or_sect = S_MIN + conv_seg( cur_seg);
|
||||
relo->or_nami = find_sym(sym, REFERENCE);
|
||||
relo->or_addr = cur_value();
|
||||
gen4( (pcrel) ? off - ( cur_value() + 4) : off);
|
||||
r = relo;
|
||||
|
||||
r->or_type = ( pcrel) ? RELPC|RRR : RRR;
|
||||
r->or_sect = S_MIN + conv_seg( cur_seg);
|
||||
r->or_nami = find_sym(sym, REFERENCE);
|
||||
r->or_addr = cur_value();
|
||||
gen4( (pcrel) ? off - ( r->or_addr + 4) : off);
|
||||
|
||||
/* print( "r %s r %ld s %d in %d adrr %ld off %ld\n",
|
||||
sym, pcrel, cur_seg, relo->or_nami, relo->or_addr,
|
||||
sym, pcrel, cur_seg, r->or_nami, r->or_addr,
|
||||
(pcrel) ? off-cur_value() : off);
|
||||
*/
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include <system.h>
|
||||
#include <out.h>
|
||||
#include "back.h"
|
||||
#include "data.h"
|
||||
|
||||
/* Solve the local references.
|
||||
*/
|
||||
|
@ -8,9 +9,6 @@
|
|||
#define seg_index( s) ( nname - SEGBSS - 1 + s)
|
||||
|
||||
long get4();
|
||||
extern short get2();
|
||||
extern char get1();
|
||||
|
||||
|
||||
do_local_relocation()
|
||||
|
||||
|
|
|
@ -6,10 +6,10 @@ TWO_BYTES w;
|
|||
{
|
||||
if ((_data_cnt -= 2) < 0) mem_data();
|
||||
#ifdef BYTES_REVERSED
|
||||
*data++ = ( unsigned short)w>>8;
|
||||
*data++ = w>>8;
|
||||
*data++ = w;
|
||||
#else
|
||||
*data++ = w;
|
||||
*data++ = ( unsigned short)w>>8;
|
||||
*data++ = w>>8;
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -1,14 +1,22 @@
|
|||
#include "mach.h"
|
||||
#include "back.h"
|
||||
|
||||
#ifdef BYTES_REVERSED
|
||||
#define rom2(w) { *data++ = ((w) >> 8); *data++ = (w);}
|
||||
#else
|
||||
#define rom2(w) { *data++ = (w); *data++ = ((w)>>8);}
|
||||
#endif
|
||||
|
||||
rom4( l)
|
||||
FOUR_BYTES l;
|
||||
{
|
||||
if ((_data_cnt -= 4) < 0) mem_data();
|
||||
#ifdef WORDS_REVERSED
|
||||
rom2( (short) ((unsigned long)l>>16));
|
||||
rom2( (short) l);
|
||||
rom2( (int)(l>>16));
|
||||
rom2( (int) l);
|
||||
#else
|
||||
rom2( (short) l);
|
||||
rom2( (short) ((unsigned long)l>>16));
|
||||
rom2( (int) l);
|
||||
rom2( (int) (l>>16));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -1,14 +1,12 @@
|
|||
#include "data.h"
|
||||
|
||||
switchseg( seg)
|
||||
swtchsg( seg)
|
||||
int seg;
|
||||
|
||||
/* The EM definition demands that pseudo instructions are aligned
|
||||
* at word boundaries.
|
||||
*/
|
||||
{
|
||||
if ( seg == cur_seg)
|
||||
return;
|
||||
cur_seg = seg;
|
||||
align_word();
|
||||
}
|
||||
|
|
|
@ -30,6 +30,9 @@ int string_lengte = 0,
|
|||
index_symbol_table = -1;
|
||||
|
||||
struct Hashitem *Hashitems ;
|
||||
|
||||
/* MAXHASH must be a power of two ... */
|
||||
#define MAXHASH 512
|
||||
static int Hashtab[ MAXHASH];
|
||||
static int Hash();
|
||||
|
||||
|
@ -38,7 +41,6 @@ int find_sym( sym, isdef)
|
|||
char *sym;
|
||||
int isdef;
|
||||
{
|
||||
register char *p;
|
||||
register struct outname *s;
|
||||
register struct Hashitem *ip;
|
||||
register int h;
|
||||
|
@ -57,8 +59,11 @@ int isdef;
|
|||
h = Hash(sym);
|
||||
for ( ip = Hashtab[h] + Hashitems ; ip != Hashitems;
|
||||
ip = (ip->hs_next) + Hashitems) {
|
||||
register char *p = sym, *q;
|
||||
|
||||
s = symbol_table + ip->hs_nami;
|
||||
if (strcmp(sym, (s->on_foff) + string_area) == 0) {
|
||||
q = string_area + s->on_foff;
|
||||
while (*p == *q++) if (*p++ == '\0') {
|
||||
if ( (s->on_valu == -2) && (isdef == REFERENCE)) {
|
||||
s->on_type = S_EXT;
|
||||
s->on_valu = -1;
|
||||
|
@ -89,6 +94,8 @@ int isdef;
|
|||
if ( sym == string)
|
||||
string += string_lengte;
|
||||
else { /* zie C_fil, C_lin, C_lni */
|
||||
register char *p;
|
||||
|
||||
string_lengte = 0;
|
||||
for( p=sym; *p != '\0' ; p++) {
|
||||
string_lengte++;
|
||||
|
@ -111,15 +118,14 @@ int isdef;
|
|||
|
||||
|
||||
static int Hash(sym)
|
||||
register char *sym;
|
||||
char *sym;
|
||||
{
|
||||
register unsigned h;
|
||||
register c;
|
||||
register char *s = sym;
|
||||
|
||||
h = 0;
|
||||
while (c = *sym++) {
|
||||
h <<= 2;
|
||||
h += c;
|
||||
while (*s) {
|
||||
h = (h << 2) + *s++;
|
||||
}
|
||||
return (h % MAXHASH);
|
||||
return (h & (MAXHASH - 1));
|
||||
}
|
||||
|
|
|
@ -6,10 +6,10 @@ TWO_BYTES w;
|
|||
{
|
||||
if ((_text_cnt -= 2) < 0) mem_text();
|
||||
#ifdef BYTES_REVERSED
|
||||
*text++ = ( unsigned short)w>>8;
|
||||
*text++ = w>>8;
|
||||
*text++ = w;
|
||||
#else
|
||||
*text++ = w;
|
||||
*text++ = ( unsigned short)w>>8;
|
||||
*text++ = w>>8;
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -1,13 +1,21 @@
|
|||
#include "mach.h"
|
||||
#include "back.h"
|
||||
|
||||
#ifdef BYTES_REVERSED
|
||||
#define text2(w) { *text++ = ((w) >> 8); *text++ = (w);}
|
||||
#else
|
||||
#define text2(w) { *text++ = (w); *text++ = ((w)>>8);}
|
||||
#endif
|
||||
|
||||
text4( l)
|
||||
FOUR_BYTES l;
|
||||
{
|
||||
if ((_text_cnt -= 4) < 0) mem_text();
|
||||
#ifdef WORDS_REVERSED
|
||||
text2( (short) ((unsigned long)l>>16));
|
||||
text2( (short) l);
|
||||
text2( (int) (l>>16));
|
||||
text2( (int) l);
|
||||
#else
|
||||
text2( (short) l);
|
||||
text2( (short) ((unsigned long)l>>16));
|
||||
text2( (int) l);
|
||||
text2( (int) (l>>16));
|
||||
#endif
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue