aboutsummaryrefslogtreecommitdiffstats
path: root/code
diff options
context:
space:
mode:
Diffstat (limited to 'code')
-rw-r--r--code/tools/lcc/include/alpha/osf/assert.h14
-rw-r--r--code/tools/lcc/include/alpha/osf/ctype.h25
-rw-r--r--code/tools/lcc/include/alpha/osf/errno.h8
-rw-r--r--code/tools/lcc/include/alpha/osf/float.h37
-rw-r--r--code/tools/lcc/include/alpha/osf/limits.h24
-rw-r--r--code/tools/lcc/include/alpha/osf/locale.h36
-rw-r--r--code/tools/lcc/include/alpha/osf/math.h29
-rw-r--r--code/tools/lcc/include/alpha/osf/setjmp.h10
-rw-r--r--code/tools/lcc/include/alpha/osf/signal.h20
-rw-r--r--code/tools/lcc/include/alpha/osf/stdarg.h28
-rw-r--r--code/tools/lcc/include/alpha/osf/stddef.h22
-rw-r--r--code/tools/lcc/include/alpha/osf/stdio.h113
-rw-r--r--code/tools/lcc/include/alpha/osf/stdlib.h54
-rw-r--r--code/tools/lcc/include/alpha/osf/string.h35
-rw-r--r--code/tools/lcc/include/alpha/osf/time.h50
-rw-r--r--code/tools/lcc/include/mips/irix/assert.h14
-rw-r--r--code/tools/lcc/include/mips/irix/ctype.h40
-rw-r--r--code/tools/lcc/include/mips/irix/errno.h8
-rw-r--r--code/tools/lcc/include/mips/irix/float.h37
-rw-r--r--code/tools/lcc/include/mips/irix/limits.h24
-rw-r--r--code/tools/lcc/include/mips/irix/locale.h36
-rw-r--r--code/tools/lcc/include/mips/irix/math.h29
-rw-r--r--code/tools/lcc/include/mips/irix/setjmp.h10
-rw-r--r--code/tools/lcc/include/mips/irix/signal.h20
-rw-r--r--code/tools/lcc/include/mips/irix/stdarg.h22
-rw-r--r--code/tools/lcc/include/mips/irix/stddef.h22
-rw-r--r--code/tools/lcc/include/mips/irix/stdio.h103
-rw-r--r--code/tools/lcc/include/mips/irix/stdlib.h54
-rw-r--r--code/tools/lcc/include/mips/irix/string.h35
-rw-r--r--code/tools/lcc/include/mips/irix/time.h48
-rw-r--r--code/tools/lcc/include/sparc/solaris/assert.h14
-rw-r--r--code/tools/lcc/include/sparc/solaris/ctype.h46
-rw-r--r--code/tools/lcc/include/sparc/solaris/errno.h8
-rw-r--r--code/tools/lcc/include/sparc/solaris/float.h37
-rw-r--r--code/tools/lcc/include/sparc/solaris/limits.h24
-rw-r--r--code/tools/lcc/include/sparc/solaris/locale.h36
-rw-r--r--code/tools/lcc/include/sparc/solaris/math.h30
-rw-r--r--code/tools/lcc/include/sparc/solaris/setjmp.h10
-rw-r--r--code/tools/lcc/include/sparc/solaris/signal.h20
-rw-r--r--code/tools/lcc/include/sparc/solaris/stdarg.h22
-rw-r--r--code/tools/lcc/include/sparc/solaris/stddef.h22
-rw-r--r--code/tools/lcc/include/sparc/solaris/stdio.h104
-rw-r--r--code/tools/lcc/include/sparc/solaris/stdlib.h54
-rw-r--r--code/tools/lcc/include/sparc/solaris/string.h35
-rw-r--r--code/tools/lcc/include/sparc/solaris/time.h48
-rw-r--r--code/tools/lcc/include/x86/linux/assert.h14
-rw-r--r--code/tools/lcc/include/x86/linux/float.h37
-rw-r--r--code/tools/lcc/include/x86/linux/stdarg.h21
-rw-r--r--code/tools/lcc/makefile11
-rw-r--r--code/tools/lcc/packing.lst432
-rw-r--r--code/tools/lcc/src/alpha.md1192
-rw-r--r--code/tools/lcc/src/bind.c15
-rw-r--r--code/tools/lcc/src/mips.md1120
-rw-r--r--code/tools/lcc/src/pass2.c665
-rw-r--r--code/tools/lcc/src/sparc.md1163
-rw-r--r--code/tools/lcc/src/x86.md998
-rw-r--r--code/tools/lcc/src/x86linux.md1081
57 files changed, 2 insertions, 8264 deletions
diff --git a/code/tools/lcc/include/alpha/osf/assert.h b/code/tools/lcc/include/alpha/osf/assert.h
deleted file mode 100644
index ee0b0bf..0000000
--- a/code/tools/lcc/include/alpha/osf/assert.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef __ASSERT
-#define __ASSERT
-
-void assert(int);
-
-#endif /* __ASSERT */
-
-#undef assert
-#ifdef NDEBUG
-#define assert(ignore) ((void)0)
-#else
-extern void __assert(char *, char *, unsigned);
-#define assert(e) ((void)((e)||(__assert(#e, __FILE__, __LINE__),0)))
-#endif /* NDEBUG */
diff --git a/code/tools/lcc/include/alpha/osf/ctype.h b/code/tools/lcc/include/alpha/osf/ctype.h
deleted file mode 100644
index 02e0131..0000000
--- a/code/tools/lcc/include/alpha/osf/ctype.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef __CTYPE
-#define __CTYPE
-
-extern int isalnum(int);
-extern int isalpha(int);
-extern int iscntrl(int);
-extern int isdigit(int);
-extern int isgraph(int);
-extern int islower(int);
-extern int isprint(int);
-extern int ispunct(int);
-extern int isspace(int);
-extern int isupper(int);
-extern int isxdigit(int);
-extern int tolower(int);
-extern int toupper(int);
-
-#define __U 01
-#define __L 02
-#define __N 04
-#define __S 010
-#define __P 020
-#define __C 040
-
-#endif /* __CTYPE */
diff --git a/code/tools/lcc/include/alpha/osf/errno.h b/code/tools/lcc/include/alpha/osf/errno.h
deleted file mode 100644
index c914e05..0000000
--- a/code/tools/lcc/include/alpha/osf/errno.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef __ERRNO
-#define __ERRNO
-
-#define EDOM 33
-#define ERANGE 34
-extern int errno;
-
-#endif /* __ERRNO */
diff --git a/code/tools/lcc/include/alpha/osf/float.h b/code/tools/lcc/include/alpha/osf/float.h
deleted file mode 100644
index a3e1eb5..0000000
--- a/code/tools/lcc/include/alpha/osf/float.h
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef __FLOAT
-#define __FLOAT
-
-#define FLT_ROUNDS 1
-#define FLT_RADIX 2
-
-#define FLT_DIG 6
-#define FLT_EPSILON 1.19209289550781250000e-07
-#define FLT_MANT_DIG 24
-#define FLT_MAX 3.40282346638528860000e+38
-#define FLT_MAX_10_EXP 38
-#define FLT_MAX_EXP 128
-#define FLT_MIN 1.17549435082228750000e-38
-#define FLT_MIN_10_EXP -37
-#define FLT_MIN_EXP -125
-
-#define DBL_DIG 15
-#define DBL_EPSILON 2.22044604925031310000e-16
-#define DBL_MANT_DIG 53
-#define DBL_MAX 1.79769313486231570000e+308
-#define DBL_MAX_10_EXP 308
-#define DBL_MAX_EXP 1024
-#define DBL_MIN 2.22507385850720140000e-308
-#define DBL_MIN_10_EXP -307
-#define DBL_MIN_EXP -1021
-
-#define LDBL_MANT_DIG DBL_MANT_DIG
-#define LDBL_EPSILON DBL_EPSILON
-#define LDBL_DIG DBL_DIG
-#define LDBL_MIN_EXP DBL_MIN_EXP
-#define LDBL_MIN DBL_MIN
-#define LDBL_MIN_10_EXP DBL_MIN_10_EXP
-#define LDBL_MAX_EXP DBL_MAX_EXP
-#define LDBL_MAX DBL_MAX
-#define LDBL_MAX_10_EXP DBL_MAX_10_EXP
-
-#endif /* __FLOAT */
diff --git a/code/tools/lcc/include/alpha/osf/limits.h b/code/tools/lcc/include/alpha/osf/limits.h
deleted file mode 100644
index 4b4122b..0000000
--- a/code/tools/lcc/include/alpha/osf/limits.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef __LIMITS
-#define __LIMITS
-
-#define CHAR_BIT 8
-#define MB_LEN_MAX 1
-
-#define UCHAR_MAX 0xff
-#define USHRT_MAX 0xffff
-#define UINT_MAX (~0U)
-#define ULONG_MAX (~0UL)
-
-#define CHAR_MAX SCHAR_MAX
-#define SCHAR_MAX 0x7f
-#define SHRT_MAX 0x7fff
-#define INT_MAX 0x7fffffff
-#define LONG_MAX 0x7fffffffffffffffL
-
-#define CHAR_MIN SCHAR_MIN
-#define SCHAR_MIN (-SCHAR_MAX-1)
-#define SHRT_MIN (-SHRT_MAX-1)
-#define INT_MIN (-INT_MAX-1)
-#define LONG_MIN (-LONG_MAX-1)
-
-#endif /* __LIMITS */
diff --git a/code/tools/lcc/include/alpha/osf/locale.h b/code/tools/lcc/include/alpha/osf/locale.h
deleted file mode 100644
index acce293..0000000
--- a/code/tools/lcc/include/alpha/osf/locale.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef __LOCALE
-#define __LOCALE
-
-#define LC_ALL 0
-#define LC_COLLATE 1
-#define LC_CTYPE 2
-#define LC_MONETARY 3
-#define LC_NUMERIC 4
-#define LC_TIME 5
-#define NULL 0
-
-struct lconv {
- char *decimal_point;
- char *thousands_sep;
- char *grouping;
- char *int_curr_symbol;
- char *currency_symbol;
- char *mon_decimal_point;
- char *mon_thousands_sep;
- char *mon_grouping;
- char *positive_sign;
- char *negative_sign;
- char int_frac_digits;
- char frac_digits;
- char p_cs_precedes;
- char p_sep_by_space;
- char n_cs_precedes;
- char n_sep_by_space;
- char p_sign_posn;
- char n_sign_posn;
-};
-
-char *setlocale(int, const char *);
-struct lconv *localeconv(void);
-
-#endif /* __LOCALE */
diff --git a/code/tools/lcc/include/alpha/osf/math.h b/code/tools/lcc/include/alpha/osf/math.h
deleted file mode 100644
index d2a31f4..0000000
--- a/code/tools/lcc/include/alpha/osf/math.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef __MATH
-#define __MATH
-
-#define HUGE_VAL 1.79769313486231570000e+308
-
-extern double acos(double);
-extern double asin(double);
-extern double atan(double);
-extern double atan2(double, double);
-extern double cos(double);
-extern double sin(double);
-extern double tan(double);
-extern double cosh(double);
-extern double sinh(double);
-extern double tanh(double);
-extern double exp(double);
-extern double frexp(double, int *);
-extern double ldexp(double, int);
-extern double log(double);
-extern double log10(double);
-extern double modf(double, double *);
-extern double pow(double, double);
-extern double sqrt(double);
-extern double ceil(double);
-extern double fabs(double);
-extern double floor(double);
-extern double fmod(double, double);
-
-#endif /* __MATH */
diff --git a/code/tools/lcc/include/alpha/osf/setjmp.h b/code/tools/lcc/include/alpha/osf/setjmp.h
deleted file mode 100644
index 48caf9e..0000000
--- a/code/tools/lcc/include/alpha/osf/setjmp.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef __SETJMP
-#define __SETJMP
-
-
-
-typedef int jmp_buf[35+1+48];
-int setjmp(jmp_buf);
-void longjmp(jmp_buf, int);
-
-#endif /* __SETJMP */
diff --git a/code/tools/lcc/include/alpha/osf/signal.h b/code/tools/lcc/include/alpha/osf/signal.h
deleted file mode 100644
index c208a6b..0000000
--- a/code/tools/lcc/include/alpha/osf/signal.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef __SIGNAL
-#define __SIGNAL
-
-typedef int sig_atomic_t;
-
-#define SIG_DFL ((void (*)(int))0)
-#define SIG_ERR ((void (*)(int))-1)
-#define SIG_IGN ((void (*)(int))1)
-
-#define SIGABRT 6
-#define SIGFPE 8
-#define SIGILL 4
-#define SIGINT 2
-#define SIGSEGV 11
-#define SIGTERM 15
-
-void (*signal(int, void (*)(int)))(int);
-int raise(int);
-
-#endif /* __SIGNAL */
diff --git a/code/tools/lcc/include/alpha/osf/stdarg.h b/code/tools/lcc/include/alpha/osf/stdarg.h
deleted file mode 100644
index a05c92b..0000000
--- a/code/tools/lcc/include/alpha/osf/stdarg.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef __STDARG
-#define __STDARG
-
-#if !defined(_VA_LIST)
-#define _VA_LIST
-typedef struct {
- char *_a0; /* pointer to first homed integer arg */
- int _offset; /* byte offset of next param */
- float _tmp;
-} __va_list;
-#endif
-typedef __va_list va_list;
-
-#define va_start(list, start) ((void)( \
- (list)._a0 = (__typecode(__firstarg)==1 ? \
- (char*)&__firstarg+48 : (char *)&__firstarg), \
- (list)._offset = (__typecode(start)==1 ? \
- (char*)&start+56 : (char *)&start+8)-(list)._a0))
-#define va_arg(list, mode) (*(mode *)( \
- (list)._offset += (int)((sizeof(mode)+7)&~7), \
- (__typecode(mode)==1 && sizeof(mode)==4) ? \
- ((list)._tmp = (float)*(double *)((list)._a0 + (list)._offset - \
- ((list)._offset <= 48 ? 56 : 8))), (char *)&(list)._tmp : \
- (__typecode(mode)==1 && (list)._offset <= 48) ? \
- (list)._a0 + (list)._offset - 56 : \
- (list)._a0 + (list)._offset - (int)((sizeof(mode)+7)&~7)))
-#define va_end(list) ((void)0)
-#endif
diff --git a/code/tools/lcc/include/alpha/osf/stddef.h b/code/tools/lcc/include/alpha/osf/stddef.h
deleted file mode 100644
index 4e87e1c..0000000
--- a/code/tools/lcc/include/alpha/osf/stddef.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef __STDDEF
-#define __STDDEF
-
-
-#define NULL 0
-#define offsetof(ty,mem) ((size_t)((char*)&((ty*)0)->mem - (char*)0))
-
-typedef long ptrdiff_t;
-
-#if !defined(_SIZE_T) && !defined(_SIZE_T_)
-#define _SIZE_T
-#define _SIZE_T_
-typedef unsigned long size_t;
-#endif
-
-#if !defined(_WCHAR_T) && !defined(_WCHAR_T_)
-#define _WCHAR_T
-#define _WCHAR_T_
-typedef unsigned short wchar_t;
-#endif
-
-#endif /* __STDDEF */
diff --git a/code/tools/lcc/include/alpha/osf/stdio.h b/code/tools/lcc/include/alpha/osf/stdio.h
deleted file mode 100644
index 216bec7..0000000
--- a/code/tools/lcc/include/alpha/osf/stdio.h
+++ /dev/null
@@ -1,113 +0,0 @@
-#ifndef __STDIO
-#define __STDIO
-
-#define _IOFBF 0
-#define _IOLBF 0200
-#define _IONBF 04
-#define BUFSIZ 8192
-#define EOF (-1)
-
-typedef struct _iobuf {
- int _cnt;
- unsigned char *_ptr;
- unsigned char *_base;
- int _bufsiz;
- short _flag;
- short _file;
- char *__newbase;
- void *_lock;
- unsigned char *_bufendp;
-} FILE;
-extern FILE _iob[];
-#define FILENAME_MAX 255
-#define FOPEN_MAX 64
-
-#if !defined(_FPOS_T) && !defined(_FPOS_T_)
-#define _FPOS_T
-#define _FPOS_T_
-typedef long fpos_t;
-#endif
-
-#define L_tmpnam 21
-#define NULL 0
-#define SEEK_CUR 1
-#define SEEK_END 2
-#define SEEK_SET 0
-
-#if !defined(_SIZE_T) && !defined(_SIZE_T_)
-#define _SIZE_T
-#define _SIZE_T_
-typedef unsigned long size_t;
-#endif
-
-#if !defined(_VA_LIST)
-#define _VA_LIST
-typedef struct {
- char *_a0; /* pointer to first homed integer arg */
- int _offset; /* byte offset of next param */
- float _tmp;
-} __va_list;
-#endif
-
-#define stderr (&_iob[2])
-#define stdin (&_iob[0])
-#define stdout (&_iob[1])
-#define TMP_MAX 16384
-
-extern int remove(const char *);
-extern int rename(const char *, const char *);
-extern FILE *tmpfile(void);
-extern char *tmpnam(char *);
-extern int fclose(FILE *);
-extern int fflush(FILE *);
-extern FILE *fopen(const char *, const char *);
-extern FILE *freopen(const char *, const char *, FILE *);
-extern void setbuf(FILE *, char *);
-extern int setvbuf(FILE *, char *, int, size_t);
-extern int fprintf(FILE *, const char *, ...);
-extern int fscanf(FILE *, const char *, ...);
-extern int printf(const char *, ...);
-extern int scanf(const char *, ...);
-extern int sprintf(char *, const char *, ...);
-extern int sscanf(const char *, const char *, ...);
-extern int vfprintf(FILE *, const char *, __va_list);
-extern int vprintf(const char *, __va_list);
-extern int vsprintf(char *, const char *, __va_list);
-extern int fgetc(FILE *);
-extern char *fgets(char *, int, FILE *);
-extern int fputc(int, FILE *);
-extern int fputs(const char *, FILE *);
-extern int getc(FILE *);
-extern int getchar(void);
-extern char *gets(char *);
-extern int putc(int, FILE *);
-extern int putchar(int);
-extern int puts(const char *);
-extern int ungetc(int, FILE *);
-extern size_t fread(void *, size_t, size_t, FILE *);
-extern size_t fwrite(const void *, size_t, size_t, FILE *);
-extern int fgetpos(FILE *, fpos_t *);
-extern int fseek(FILE *, long int, int);
-extern int fsetpos(FILE *, const fpos_t *);
-extern long int ftell(FILE *);
-extern void rewind(FILE *);
-extern void clearerr(FILE *);
-extern int feof(FILE *);
-extern int ferror(FILE *);
-extern void perror(const char *);
-
-#define _IOEOF 020
-#define _IOERR 040
-
-#define getc(p) (--(p)->_cnt < 0 ? _filbuf(p) : (int) *(p)->_ptr++)
-#define putc(x, p) (--(p)->_cnt < 0 ? \
- _flsbuf((unsigned char) (x), p) : \
- (int) (*(p)->_ptr++ = (unsigned char) (x)))
-extern int _filbuf(FILE *), _flsbuf(unsigned, FILE *);
-#define feof(p) ((p)->_flag&_IOEOF)
-#define ferror(p) ((p)->_flag&_IOERR)
-#define clearerr(p) ((p)->_flag &= ~(_IOERR|_IOEOF))
-#define getchar() getc(stdin)
-#define putchar(x) putc((x),stdout)
-
-#endif /* __STDIO */
diff --git a/code/tools/lcc/include/alpha/osf/stdlib.h b/code/tools/lcc/include/alpha/osf/stdlib.h
deleted file mode 100644
index ac1204c..0000000
--- a/code/tools/lcc/include/alpha/osf/stdlib.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef __STDLIB
-#define __STDLIB
-
-#define EXIT_FAILURE 1
-#define EXIT_SUCCESS 0
-#define MB_CUR_MAX 1
-#define NULL 0
-#define RAND_MAX 32767
-
-typedef struct { int quot, rem; } div_t;
-typedef struct { long quot, rem; } ldiv_t;
-
-#if !defined(_SIZE_T) && !defined(_SIZE_T_)
-#define _SIZE_T
-#define _SIZE_T_
-typedef unsigned long size_t;
-#endif
-
-#if !defined(_WCHAR_T) && !defined(_WCHAR_T_)
-#define _WCHAR_T
-#define _WCHAR_T_
-typedef unsigned char wchar_t;
-#endif
-
-extern double atof(const char *);
-extern int atoi(const char *);
-extern long int atol(const char *);
-extern double strtod(const char *, char **);
-extern long int strtol(const char *, char **, int);
-extern unsigned long int strtoul(const char *, char **, int);
-extern int rand(void);
-extern void srand(unsigned int);
-extern void *calloc(size_t, size_t);
-extern void free(void *);
-extern void *malloc(size_t);
-extern void *realloc(void *, size_t);
-extern void abort(void);
-extern int atexit(void (*)(void));
-extern void exit(int);
-extern char *getenv(const char *);
-extern int system(const char *);
-extern void *bsearch(const void *, const void *, size_t, size_t, int (*)(const void *, const void *));
-extern void qsort(void *, size_t, size_t, int (*)(const void *, const void *));
-extern int abs(int);
-extern div_t div(int, int);
-extern long int labs(long int);
-extern ldiv_t ldiv(long int, long int);
-extern int mblen(const char *, size_t);
-extern int mbtowc(wchar_t *, const char *, size_t);
-extern int wctomb(char *, wchar_t);
-extern size_t mbstowcs(wchar_t *, const char *, size_t);
-extern size_t wcstombs(char *, const wchar_t *, size_t);
-
-#endif /* __STDLIB */
diff --git a/code/tools/lcc/include/alpha/osf/string.h b/code/tools/lcc/include/alpha/osf/string.h
deleted file mode 100644
index 8432820..0000000
--- a/code/tools/lcc/include/alpha/osf/string.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef __STRING
-#define __STRING
-
-#define NULL 0
-
-#if !defined(_SIZE_T) && !defined(_SIZE_T_)
-#define _SIZE_T
-#define _SIZE_T_
-typedef unsigned long size_t;
-#endif
-
-void *memcpy(void *, const void *, size_t);
-void *memmove(void *, const void *, size_t);
-char *strcpy(char *, const char *);
-char *strncpy(char *, const char *, size_t);
-char *strcat(char *, const char *);
-char *strncat(char *, const char *, size_t);
-int memcmp(const void *, const void *, size_t);
-int strcmp(const char *, const char *);
-int strcoll(const char *, const char *);
-int strncmp(const char *, const char *, size_t);
-size_t strxfrm(char *, const char *, size_t);
-void *memchr(const void *, int, size_t);
-char *strchr(const char *, int);
-size_t strcspn(const char *, const char *);
-char *strpbrk(const char *, const char *);
-char *strrchr(const char *, int);
-size_t strspn(const char *, const char *);
-char *strstr(const char *, const char *);
-char *strtok(char *, const char *);
-void *memset(void *, int, size_t);
-char *strerror(int);
-size_t strlen(const char *);
-
-#endif /* __STRING */
diff --git a/code/tools/lcc/include/alpha/osf/time.h b/code/tools/lcc/include/alpha/osf/time.h
deleted file mode 100644
index a855400..0000000
--- a/code/tools/lcc/include/alpha/osf/time.h
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef __TIME
-#define __TIME
-
-#define CLOCKS_PER_SEC 1000000
-#ifndef NULL
-#define NULL 0
-#endif
-
-#if !defined(_CLOCK_T) && !defined(_CLOCK_T_)
-#define _CLOCK_T
-#define _CLOCK_T_
-typedef long clock_t;
-#endif
-
-#if !defined(_TIME_T) && !defined(_TIME_T_)
-#define _TIME_T
-#define _TIME_T_
-typedef long time_t;
-#endif
-
-#if !defined(_SIZE_T) && !defined(_SIZE_T_)
-#define _SIZE_T
-#define _SIZE_T_
-typedef unsigned long size_t;
-#endif
-
-struct tm {
- int tm_sec;
- int tm_min;
- int tm_hour;
- int tm_mday;
- int tm_mon;
- int tm_year;
- int tm_wday;
- int tm_yday;
- int tm_isdst;
-long __tm_gmtoff;
- char *__tm_zone;
-};
-extern clock_t clock(void);
-extern double difftime(time_t, time_t);
-extern time_t mktime(struct tm *);
-extern time_t time(time_t *);
-extern char *asctime(const struct tm *);
-extern char *ctime(const time_t *);
-extern struct tm *gmtime(const time_t *);
-extern struct tm *localtime(const time_t *);
-extern size_t strftime(char *, size_t, const char *, const struct tm *);
-
-#endif /* __TIME */
diff --git a/code/tools/lcc/include/mips/irix/assert.h b/code/tools/lcc/include/mips/irix/assert.h
deleted file mode 100644
index 04b0e3a..0000000
--- a/code/tools/lcc/include/mips/irix/assert.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef __ASSERT
-#define __ASSERT
-
-void assert(int);
-
-#endif /* __ASSERT */
-
-#undef assert
-#ifdef NDEBUG
-#define assert(ignore) ((void)0)
-#else
-extern int _assert(char *, char *, unsigned);
-#define assert(e) ((void)((e)||_assert(#e, __FILE__, __LINE__)))
-#endif /* NDEBUG */
diff --git a/code/tools/lcc/include/mips/irix/ctype.h b/code/tools/lcc/include/mips/irix/ctype.h
deleted file mode 100644
index 2a43440..0000000
--- a/code/tools/lcc/include/mips/irix/ctype.h
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef __CTYPE
-#define __CTYPE
-
-extern int isalnum(int);
-extern int isalpha(int);
-extern int iscntrl(int);
-extern int isdigit(int);
-extern int isgraph(int);
-extern int islower(int);
-extern int isprint(int);
-extern int ispunct(int);
-extern int isspace(int);
-extern int isupper(int);
-extern int isxdigit(int);
-extern int tolower(int);
-extern int toupper(int);
-
-#define __U 01
-#define __L 02
-#define __N 04
-#define __S 010
-#define __P 020
-#define __C 040
-#define __B 0100
-#define __X 0200
-
-extern unsigned char _ctype[];
-#define isalnum(c) ((_ctype+1)[c]&(__U|__L|__N))
-#define isalpha(c) ((_ctype+1)[c]&(__U|__L))
-#define iscntrl(c) ((_ctype+1)[c]&__C)
-#define isdigit(c) ((_ctype+1)[c]&__N)
-#define isgraph(c) ((_ctype+1)[c]&(__P|__U|__L|__N))
-#define islower(c) ((_ctype+1)[c]&__L)
-#define isprint(c) ((_ctype+1)[c]&(__P|__U|__L|__N|__B))
-#define ispunct(c) ((_ctype+1)[c]&__P)
-#define isspace(c) ((_ctype+1)[c]&__S)
-#define isupper(c) ((_ctype+1)[c]&__U)
-#define isxdigit(c) ((_ctype+1)[c]&__X)
-
-#endif /* __CTYPE */
diff --git a/code/tools/lcc/include/mips/irix/errno.h b/code/tools/lcc/include/mips/irix/errno.h
deleted file mode 100644
index c914e05..0000000
--- a/code/tools/lcc/include/mips/irix/errno.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef __ERRNO
-#define __ERRNO
-
-#define EDOM 33
-#define ERANGE 34
-extern int errno;
-
-#endif /* __ERRNO */
diff --git a/code/tools/lcc/include/mips/irix/float.h b/code/tools/lcc/include/mips/irix/float.h
deleted file mode 100644
index a3e1eb5..0000000
--- a/code/tools/lcc/include/mips/irix/float.h
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef __FLOAT
-#define __FLOAT
-
-#define FLT_ROUNDS 1
-#define FLT_RADIX 2
-
-#define FLT_DIG 6
-#define FLT_EPSILON 1.19209289550781250000e-07
-#define FLT_MANT_DIG 24
-#define FLT_MAX 3.40282346638528860000e+38
-#define FLT_MAX_10_EXP 38
-#define FLT_MAX_EXP 128
-#define FLT_MIN 1.17549435082228750000e-38
-#define FLT_MIN_10_EXP -37
-#define FLT_MIN_EXP -125
-
-#define DBL_DIG 15
-#define DBL_EPSILON 2.22044604925031310000e-16
-#define DBL_MANT_DIG 53
-#define DBL_MAX 1.79769313486231570000e+308
-#define DBL_MAX_10_EXP 308
-#define DBL_MAX_EXP 1024
-#define DBL_MIN 2.22507385850720140000e-308
-#define DBL_MIN_10_EXP -307
-#define DBL_MIN_EXP -1021
-
-#define LDBL_MANT_DIG DBL_MANT_DIG
-#define LDBL_EPSILON DBL_EPSILON
-#define LDBL_DIG DBL_DIG
-#define LDBL_MIN_EXP DBL_MIN_EXP
-#define LDBL_MIN DBL_MIN
-#define LDBL_MIN_10_EXP DBL_MIN_10_EXP
-#define LDBL_MAX_EXP DBL_MAX_EXP
-#define LDBL_MAX DBL_MAX
-#define LDBL_MAX_10_EXP DBL_MAX_10_EXP
-
-#endif /* __FLOAT */
diff --git a/code/tools/lcc/include/mips/irix/limits.h b/code/tools/lcc/include/mips/irix/limits.h
deleted file mode 100644
index 30944a5..0000000
--- a/code/tools/lcc/include/mips/irix/limits.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef __LIMITS
-#define __LIMITS
-
-#define CHAR_BIT 8
-#define MB_LEN_MAX 1
-
-#define UCHAR_MAX 0xff
-#define USHRT_MAX 0xffff
-#define UINT_MAX (~0U)
-#define ULONG_MAX (~0UL)
-
-#define CHAR_MAX SCHAR_MAX
-#define SCHAR_MAX 0x7f
-#define SHRT_MAX 0x7fff
-#define INT_MAX 0x7fffffff
-#define LONG_MAX 0x7fffffffL
-
-#define CHAR_MIN SCHAR_MIN
-#define SCHAR_MIN (-SCHAR_MAX-1)
-#define SHRT_MIN (-SHRT_MAX-1)
-#define INT_MIN (-INT_MAX-1)
-#define LONG_MIN (-LONG_MAX-1)
-
-#endif /* __LIMITS */
diff --git a/code/tools/lcc/include/mips/irix/locale.h b/code/tools/lcc/include/mips/irix/locale.h
deleted file mode 100644
index acce293..0000000
--- a/code/tools/lcc/include/mips/irix/locale.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef __LOCALE
-#define __LOCALE
-
-#define LC_ALL 0
-#define LC_COLLATE 1
-#define LC_CTYPE 2
-#define LC_MONETARY 3
-#define LC_NUMERIC 4
-#define LC_TIME 5
-#define NULL 0
-
-struct lconv {
- char *decimal_point;
- char *thousands_sep;
- char *grouping;
- char *int_curr_symbol;
- char *currency_symbol;
- char *mon_decimal_point;
- char *mon_thousands_sep;
- char *mon_grouping;
- char *positive_sign;
- char *negative_sign;
- char int_frac_digits;
- char frac_digits;
- char p_cs_precedes;
- char p_sep_by_space;
- char n_cs_precedes;
- char n_sep_by_space;
- char p_sign_posn;
- char n_sign_posn;
-};
-
-char *setlocale(int, const char *);
-struct lconv *localeconv(void);
-
-#endif /* __LOCALE */
diff --git a/code/tools/lcc/include/mips/irix/math.h b/code/tools/lcc/include/mips/irix/math.h
deleted file mode 100644
index d2a31f4..0000000
--- a/code/tools/lcc/include/mips/irix/math.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef __MATH
-#define __MATH
-
-#define HUGE_VAL 1.79769313486231570000e+308
-
-extern double acos(double);
-extern double asin(double);
-extern double atan(double);
-extern double atan2(double, double);
-extern double cos(double);
-extern double sin(double);
-extern double tan(double);
-extern double cosh(double);
-extern double sinh(double);
-extern double tanh(double);
-extern double exp(double);
-extern double frexp(double, int *);
-extern double ldexp(double, int);
-extern double log(double);
-extern double log10(double);
-extern double modf(double, double *);
-extern double pow(double, double);
-extern double sqrt(double);
-extern double ceil(double);
-extern double fabs(double);
-extern double floor(double);
-extern double fmod(double, double);
-
-#endif /* __MATH */
diff --git a/code/tools/lcc/include/mips/irix/setjmp.h b/code/tools/lcc/include/mips/irix/setjmp.h
deleted file mode 100644
index 384a1ca..0000000
--- a/code/tools/lcc/include/mips/irix/setjmp.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef __SETJMP
-#define __SETJMP
-
-
-
-typedef int jmp_buf[28];
-int setjmp(jmp_buf);
-void longjmp(jmp_buf, int);
-
-#endif /* __SETJMP */
diff --git a/code/tools/lcc/include/mips/irix/signal.h b/code/tools/lcc/include/mips/irix/signal.h
deleted file mode 100644
index c208a6b..0000000
--- a/code/tools/lcc/include/mips/irix/signal.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef __SIGNAL
-#define __SIGNAL
-
-typedef int sig_atomic_t;
-
-#define SIG_DFL ((void (*)(int))0)
-#define SIG_ERR ((void (*)(int))-1)
-#define SIG_IGN ((void (*)(int))1)
-
-#define SIGABRT 6
-#define SIGFPE 8
-#define SIGILL 4
-#define SIGINT 2
-#define SIGSEGV 11
-#define SIGTERM 15
-
-void (*signal(int, void (*)(int)))(int);
-int raise(int);
-
-#endif /* __SIGNAL */
diff --git a/code/tools/lcc/include/mips/irix/stdarg.h b/code/tools/lcc/include/mips/irix/stdarg.h
deleted file mode 100644
index 594db32..0000000
--- a/code/tools/lcc/include/mips/irix/stdarg.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef __STDARG
-#define __STDARG
-
-#if !defined(_VA_LIST)
-#define _VA_LIST
-typedef char *__va_list;
-#endif
-typedef __va_list va_list;
-
-#define va_start(list, start) ((void)((list) = (sizeof(start)<4 ? \
- (char *)((int *)&(start)+1) : (char *)(&(start)+1))))
-#define __va_arg(list, mode, n) \
- (*(mode *)(&(list += ((sizeof(mode)+n)&~n))[-(int)((sizeof(mode)+n)&~n)]))
-#define _bigendian_va_arg(list, mode, n) (\
- sizeof(mode)==1 ? *(mode *)(&(list += 4)[-1]) : \
- sizeof(mode)==2 ? *(mode *)(&(list += 4)[-2]) : __va_arg(list, mode, n))
-#define _littleendian_va_arg(list, mode, n) __va_arg(list, mode, n)
-#define va_end(list) ((void)0)
-#define va_arg(list, mode) (sizeof(mode)==8 ? \
- *(mode *)(&(list = (char*)(((int)list + 15)&~7U))[-8]) : \
- _bigendian_va_arg(list, mode, 3U))
-#endif
diff --git a/code/tools/lcc/include/mips/irix/stddef.h b/code/tools/lcc/include/mips/irix/stddef.h
deleted file mode 100644
index 4e87e1c..0000000
--- a/code/tools/lcc/include/mips/irix/stddef.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef __STDDEF
-#define __STDDEF
-
-
-#define NULL 0
-#define offsetof(ty,mem) ((size_t)((char*)&((ty*)0)->mem - (char*)0))
-
-typedef long ptrdiff_t;
-
-#if !defined(_SIZE_T) && !defined(_SIZE_T_)
-#define _SIZE_T
-#define _SIZE_T_
-typedef unsigned long size_t;
-#endif
-
-#if !defined(_WCHAR_T) && !defined(_WCHAR_T_)
-#define _WCHAR_T
-#define _WCHAR_T_
-typedef unsigned short wchar_t;
-#endif
-
-#endif /* __STDDEF */
diff --git a/code/tools/lcc/include/mips/irix/stdio.h b/code/tools/lcc/include/mips/irix/stdio.h
deleted file mode 100644
index 2668465..0000000
--- a/code/tools/lcc/include/mips/irix/stdio.h
+++ /dev/null
@@ -1,103 +0,0 @@
-#ifndef __STDIO
-#define __STDIO
-
-#define _IOFBF 0
-#define _IOLBF 0100
-#define _IONBF 04
-#define BUFSIZ 1024
-#define EOF (-1)
-
-extern struct _iobuf {
- int _cnt;
- unsigned char *_ptr;
- unsigned char *_base;
- char _flag;
- char _file;
-} _iob[];
-#define FILE struct _iobuf
-#define FILENAME_MAX 256
-#define FOPEN_MAX 100
-
-#if !defined(_FPOS_T) && !defined(_FPOS_T_)
-#define _FPOS_T
-#define _FPOS_T_
-typedef long fpos_t;
-#endif
-
-#define L_tmpnam 25
-#define NULL 0
-#define SEEK_CUR 1
-#define SEEK_END 2
-#define SEEK_SET 0
-
-#if !defined(_SIZE_T) && !defined(_SIZE_T_)
-#define _SIZE_T
-#define _SIZE_T_
-typedef unsigned long size_t;
-#endif
-
-#if !defined(_VA_LIST)
-#define _VA_LIST
-typedef char *__va_list;
-#endif
-
-#define stderr (&_iob[2])
-#define stdin (&_iob[0])
-#define stdout (&_iob[1])
-#define TMP_MAX 17576
-
-extern int remove(const char *);
-extern int rename(const char *, const char *);
-extern FILE *tmpfile(void);
-extern char *tmpnam(char *);
-extern int fclose(FILE *);
-extern int fflush(FILE *);
-extern FILE *fopen(const char *, const char *);
-extern FILE *freopen(const char *, const char *, FILE *);
-extern void setbuf(FILE *, char *);
-extern int setvbuf(FILE *, char *, int, size_t);
-extern int fprintf(FILE *, const char *, ...);
-extern int fscanf(FILE *, const char *, ...);
-extern int printf(const char *, ...);
-extern int scanf(const char *, ...);
-extern int sprintf(char *, const char *, ...);
-extern int sscanf(const char *, const char *, ...);
-extern int vfprintf(FILE *, const char *, __va_list);
-extern int vprintf(const char *, __va_list);
-extern int vsprintf(char *, const char *, __va_list);
-extern int fgetc(FILE *);
-extern char *fgets(char *, int, FILE *);
-extern int fputc(int, FILE *);
-extern int fputs(const char *, FILE *);
-extern int getc(FILE *);
-extern int getchar(void);
-extern char *gets(char *);
-extern int putc(int, FILE *);
-extern int putchar(int);
-extern int puts(const char *);
-extern int ungetc(int, FILE *);
-extern size_t fread(void *, size_t, size_t, FILE *);
-extern size_t fwrite(const void *, size_t, size_t, FILE *);
-extern int fgetpos(FILE *, fpos_t *);
-extern int fseek(FILE *, long int, int);
-extern int fsetpos(FILE *, const fpos_t *);
-extern long int ftell(FILE *);
-extern void rewind(FILE *);
-extern void clearerr(FILE *);
-extern int feof(FILE *);
-extern int ferror(FILE *);
-extern void perror(const char *);
-
-#define _IOEOF 020
-#define _IOERR 040
-
-#define getc(p) (--(p)->_cnt < 0 ? _filbuf(p) : (int) *(p)->_ptr++)
-#define putc(x, p) (--(p)->_cnt < 0 ? _flsbuf((unsigned char) (x), p) : (int) (*(p)->_ptr++ = (unsigned char) (x)))
-extern int _filbuf(FILE *), _flsbuf(unsigned, FILE *);
-#define feof(p) ((p)->_flag&_IOEOF)
-#define ferror(p) ((p)->_flag&_IOERR)
-#define clearerr(p) ((p)->_flag &= ~(_IOERR|_IOEOF))
-#define getchar() getc(stdin)
-#define putchar(x) putc((x),stdout)
-
-#endif /* __STDIO */
diff --git a/code/tools/lcc/include/mips/irix/stdlib.h b/code/tools/lcc/include/mips/irix/stdlib.h
deleted file mode 100644
index ac1204c..0000000
--- a/code/tools/lcc/include/mips/irix/stdlib.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef __STDLIB
-#define __STDLIB
-
-#define EXIT_FAILURE 1
-#define EXIT_SUCCESS 0
-#define MB_CUR_MAX 1
-#define NULL 0
-#define RAND_MAX 32767
-
-typedef struct { int quot, rem; } div_t;
-typedef struct { long quot, rem; } ldiv_t;
-
-#if !defined(_SIZE_T) && !defined(_SIZE_T_)
-#define _SIZE_T
-#define _SIZE_T_
-typedef unsigned long size_t;
-#endif
-
-#if !defined(_WCHAR_T) && !defined(_WCHAR_T_)
-#define _WCHAR_T
-#define _WCHAR_T_
-typedef unsigned char wchar_t;
-#endif
-
-extern double atof(const char *);
-extern int atoi(const char *);
-extern long int atol(const char *);
-extern double strtod(const char *, char **);
-extern long int strtol(const char *, char **, int);
-extern unsigned long int strtoul(const char *, char **, int);
-extern int rand(void);
-extern void srand(unsigned int);
-extern void *calloc(size_t, size_t);
-extern void free(void *);
-extern void *malloc(size_t);
-extern void *realloc(void *, size_t);
-extern void abort(void);
-extern int atexit(void (*)(void));
-extern void exit(int);
-extern char *getenv(const char *);
-extern int system(const char *);
-extern void *bsearch(const void *, const void *, size_t, size_t, int (*)(const void *, const void *));
-extern void qsort(void *, size_t, size_t, int (*)(const void *, const void *));
-extern int abs(int);
-extern div_t div(int, int);
-extern long int labs(long int);
-extern ldiv_t ldiv(long int, long int);
-extern int mblen(const char *, size_t);
-extern int mbtowc(wchar_t *, const char *, size_t);
-extern int wctomb(char *, wchar_t);
-extern size_t mbstowcs(wchar_t *, const char *, size_t);
-extern size_t wcstombs(char *, const wchar_t *, size_t);
-
-#endif /* __STDLIB */
diff --git a/code/tools/lcc/include/mips/irix/string.h b/code/tools/lcc/include/mips/irix/string.h
deleted file mode 100644
index 8432820..0000000
--- a/code/tools/lcc/include/mips/irix/string.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef __STRING
-#define __STRING
-
-#define NULL 0
-
-#if !defined(_SIZE_T) && !defined(_SIZE_T_)
-#define _SIZE_T
-#define _SIZE_T_
-typedef unsigned long size_t;
-#endif
-
-void *memcpy(void *, const void *, size_t);
-void *memmove(void *, const void *, size_t);
-char *strcpy(char *, const char *);
-char *strncpy(char *, const char *, size_t);
-char *strcat(char *, const char *);
-char *strncat(char *, const char *, size_t);
-int memcmp(const void *, const void *, size_t);
-int strcmp(const char *, const char *);
-int strcoll(const char *, const char *);
-int strncmp(const char *, const char *, size_t);
-size_t strxfrm(char *, const char *, size_t);
-void *memchr(const void *, int, size_t);
-char *strchr(const char *, int);
-size_t strcspn(const char *, const char *);
-char *strpbrk(const char *, const char *);
-char *strrchr(const char *, int);
-size_t strspn(const char *, const char *);
-char *strstr(const char *, const char *);
-char *strtok(char *, const char *);
-void *memset(void *, int, size_t);
-char *strerror(int);
-size_t strlen(const char *);
-
-#endif /* __STRING */
diff --git a/code/tools/lcc/include/mips/irix/time.h b/code/tools/lcc/include/mips/irix/time.h
deleted file mode 100644
index 07d8b41..0000000
--- a/code/tools/lcc/include/mips/irix/time.h
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef __TIME
-#define __TIME
-
-#define CLOCKS_PER_SEC 1000000
-#ifndef NULL
-#define NULL 0
-#endif
-
-#if !defined(_CLOCK_T) && !defined(_CLOCK_T_)
-#define _CLOCK_T
-#define _CLOCK_T_
-typedef long clock_t;
-#endif
-
-#if !defined(_TIME_T) && !defined(_TIME_T_)
-#define _TIME_T
-#define _TIME_T_
-typedef long time_t;
-#endif
-
-#if !defined(_SIZE_T) && !defined(_SIZE_T_)
-#define _SIZE_T
-#define _SIZE_T_
-typedef unsigned long size_t;
-#endif
-
-struct tm {
- int tm_sec;
- int tm_min;
- int tm_hour;
- int tm_mday;
- int tm_mon;
- int tm_year;
- int tm_wday;
- int tm_yday;
- int tm_isdst;
-};
-extern clock_t clock(void);
-extern double difftime(time_t, time_t);
-extern time_t mktime(struct tm *);
-extern time_t time(time_t *);
-extern char *asctime(const struct tm *);
-extern char *ctime(const time_t *);
-extern struct tm *gmtime(const time_t *);
-extern struct tm *localtime(const time_t *);
-extern size_t strftime(char *, size_t, const char *, const struct tm *);
-
-#endif /* __TIME */
diff --git a/code/tools/lcc/include/sparc/solaris/assert.h b/code/tools/lcc/include/sparc/solaris/assert.h
deleted file mode 100644
index ee0b0bf..0000000
--- a/code/tools/lcc/include/sparc/solaris/assert.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef __ASSERT
-#define __ASSERT
-
-void assert(int);
-
-#endif /* __ASSERT */
-
-#undef assert
-#ifdef NDEBUG
-#define assert(ignore) ((void)0)
-#else
-extern void __assert(char *, char *, unsigned);
-#define assert(e) ((void)((e)||(__assert(#e, __FILE__, __LINE__),0)))
-#endif /* NDEBUG */
diff --git a/code/tools/lcc/include/sparc/solaris/ctype.h b/code/tools/lcc/include/sparc/solaris/ctype.h
deleted file mode 100644
index b25b2a4..0000000
--- a/code/tools/lcc/include/sparc/solaris/ctype.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef __CTYPE
-#define __CTYPE
-
-extern int isalnum(int);
-extern int isalpha(int);
-extern int iscntrl(int);
-extern int isdigit(int);
-extern int isgraph(int);
-extern int islower(int);
-extern int isprint(int);
-extern int ispunct(int);
-extern int isspace(int);
-extern int isupper(int);
-extern int isxdigit(int);
-extern int tolower(int);
-extern int toupper(int);
-
-#define __U 01
-#define __L 02
-#define __N 04
-#define __S 010
-#define __P 020
-#define __C 040
-#define _U 01
-#define _L 02
-#define _N 04
-#define _S 010
-#define _P 020
-#define _C 040
-#define _B 0100
-#define _X 0200
-
-extern unsigned char __ctype[];
-#define isalpha(c) ((__ctype + 1)[c] & (_U | _L))
-#define isupper(c) ((__ctype + 1)[c] & _U)
-#define islower(c) ((__ctype + 1)[c] & _L)
-#define isdigit(c) ((__ctype + 1)[c] & _N)
-#define isxdigit(c) ((__ctype + 1)[c] & _X)
-#define isalnum(c) ((__ctype + 1)[c] & (_U | _L | _N))
-#define isspace(c) ((__ctype + 1)[c] & _S)
-#define ispunct(c) ((__ctype + 1)[c] & _P)
-#define isprint(c) ((__ctype + 1)[c] & (_P | _U | _L | _N | _B))
-#define isgraph(c) ((__ctype + 1)[c] & (_P | _U | _L | _N))
-#define iscntrl(c) ((__ctype + 1)[c] & _C)
-
-#endif /* __CTYPE */
diff --git a/code/tools/lcc/include/sparc/solaris/errno.h b/code/tools/lcc/include/sparc/solaris/errno.h
deleted file mode 100644
index c914e05..0000000
--- a/code/tools/lcc/include/sparc/solaris/errno.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef __ERRNO
-#define __ERRNO
-
-#define EDOM 33
-#define ERANGE 34
-extern int errno;
-
-#endif /* __ERRNO */
diff --git a/code/tools/lcc/include/sparc/solaris/float.h b/code/tools/lcc/include/sparc/solaris/float.h
deleted file mode 100644
index a3e1eb5..0000000
--- a/code/tools/lcc/include/sparc/solaris/float.h
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef __FLOAT
-#define __FLOAT
-
-#define FLT_ROUNDS 1
-#define FLT_RADIX 2
-
-#define FLT_DIG 6
-#define FLT_EPSILON 1.19209289550781250000e-07
-#define FLT_MANT_DIG 24
-#define FLT_MAX 3.40282346638528860000e+38
-#define FLT_MAX_10_EXP 38
-#define FLT_MAX_EXP 128
-#define FLT_MIN 1.17549435082228750000e-38
-#define FLT_MIN_10_EXP -37
-#define FLT_MIN_EXP -125
-
-#define DBL_DIG 15
-#define DBL_EPSILON 2.22044604925031310000e-16
-#define DBL_MANT_DIG 53
-#define DBL_MAX 1.79769313486231570000e+308
-#define DBL_MAX_10_EXP 308
-#define DBL_MAX_EXP 1024
-#define DBL_MIN 2.22507385850720140000e-308
-#define DBL_MIN_10_EXP -307
-#define DBL_MIN_EXP -1021
-
-#define LDBL_MANT_DIG DBL_MANT_DIG
-#define LDBL_EPSILON DBL_EPSILON
-#define LDBL_DIG DBL_DIG
-#define LDBL_MIN_EXP DBL_MIN_EXP
-#define LDBL_MIN DBL_MIN
-#define LDBL_MIN_10_EXP DBL_MIN_10_EXP
-#define LDBL_MAX_EXP DBL_MAX_EXP
-#define LDBL_MAX DBL_MAX
-#define LDBL_MAX_10_EXP DBL_MAX_10_EXP
-
-#endif /* __FLOAT */
diff --git a/code/tools/lcc/include/sparc/solaris/limits.h b/code/tools/lcc/include/sparc/solaris/limits.h
deleted file mode 100644
index 30944a5..0000000
--- a/code/tools/lcc/include/sparc/solaris/limits.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef __LIMITS
-#define __LIMITS
-
-#define CHAR_BIT 8
-#define MB_LEN_MAX 1
-
-#define UCHAR_MAX 0xff
-#define USHRT_MAX 0xffff
-#define UINT_MAX (~0U)
-#define ULONG_MAX (~0UL)
-
-#define CHAR_MAX SCHAR_MAX
-#define SCHAR_MAX 0x7f
-#define SHRT_MAX 0x7fff
-#define INT_MAX 0x7fffffff
-#define LONG_MAX 0x7fffffffL
-
-#define CHAR_MIN SCHAR_MIN
-#define SCHAR_MIN (-SCHAR_MAX-1)
-#define SHRT_MIN (-SHRT_MAX-1)
-#define INT_MIN (-INT_MAX-1)
-#define LONG_MIN (-LONG_MAX-1)
-
-#endif /* __LIMITS */
diff --git a/code/tools/lcc/include/sparc/solaris/locale.h b/code/tools/lcc/include/sparc/solaris/locale.h
deleted file mode 100644
index acce293..0000000
--- a/code/tools/lcc/include/sparc/solaris/locale.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef __LOCALE
-#define __LOCALE
-
-#define LC_ALL 0
-#define LC_COLLATE 1
-#define LC_CTYPE 2
-#define LC_MONETARY 3
-#define LC_NUMERIC 4
-#define LC_TIME 5
-#define NULL 0
-
-struct lconv {
- char *decimal_point;
- char *thousands_sep;
- char *grouping;
- char *int_curr_symbol;
- char *currency_symbol;
- char *mon_decimal_point;
- char *mon_thousands_sep;
- char *mon_grouping;
- char *positive_sign;
- char *negative_sign;
- char int_frac_digits;
- char frac_digits;
- char p_cs_precedes;
- char p_sep_by_space;
- char n_cs_precedes;
- char n_sep_by_space;
- char p_sign_posn;
- char n_sign_posn;
-};
-
-char *setlocale(int, const char *);
-struct lconv *localeconv(void);
-
-#endif /* __LOCALE */
diff --git a/code/tools/lcc/include/sparc/solaris/math.h b/code/tools/lcc/include/sparc/solaris/math.h
deleted file mode 100644
index 93b8bdc..0000000
--- a/code/tools/lcc/include/sparc/solaris/math.h
+++ /dev/null
@@ -1,30 +0,0 @@
-#ifndef __MATH
-#define __MATH
-
-extern double infinity(void);
-#define HUGE_VAL (infinity())
-
-extern double acos(double);
-extern double asin(double);
-extern double atan(double);
-extern double atan2(double, double);
-extern double cos(double);
-extern double sin(double);
-extern double tan(double);
-extern double cosh(double);
-extern double sinh(double);
-extern double tanh(double);
-extern double exp(double);
-extern double frexp(double, int *);
-extern double ldexp(double, int);
-extern double log(double);
-extern double log10(double);
-extern double modf(double, double *);
-extern double pow(double, double);
-extern double sqrt(double);
-extern double ceil(double);
-extern double fabs(double);
-extern double floor(double);
-extern double fmod(double, double);
-
-#endif /* __MATH */
diff --git a/code/tools/lcc/include/sparc/solaris/setjmp.h b/code/tools/lcc/include/sparc/solaris/setjmp.h
deleted file mode 100644
index c5a063b..0000000
--- a/code/tools/lcc/include/sparc/solaris/setjmp.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef __SETJMP
-#define __SETJMP
-
-
-
-typedef int jmp_buf[12];
-int setjmp(jmp_buf);
-void longjmp(jmp_buf, int);
-
-#endif /* __SETJMP */
diff --git a/code/tools/lcc/include/sparc/solaris/signal.h b/code/tools/lcc/include/sparc/solaris/signal.h
deleted file mode 100644
index c208a6b..0000000
--- a/code/tools/lcc/include/sparc/solaris/signal.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef __SIGNAL
-#define __SIGNAL
-
-typedef int sig_atomic_t;
-
-#define SIG_DFL ((void (*)(int))0)
-#define SIG_ERR ((void (*)(int))-1)
-#define SIG_IGN ((void (*)(int))1)
-
-#define SIGABRT 6
-#define SIGFPE 8
-#define SIGILL 4
-#define SIGINT 2
-#define SIGSEGV 11
-#define SIGTERM 15
-
-void (*signal(int, void (*)(int)))(int);
-int raise(int);
-
-#endif /* __SIGNAL */
diff --git a/code/tools/lcc/include/sparc/solaris/stdarg.h b/code/tools/lcc/include/sparc/solaris/stdarg.h
deleted file mode 100644
index 5a99f45..0000000
--- a/code/tools/lcc/include/sparc/solaris/stdarg.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef __STDARG
-#define __STDARG
-
-#if !defined(_VA_LIST)
-#define _VA_LIST
-typedef char *__va_list;
-#endif
-typedef __va_list va_list;
-
-#define va_start(list, start) ((void)((list) = (sizeof(start)<4 ? \
- (char *)((int *)&(start)+1) : (char *)(&(start)+1))))
-#define __va_arg(list, mode, n) \
- (*(mode *)(&(list += ((sizeof(mode)+n)&~n))[-(int)((sizeof(mode)+n)&~n)]))
-#define _bigendian_va_arg(list, mode, n) (\
- sizeof(mode)==1 ? *(mode *)(&(list += 4)[-1]) : \
- sizeof(mode)==2 ? *(mode *)(&(list += 4)[-2]) : __va_arg(list, mode, n))
-#define _littleendian_va_arg(list, mode, n) __va_arg(list, mode, n)
-#define va_end(list) ((void)0)
-#define va_arg(list, mode) (sizeof(mode)>8 ? \
- **(mode **)(&(list += 4)[-4]) : \
- _bigendian_va_arg(list, mode, 3U))
-#endif
diff --git a/code/tools/lcc/include/sparc/solaris/stddef.h b/code/tools/lcc/include/sparc/solaris/stddef.h
deleted file mode 100644
index 4e87e1c..0000000
--- a/code/tools/lcc/include/sparc/solaris/stddef.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef __STDDEF
-#define __STDDEF
-
-
-#define NULL 0
-#define offsetof(ty,mem) ((size_t)((char*)&((ty*)0)->mem - (char*)0))
-
-typedef long ptrdiff_t;
-
-#if !defined(_SIZE_T) && !defined(_SIZE_T_)
-#define _SIZE_T
-#define _SIZE_T_
-typedef unsigned long size_t;
-#endif
-
-#if !defined(_WCHAR_T) && !defined(_WCHAR_T_)
-#define _WCHAR_T
-#define _WCHAR_T_
-typedef unsigned short wchar_t;
-#endif
-
-#endif /* __STDDEF */
diff --git a/code/tools/lcc/include/sparc/solaris/stdio.h b/code/tools/lcc/include/sparc/solaris/stdio.h
deleted file mode 100644
index b0e3232..0000000
--- a/code/tools/lcc/include/sparc/solaris/stdio.h
+++ /dev/null
@@ -1,104 +0,0 @@
-#ifndef __STDIO
-#define __STDIO
-
-#define _IOFBF 0
-#define _IOLBF 0100
-#define _IONBF 04
-#define BUFSIZ 1024
-#define EOF (-1)
-
-typedef struct {
- int _cnt;
- unsigned char *_ptr;
- unsigned char *_base;
- unsigned char _flag;
- unsigned char _file;
-} FILE;
-extern FILE __iob[];
-#define FILENAME_MAX 1024
-#define FOPEN_MAX 20
-
-#if !defined(_FPOS_T) && !defined(_FPOS_T_)
-#define _FPOS_T
-#define _FPOS_T_
-typedef long fpos_t;
-#endif
-
-#define L_tmpnam 25
-#define NULL 0
-#define SEEK_CUR 1
-#define SEEK_END 2
-#define SEEK_SET 0
-
-#if !defined(_SIZE_T) && !defined(_SIZE_T_)
-#define _SIZE_T
-#define _SIZE_T_
-typedef unsigned long size_t;
-#endif
-
-#if !defined(_VA_LIST)
-#define _VA_LIST
-typedef char *__va_list;
-#endif
-
-#define stderr (&__iob[2])
-#define stdin (&__iob[0])
-#define stdout (&__iob[1])
-#define TMP_MAX 17576
-
-extern int remove(const char *);
-extern int rename(const char *, const char *);
-extern FILE *tmpfile(void);
-extern char *tmpnam(char *);
-extern int fclose(FILE *);
-extern int fflush(FILE *);
-extern FILE *fopen(const char *, const char *);
-extern FILE *freopen(const char *, const char *, FILE *);
-extern void setbuf(FILE *, char *);
-extern int setvbuf(FILE *, char *, int, size_t);
-extern int fprintf(FILE *, const char *, ...);
-extern int fscanf(FILE *, const char *, ...);
-extern int printf(const char *, ...);
-extern int scanf(const char *, ...);
-extern int sprintf(char *, const char *, ...);
-extern int sscanf(const char *, const char *, ...);
-extern int vfprintf(FILE *, const char *, __va_list);
-extern int vprintf(const char *, __va_list);
-extern int vsprintf(char *, const char *, __va_list);
-extern int fgetc(FILE *);
-extern char *fgets(char *, int, FILE *);
-extern int fputc(int, FILE *);
-extern int fputs(const char *, FILE *);
-extern int getc(FILE *);
-extern int getchar(void);
-extern char *gets(char *);
-extern int putc(int, FILE *);
-extern int putchar(int);
-extern int puts(const char *);
-extern int ungetc(int, FILE *);
-extern size_t fread(void *, size_t, size_t, FILE *);
-extern size_t fwrite(const void *, size_t, size_t, FILE *);
-extern int fgetpos(FILE *, fpos_t *);
-extern int fseek(FILE *, long int, int);
-extern int fsetpos(FILE *, const fpos_t *);
-extern long int ftell(FILE *);
-extern void rewind(FILE *);
-extern void clearerr(FILE *);
-extern int feof(FILE *);
-extern int ferror(FILE *);
-extern void perror(const char *);
-
-#define _IOEOF 020
-#define _IOERR 040
-
-#define getc(p) (--(p)->_cnt < 0 ? __filbuf(p) : (int)*(p)->_ptr++)
-#define putc(x, p) (--(p)->_cnt < 0 ? __flsbuf((unsigned char) (x), (p)) \
- : (int)(*(p)->_ptr++ = (x)))
-extern int __filbuf(FILE *), __flsbuf(unsigned, FILE *);
-#define feof(p) ((p)->_flag&_IOEOF)
-#define ferror(p) ((p)->_flag&_IOERR)
-#define clearerr(p) ((p)->_flag &= ~(_IOERR|_IOEOF))
-#define getchar() getc(stdin)
-#define putchar(x) putc((x),stdout)
-
-#endif /* __STDIO */
diff --git a/code/tools/lcc/include/sparc/solaris/stdlib.h b/code/tools/lcc/include/sparc/solaris/stdlib.h
deleted file mode 100644
index ac1204c..0000000
--- a/code/tools/lcc/include/sparc/solaris/stdlib.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef __STDLIB
-#define __STDLIB
-
-#define EXIT_FAILURE 1
-#define EXIT_SUCCESS 0
-#define MB_CUR_MAX 1
-#define NULL 0
-#define RAND_MAX 32767
-
-typedef struct { int quot, rem; } div_t;
-typedef struct { long quot, rem; } ldiv_t;
-
-#if !defined(_SIZE_T) && !defined(_SIZE_T_)
-#define _SIZE_T
-#define _SIZE_T_
-typedef unsigned long size_t;
-#endif
-
-#if !defined(_WCHAR_T) && !defined(_WCHAR_T_)
-#define _WCHAR_T
-#define _WCHAR_T_
-typedef unsigned char wchar_t;
-#endif
-
-extern double atof(const char *);
-extern int atoi(const char *);
-extern long int atol(const char *);
-extern double strtod(const char *, char **);
-extern long int strtol(const char *, char **, int);
-extern unsigned long int strtoul(const char *, char **, int);
-extern int rand(void);
-extern void srand(unsigned int);
-extern void *calloc(size_t, size_t);
-extern void free(void *);
-extern void *malloc(size_t);
-extern void *realloc(void *, size_t);
-extern void abort(void);
-extern int atexit(void (*)(void));
-extern void exit(int);
-extern char *getenv(const char *);
-extern int system(const char *);
-extern void *bsearch(const void *, const void *, size_t, size_t, int (*)(const void *, const void *));
-extern void qsort(void *, size_t, size_t, int (*)(const void *, const void *));
-extern int abs(int);
-extern div_t div(int, int);
-extern long int labs(long int);
-extern ldiv_t ldiv(long int, long int);
-extern int mblen(const char *, size_t);
-extern int mbtowc(wchar_t *, const char *, size_t);
-extern int wctomb(char *, wchar_t);
-extern size_t mbstowcs(wchar_t *, const char *, size_t);
-extern size_t wcstombs(char *, const wchar_t *, size_t);
-
-#endif /* __STDLIB */
diff --git a/code/tools/lcc/include/sparc/solaris/string.h b/code/tools/lcc/include/sparc/solaris/string.h
deleted file mode 100644
index 8432820..0000000
--- a/code/tools/lcc/include/sparc/solaris/string.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef __STRING
-#define __STRING
-
-#define NULL 0
-
-#if !defined(_SIZE_T) && !defined(_SIZE_T_)
-#define _SIZE_T
-#define _SIZE_T_
-typedef unsigned long size_t;
-#endif
-
-void *memcpy(void *, const void *, size_t);
-void *memmove(void *, const void *, size_t);
-char *strcpy(char *, const char *);
-char *strncpy(char *, const char *, size_t);
-char *strcat(char *, const char *);
-char *strncat(char *, const char *, size_t);
-int memcmp(const void *, const void *, size_t);
-int strcmp(const char *, const char *);
-int strcoll(const char *, const char *);
-int strncmp(const char *, const char *, size_t);
-size_t strxfrm(char *, const char *, size_t);
-void *memchr(const void *, int, size_t);
-char *strchr(const char *, int);
-size_t strcspn(const char *, const char *);
-char *strpbrk(const char *, const char *);
-char *strrchr(const char *, int);
-size_t strspn(const char *, const char *);
-char *strstr(const char *, const char *);
-char *strtok(char *, const char *);
-void *memset(void *, int, size_t);
-char *strerror(int);
-size_t strlen(const char *);
-
-#endif /* __STRING */
diff --git a/code/tools/lcc/include/sparc/solaris/time.h b/code/tools/lcc/include/sparc/solaris/time.h
deleted file mode 100644
index 07d8b41..0000000
--- a/code/tools/lcc/include/sparc/solaris/time.h
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef __TIME
-#define __TIME
-
-#define CLOCKS_PER_SEC 1000000
-#ifndef NULL
-#define NULL 0
-#endif
-
-#if !defined(_CLOCK_T) && !defined(_CLOCK_T_)
-#define _CLOCK_T
-#define _CLOCK_T_
-typedef long clock_t;
-#endif
-
-#if !defined(_TIME_T) && !defined(_TIME_T_)
-#define _TIME_T
-#define _TIME_T_
-typedef long time_t;
-#endif
-
-#if !defined(_SIZE_T) && !defined(_SIZE_T_)
-#define _SIZE_T
-#define _SIZE_T_
-typedef unsigned long size_t;
-#endif
-
-struct tm {
- int tm_sec;
- int tm_min;
- int tm_hour;
- int tm_mday;
- int tm_mon;
- int tm_year;
- int tm_wday;
- int tm_yday;
- int tm_isdst;
-};
-extern clock_t clock(void);
-extern double difftime(time_t, time_t);
-extern time_t mktime(struct tm *);
-extern time_t time(time_t *);
-extern char *asctime(const struct tm *);
-extern char *ctime(const time_t *);
-extern struct tm *gmtime(const time_t *);
-extern struct tm *localtime(const time_t *);
-extern size_t strftime(char *, size_t, const char *, const struct tm *);
-
-#endif /* __TIME */
diff --git a/code/tools/lcc/include/x86/linux/assert.h b/code/tools/lcc/include/x86/linux/assert.h
deleted file mode 100644
index 04b0e3a..0000000
--- a/code/tools/lcc/include/x86/linux/assert.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef __ASSERT
-#define __ASSERT
-
-void assert(int);
-
-#endif /* __ASSERT */
-
-#undef assert
-#ifdef NDEBUG
-#define assert(ignore) ((void)0)
-#else
-extern int _assert(char *, char *, unsigned);
-#define assert(e) ((void)((e)||_assert(#e, __FILE__, __LINE__)))
-#endif /* NDEBUG */
diff --git a/code/tools/lcc/include/x86/linux/float.h b/code/tools/lcc/include/x86/linux/float.h
deleted file mode 100644
index fde462b..0000000
--- a/code/tools/lcc/include/x86/linux/float.h
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef __FLOAT
-#define __FLOAT
-
-#define FLT_ROUNDS (__flt_rounds())
-#define FLT_RADIX 2
-
-#define FLT_DIG 6
-#define FLT_EPSILON 1.19209289550781250000e-07
-#define FLT_MANT_DIG 24
-#define FLT_MAX 3.40282346638528860000e+38
-#define FLT_MAX_10_EXP 38
-#define FLT_MAX_EXP 128
-#define FLT_MIN 1.17549435082228750000e-38
-#define FLT_MIN_10_EXP -37
-#define FLT_MIN_EXP -125
-
-#define DBL_DIG 15
-#define DBL_EPSILON 2.22044604925031310000e-16
-#define DBL_MANT_DIG 53
-#define DBL_MAX 1.79769313486231570000e+308
-#define DBL_MAX_10_EXP 308
-#define DBL_MAX_EXP 1024
-#define DBL_MIN 2.22507385850720140000e-308
-#define DBL_MIN_10_EXP -307
-#define DBL_MIN_EXP -1021
-
-#define LDBL_MANT_DIG DBL_MANT_DIG
-#define LDBL_EPSILON DBL_EPSILON
-#define LDBL_DIG DBL_DIG
-#define LDBL_MIN_EXP DBL_MIN_EXP
-#define LDBL_MIN DBL_MIN
-#define LDBL_MIN_10_EXP DBL_MIN_10_EXP
-#define LDBL_MAX_EXP DBL_MAX_EXP
-#define LDBL_MAX DBL_MAX
-#define LDBL_MAX_10_EXP DBL_MAX_10_EXP
-
-#endif /* __FLOAT */
diff --git a/code/tools/lcc/include/x86/linux/stdarg.h b/code/tools/lcc/include/x86/linux/stdarg.h
deleted file mode 100644
index a68f1a9..0000000
--- a/code/tools/lcc/include/x86/linux/stdarg.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef __STDARG
-#define __STDARG
-
-#if !defined(_VA_LIST)
-#define _VA_LIST
-typedef char *__va_list;
-#endif
-typedef __va_list va_list;
-
-#define va_start(list, start) ((void)((list) = (sizeof(start)<4 ? \
- (char *)((int *)&(start)+1) : (char *)(&(start)+1))))
-#define __va_arg(list, mode, n) \
- (*(mode *)(&(list += ((sizeof(mode)+n)&~n))[-(int)((sizeof(mode)+n)&~n)]))
-#define _bigendian_va_arg(list, mode, n) (\
- sizeof(mode)==1 ? *(mode *)(&(list += 4)[-1]) : \
- sizeof(mode)==2 ? *(mode *)(&(list += 4)[-2]) : __va_arg(list, mode, n))
-#define _littleendian_va_arg(list, mode, n) __va_arg(list, mode, n)
-#define va_end(list) ((void)0)
-#define va_arg(list, mode) _littleendian_va_arg(list, mode, 3U)
-typedef void *__gnuc_va_list;
-#endif
diff --git a/code/tools/lcc/makefile b/code/tools/lcc/makefile
index 08aa1d4..eb2d0f0 100644
--- a/code/tools/lcc/makefile
+++ b/code/tools/lcc/makefile
@@ -120,10 +120,8 @@ $(BD)dagcheck.c: $(BD)lburg$(E) src/dagcheck.md; $(BD)lburg src/dagcheck.md $@
$(BD)q3rcc.h: src/rcc.asdl; $(ASDL_HOME)/bin/asdlGen --c -d $(BD) src/rcc.asdl
$(BD)q3rcc$(O): $(BD)rcc.h; $(CC) $(LCC_CFLAGS) -c -Isrc -I$(BD) -I$(ASDL_HOME)/include/asdlGen -o $@ $(BD)rcc.c
$(BD)asdl$(O): src/asdl.c $(BD)rcc.h src/c.h; $(CC) $(LCC_CFLAGS) -c -Isrc -I$(BD) -I$(ASDL_HOME)/include/asdlGen -o $@ src/asdl.c
-$(BD)pass2$(O): src/pass2.c $(BD)rcc.h src/c.h; $(CC) $(LCC_CFLAGS) -c -Isrc -I$(BD) -I$(ASDL_HOME)/include/asdlGen -o $@ src/pass2.c
$(BD)2html$(O): src/2html.c $(BD)rcc.h src/c.h; $(CC) $(LCC_CFLAGS) -c -Isrc -I$(BD) -I$(ASDL_HOME)/include/asdlGen -o $@ src/2html.c
-$(BD)pass2$(E): $(BD)pass2$(O) $(EXTRAOBJS) $(BD)librcc$(A); $(LD) $(LDFLAGS) -o $@ $(BD)pass2$(O) $(EXTRAOBJS) $(BD)librcc$(A) $(EXTRALIBS)
$(BD)2html$(E): $(BD)2html$(O) $(BD)q3rcc$(O); $(LD) $(LDFLAGS) -o $@ $(BD)2html$(O) $(BD)q3rcc$(O) $(EXTRALIBS)
$(BD)bprint$(E): $(BD)bprint$(O); $(LD) $(LDFLAGS) -o $@ $(BD)bprint$(O)
@@ -188,7 +186,7 @@ clean::
$(RM) -r $(BD)
clobber:: clean
- $(RM) $(BD)q3rcc$(E) $(BD)2html$(E) $(BD)pass2$(E) $(BD)lburg$(E) $(BD)q3cpp$(E) $(BD)q3lcc$(E) $(BD)bprint$(E) $(BD)*$(A)
+ $(RM) $(BD)q3rcc$(E) $(BD)2html$(E) $(BD)lburg$(E) $(BD)q3cpp$(E) $(BD)q3lcc$(E) $(BD)bprint$(E) $(BD)*$(A)
$(RM) $(BD)*.pdb $(BD)*.pch
RCCSRCS=src/alloc.c \
@@ -220,12 +218,7 @@ RCCSRCS=src/alloc.c \
src/bytecode.c \
src/gen.c \
src/stab.c \
- $(BD)dagcheck.c \
- $(BD)alpha.c \
- $(BD)mips.c \
- $(BD)sparc.c \
- $(BD)x86linux.c \
- $(BD)x86.c
+ $(BD)dagcheck.c
C=$(BD)q3lcc -A -d0.6 -Wo-lccdir=$(BUILDDIR) -Isrc -I$(BUILDDIR)
triple: $(BD)q3rcc$(E) $(BD)q3lcc$(E) $(BD)q3cpp$(E)
diff --git a/code/tools/lcc/packing.lst b/code/tools/lcc/packing.lst
deleted file mode 100644
index 416f602..0000000
--- a/code/tools/lcc/packing.lst
+++ /dev/null
@@ -1,432 +0,0 @@
-README
-CPYRIGHT
-LOG
-makefile
-makefile.nt
-src/2html.c
-src/alloc.c
-src/asdl.c
-src/bind.c
-src/bytecode.c
-src/c.h
-src/config.h
-src/dag.c
-src/decl.c
-src/enode.c
-src/error.c
-src/event.c
-src/expr.c
-src/gen.c
-src/init.c
-src/inits.c
-src/input.c
-src/lex.c
-src/list.c
-src/main.c
-src/null.c
-src/output.c
-src/pass2.c
-src/prof.c
-src/profio.c
-src/simp.c
-src/stab.c
-src/stab.h
-src/stmt.c
-src/string.c
-src/sym.c
-src/symbolic.c
-src/token.h
-src/trace.c
-src/tree.c
-src/types.c
-src/alpha.md
-src/dagcheck.md
-src/mips.md
-src/sparc.md
-src/x86.md
-src/x86linux.md
-src/run.sh
-src/rcc.asdl
-lib/assert.c
-lib/bbexit.c
-lib/yynull.c
-tst/8q.0
-tst/8q.c
-tst/array.0
-tst/array.c
-tst/cf.0
-tst/cf.c
-tst/cq.0
-tst/cq.c
-tst/cvt.0
-tst/cvt.c
-tst/fields.0
-tst/fields.c
-tst/front.0
-tst/front.c
-tst/incr.0
-tst/incr.c
-tst/init.0
-tst/init.c
-tst/limits.0
-tst/limits.c
-tst/paranoia.0
-tst/paranoia.c
-tst/sort.0
-tst/sort.c
-tst/spill.0
-tst/spill.c
-tst/stdarg.0
-tst/stdarg.c
-tst/struct.0
-tst/struct.c
-tst/switch.0
-tst/switch.c
-tst/wf1.0
-tst/wf1.c
-tst/yacc.0
-tst/yacc.c
-etc/bprint.c
-etc/gcc-solaris.c
-etc/irix.c
-etc/lcc.c
-etc/linux.c
-etc/ops.c
-etc/osf.c
-etc/solaris.c
-etc/win32.c
-cpp/cpp.c
-cpp/cpp.h
-cpp/eval.c
-cpp/getopt.c
-cpp/hideset.c
-cpp/include.c
-cpp/lex.c
-cpp/macro.c
-cpp/nlist.c
-cpp/tokens.c
-cpp/unix.c
-lburg/gram.c
-lburg/gram.y
-lburg/lburg.1
-lburg/lburg.c
-lburg/lburg.h
-include/alpha/osf/assert.h
-include/alpha/osf/ctype.h
-include/alpha/osf/errno.h
-include/alpha/osf/float.h
-include/alpha/osf/limits.h
-include/alpha/osf/locale.h
-include/alpha/osf/math.h
-include/alpha/osf/setjmp.h
-include/alpha/osf/signal.h
-include/alpha/osf/stdarg.h
-include/alpha/osf/stddef.h
-include/alpha/osf/stdio.h
-include/alpha/osf/stdlib.h
-include/alpha/osf/string.h
-include/alpha/osf/time.h
-include/sparc/solaris/assert.h
-include/sparc/solaris/ctype.h
-include/sparc/solaris/errno.h
-include/sparc/solaris/float.h
-include/sparc/solaris/limits.h
-include/sparc/solaris/locale.h
-include/sparc/solaris/math.h
-include/sparc/solaris/setjmp.h
-include/sparc/solaris/signal.h
-include/sparc/solaris/stdarg.h
-include/sparc/solaris/stddef.h
-include/sparc/solaris/stdio.h
-include/sparc/solaris/stdlib.h
-include/sparc/solaris/string.h
-include/sparc/solaris/time.h
-include/mips/irix/assert.h
-include/mips/irix/ctype.h
-include/mips/irix/errno.h
-include/mips/irix/float.h
-include/mips/irix/limits.h
-include/mips/irix/locale.h
-include/mips/irix/math.h
-include/mips/irix/setjmp.h
-include/mips/irix/signal.h
-include/mips/irix/stdarg.h
-include/mips/irix/stddef.h
-include/mips/irix/stdio.h
-include/mips/irix/stdlib.h
-include/mips/irix/string.h
-include/mips/irix/time.h
-include/x86/linux/assert.h
-include/x86/linux/float.h
-include/x86/linux/stdarg.h
-doc/4.html
-doc/install.html
-doc/bprint.1
-doc/lcc.1
-doc/bprint.pdf
-doc/lcc.pdf
-alpha/osf/tst/8q.1bk
-alpha/osf/tst/8q.2bk
-alpha/osf/tst/8q.sbk
-alpha/osf/tst/array.1bk
-alpha/osf/tst/array.2bk
-alpha/osf/tst/array.sbk
-alpha/osf/tst/cf.1bk
-alpha/osf/tst/cf.2bk
-alpha/osf/tst/cf.sbk
-alpha/osf/tst/cq.1bk
-alpha/osf/tst/cq.2bk
-alpha/osf/tst/cq.sbk
-alpha/osf/tst/cvt.1bk
-alpha/osf/tst/cvt.2bk
-alpha/osf/tst/cvt.sbk
-alpha/osf/tst/fields.1bk
-alpha/osf/tst/fields.2bk
-alpha/osf/tst/fields.sbk
-alpha/osf/tst/front.2bk
-alpha/osf/tst/front.sbk
-alpha/osf/tst/incr.1bk
-alpha/osf/tst/incr.2bk
-alpha/osf/tst/incr.sbk
-alpha/osf/tst/init.1bk
-alpha/osf/tst/init.2bk
-alpha/osf/tst/init.sbk
-alpha/osf/tst/limits.1bk
-alpha/osf/tst/limits.2bk
-alpha/osf/tst/limits.sbk
-alpha/osf/tst/paranoia.1bk
-alpha/osf/tst/paranoia.2bk
-alpha/osf/tst/paranoia.sbk
-alpha/osf/tst/sort.1bk
-alpha/osf/tst/sort.2bk
-alpha/osf/tst/sort.sbk
-alpha/osf/tst/spill.1bk
-alpha/osf/tst/spill.2bk
-alpha/osf/tst/spill.sbk
-alpha/osf/tst/stdarg.1bk
-alpha/osf/tst/stdarg.2bk
-alpha/osf/tst/stdarg.sbk
-alpha/osf/tst/struct.1bk
-alpha/osf/tst/struct.2bk
-alpha/osf/tst/struct.sbk
-alpha/osf/tst/switch.1bk
-alpha/osf/tst/switch.2bk
-alpha/osf/tst/switch.sbk
-alpha/osf/tst/wf1.1bk
-alpha/osf/tst/wf1.2bk
-alpha/osf/tst/wf1.sbk
-alpha/osf/tst/yacc.1bk
-alpha/osf/tst/yacc.2bk
-alpha/osf/tst/yacc.sbk
-sparc/solaris/tst/8q.1bk
-sparc/solaris/tst/8q.2bk
-sparc/solaris/tst/8q.sbk
-sparc/solaris/tst/array.1bk
-sparc/solaris/tst/array.2bk
-sparc/solaris/tst/array.sbk
-sparc/solaris/tst/cf.1bk
-sparc/solaris/tst/cf.2bk
-sparc/solaris/tst/cf.sbk
-sparc/solaris/tst/cq.1bk
-sparc/solaris/tst/cq.2bk
-sparc/solaris/tst/cq.sbk
-sparc/solaris/tst/cvt.1bk
-sparc/solaris/tst/cvt.2bk
-sparc/solaris/tst/cvt.sbk
-sparc/solaris/tst/fields.1bk
-sparc/solaris/tst/fields.2bk
-sparc/solaris/tst/fields.sbk
-sparc/solaris/tst/front.2bk
-sparc/solaris/tst/front.sbk
-sparc/solaris/tst/incr.1bk
-sparc/solaris/tst/incr.2bk
-sparc/solaris/tst/incr.sbk
-sparc/solaris/tst/init.1bk
-sparc/solaris/tst/init.2bk
-sparc/solaris/tst/init.sbk
-sparc/solaris/tst/limits.1bk
-sparc/solaris/tst/limits.2bk
-sparc/solaris/tst/limits.sbk
-sparc/solaris/tst/paranoia.1bk
-sparc/solaris/tst/paranoia.2bk
-sparc/solaris/tst/paranoia.sbk
-sparc/solaris/tst/sort.1bk
-sparc/solaris/tst/sort.2bk
-sparc/solaris/tst/sort.sbk
-sparc/solaris/tst/spill.1bk
-sparc/solaris/tst/spill.2bk
-sparc/solaris/tst/spill.sbk
-sparc/solaris/tst/stdarg.1bk
-sparc/solaris/tst/stdarg.2bk
-sparc/solaris/tst/stdarg.sbk
-sparc/solaris/tst/struct.1bk
-sparc/solaris/tst/struct.2bk
-sparc/solaris/tst/struct.sbk
-sparc/solaris/tst/switch.1bk
-sparc/solaris/tst/switch.2bk
-sparc/solaris/tst/switch.sbk
-sparc/solaris/tst/wf1.1bk
-sparc/solaris/tst/wf1.2bk
-sparc/solaris/tst/wf1.sbk
-sparc/solaris/tst/yacc.1bk
-sparc/solaris/tst/yacc.2bk
-sparc/solaris/tst/yacc.sbk
-mips/irix/tst/8q.1bk
-mips/irix/tst/8q.2bk
-mips/irix/tst/8q.sbk
-mips/irix/tst/array.1bk
-mips/irix/tst/array.2bk
-mips/irix/tst/array.sbk
-mips/irix/tst/cf.1bk
-mips/irix/tst/cf.2bk
-mips/irix/tst/cf.sbk
-mips/irix/tst/cq.1bk
-mips/irix/tst/cq.2bk
-mips/irix/tst/cq.sbk
-mips/irix/tst/cvt.1bk
-mips/irix/tst/cvt.2bk
-mips/irix/tst/cvt.sbk
-mips/irix/tst/fields.1bk
-mips/irix/tst/fields.2bk
-mips/irix/tst/fields.sbk
-mips/irix/tst/front.2bk
-mips/irix/tst/front.sbk
-mips/irix/tst/incr.2bk
-mips/irix/tst/incr.sbk
-mips/irix/tst/init.1bk
-mips/irix/tst/init.2bk
-mips/irix/tst/init.sbk
-mips/irix/tst/limits.1bk
-mips/irix/tst/limits.2bk
-mips/irix/tst/limits.sbk
-mips/irix/tst/paranoia.1bk
-mips/irix/tst/paranoia.2bk
-mips/irix/tst/paranoia.sbk
-mips/irix/tst/sort.1bk
-mips/irix/tst/sort.2bk
-mips/irix/tst/sort.sbk
-mips/irix/tst/spill.2bk
-mips/irix/tst/spill.sbk
-mips/irix/tst/stdarg.1bk
-mips/irix/tst/stdarg.2bk
-mips/irix/tst/stdarg.sbk
-mips/irix/tst/struct.1bk
-mips/irix/tst/struct.2bk
-mips/irix/tst/struct.sbk
-mips/irix/tst/switch.1bk
-mips/irix/tst/switch.2bk
-mips/irix/tst/switch.sbk
-mips/irix/tst/wf1.1bk
-mips/irix/tst/wf1.2bk
-mips/irix/tst/wf1.sbk
-mips/irix/tst/yacc.1bk
-mips/irix/tst/yacc.2bk
-mips/irix/tst/yacc.sbk
-x86/linux/tst/8q.1bk
-x86/linux/tst/8q.2bk
-x86/linux/tst/8q.sbk
-x86/linux/tst/array.1bk
-x86/linux/tst/array.2bk
-x86/linux/tst/array.sbk
-x86/linux/tst/cf.1bk
-x86/linux/tst/cf.2bk
-x86/linux/tst/cf.sbk
-x86/linux/tst/cq.1bk
-x86/linux/tst/cq.2bk
-x86/linux/tst/cq.sbk
-x86/linux/tst/cvt.1bk
-x86/linux/tst/cvt.2bk
-x86/linux/tst/cvt.sbk
-x86/linux/tst/fields.1bk
-x86/linux/tst/fields.2bk
-x86/linux/tst/fields.sbk
-x86/linux/tst/front.2bk
-x86/linux/tst/front.sbk
-x86/linux/tst/incr.1bk
-x86/linux/tst/incr.2bk
-x86/linux/tst/incr.sbk
-x86/linux/tst/init.1bk
-x86/linux/tst/init.2bk
-x86/linux/tst/init.sbk
-x86/linux/tst/limits.1bk
-x86/linux/tst/limits.2bk
-x86/linux/tst/limits.sbk
-x86/linux/tst/paranoia.1bk
-x86/linux/tst/paranoia.2bk
-x86/linux/tst/paranoia.sbk
-x86/linux/tst/sort.1bk
-x86/linux/tst/sort.2bk
-x86/linux/tst/sort.sbk
-x86/linux/tst/spill.1bk
-x86/linux/tst/spill.2bk
-x86/linux/tst/spill.sbk
-x86/linux/tst/stdarg.1bk
-x86/linux/tst/stdarg.2bk
-x86/linux/tst/stdarg.sbk
-x86/linux/tst/struct.1bk
-x86/linux/tst/struct.2bk
-x86/linux/tst/struct.sbk
-x86/linux/tst/switch.1bk
-x86/linux/tst/switch.2bk
-x86/linux/tst/switch.sbk
-x86/linux/tst/wf1.1bk
-x86/linux/tst/wf1.2bk
-x86/linux/tst/wf1.sbk
-x86/linux/tst/yacc.1bk
-x86/linux/tst/yacc.2bk
-x86/linux/tst/yacc.sbk
-x86/win32/tst/8q.1bk
-x86/win32/tst/8q.2bk
-x86/win32/tst/8q.sbk
-x86/win32/tst/array.1bk
-x86/win32/tst/array.2bk
-x86/win32/tst/array.sbk
-x86/win32/tst/cf.1bk
-x86/win32/tst/cf.2bk
-x86/win32/tst/cf.sbk
-x86/win32/tst/cq.1bk
-x86/win32/tst/cq.2bk
-x86/win32/tst/cq.sbk
-x86/win32/tst/cvt.1bk
-x86/win32/tst/cvt.2bk
-x86/win32/tst/cvt.sbk
-x86/win32/tst/fields.1bk
-x86/win32/tst/fields.2bk
-x86/win32/tst/fields.sbk
-x86/win32/tst/front.2bk
-x86/win32/tst/front.sbk
-x86/win32/tst/incr.1bk
-x86/win32/tst/incr.2bk
-x86/win32/tst/incr.sbk
-x86/win32/tst/init.1bk
-x86/win32/tst/init.2bk
-x86/win32/tst/init.sbk
-x86/win32/tst/limits.1bk
-x86/win32/tst/limits.2bk
-x86/win32/tst/limits.sbk
-x86/win32/tst/paranoia.1bk
-x86/win32/tst/paranoia.2bk
-x86/win32/tst/paranoia.sbk
-x86/win32/tst/sort.1bk
-x86/win32/tst/sort.2bk
-x86/win32/tst/sort.sbk
-x86/win32/tst/spill.1bk
-x86/win32/tst/spill.2bk
-x86/win32/tst/spill.sbk
-x86/win32/tst/stdarg.1bk
-x86/win32/tst/stdarg.2bk
-x86/win32/tst/stdarg.sbk
-x86/win32/tst/struct.1bk
-x86/win32/tst/struct.2bk
-x86/win32/tst/struct.sbk
-x86/win32/tst/switch.1bk
-x86/win32/tst/switch.2bk
-x86/win32/tst/switch.sbk
-x86/win32/tst/wf1.1bk
-x86/win32/tst/wf1.2bk
-x86/win32/tst/wf1.sbk
-x86/win32/tst/yacc.1bk
-x86/win32/tst/yacc.2bk
-x86/win32/tst/yacc.sbk
-custom.mk
-packing.lst
diff --git a/code/tools/lcc/src/alpha.md b/code/tools/lcc/src/alpha.md
deleted file mode 100644
index 450dfd3..0000000
--- a/code/tools/lcc/src/alpha.md
+++ /dev/null
@@ -1,1192 +0,0 @@
-%{
-#define INTTMP ((0xff<<1)|(1<<22)|(1<<25)|(1<<27))
-#define INTVAR (0x3f<<9)
-#define FLTTMP ((0x3f<<10)|(0x1ff<<22))
-#define FLTVAR (0xff<<2)
-
-#define INTRET 0x00000001
-#define FLTRET 0x00000003
-
-#define readsreg(p) \
- (generic((p)->op)==INDIR && (p)->kids[0]->op==VREG+P)
-#define setsrc(d) ((d) && (d)->x.regnode && \
- (d)->x.regnode->set == src->x.regnode->set && \
- (d)->x.regnode->mask&src->x.regnode->mask)
-
-#define relink(a, b) ((b)->x.prev = (a), (a)->x.next = (b))
-
-#include "c.h"
-#define NODEPTR_TYPE Node
-#define OP_LABEL(p) ((p)->op)
-#define LEFT_CHILD(p) ((p)->kids[0])
-#define RIGHT_CHILD(p) ((p)->kids[1])
-#define STATE_LABEL(p) ((p)->x.state)
-static void address(Symbol, Symbol, long);
-static void blkfetch(int, int, int, int);
-static void blkloop(int, int, int, int, int, int[]);
-static void blkstore(int, int, int, int);
-static void defaddress(Symbol);
-static void defconst(int, int, Value);
-static void defstring(int, char *);
-static void defsymbol(Symbol);
-static void doarg(Node);
-static void emit2(Node);
-static void export(Symbol);
-static void clobber(Node);
-static void function(Symbol, Symbol [], Symbol [], int);
-static void global(Symbol);
-static void import(Symbol);
-static void local(Symbol);
-static void progbeg(int, char **);
-static void progend(void);
-static void segment(int);
-static void space(int);
-static void target(Node);
-static Symbol ireg[32], freg[32];
-static Symbol iregw, fregw;
-
-static int tmpregs[] = {4, 2, 3};
-static Symbol blkreg;
-
-static int cseg;
-
-static char *currentfile;
-
-%}
-%start stmt
-%term CNSTF4=4113
-%term CNSTF8=8209
-%term CNSTF16=16401
-%term CNSTI1=1045
-%term CNSTI2=2069
-%term CNSTI4=4117
-%term CNSTI8=8213
-%term CNSTP4=4119
-%term CNSTP8=8215
-%term CNSTU1=1046
-%term CNSTU2=2070
-%term CNSTU4=4118
-%term CNSTU8=8214
-
-%term ARGB=41
-%term ARGF4=4129
-%term ARGF8=8225
-%term ARGF16=16417
-%term ARGI4=4133
-%term ARGI8=8229
-%term ARGP4=4135
-%term ARGP8=8231
-%term ARGU4=4134
-%term ARGU8=8230
-
-%term ASGNB=57
-%term ASGNF4=4145
-%term ASGNF8=8241
-%term ASGNF16=16433
-%term ASGNI1=1077
-%term ASGNI2=2101
-%term ASGNI4=4149
-%term ASGNI8=8245
-%term ASGNP4=4151
-%term ASGNP8=8247
-%term ASGNU1=1078
-%term ASGNU2=2102
-%term ASGNU4=4150
-%term ASGNU8=8246
-
-%term INDIRB=73
-%term INDIRF4=4161
-%term INDIRF8=8257
-%term INDIRF16=16449
-%term INDIRI1=1093
-%term INDIRI2=2117
-%term INDIRI4=4165
-%term INDIRI8=8261
-%term INDIRP4=4167
-%term INDIRP8=8263
-%term INDIRU1=1094
-%term INDIRU2=2118
-%term INDIRU4=4166
-%term INDIRU8=8262
-
-%term CVFF4=4209
-%term CVFF8=8305
-%term CVFF16=16497
-%term CVFI4=4213
-%term CVFI8=8309
-
-%term CVIF4=4225
-%term CVIF8=8321
-%term CVIF16=16513
-%term CVII1=1157
-%term CVII2=2181
-%term CVII4=4229
-%term CVII8=8325
-%term CVIU1=1158
-%term CVIU2=2182
-%term CVIU4=4230
-%term CVIU8=8326
-
-%term CVPP4=4247
-%term CVPP8=8343
-%term CVPP16=16535
-%term CVPU4=4246
-%term CVPU8=8342
-
-%term CVUI1=1205
-%term CVUI2=2229
-%term CVUI4=4277
-%term CVUI8=8373
-%term CVUP4=4279
-%term CVUP8=8375
-%term CVUP16=16567
-%term CVUU1=1206
-%term CVUU2=2230
-%term CVUU4=4278
-%term CVUU8=8374
-
-%term NEGF4=4289
-%term NEGF8=8385
-%term NEGF16=16577
-%term NEGI4=4293
-%term NEGI8=8389
-
-%term CALLB=217
-%term CALLF4=4305
-%term CALLF8=8401
-%term CALLF16=16593
-%term CALLI4=4309
-%term CALLI8=8405
-%term CALLP4=4311
-%term CALLP8=8407
-%term CALLU4=4310
-%term CALLU8=8406
-%term CALLV=216
-
-%term RETF4=4337
-%term RETF8=8433
-%term RETF16=16625
-%term RETI4=4341
-%term RETI8=8437
-%term RETP4=4343
-%term RETP8=8439
-%term RETU4=4342
-%term RETU8=8438
-%term RETV=248
-
-%term ADDRGP4=4359
-%term ADDRGP8=8455
-
-%term ADDRFP4=4375
-%term ADDRFP8=8471
-
-%term ADDRLP4=4391
-%term ADDRLP8=8487
-
-%term ADDF4=4401
-%term ADDF8=8497
-%term ADDF16=16689
-%term ADDI4=4405
-%term ADDI8=8501
-%term ADDP4=4407
-%term ADDP8=8503
-%term ADDU4=4406
-%term ADDU8=8502
-
-%term SUBF4=4417
-%term SUBF8=8513
-%term SUBF16=16705
-%term SUBI4=4421
-%term SUBI8=8517
-%term SUBP4=4423
-%term SUBP8=8519
-%term SUBU4=4422
-%term SUBU8=8518
-
-%term LSHI4=4437
-%term LSHI8=8533
-%term LSHU4=4438
-%term LSHU8=8534
-
-%term MODI4=4453
-%term MODI8=8549
-%term MODU4=4454
-%term MODU8=8550
-
-%term RSHI4=4469
-%term RSHI8=8565
-%term RSHU4=4470
-%term RSHU8=8566
-
-%term BANDI4=4485
-%term BANDI8=8581
-%term BANDU4=4486
-%term BANDU8=8582
-
-%term BCOMI4=4501
-%term BCOMI8=8597
-%term BCOMU4=4502
-%term BCOMU8=8598
-
-%term BORI4=4517
-%term BORI8=8613
-%term BORU4=4518
-%term BORU8=8614
-
-%term BXORI4=4533
-%term BXORI8=8629
-%term BXORU4=4534
-%term BXORU8=8630
-
-%term DIVF4=4545
-%term DIVF8=8641
-%term DIVF16=16833
-%term DIVI4=4549
-%term DIVI8=8645
-%term DIVU4=4550
-%term DIVU8=8646
-
-%term MULF4=4561
-%term MULF8=8657
-%term MULF16=16849
-%term MULI4=4565
-%term MULI8=8661
-%term MULU4=4566
-%term MULU8=8662
-
-%term EQF4=4577
-%term EQF8=8673
-%term EQF16=16865
-%term EQI4=4581
-%term EQI8=8677
-%term EQU4=4582
-%term EQU8=8678
-
-%term GEF4=4593
-%term GEF8=8689
-%term GEI4=4597
-%term GEI8=8693
-%term GEI16=16885
-%term GEU4=4598
-%term GEU8=8694
-
-%term GTF4=4609
-%term GTF8=8705
-%term GTF16=16897
-%term GTI4=4613
-%term GTI8=8709
-%term GTU4=4614
-%term GTU8=8710
-
-%term LEF4=4625
-%term LEF8=8721
-%term LEF16=16913
-%term LEI4=4629
-%term LEI8=8725
-%term LEU4=4630
-%term LEU8=8726
-
-%term LTF4=4641
-%term LTF8=8737
-%term LTF16=16929
-%term LTI4=4645
-%term LTI8=8741
-%term LTU4=4646
-%term LTU8=8742
-
-%term NEF4=4657
-%term NEF8=8753
-%term NEF16=16945
-%term NEI4=4661
-%term NEI8=8757
-%term NEU4=4662
-%term NEU8=8758
-
-%term JUMPV=584
-
-%term LABELV=600
-
-%term LOADB=233
-%term LOADF4=4321
-%term LOADF8=8417
-%term LOADF16=16609
-%term LOADI1=1253
-%term LOADI2=2277
-%term LOADI4=4325
-%term LOADI8=8421
-%term LOADP4=4327
-%term LOADP8=8423
-%term LOADU1=1254
-%term LOADU2=2278
-%term LOADU4=4326
-%term LOADU8=8422
-
-%term VREGP=711
-%%
-reg: INDIRI1(VREGP) "# read register\n"
-reg: INDIRU1(VREGP) "# read register\n"
-
-reg: INDIRI2(VREGP) "# read register\n"
-reg: INDIRU2(VREGP) "# read register\n"
-
-reg: INDIRF4(VREGP) "# read register\n"
-reg: INDIRI4(VREGP) "# read register\n"
-reg: INDIRP4(VREGP) "# read register\n"
-reg: INDIRU4(VREGP) "# read register\n"
-
-reg: INDIRF8(VREGP) "# read register\n"
-reg: INDIRI8(VREGP) "# read register\n"
-reg: INDIRP8(VREGP) "# read register\n"
-reg: INDIRU8(VREGP) "# read register\n"
-
-stmt: ASGNI1(VREGP,reg) "# write register\n"
-stmt: ASGNU1(VREGP,reg) "# write register\n"
-
-stmt: ASGNI2(VREGP,reg) "# write register\n"
-stmt: ASGNU2(VREGP,reg) "# write register\n"
-
-stmt: ASGNF4(VREGP,reg) "# write register\n"
-stmt: ASGNI4(VREGP,reg) "# write register\n"
-stmt: ASGNP4(VREGP,reg) "# write register\n"
-stmt: ASGNU4(VREGP,reg) "# write register\n"
-
-stmt: ASGNF8(VREGP,reg) "# write register\n"
-stmt: ASGNI8(VREGP,reg) "# write register\n"
-stmt: ASGNP8(VREGP,reg) "# write register\n"
-stmt: ASGNU8(VREGP,reg) "# write register\n"
-con: CNSTI1 "%a"
-con: CNSTU1 "%a"
-
-con: CNSTI2 "%a"
-con: CNSTU2 "%a"
-
-con: CNSTI4 "%a"
-con: CNSTU4 "%a"
-con: CNSTP4 "%a"
-
-con: CNSTI8 "%a"
-con: CNSTU8 "%a"
-con: CNSTP8 "%a"
-stmt: reg ""
-acon: con "%0"
-acon: ADDRGP8 "%a"
-
-addr: ADDI4(reg,acon) "%1($%0)"
-addr: ADDI8(reg,acon) "%1($%0)"
-addr: ADDU8(reg,acon) "%1($%0)"
-addr: ADDP8(reg,acon) "%1($%0)"
-
-addr: acon "%0"
-addr: reg "($%0)"
-
-addr: ADDRFP8 "%a+%F($sp)"
-addr: ADDRLP8 "%a+%F($sp)"
-
-reg: addr "lda $%c,%0\n" 1
-
-reg: CNSTI1 "# reg\n" range(a, 0, 0)
-reg: CNSTI2 "# reg\n" range(a, 0, 0)
-reg: CNSTI4 "# reg\n" range(a, 0, 0)
-reg: CNSTI8 "# reg\n" range(a, 0, 0)
-reg: CNSTU1 "# reg\n" range(a, 0, 0)
-reg: CNSTU2 "# reg\n" range(a, 0, 0)
-reg: CNSTU4 "# reg\n" range(a, 0, 0)
-reg: CNSTU8 "# reg\n" range(a, 0, 0)
-reg: CNSTP8 "# reg\n" range(a, 0, 0)
-
-stmt: ASGNI1(addr,reg) "stb $%1,%0\n" 1
-stmt: ASGNU1(addr,reg) "stb $%1,%0\n" 1
-stmt: ASGNI2(addr,reg) "stw $%1,%0\n" 1
-stmt: ASGNU2(addr,reg) "stw $%1,%0\n" 1
-
-stmt: ASGNI4(addr,reg) "stl $%1,%0\n" 1
-stmt: ASGNU4(addr,reg) "stl $%1,%0\n" 1
-stmt: ASGNI8(addr,reg) "stq $%1,%0\n" 1
-stmt: ASGNU8(addr,reg) "stq $%1,%0\n" 1
-stmt: ASGNP8(addr,reg) "stq $%1,%0\n" 1
-
-reg: INDIRI1(reg) "ldb $%c,($%0)\n" 1
-reg: INDIRI2(reg) "ldw $%c,($%0)\n" 1
-reg: INDIRI4(addr) "ldl $%c,%0\n" 1
-reg: INDIRI8(addr) "ldq $%c,%0\n" 1
-reg: INDIRP8(addr) "ldq $%c,%0\n" 1
-reg: INDIRU1(reg) "ldbu $%c,($%0)\n" 1
-reg: INDIRU2(reg) "ldwu $%c,($%0)\n" 1
-reg: INDIRU4(addr) "ldl $%c,%0\nzap $%c,240,$%c\n" 2
-reg: INDIRU8(addr) "ldq $%c,%0\n" 1
-
-reg: CVII4(INDIRI1(reg)) "ldb $%c,($%0)\n" 1
-reg: CVII8(INDIRI1(reg)) "ldb $%c,($%0)\n" 1
-reg: CVII4(INDIRI2(reg)) "ldw $%c,($%0)\n" 1
-reg: CVII8(INDIRI2(reg)) "ldw $%c,($%0)\n" 1
-reg: CVII8(INDIRI4(addr)) "ldl $%c,%0\n" 1
-
-reg: CVUU4(INDIRU1(reg)) "ldbu $%c,($%0)\n" 1
-reg: CVUU8(INDIRU1(reg)) "ldbu $%c,($%0)\n" 1
-reg: CVUU4(INDIRU2(reg)) "ldwu $%c,($%0)\n" 1
-reg: CVUU8(INDIRU2(reg)) "ldwu $%c,($%0)\n" 1
-reg: CVUU8(INDIRU4(addr)) "ldl $%c,%0\nzap $%c,240,$%c\n" 2
-
-reg: CVUI4(INDIRU1(reg)) "ldbu $%c,($%0)\n" 1
-reg: CVUI8(INDIRU1(reg)) "ldbu $%c,($%0)\n" 1
-reg: CVUI4(INDIRU2(reg)) "ldwu $%c,($%0)\n" 1
-reg: CVUI8(INDIRU2(reg)) "ldwu $%c,($%0)\n" 1
-reg: CVUI8(INDIRU4(addr)) "ldl $%c,%0\nzap $%c,240,$%c\n" 2
-
-reg: CVIU8(reg) "mov $%0,$%c\n" move(a)
-
-reg: INDIRF4(addr) "lds $f%c,%0\n" 1
-reg: INDIRF8(addr) "ldt $f%c,%0\n" 1
-stmt: ASGNF4(addr,reg) "sts $f%1,%0\n" 1
-stmt: ASGNF8(addr,reg) "stt $f%1,%0\n" 1
-
-reg: MULI4(reg,rc) "mull $%0,%1,$%c\n" 1
-reg: MULI8(reg,rc) "mulq $%0,%1,$%c\n" 1
-reg: MULU4(reg,rc) "mull $%0,%1,$%c\nzap $%c,240,$%c\n" 2
-reg: MULU8(reg,rc) "mulq $%0,%1,$%c\n" 1
-
-reg: DIVI4(reg,rc) "divl $%0,%1,$%c\n" 1
-reg: DIVI8(reg,rc) "divq $%0,%1,$%c\n" 1
-reg: DIVU4(reg,rc) "divlu $%0,%1,$%c\n" 1
-reg: DIVU8(reg,rc) "divqu $%0,%1,$%c\n" 1
-reg: MODI4(reg,rc) "reml $%0,%1,$%c\n" 1
-reg: MODI8(reg,rc) "remq $%0,%1,$%c\n" 1
-reg: MODU4(reg,rc) "remlu $%0,%1,$%c\n" 1
-reg: MODU8(reg,rc) "remqu $%0,%1,$%c\n" 1
-
-rc: con "%0"
-rc: reg "$%0"
-
-reg: ADDI4(reg,rc) "addl $%0,%1,$%c\n" 1
-reg: ADDI8(reg,rc) "addq $%0,%1,$%c\n" 1
-reg: ADDP8(reg,rc) "addq $%0,%1,$%c\n" 1
-reg: ADDU4(reg,rc) "addl $%0,%1,$%c\nzap $%c,240,$%c\n" 2
-reg: ADDU8(reg,rc) "addq $%0,%1,$%c\n" 1
-reg: SUBI4(reg,rc) "subl $%0,%1,$%c\n" 1
-reg: SUBI8(reg,rc) "subq $%0,%1,$%c\n" 1
-reg: SUBP8(reg,rc) "subq $%0,%1,$%c\n" 1
-reg: SUBU4(reg,rc) "subl $%0,%1,$%c\nzap $%c,240,$%c\n" 2
-reg: SUBU8(reg,rc) "subq $%0,%1,$%c\n" 1
-
-reg: BANDI4(reg,rc) "and $%0,%1,$%c\naddl $%c,0,$%c\n" 2
-reg: BANDI8(reg,rc) "and $%0,%1,$%c\n" 1
-reg: BANDU4(reg,rc) "and $%0,%1,$%c\n" 1
-reg: BANDU8(reg,rc) "and $%0,%1,$%c\n" 1
-reg: BORI4(reg,rc) "or $%0,%1,$%c\naddl $%c,0,$%c\n" 2
-reg: BORI8(reg,rc) "or $%0,%1,$%c\n" 1
-reg: BORU4(reg,rc) "or $%0,%1,$%c\n" 1
-reg: BORU8(reg,rc) "or $%0,%1,$%c\n" 1
-reg: BXORI4(reg,rc) "xor $%0,%1,$%c\naddl $%c,0,$%c\n" 2
-reg: BXORI8(reg,rc) "xor $%0,%1,$%c\n" 1
-reg: BXORU4(reg,rc) "xor $%0,%1,$%c\n" 1
-reg: BXORU8(reg,rc) "xor $%0,%1,$%c\n" 1
-
-rc6: CNSTI4 "%a" range(a,0,63)
-rc6: CNSTI8 "%a" range(a,0,63)
-rc6: reg "$%0"
-
-reg: LSHI4(reg,rc6) "sll $%0,%1,$%c\naddl $%c,0,$%c\n" 2
-reg: LSHI8(reg,rc6) "sll $%0,%1,$%c\n" 1
-reg: LSHU4(reg,rc6) "sll $%0,%1,$%c\nzap $%c,240,$%c\n" 2
-reg: LSHU8(reg,rc6) "sll $%0,%1,$%c\n" 1
-reg: RSHI4(reg,rc6) "sra $%0,%1,$%c\naddl $%c,0,$%c\n" 2
-reg: RSHI8(reg,rc6) "sra $%0,%1,$%c\n" 1
-reg: RSHU4(reg,rc6) "srl $%0,%1,$%c\n" 1
-reg: RSHU8(reg,rc6) "srl $%0,%1,$%c\n" 1
-
-reg: BCOMI4(reg) "not $%0,$%c\naddl $%c,0,$%c\n" 2
-reg: BCOMU4(reg) "not $%0,$%c\nzap $%c,240,$%c\n" 2
-reg: BCOMI8(reg) "not $%0,$%c\n" 1
-reg: BCOMU8(reg) "not $%0,$%c\n" 1
-reg: NEGI4(reg) "negl $%0,$%c\n" 1
-reg: NEGI8(reg) "negq $%0,$%c\n" 1
-reg: LOADI1(reg) "mov $%0,$%c\n" move(a)
-reg: LOADI2(reg) "mov $%0,$%c\n" move(a)
-reg: LOADI4(reg) "mov $%0,$%c\n" move(a)
-reg: LOADI8(reg) "mov $%0,$%c\n" move(a)
-reg: LOADP8(reg) "mov $%0,$%c\n" move(a)
-reg: LOADU1(reg) "mov $%0,$%c\n" move(a)
-reg: LOADU2(reg) "mov $%0,$%c\n" move(a)
-reg: LOADU4(reg) "mov $%0,$%c\n" move(a)
-reg: LOADU8(reg) "mov $%0,$%c\n" move(a)
-
-reg: ADDF4(reg,reg) "adds $f%0,$f%1,$f%c\n" 1
-reg: ADDF8(reg,reg) "addt $f%0,$f%1,$f%c\n" 1
-reg: DIVF4(reg,reg) "divs $f%0,$f%1,$f%c\n" 1
-reg: DIVF8(reg,reg) "divt $f%0,$f%1,$f%c\n" 1
-reg: MULF4(reg,reg) "muls $f%0,$f%1,$f%c\n" 1
-reg: MULF8(reg,reg) "mult $f%0,$f%1,$f%c\n" 1
-reg: SUBF4(reg,reg) "subs $f%0,$f%1,$f%c\n" 1
-reg: SUBF8(reg,reg) "subt $f%0,$f%1,$f%c\n" 1
-reg: LOADF4(reg) "fmov $f%0,$f%c\n" move(a)
-reg: LOADF8(reg) "fmov $f%0,$f%c\n" move(a)
-reg: NEGF4(reg) "negs $f%0,$f%c\n" 1
-reg: NEGF8(reg) "negt $f%0,$f%c\n" 1
-reg: CVII4(reg) "sll $%0,8*(8-%a),$%c\nsra $%c,8*(8-%a),$%c\n" 2
-reg: CVII8(reg) "sll $%0,8*(8-%a),$%c\nsra $%c,8*(8-%a),$%c\n" 2
-reg: CVUI4(reg) "and $%0,(1<<(8*%a))-1,$%c\n" 1
-reg: CVUI8(reg) "and $%0,(1<<(8*%a))-1,$%c\n" 1
-reg: CVUU4(reg) "and $%0,(1<<(8*%a))-1,$%c\n" 1
-reg: CVUU8(reg) "and $%0,(1<<(8*%a))-1,$%c\n" 1
-
-reg: CVUP8(reg) "and $%0,(1<<(8*%a))-1,$%c\n" 1
-
-reg: CVFF4(reg) "cvtts $f%0,$f%c\n" 1
-reg: CVFF8(reg) "cvtst $f%0,$f%c\n" 1
-
-reg: CVIF4(reg) "stq $%0,-56+%F($sp)\nldt $%f%c,-56+%F($sp)\ncvtqs $f%c,$f%c\n" 3
-reg: CVIF8(reg) "stq $%0,-56+%F($sp)\nldt $%f%c,-56+%F($sp)\ncvtqt $f%c,$f%c\n" 3
-reg: CVIF4(INDIRI4(addr)) "lds $f%c,%0\ncvtlq $f%c,$f%c\ncvtqs $f%c,$f%c\n" 3
-reg: CVIF4(INDIRI8(addr)) "ldt $f%c,%0\ncvtqs $f%c,$f%c\n" 2
-reg: CVIF8(INDIRI4(addr)) "lds $f%c,%0\ncvtlq $f%c,$f%c\ncvtqt $f%c,$f%c\n" 3
-reg: CVIF8(INDIRI8(addr)) "ldt $f%c,%0\ncvtqt $f%c,$f%c\n" 2
-
-reg: CVFI4(reg) "cvttqc $f%0,$f1\ncvtql $f1,$f1\nsts $f1,-56+%F($sp)\nldl $%c,-56+%F($sp)\n" 4
-reg: CVFI8(reg) "cvttqc $f%0,$f1\nstt $f1,-56+%F($sp)\nldq $%c,-56+%F($sp)\n" 3
-
-stmt: LABELV "%a:\n"
-
-stmt: JUMPV(acon) "br %0\n" 1
-stmt: JUMPV(reg) "jmp ($%0)\n" 1
-
-stmt: EQI4(reg,rc6) "cmpeq $%0,%1,$23\nbne $23,%a\n" 2
-stmt: EQU4(reg,rc6) "cmpeq $%0,%1,$23\nbne $23,%a\n" 2
-stmt: EQI8(reg,rc6) "cmpeq $%0,%1,$23\nbne $23,%a\n" 2
-stmt: EQU8(reg,rc6) "cmpeq $%0,%1,$23\nbne $23,%a\n" 2
-stmt: NEI4(reg,rc6) "cmpeq $%0,%1,$23\nbeq $23,%a\n" 2
-stmt: NEU4(reg,rc6) "cmpeq $%0,%1,$23\nbeq $23,%a\n" 2
-stmt: NEI8(reg,rc6) "cmpeq $%0,%1,$23\nbeq $23,%a\n" 2
-stmt: NEU8(reg,rc6) "cmpeq $%0,%1,$23\nbeq $23,%a\n" 2
-stmt: GEI4(reg,rc6) "cmplt $%0,%1,$23\nbeq $23,%a\n" 2
-stmt: GEI8(reg,rc6) "cmplt $%0,%1,$23\nbeq $23,%a\n" 2
-stmt: GEU4(reg,rc6) "cmpult $%0,%1,$23\nbeq $23,%a\n" 1
-stmt: GEU8(reg,rc6) "cmpult $%0,%1,$23\nbeq $23,%a\n" 1
-stmt: GTI4(reg,rc6) "cmple $%0,%1,$23\nbeq $23,%a\n" 2
-stmt: GTI8(reg,rc6) "cmple $%0,%1,$23\nbeq $23,%a\n" 2
-stmt: GTU4(reg,rc6) "cmpule $%0,%1,$23\nbeq $23,%a\n" 1
-stmt: GTU8(reg,rc6) "cmpule $%0,%1,$23\nbeq $23,%a\n" 1
-stmt: LEI4(reg,rc6) "cmple $%0,%1,$23\nbne $23,%a\n" 2
-stmt: LEI8(reg,rc6) "cmple $%0,%1,$23\nbne $23,%a\n" 2
-stmt: LEU4(reg,rc6) "cmpule $%0,%1,$23\nbne $23,%a\n" 2
-stmt: LEU8(reg,rc6) "cmpule $%0,%1,$23\nbne $23,%a\n" 2
-stmt: LTI4(reg,rc6) "cmplt $%0,%1,$23\nbne $23,%a\n" 2
-stmt: LTI8(reg,rc6) "cmplt $%0,%1,$23\nbne $23,%a\n" 2
-stmt: LTU4(reg,rc6) "cmpult $%0,%1,$23\nbne $23,%a\n" 2
-stmt: LTU8(reg,rc6) "cmpult $%0,%1,$23\nbne $23,%a\n" 2
-
-stmt: EQF4(reg,reg) "cmpteq $f%0,$f%1,$f1\nfbne $f1,%a\n" 2
-stmt: EQF8(reg,reg) "cmpteq $f%0,$f%1,$f1\nfbne $f1,%a\n" 2
-stmt: LEF4(reg,reg) "cmptle $f%0,$f%1,$f1\nfbne $f1,%a\n" 2
-stmt: LEF8(reg,reg) "cmptle $f%0,$f%1,$f1\nfbne $f1,%a\n" 2
-stmt: LTF4(reg,reg) "cmptlt $f%0,$f%1,$f1\nfbne $f1,%a\n" 2
-stmt: LTF8(reg,reg) "cmptlt $f%0,$f%1,$f1\nfbne $f1,%a\n" 2
-
-stmt: NEF4(reg,reg) "cmpteq $f%0,$f%1,$f1\nfbeq $f1,%a\n" 2
-stmt: NEF8(reg,reg) "cmpteq $f%0,$f%1,$f1\nfbeq $f1,%a\n" 2
-stmt: GEF4(reg,reg) "cmptlt $f%0,$f%1,$f1\nfbeq $f1,%a\n" 2
-stmt: GEF8(reg,reg) "cmptlt $f%0,$f%1,$f1\nfbeq $f1,%a\n" 2
-stmt: GTF4(reg,reg) "cmptle $f%0,$f%1,$f1\nfbeq $f1,%a\n" 2
-stmt: GTF8(reg,reg) "cmptle $f%0,$f%1,$f1\nfbeq $f1,%a\n" 2
-
-ar: ADDRGP8 "%a"
-ar: reg "($%0)"
-
-reg: CALLF4(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2
-reg: CALLF8(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2
-reg: CALLI4(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2
-reg: CALLI8(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2
-reg: CALLP8(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2
-reg: CALLU4(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2
-reg: CALLU8(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2
-stmt: CALLV(ar) "jsr $26,%0\nldgp $gp,0($26)\n" 2
-
-stmt: RETF4(reg) "# ret\n" 1
-stmt: RETF8(reg) "# ret\n" 1
-stmt: RETI4(reg) "# ret\n" 1
-stmt: RETU4(reg) "# ret\n" 1
-stmt: RETI8(reg) "# ret\n" 1
-stmt: RETU8(reg) "# ret\n" 1
-stmt: RETP8(reg) "# ret\n" 1
-stmt: RETV(reg) "# ret\n" 1
-
-stmt: ARGF4(reg) "# arg\n" 1
-stmt: ARGF8(reg) "# arg\n" 1
-stmt: ARGI4(reg) "# arg\n" 1
-stmt: ARGI8(reg) "# arg\n" 1
-stmt: ARGP8(reg) "# arg\n" 1
-stmt: ARGU4(reg) "# arg\n" 1
-stmt: ARGU8(reg) "# arg\n" 1
-
-stmt: ARGB(INDIRB(reg)) "# argb %0\n" 1
-stmt: ASGNB(reg,INDIRB(reg)) "# asgnb %0 %1\n" 1
-
-%%
-static void progend(void){}
-
-static void progbeg(int argc, char *argv[]) {
- int i;
-
- {
- union {
- char c;
- int i;
- } u;
- u.i = 0;
- u.c = 1;
- swap = ((int)(u.i == 1)) != IR->little_endian;
- }
- parseflags(argc, argv);
-
- for (i = 0; i < 32; i++)
- freg[i] = mkreg("%d", i, 1, FREG);
- for (i = 0; i < 32; i++)
- ireg[i] = mkreg("%d", i, 1, IREG);
- ireg[29]->x.name = "gp";
- ireg[30]->x.name = "sp";
- fregw = mkwildcard(freg);
- iregw = mkwildcard(ireg);
-
- tmask[IREG] = INTTMP; tmask[FREG] = FLTTMP;
- vmask[IREG] = INTVAR; vmask[FREG] = FLTVAR;
-
- blkreg = mkreg("1", 1, 0xf, IREG);
-
-}
-
-static Symbol rmap(int opk) {
- switch (optype(opk)) {
- case I: case U: case P: case B:
- return iregw;
- case F:
- return fregw;
- default:
- return 0;
- }
-}
-
-static Symbol argreg(int offset, int ty) {
- if (offset >= 48)
- return NULL;
- else if (ty == F)
- return freg[(offset/8) + 16];
- else
- return ireg[(offset/8) + 16];
-}
-
-static void target(Node p) {
- assert(p);
- switch (specific(p->op)) {
- case CNST+I: case CNST+U: case CNST+P:
- if (range(p, 0, 0) == 0) {
- setreg(p, ireg[31]);
- p->x.registered = 1;
- }
- break;
- case CNST+F:
- if (p->syms[0]->u.c.v.d == 0) {
- setreg(p, freg[31]);
- p->x.registered = 1;
- }
- break;
-
- case CALL+V:
- rtarget(p, 0, ireg[27]);
- break;
- case CALL+F:
- rtarget(p, 0, ireg[27]);
- setreg(p, freg[0]);
- break;
- case CALL+I: case CALL+P: case CALL+U:
- rtarget(p, 0, ireg[27]);
- setreg(p, ireg[0]);
- break;
- case RET+F:
- rtarget(p, 0, freg[0]);
- break;
- case RET+I: case RET+U: case RET+P:
- rtarget(p, 0, ireg[0]);
- break;
-
- case ARG+F: case ARG+I: case ARG+P: case ARG+U: {
- Symbol q = argreg(p->syms[2]->u.c.v.i, optype(p->op));
- if (q)
- rtarget(p, 0, q);
- break;
- }
-
-
- case ASGN+B: rtarget(p->kids[1], 0, blkreg); break;
- case ARG+B: rtarget(p->kids[0], 0, blkreg); break;
-
- }
-}
-
-static void clobber(Node p) {
- assert(p);
- switch (specific(p->op)) {
- case ASGN+I: case ASGN+U:
- if (opsize(p->op) <= 2)
- spill(1<<24, IREG, p);
- break;
-
- case DIV+I: case DIV+U: case MOD+I: case MOD+U:
- spill(((1<<27)|(3<<24))&~p->syms[RX]->x.regnode->mask, IREG, p);
- break;
-
- case CALL+F:
- spill(INTTMP | INTRET, IREG, p);
- spill(FLTTMP, FREG, p);
- break;
- case CALL+I: case CALL+P: case CALL+U:
- spill(INTTMP, IREG, p);
- spill(FLTTMP | FLTRET, FREG, p);
- break;
- case CALL+V:
- spill(INTTMP | INTRET, IREG, p);
- spill(FLTTMP | FLTRET, FREG, p);
- break;
-
- }
-}
-
-static void emit2(Node p) {
- int dst, n, src, sz, ty;
- static int ty0;
- Symbol q;
-
- switch (specific(p->op)) {
- case ARG+F: case ARG+I: case ARG+P: case ARG+U:
- ty = optype(p->op);
- sz = opsize(p->op);
- q = argreg(p->syms[2]->u.c.v.i, ty);
- src = getregnum(p->x.kids[0]);
- if (q)
- break;
- else if (ty == F && sz == 4)
- print("sts $f%d,%d($sp)\n", src, p->syms[2]->u.c.v.i - 48);
- else if (ty == F && sz == 8)
- print("stt $f%d,%d($sp)\n", src, p->syms[2]->u.c.v.i - 48);
- else if (sz == 4)
- print("stq $%d,%d($sp)\n", src, p->syms[2]->u.c.v.i - 48);
- else if (sz == 8)
- print("stq $%d,%d($sp)\n", src, p->syms[2]->u.c.v.i - 48);
- else
- assert(0);
- break;
-
- case ASGN+B:
- dalign = salign = p->syms[1]->u.c.v.i;
- blkcopy(getregnum(p->x.kids[0]), 0,
- getregnum(p->x.kids[1]), 0,
- p->syms[0]->u.c.v.i, tmpregs);
- break;
-
-
- case ARG+B: {
- int doff = p->syms[2]->u.c.v.i, soff = 0, sreg = getregnum(p->x.kids[0]);
- dalign = 8;
- salign = p->syms[1]->u.c.v.i;
- n = p->syms[0]->u.c.v.i;
- for ( ; doff <= 40 && n > 0; doff += 8) {
- print("uldq $%d,%d($%d)\n", (doff/8)+16, soff, sreg);
- soff += 8;
- n -= 8;
- }
- if (n > 0)
- blkcopy(30, doff - 48, sreg, soff, n, tmpregs);
- break;
- }
-
- }
-}
-
-static void doarg(Node p) {
- p->syms[2] = intconst(mkactual(8, roundup(p->syms[0]->u.c.v.i,8)));
-}
-
-static void local(Symbol p) {
- if (askregvar(p, rmap(ttob(p->type))) == 0)
- mkauto(p);
-}
-
-static int bitcount(unsigned mask) {
- unsigned i, n = 0;
-
- for (i = 1; i; i <<= 1)
- if (mask&i)
- n++;
- return n;
-}
-
-static void function(Symbol f, Symbol caller[], Symbol callee[], int ncalls) {
- int i, sizeargs, saved, sizefsave, sizeisave, varargs;
- Symbol r, argregs[6];
-
- usedmask[0] = usedmask[1] = 0;
- freemask[0] = freemask[1] = ~(unsigned)0;
- maxargoffset = offset = maxoffset = 0;
-
- for (i = 0; callee[i]; i++)
- ;
- varargs = variadic(f->type)
- || i > 0 && strcmp(callee[i-1]->name, "va_alist") == 0;
- if (varargs)
- sizeargs = 2*48;
- else
- sizeargs = 48;
-
- for (i = 0; callee[i]; i++) {
- Symbol p = callee[i];
- Symbol q = caller[i];
- assert(q);
- if (isfloat(p->type) && varargs) {
- p->x.offset = q->x.offset = offset - 2*48;
- p->x.name = q->x.name = stringd(offset - 2*48);
- } else {
- p->x.offset = q->x.offset = offset - 48;
- p->x.name = q->x.name = stringd(offset - 48);
- }
- offset = roundup(offset, q->type->align);
- r = argreg(offset, optype(ttob(q->type)));
- if (i < 6)
- argregs[i] = r;
- offset = roundup(offset + q->type->size, 8);
- if (varargs)
- p->sclass = AUTO;
- else if (r && ncalls == 0 && !isstruct(q->type) && !p->addressed
-) {
- p->sclass = q->sclass = REGISTER;
- askregvar(p, r);
- assert(p->x.regnode && p->x.regnode->vbl == p);
- q->x = p->x;
- q->type = p->type;
- } else if (askregvar(p, rmap(ttob(p->type)))
- && r != NULL /*
- && (isint(p->type) || p->type == q->type) */
-) {
- assert(q->sclass != REGISTER);
- p->sclass = q->sclass = REGISTER;
- q->type = p->type;
- }
-
- }
- assert(!caller[i]);
-
- offset = sizeargs + 8;
- gencode(caller, callee);
- usedmask[IREG] &= ~(INTTMP|(0x3f<<16)|INTRET);
- usedmask[FREG] &= ~(FLTTMP|(0x3f<<16)|FLTRET);
- if (ncalls || usedmask[IREG] || usedmask[FREG])
- usedmask[IREG] |= 1<<26;
- sizefsave = 8*bitcount(usedmask[FREG]);
- sizeisave = 8*bitcount(usedmask[IREG]);
- if (maxargoffset > 48)
- maxargoffset -= 48;
- else
- maxargoffset = 0;
- if (maxoffset < sizeargs)
- maxoffset = sizeargs;
- framesize = roundup(maxargoffset + sizefsave + sizeisave + maxoffset, 16);
- segment(CODE);
- print(".ent %s\n", f->x.name);
- print("%s:\n", f->x.name);
- print("ldgp $gp,0($27)\n");
- i = maxargoffset + sizefsave - framesize;
- if (framesize > 0)
- print("lda $sp,%d($sp)\n", -framesize);
- if (usedmask[FREG])
- print(".fmask 0x%x,%d\n", usedmask[FREG], i - 8);
- if (usedmask[IREG])
- print(".mask 0x%x,%d\n", usedmask[IREG], i + sizeisave - 8);
- print(".frame $sp,%d,$26,%d\n", framesize, sizeargs);
-
- saved = maxargoffset;
- for (i = 2; i <= 9; i++)
- if (usedmask[FREG]&(1<<i)) {
- print("stt $f%d,%d($sp)\n", i, saved);
- saved += 8;
- }
-
- for (i = 9; i <= 26; i++)
- if (usedmask[IREG]&(1<<i)) {
- print("stq $%d,%d($sp)\n", i, saved);
- saved += 8;
- }
- for (i = 0; i < 6 && callee[i]; i++) {
- r = argregs[i];
- if (r && r->x.regnode != callee[i]->x.regnode) {
- Symbol out = callee[i];
- Symbol in = caller[i];
- int rn = r->x.regnode->number;
- int rs = r->x.regnode->set;
- int tyin = ttob(in->type);
-
- assert(out && in && r && r->x.regnode);
- assert(out->sclass != REGISTER || out->x.regnode);
- if (out->sclass == REGISTER) {
- if (rs == FREG)
- print("fmov $f%d,$f%d\n", rn, out->x.regnode->number);
- else
- print("mov $%d,$%d\n", rn, out->x.regnode->number);
-
- } else {
- int off = in->x.offset + framesize;
- if (rs == FREG && tyin == F+sizeop(8))
- print("stt $f%d,%d($sp)\n", rn, off);
- else if (rs == FREG && tyin == F+sizeop(4))
- print("sts $f%d,%d($sp)\n", rn, off);
- else {
- int i, n = (in->type->size + 7)/8;
- for (i = rn; i < rn+n && i <= 21; i++)
- print("stq $%d,%d($sp)\n", i, off + (i-rn)*8);
- }
-
- }
-
- }
- }
- if (varargs && callee[i-1]) {
- i = callee[i-1]->x.offset + roundup(callee[i-1]->type->size, 8);
- for (i = (48+i)/8; i < 6; i++) {
- print("stq $%d,%d($sp)\n", i + 16, framesize - 48 + 8*i);
- print("stt $f%d,%d($sp)\n", i + 16, framesize - 2*48 + 8*i);
- }
- }
- print(".prologue 1\n");
-
- emitcode();
- saved = maxargoffset;
- for (i = 2; i <= 9; i++)
- if (usedmask[FREG]&(1<<i)) {
- print("ldt $f%d,%d($sp)\n", i, saved);
- saved += 8;
- }
- for (i = 9; i <= 26; i++)
- if (usedmask[IREG]&(1<<i)) {
- print("ldq $%d,%d($sp)\n", i, saved);
- saved += 8;
- }
- if (framesize > 0)
- print("lda $sp,%d($sp)\n", framesize);
- print("ret\n");
- print(".end %s\n", f->x.name);
-
-}
-
-static void defconst(int suffix, int size, Value v) {
- if (suffix == F && size == 4) {
- float f = v.d;
- print(".long 0x%x\n", *(unsigned *)&f);
- } else if (suffix == F && size == 8) {
- double d = v.d;
- unsigned *p = (unsigned *)&d;
- print(".long 0x%x\n.long 0x%x\n", p[swap], p[!swap]);
- } else if (suffix == P)
- print(".quad 0x%X\n", v.p);
- else if (size == 1)
- print(".byte 0x%x\n", suffix == I ? v.i : v.u);
- else if (size == 2)
- print(".word 0x%x\n", suffix == I ? v.i&0xFFFF : v.u&0xFFFF);
- else if (size == 4)
- print(".long 0x%x\n", suffix == I ? v.i : v.u);
- else if (size == 8)
- print(".quad 0x%X\n", suffix == I ? v.i : v.u);
-
-}
-
-static void defaddress(Symbol p) {
- print(".quad %s\n", p->x.name);
-}
-
-static void defstring(int n, char *str) {
- char *s;
-
- for (s = str; s < str + n; s++)
- print(".byte %d\n", (*s)&0377);
-}
-
-static void export(Symbol p) {
- print(".globl %s\n", p->x.name);
-}
-
-static void import(Symbol p) {
- if (!isfunc(p->type))
- print(".extern %s %d\n", p->name, p->type->size);
-}
-
-static void defsymbol(Symbol p) {
- if (p->scope >= LOCAL && p->sclass == STATIC)
- p->x.name = stringf("L.%d", genlabel(1));
- else if (p->generated)
- p->x.name = stringf("L.%s", p->name);
- else
- assert(p->scope != CONSTANTS || isint(p->type) || isptr(p->type)),
- p->x.name = p->name;
-}
-
-static void address(Symbol q, Symbol p, long n) {
- if (p->scope == GLOBAL
- || p->sclass == STATIC || p->sclass == EXTERN)
- q->x.name = stringf("%s%s%D", p->x.name,
- n >= 0 ? "+" : "", n);
- else {
- assert(n <= INT_MAX && n >= INT_MIN);
- q->x.offset = p->x.offset + n;
- q->x.name = stringd(q->x.offset);
- }
-}
-
-static void global(Symbol p) {
- if (p->u.seg == DATA || p->u.seg == LIT) {
- assert(p->type->align <= 8);
- print(".align %c\n", ".01.2...3"[p->type->align]);
- print("%s:\n", p->x.name);
- } else if (p->sclass == STATIC || Aflag >= 2)
- print(".lcomm %s,%d\n", p->x.name, p->type->size);
- else
- print( ".comm %s,%d\n", p->x.name, p->type->size);
-}
-
-static void segment(int n) {
- cseg = n;
- switch (n) {
- case DATA: print(".sdata\n"); break;
- case CODE: print(".text\n"); break;
- case LIT: print(".rdata\n"); break;
- }
-}
-
-static void space(int n) {
- if (cseg != BSS)
- print(".space %d\n", n);
-}
-
-static void blkloop(int dreg, int doff, int sreg, int soff, int size, int tmps[]) {
- int lab = genlabel(1);
-
- print("addq $%d,%d,$%d\n", sreg, size&~7, sreg);
- print("addq $%d,%d,$%d\n", dreg, size&~7, tmps[2]);
- blkcopy(tmps[2], doff, sreg, soff, size&7, tmps);
- print("L.%d:\n", lab);
- print("addq $%d,%d,$%d\n", sreg, -8, sreg);
- print("addq $%d,%d,$%d\n", tmps[2], -8, tmps[2]);
- blkcopy(tmps[2], doff, sreg, soff, 8, tmps);
- print("cmpult $%d,$%d,$23\nbne $23,L.%d\n", dreg, tmps[2], lab);
-}
-
-static void blkfetch(int size, int off, int reg, int tmp) {
- assert(size == 1 || size == 2 || size == 4 || size == 8);
- if (size == 1)
- print("ldb $%d,%d($%d)\n", tmp, off, reg);
- else if (size == 2)
- print("ldw $%d,%d($%d)\n", tmp, off, reg);
- else if (salign >= size && size == 4)
- print("ldl $%d,%d($%d)\n", tmp, off, reg);
- else if (salign >= size && size == 8)
- print("ldq $%d,%d($%d)\n", tmp, off, reg);
- else if (size == 4)
- print("uldl $%d,%d($%d)\n", tmp, off, reg);
- else
- print("uldq $%d,%d($%d)\n", tmp, off, reg);
-}
-
-static void blkstore(int size, int off, int reg, int tmp) {
- assert(size == 1 || size == 2 || size == 4 || size == 8);
- if (size == 1)
- print("stb $%d,%d($%d)\n", tmp, off, reg);
- else if (size == 2)
- print("stw $%d,%d($%d)\n", tmp, off, reg);
- else if (dalign >= size && size == 4)
- print("stl $%d,%d($%d)\n", tmp, off, reg);
- else if (dalign >= size && size == 8)
- print("stq $%d,%d($%d)\n", tmp, off, reg);
- else if (size == 4)
- print("ustl $%d,%d($%d)\n", tmp, off, reg);
- else
- print("ustq $%d,%d($%d)\n", tmp, off, reg);
-}
-
-/* stabinit - initialize stab output */
-static void stabinit(char *file, int argc, char *argv[]) {
- if (file) {
- print(".file 2,\"%s\"\n", file);
- currentfile = file;
- }
-}
-
-/* stabline - emit stab entry for source coordinate *cp */
-static void stabline(Coordinate *cp) {
- if (cp->file && cp->file != currentfile) {
- print(".file 2,\"%s\"\n", cp->file);
- currentfile = cp->file;
- }
- print(".loc 2,%d\n", cp->y);
-}
-
-/* stabsym - output a stab entry for symbol p */
-static void stabsym(Symbol p) {
- if (p == cfunc && IR->stabline)
- (*IR->stabline)(&p->src);
-}
-Interface alphaIR = {
- 1, 1, 0, /* char */
- 2, 2, 0, /* short */
- 4, 4, 0, /* int */
- 8, 8, 0, /* long */
- 8, 8, 0, /* long long */
- 4, 4, 1, /* float */
- 8, 8, 1, /* double */
- 8, 8, 1, /* long double */
- 8, 8, 0, /* T * */
- 0, 1, 0, /* struct */
-
- 1, /* little_endian */
- 0, /* mulops_calls */
- 0, /* wants_callb */
- 1, /* wants_argb */
- 1, /* left_to_right */
- 0, /* wants_dag */
- 0, /* unsigned_char */
- address,
- blockbeg,
- blockend,
- defaddress,
- defconst,
- defstring,
- defsymbol,
- emit,
- export,
- function,
- gen,
- global,
- import,
- local,
- progbeg,
- progend,
- segment,
- space,
- 0, 0, 0, stabinit, stabline, stabsym, 0,
- {
- 1, /* max_unaligned_load */
- rmap,
- blkfetch, blkstore, blkloop,
- _label,
- _rule,
- _nts,
- _kids,
- _string,
- _templates,
- _isinstruction,
- _ntname,
- emit2,
- doarg,
- target,
- clobber,
-
- }
-
-};
-
-
-static char rcsid[] = "$Id: alpha.md 145 2001-10-17 21:53:10Z timo $";
-
diff --git a/code/tools/lcc/src/bind.c b/code/tools/lcc/src/bind.c
index c27036f..bc7b983 100644
--- a/code/tools/lcc/src/bind.c
+++ b/code/tools/lcc/src/bind.c
@@ -1,22 +1,7 @@
#include "c.h"
-extern Interface alphaIR;
-extern Interface mipsebIR, mipselIR;
-extern Interface sparcIR, solarisIR;
-extern Interface x86IR, x86linuxIR;
-extern Interface symbolicIR, symbolic64IR;
extern Interface nullIR;
extern Interface bytecodeIR;
Binding bindings[] = {
- /*{ "alpha/osf", &alphaIR },*/
- /*{ "mips/irix", &mipsebIR },*/
- /*{ "mips/ultrix", &mipselIR },*/
- /*{ "sparc/sun", &sparcIR },*/
- /*{ "sparc/solaris", &solarisIR },*/
- /*{ "x86/win32", &x86IR },*/
- /*{ "x86/linux", &x86linuxIR },*/
- { "symbolic/osf", &symbolic64IR },
- { "symbolic/irix", &symbolicIR },
- { "symbolic", &symbolicIR },
{ "null", &nullIR },
{ "bytecode", &bytecodeIR },
{ NULL, NULL },
diff --git a/code/tools/lcc/src/mips.md b/code/tools/lcc/src/mips.md
deleted file mode 100644
index 41f6d8c..0000000
--- a/code/tools/lcc/src/mips.md
+++ /dev/null
@@ -1,1120 +0,0 @@
-%{
-#define INTTMP 0x0100ff00
-#define INTVAR 0x40ff0000
-#define FLTTMP 0x000f0ff0
-#define FLTVAR 0xfff00000
-
-#define INTRET 0x00000004
-#define FLTRET 0x00000003
-
-#define readsreg(p) \
- (generic((p)->op)==INDIR && (p)->kids[0]->op==VREG+P)
-#define setsrc(d) ((d) && (d)->x.regnode && \
- (d)->x.regnode->set == src->x.regnode->set && \
- (d)->x.regnode->mask&src->x.regnode->mask)
-
-#define relink(a, b) ((b)->x.prev = (a), (a)->x.next = (b))
-
-#include "c.h"
-#define NODEPTR_TYPE Node
-#define OP_LABEL(p) ((p)->op)
-#define LEFT_CHILD(p) ((p)->kids[0])
-#define RIGHT_CHILD(p) ((p)->kids[1])
-#define STATE_LABEL(p) ((p)->x.state)
-static void address(Symbol, Symbol, long);
-static void blkfetch(int, int, int, int);
-static void blkloop(int, int, int, int, int, int[]);
-static void blkstore(int, int, int, int);
-static void defaddress(Symbol);
-static void defconst(int, int, Value);
-static void defstring(int, char *);
-static void defsymbol(Symbol);
-static void doarg(Node);
-static void emit2(Node);
-static void export(Symbol);
-static void clobber(Node);
-static void function(Symbol, Symbol [], Symbol [], int);
-static void global(Symbol);
-static void import(Symbol);
-static void local(Symbol);
-static void progbeg(int, char **);
-static void progend(void);
-static void segment(int);
-static void space(int);
-static void target(Node);
-static int bitcount (unsigned);
-static Symbol argreg (int, int, int, int, int);
-
-static Symbol ireg[32], freg2[32], d6;
-static Symbol iregw, freg2w;
-static int tmpregs[] = {3, 9, 10};
-static Symbol blkreg;
-
-static int gnum = 8;
-static int pic;
-
-static int cseg;
-%}
-%start stmt
-%term CNSTF4=4113
-%term CNSTF8=8209
-%term CNSTF16=16401
-%term CNSTI1=1045
-%term CNSTI2=2069
-%term CNSTI4=4117
-%term CNSTI8=8213
-%term CNSTP4=4119
-%term CNSTP8=8215
-%term CNSTU1=1046
-%term CNSTU2=2070
-%term CNSTU4=4118
-%term CNSTU8=8214
-
-%term ARGB=41
-%term ARGF4=4129
-%term ARGF8=8225
-%term ARGF16=16417
-%term ARGI4=4133
-%term ARGI8=8229
-%term ARGP4=4135
-%term ARGP8=8231
-%term ARGU4=4134
-%term ARGU8=8230
-
-%term ASGNB=57
-%term ASGNF4=4145
-%term ASGNF8=8241
-%term ASGNF16=16433
-%term ASGNI1=1077
-%term ASGNI2=2101
-%term ASGNI4=4149
-%term ASGNI8=8245
-%term ASGNP4=4151
-%term ASGNP8=8247
-%term ASGNU1=1078
-%term ASGNU2=2102
-%term ASGNU4=4150
-%term ASGNU8=8246
-
-%term INDIRB=73
-%term INDIRF4=4161
-%term INDIRF8=8257
-%term INDIRF16=16449
-%term INDIRI1=1093
-%term INDIRI2=2117
-%term INDIRI4=4165
-%term INDIRI8=8261
-%term INDIRP4=4167
-%term INDIRP8=8263
-%term INDIRU1=1094
-%term INDIRU2=2118
-%term INDIRU4=4166
-%term INDIRU8=8262
-
-%term CVFF4=4209
-%term CVFF8=8305
-%term CVFF16=16497
-%term CVFI4=4213
-%term CVFI8=8309
-
-%term CVIF4=4225
-%term CVIF8=8321
-%term CVIF16=16513
-%term CVII1=1157
-%term CVII2=2181
-%term CVII4=4229
-%term CVII8=8325
-%term CVIU1=1158
-%term CVIU2=2182
-%term CVIU4=4230
-%term CVIU8=8326
-
-%term CVPP4=4247
-%term CVPP8=8343
-%term CVPP16=16535
-%term CVPU4=4246
-%term CVPU8=8342
-
-%term CVUI1=1205
-%term CVUI2=2229
-%term CVUI4=4277
-%term CVUI8=8373
-%term CVUP4=4279
-%term CVUP8=8375
-%term CVUP16=16567
-%term CVUU1=1206
-%term CVUU2=2230
-%term CVUU4=4278
-%term CVUU8=8374
-
-%term NEGF4=4289
-%term NEGF8=8385
-%term NEGF16=16577
-%term NEGI4=4293
-%term NEGI8=8389
-
-%term CALLB=217
-%term CALLF4=4305
-%term CALLF8=8401
-%term CALLF16=16593
-%term CALLI4=4309
-%term CALLI8=8405
-%term CALLP4=4311
-%term CALLP8=8407
-%term CALLU4=4310
-%term CALLU8=8406
-%term CALLV=216
-
-%term RETF4=4337
-%term RETF8=8433
-%term RETF16=16625
-%term RETI4=4341
-%term RETI8=8437
-%term RETP4=4343
-%term RETP8=8439
-%term RETU4=4342
-%term RETU8=8438
-%term RETV=248
-
-%term ADDRGP4=4359
-%term ADDRGP8=8455
-
-%term ADDRFP4=4375
-%term ADDRFP8=8471
-
-%term ADDRLP4=4391
-%term ADDRLP8=8487
-
-%term ADDF4=4401
-%term ADDF8=8497
-%term ADDF16=16689
-%term ADDI4=4405
-%term ADDI8=8501
-%term ADDP4=4407
-%term ADDP8=8503
-%term ADDU4=4406
-%term ADDU8=8502
-
-%term SUBF4=4417
-%term SUBF8=8513
-%term SUBF16=16705
-%term SUBI4=4421
-%term SUBI8=8517
-%term SUBP4=4423
-%term SUBP8=8519
-%term SUBU4=4422
-%term SUBU8=8518
-
-%term LSHI4=4437
-%term LSHI8=8533
-%term LSHU4=4438
-%term LSHU8=8534
-
-%term MODI4=4453
-%term MODI8=8549
-%term MODU4=4454
-%term MODU8=8550
-
-%term RSHI4=4469
-%term RSHI8=8565
-%term RSHU4=4470
-%term RSHU8=8566
-
-%term BANDI4=4485
-%term BANDI8=8581
-%term BANDU4=4486
-%term BANDU8=8582
-
-%term BCOMI4=4501
-%term BCOMI8=8597
-%term BCOMU4=4502
-%term BCOMU8=8598
-
-%term BORI4=4517
-%term BORI8=8613
-%term BORU4=4518
-%term BORU8=8614
-
-%term BXORI4=4533
-%term BXORI8=8629
-%term BXORU4=4534
-%term BXORU8=8630
-
-%term DIVF4=4545
-%term DIVF8=8641
-%term DIVF16=16833
-%term DIVI4=4549
-%term DIVI8=8645
-%term DIVU4=4550
-%term DIVU8=8646
-
-%term MULF4=4561
-%term MULF8=8657
-%term MULF16=16849
-%term MULI4=4565
-%term MULI8=8661
-%term MULU4=4566
-%term MULU8=8662
-
-%term EQF4=4577
-%term EQF8=8673
-%term EQF16=16865
-%term EQI4=4581
-%term EQI8=8677
-%term EQU4=4582
-%term EQU8=8678
-
-%term GEF4=4593
-%term GEF8=8689
-%term GEI4=4597
-%term GEI8=8693
-%term GEI16=16885
-%term GEU4=4598
-%term GEU8=8694
-
-%term GTF4=4609
-%term GTF8=8705
-%term GTF16=16897
-%term GTI4=4613
-%term GTI8=8709
-%term GTU4=4614
-%term GTU8=8710
-
-%term LEF4=4625
-%term LEF8=8721
-%term LEF16=16913
-%term LEI4=4629
-%term LEI8=8725
-%term LEU4=4630
-%term LEU8=8726
-
-%term LTF4=4641
-%term LTF8=8737
-%term LTF16=16929
-%term LTI4=4645
-%term LTI8=8741
-%term LTU4=4646
-%term LTU8=8742
-
-%term NEF4=4657
-%term NEF8=8753
-%term NEF16=16945
-%term NEI4=4661
-%term NEI8=8757
-%term NEU4=4662
-%term NEU8=8758
-
-%term JUMPV=584
-
-%term LABELV=600
-
-%term LOADB=233
-%term LOADF4=4321
-%term LOADF8=8417
-%term LOADF16=16609
-%term LOADI1=1253
-%term LOADI2=2277
-%term LOADI4=4325
-%term LOADI8=8421
-%term LOADP4=4327
-%term LOADP8=8423
-%term LOADU1=1254
-%term LOADU2=2278
-%term LOADU4=4326
-%term LOADU8=8422
-
-%term VREGP=711
-%%
-reg: INDIRI1(VREGP) "# read register\n"
-reg: INDIRU1(VREGP) "# read register\n"
-
-reg: INDIRI2(VREGP) "# read register\n"
-reg: INDIRU2(VREGP) "# read register\n"
-
-reg: INDIRF4(VREGP) "# read register\n"
-reg: INDIRI4(VREGP) "# read register\n"
-reg: INDIRP4(VREGP) "# read register\n"
-reg: INDIRU4(VREGP) "# read register\n"
-
-reg: INDIRF8(VREGP) "# read register\n"
-reg: INDIRI8(VREGP) "# read register\n"
-reg: INDIRP8(VREGP) "# read register\n"
-reg: INDIRU8(VREGP) "# read register\n"
-
-stmt: ASGNI1(VREGP,reg) "# write register\n"
-stmt: ASGNU1(VREGP,reg) "# write register\n"
-
-stmt: ASGNI2(VREGP,reg) "# write register\n"
-stmt: ASGNU2(VREGP,reg) "# write register\n"
-
-stmt: ASGNF4(VREGP,reg) "# write register\n"
-stmt: ASGNI4(VREGP,reg) "# write register\n"
-stmt: ASGNP4(VREGP,reg) "# write register\n"
-stmt: ASGNU4(VREGP,reg) "# write register\n"
-
-stmt: ASGNF8(VREGP,reg) "# write register\n"
-stmt: ASGNI8(VREGP,reg) "# write register\n"
-stmt: ASGNP8(VREGP,reg) "# write register\n"
-stmt: ASGNU8(VREGP,reg) "# write register\n"
-con: CNSTI1 "%a"
-con: CNSTU1 "%a"
-
-con: CNSTI2 "%a"
-con: CNSTU2 "%a"
-
-con: CNSTI4 "%a"
-con: CNSTU4 "%a"
-con: CNSTP4 "%a"
-
-con: CNSTI8 "%a"
-con: CNSTU8 "%a"
-con: CNSTP8 "%a"
-stmt: reg ""
-acon: con "%0"
-acon: ADDRGP4 "%a"
-addr: ADDI4(reg,acon) "%1($%0)"
-addr: ADDU4(reg,acon) "%1($%0)"
-addr: ADDP4(reg,acon) "%1($%0)"
-addr: acon "%0"
-addr: reg "($%0)"
-addr: ADDRFP4 "%a+%F($sp)"
-addr: ADDRLP4 "%a+%F($sp)"
-reg: addr "la $%c,%0\n" 1
-reg: CNSTI1 "# reg\n" range(a, 0, 0)
-reg: CNSTI2 "# reg\n" range(a, 0, 0)
-reg: CNSTI4 "# reg\n" range(a, 0, 0)
-reg: CNSTU1 "# reg\n" range(a, 0, 0)
-reg: CNSTU2 "# reg\n" range(a, 0, 0)
-reg: CNSTU4 "# reg\n" range(a, 0, 0)
-reg: CNSTP4 "# reg\n" range(a, 0, 0)
-stmt: ASGNI1(addr,reg) "sb $%1,%0\n" 1
-stmt: ASGNU1(addr,reg) "sb $%1,%0\n" 1
-stmt: ASGNI2(addr,reg) "sh $%1,%0\n" 1
-stmt: ASGNU2(addr,reg) "sh $%1,%0\n" 1
-stmt: ASGNI4(addr,reg) "sw $%1,%0\n" 1
-stmt: ASGNU4(addr,reg) "sw $%1,%0\n" 1
-stmt: ASGNP4(addr,reg) "sw $%1,%0\n" 1
-reg: INDIRI1(addr) "lb $%c,%0\n" 1
-reg: INDIRU1(addr) "lbu $%c,%0\n" 1
-reg: INDIRI2(addr) "lh $%c,%0\n" 1
-reg: INDIRU2(addr) "lhu $%c,%0\n" 1
-reg: INDIRI4(addr) "lw $%c,%0\n" 1
-reg: INDIRU4(addr) "lw $%c,%0\n" 1
-reg: INDIRP4(addr) "lw $%c,%0\n" 1
-
-reg: CVII4(INDIRI1(addr)) "lb $%c,%0\n" 1
-reg: CVII4(INDIRI2(addr)) "lh $%c,%0\n" 1
-reg: CVUU4(INDIRU1(addr)) "lbu $%c,%0\n" 1
-reg: CVUU4(INDIRU2(addr)) "lhu $%c,%0\n" 1
-reg: CVUI4(INDIRU1(addr)) "lbu $%c,%0\n" 1
-reg: CVUI4(INDIRU2(addr)) "lhu $%c,%0\n" 1
-reg: INDIRF4(addr) "l.s $f%c,%0\n" 1
-reg: INDIRF8(addr) "l.d $f%c,%0\n" 1
-stmt: ASGNF4(addr,reg) "s.s $f%1,%0\n" 1
-stmt: ASGNF8(addr,reg) "s.d $f%1,%0\n" 1
-reg: DIVI4(reg,reg) "div $%c,$%0,$%1\n" 1
-reg: DIVU4(reg,reg) "divu $%c,$%0,$%1\n" 1
-reg: MODI4(reg,reg) "rem $%c,$%0,$%1\n" 1
-reg: MODU4(reg,reg) "remu $%c,$%0,$%1\n" 1
-reg: MULI4(reg,reg) "mul $%c,$%0,$%1\n" 1
-reg: MULU4(reg,reg) "mul $%c,$%0,$%1\n" 1
-rc: con "%0"
-rc: reg "$%0"
-
-reg: ADDI4(reg,rc) "addu $%c,$%0,%1\n" 1
-reg: ADDP4(reg,rc) "addu $%c,$%0,%1\n" 1
-reg: ADDU4(reg,rc) "addu $%c,$%0,%1\n" 1
-reg: BANDI4(reg,rc) "and $%c,$%0,%1\n" 1
-reg: BORI4(reg,rc) "or $%c,$%0,%1\n" 1
-reg: BXORI4(reg,rc) "xor $%c,$%0,%1\n" 1
-reg: BANDU4(reg,rc) "and $%c,$%0,%1\n" 1
-reg: BORU4(reg,rc) "or $%c,$%0,%1\n" 1
-reg: BXORU4(reg,rc) "xor $%c,$%0,%1\n" 1
-reg: SUBI4(reg,rc) "subu $%c,$%0,%1\n" 1
-reg: SUBP4(reg,rc) "subu $%c,$%0,%1\n" 1
-reg: SUBU4(reg,rc) "subu $%c,$%0,%1\n" 1
-rc5: CNSTI4 "%a" range(a,0,31)
-rc5: reg "$%0"
-
-reg: LSHI4(reg,rc5) "sll $%c,$%0,%1\n" 1
-reg: LSHU4(reg,rc5) "sll $%c,$%0,%1\n" 1
-reg: RSHI4(reg,rc5) "sra $%c,$%0,%1\n" 1
-reg: RSHU4(reg,rc5) "srl $%c,$%0,%1\n" 1
-reg: BCOMI4(reg) "not $%c,$%0\n" 1
-reg: BCOMU4(reg) "not $%c,$%0\n" 1
-reg: NEGI4(reg) "negu $%c,$%0\n" 1
-reg: LOADI1(reg) "move $%c,$%0\n" move(a)
-reg: LOADU1(reg) "move $%c,$%0\n" move(a)
-reg: LOADI2(reg) "move $%c,$%0\n" move(a)
-reg: LOADU2(reg) "move $%c,$%0\n" move(a)
-reg: LOADI4(reg) "move $%c,$%0\n" move(a)
-reg: LOADP4(reg) "move $%c,$%0\n" move(a)
-reg: LOADU4(reg) "move $%c,$%0\n" move(a)
-reg: ADDF4(reg,reg) "add.s $f%c,$f%0,$f%1\n" 1
-reg: ADDF8(reg,reg) "add.d $f%c,$f%0,$f%1\n" 1
-reg: DIVF4(reg,reg) "div.s $f%c,$f%0,$f%1\n" 1
-reg: DIVF8(reg,reg) "div.d $f%c,$f%0,$f%1\n" 1
-reg: MULF4(reg,reg) "mul.s $f%c,$f%0,$f%1\n" 1
-reg: MULF8(reg,reg) "mul.d $f%c,$f%0,$f%1\n" 1
-reg: SUBF4(reg,reg) "sub.s $f%c,$f%0,$f%1\n" 1
-reg: SUBF8(reg,reg) "sub.d $f%c,$f%0,$f%1\n" 1
-reg: LOADF4(reg) "mov.s $f%c,$f%0\n" move(a)
-reg: LOADF8(reg) "mov.d $f%c,$f%0\n" move(a)
-reg: NEGF4(reg) "neg.s $f%c,$f%0\n" 1
-reg: NEGF8(reg) "neg.d $f%c,$f%0\n" 1
-reg: CVII4(reg) "sll $%c,$%0,8*(4-%a); sra $%c,$%c,8*(4-%a)\n" 2
-reg: CVUI4(reg) "and $%c,$%0,(1<<(8*%a))-1\n" 1
-reg: CVUU4(reg) "and $%c,$%0,(1<<(8*%a))-1\n" 1
-reg: CVFF4(reg) "cvt.s.d $f%c,$f%0\n" 1
-reg: CVFF8(reg) "cvt.d.s $f%c,$f%0\n" 1
-reg: CVIF4(reg) "mtc1 $%0,$f%c; cvt.s.w $f%c,$f%c\n" 2
-reg: CVIF8(reg) "mtc1 $%0,$f%c; cvt.d.w $f%c,$f%c\n" 2
-reg: CVFI4(reg) "trunc.w.s $f2,$f%0,$%c; mfc1 $%c,$f2\n" (a->syms[0]->u.c.v.i==4?2:LBURG_MAX)
-reg: CVFI4(reg) "trunc.w.d $f2,$f%0,$%c; mfc1 $%c,$f2\n" (a->syms[0]->u.c.v.i==8?2:LBURG_MAX)
-stmt: LABELV "%a:\n"
-stmt: JUMPV(acon) "b %0\n" 1
-stmt: JUMPV(reg) ".cpadd $%0\nj $%0\n" !pic
-stmt: JUMPV(reg) "j $%0\n" pic
-stmt: EQI4(reg,reg) "beq $%0,$%1,%a\n" 1
-stmt: EQU4(reg,reg) "beq $%0,$%1,%a\n" 1
-stmt: GEI4(reg,reg) "bge $%0,$%1,%a\n" 1
-stmt: GEU4(reg,reg) "bgeu $%0,$%1,%a\n" 1
-stmt: GTI4(reg,reg) "bgt $%0,$%1,%a\n" 1
-stmt: GTU4(reg,reg) "bgtu $%0,$%1,%a\n" 1
-stmt: LEI4(reg,reg) "ble $%0,$%1,%a\n" 1
-stmt: LEU4(reg,reg) "bleu $%0,$%1,%a\n" 1
-stmt: LTI4(reg,reg) "blt $%0,$%1,%a\n" 1
-stmt: LTU4(reg,reg) "bltu $%0,$%1,%a\n" 1
-stmt: NEI4(reg,reg) "bne $%0,$%1,%a\n" 1
-stmt: NEU4(reg,reg) "bne $%0,$%1,%a\n" 1
-stmt: EQF4(reg,reg) "c.eq.s $f%0,$f%1; bc1t %a\n" 2
-stmt: EQF8(reg,reg) "c.eq.d $f%0,$f%1; bc1t %a\n" 2
-stmt: LEF4(reg,reg) "c.le.s $f%0,$f%1; bc1t %a\n" 2
-stmt: LEF8(reg,reg) "c.le.d $f%0,$f%1; bc1t %a\n" 2
-stmt: LTF4(reg,reg) "c.lt.s $f%0,$f%1; bc1t %a\n" 2
-stmt: LTF8(reg,reg) "c.lt.d $f%0,$f%1; bc1t %a\n" 2
-stmt: GEF4(reg,reg) "c.lt.s $f%0,$f%1; bc1f %a\n" 2
-stmt: GEF8(reg,reg) "c.lt.d $f%0,$f%1; bc1f %a\n" 2
-stmt: GTF4(reg,reg) "c.le.s $f%0,$f%1; bc1f %a\n" 2
-stmt: GTF8(reg,reg) "c.le.d $f%0,$f%1; bc1f %a\n" 2
-stmt: NEF4(reg,reg) "c.eq.s $f%0,$f%1; bc1f %a\n" 2
-stmt: NEF8(reg,reg) "c.eq.d $f%0,$f%1; bc1f %a\n" 2
-ar: ADDRGP4 "%a"
-
-reg: CALLF4(ar) "jal %0\n" 1
-reg: CALLF8(ar) "jal %0\n" 1
-reg: CALLI4(ar) "jal %0\n" 1
-reg: CALLP4(ar) "jal %0\n" 1
-reg: CALLU4(ar) "jal %0\n" 1
-stmt: CALLV(ar) "jal %0\n" 1
-ar: reg "$%0"
-ar: CNSTP4 "%a" range(a, 0, 0x0fffffff)
-stmt: RETF4(reg) "# ret\n" 1
-stmt: RETF8(reg) "# ret\n" 1
-stmt: RETI4(reg) "# ret\n" 1
-stmt: RETU4(reg) "# ret\n" 1
-stmt: RETP4(reg) "# ret\n" 1
-stmt: RETV(reg) "# ret\n" 1
-stmt: ARGF4(reg) "# arg\n" 1
-stmt: ARGF8(reg) "# arg\n" 1
-stmt: ARGI4(reg) "# arg\n" 1
-stmt: ARGP4(reg) "# arg\n" 1
-stmt: ARGU4(reg) "# arg\n" 1
-
-stmt: ARGB(INDIRB(reg)) "# argb %0\n" 1
-stmt: ASGNB(reg,INDIRB(reg)) "# asgnb %0 %1\n" 1
-%%
-static void progend(void){}
-static void progbeg(int argc, char *argv[]) {
- int i;
-
- {
- union {
- char c;
- int i;
- } u;
- u.i = 0;
- u.c = 1;
- swap = ((int)(u.i == 1)) != IR->little_endian;
- }
- print(".set reorder\n");
- pic = !IR->little_endian;
- parseflags(argc, argv);
- for (i = 0; i < argc; i++)
- if (strncmp(argv[i], "-G", 2) == 0)
- gnum = atoi(argv[i] + 2);
- else if (strcmp(argv[i], "-pic=1") == 0
- || strcmp(argv[i], "-pic=0") == 0)
- pic = argv[i][5]-'0';
- for (i = 0; i < 31; i += 2)
- freg2[i] = mkreg("%d", i, 3, FREG);
- for (i = 0; i < 32; i++)
- ireg[i] = mkreg("%d", i, 1, IREG);
- ireg[29]->x.name = "sp";
- d6 = mkreg("6", 6, 3, IREG);
- freg2w = mkwildcard(freg2);
- iregw = mkwildcard(ireg);
- tmask[IREG] = INTTMP; tmask[FREG] = FLTTMP;
- vmask[IREG] = INTVAR; vmask[FREG] = FLTVAR;
- blkreg = mkreg("8", 8, 7, IREG);
-}
-static Symbol rmap(int opk) {
- switch (optype(opk)) {
- case I: case U: case P: case B:
- return iregw;
- case F:
- return freg2w;
- default:
- return 0;
- }
-}
-static void target(Node p) {
- assert(p);
- switch (specific(p->op)) {
- case CNST+I: case CNST+U: case CNST+P:
- if (range(p, 0, 0) == 0) {
- setreg(p, ireg[0]);
- p->x.registered = 1;
- }
- break;
- case CALL+V:
- rtarget(p, 0, ireg[25]);
- break;
- case CALL+F:
- rtarget(p, 0, ireg[25]);
- setreg(p, freg2[0]);
- break;
- case CALL+I: case CALL+P: case CALL+U:
- rtarget(p, 0, ireg[25]);
- setreg(p, ireg[2]);
- break;
- case RET+F:
- rtarget(p, 0, freg2[0]);
- break;
- case RET+I: case RET+U: case RET+P:
- rtarget(p, 0, ireg[2]);
- break;
- case ARG+F: case ARG+I: case ARG+P: case ARG+U: {
- static int ty0;
- int ty = optype(p->op);
- Symbol q;
-
- q = argreg(p->x.argno, p->syms[2]->u.c.v.i, ty, opsize(p->op), ty0);
- if (p->x.argno == 0)
- ty0 = ty;
- if (q &&
- !(ty == F && q->x.regnode->set == IREG))
- rtarget(p, 0, q);
- break;
- }
- case ASGN+B: rtarget(p->kids[1], 0, blkreg); break;
- case ARG+B: rtarget(p->kids[0], 0, blkreg); break;
- }
-}
-static void clobber(Node p) {
- assert(p);
- switch (specific(p->op)) {
- case CALL+F:
- spill(INTTMP | INTRET, IREG, p);
- spill(FLTTMP, FREG, p);
- break;
- case CALL+I: case CALL+P: case CALL+U:
- spill(INTTMP, IREG, p);
- spill(FLTTMP | FLTRET, FREG, p);
- break;
- case CALL+V:
- spill(INTTMP | INTRET, IREG, p);
- spill(FLTTMP | FLTRET, FREG, p);
- break;
- }
-}
-static void emit2(Node p) {
- int dst, n, src, sz, ty;
- static int ty0;
- Symbol q;
-
- switch (specific(p->op)) {
- case ARG+F: case ARG+I: case ARG+P: case ARG+U:
- ty = optype(p->op);
- sz = opsize(p->op);
- if (p->x.argno == 0)
- ty0 = ty;
- q = argreg(p->x.argno, p->syms[2]->u.c.v.i, ty, sz, ty0);
- src = getregnum(p->x.kids[0]);
- if (q == NULL && ty == F && sz == 4)
- print("s.s $f%d,%d($sp)\n", src, p->syms[2]->u.c.v.i);
- else if (q == NULL && ty == F)
- print("s.d $f%d,%d($sp)\n", src, p->syms[2]->u.c.v.i);
- else if (q == NULL)
- print("sw $%d,%d($sp)\n", src, p->syms[2]->u.c.v.i);
- else if (ty == F && sz == 4 && q->x.regnode->set == IREG)
- print("mfc1 $%d,$f%d\n", q->x.regnode->number, src);
- else if (ty == F && q->x.regnode->set == IREG)
- print("mfc1.d $%d,$f%d\n", q->x.regnode->number, src);
- break;
- case ASGN+B:
- dalign = salign = p->syms[1]->u.c.v.i;
- blkcopy(getregnum(p->x.kids[0]), 0,
- getregnum(p->x.kids[1]), 0,
- p->syms[0]->u.c.v.i, tmpregs);
- break;
- case ARG+B:
- dalign = 4;
- salign = p->syms[1]->u.c.v.i;
- blkcopy(29, p->syms[2]->u.c.v.i,
- getregnum(p->x.kids[0]), 0,
- p->syms[0]->u.c.v.i, tmpregs);
- n = p->syms[2]->u.c.v.i + p->syms[0]->u.c.v.i;
- dst = p->syms[2]->u.c.v.i;
- for ( ; dst <= 12 && dst < n; dst += 4)
- print("lw $%d,%d($sp)\n", (dst/4)+4, dst);
- break;
- }
-}
-static Symbol argreg(int argno, int offset, int ty, int sz, int ty0) {
- assert((offset&3) == 0);
- if (offset > 12)
- return NULL;
- else if (argno == 0 && ty == F)
- return freg2[12];
- else if (argno == 1 && ty == F && ty0 == F)
- return freg2[14];
- else if (argno == 1 && ty == F && sz == 8)
- return d6; /* Pair! */
- else
- return ireg[(offset/4) + 4];
-}
-static void doarg(Node p) {
- static int argno;
- int align;
-
- if (argoffset == 0)
- argno = 0;
- p->x.argno = argno++;
- align = p->syms[1]->u.c.v.i < 4 ? 4 : p->syms[1]->u.c.v.i;
- p->syms[2] = intconst(mkactual(align,
- p->syms[0]->u.c.v.i));
-}
-static void local(Symbol p) {
- if (askregvar(p, rmap(ttob(p->type))) == 0)
- mkauto(p);
-}
-static void function(Symbol f, Symbol caller[], Symbol callee[], int ncalls) {
- int i, saved, sizefsave, sizeisave, varargs;
- Symbol r, argregs[4];
-
- usedmask[0] = usedmask[1] = 0;
- freemask[0] = freemask[1] = ~(unsigned)0;
- offset = maxoffset = maxargoffset = 0;
- for (i = 0; callee[i]; i++)
- ;
- varargs = variadic(f->type)
- || i > 0 && strcmp(callee[i-1]->name, "va_alist") == 0;
- for (i = 0; callee[i]; i++) {
- Symbol p = callee[i];
- Symbol q = caller[i];
- assert(q);
- offset = roundup(offset, q->type->align);
- p->x.offset = q->x.offset = offset;
- p->x.name = q->x.name = stringd(offset);
- r = argreg(i, offset, optype(ttob(q->type)), q->type->size, optype(ttob(caller[0]->type)));
- if (i < 4)
- argregs[i] = r;
- offset = roundup(offset + q->type->size, 4);
- if (varargs)
- p->sclass = AUTO;
- else if (r && ncalls == 0 &&
- !isstruct(q->type) && !p->addressed &&
- !(isfloat(q->type) && r->x.regnode->set == IREG)
-) {
- p->sclass = q->sclass = REGISTER;
- askregvar(p, r);
- assert(p->x.regnode && p->x.regnode->vbl == p);
- q->x = p->x;
- q->type = p->type;
- }
- else if (askregvar(p, rmap(ttob(p->type)))
- && r != NULL
- && (isint(p->type) || p->type == q->type)) {
- assert(q->sclass != REGISTER);
- p->sclass = q->sclass = REGISTER;
- q->type = p->type;
- }
- }
- assert(!caller[i]);
- offset = 0;
- gencode(caller, callee);
- if (ncalls)
- usedmask[IREG] |= ((unsigned)1)<<31;
- usedmask[IREG] &= 0xc0ff0000;
- usedmask[FREG] &= 0xfff00000;
- if (pic && ncalls)
- usedmask[IREG] |= 1<<25;
- maxargoffset = roundup(maxargoffset, usedmask[FREG] ? 8 : 4);
- if (ncalls && maxargoffset < 16)
- maxargoffset = 16;
- sizefsave = 4*bitcount(usedmask[FREG]);
- sizeisave = 4*bitcount(usedmask[IREG]);
- framesize = roundup(maxargoffset + sizefsave
- + sizeisave + maxoffset, 8);
- segment(CODE);
- print(".align 2\n");
- print(".ent %s\n", f->x.name);
- print("%s:\n", f->x.name);
- i = maxargoffset + sizefsave - framesize;
- print(".frame $sp,%d,$31\n", framesize);
- if (pic)
- print(".set noreorder\n.cpload $25\n.set reorder\n");
- if (framesize > 0)
- print("addu $sp,$sp,%d\n", -framesize);
- if (usedmask[FREG])
- print(".fmask 0x%x,%d\n", usedmask[FREG], i - 8);
- if (usedmask[IREG])
- print(".mask 0x%x,%d\n", usedmask[IREG],
- i + sizeisave - 4);
- saved = maxargoffset;
- for (i = 20; i <= 30; i += 2)
- if (usedmask[FREG]&(3<<i)) {
- print("s.d $f%d,%d($sp)\n", i, saved);
- saved += 8;
- }
-
- for (i = 16; i <= 31; i++)
- if (usedmask[IREG]&(1<<i)) {
- if (i == 25)
- print(".cprestore %d\n", saved);
- else
- print("sw $%d,%d($sp)\n", i, saved);
- saved += 4;
- }
- for (i = 0; i < 4 && callee[i]; i++) {
- r = argregs[i];
- if (r && r->x.regnode != callee[i]->x.regnode) {
- Symbol out = callee[i];
- Symbol in = caller[i];
- int rn = r->x.regnode->number;
- int rs = r->x.regnode->set;
- int tyin = ttob(in->type);
-
- assert(out && in && r && r->x.regnode);
- assert(out->sclass != REGISTER || out->x.regnode);
- if (out->sclass == REGISTER
- && (isint(out->type) || out->type == in->type)) {
- int outn = out->x.regnode->number;
- if (rs == FREG && tyin == F+sizeop(8))
- print("mov.d $f%d,$f%d\n", outn, rn);
- else if (rs == FREG && tyin == F+sizeop(4))
- print("mov.s $f%d,$f%d\n", outn, rn);
- else if (rs == IREG && tyin == F+sizeop(8))
- print("mtc1.d $%d,$f%d\n", rn, outn);
- else if (rs == IREG && tyin == F+sizeop(4))
- print("mtc1 $%d,$f%d\n", rn, outn);
- else
- print("move $%d,$%d\n", outn, rn);
- } else {
- int off = in->x.offset + framesize;
- if (rs == FREG && tyin == F+sizeop(8))
- print("s.d $f%d,%d($sp)\n", rn, off);
- else if (rs == FREG && tyin == F+sizeop(4))
- print("s.s $f%d,%d($sp)\n", rn, off);
- else {
- int i, n = (in->type->size + 3)/4;
- for (i = rn; i < rn+n && i <= 7; i++)
- print("sw $%d,%d($sp)\n", i, off + (i-rn)*4);
- }
- }
- }
- }
- if (varargs && callee[i-1]) {
- i = callee[i-1]->x.offset + callee[i-1]->type->size;
- for (i = roundup(i, 4)/4; i <= 3; i++)
- print("sw $%d,%d($sp)\n", i + 4, framesize + 4*i);
- }
- emitcode();
- saved = maxargoffset;
- for (i = 20; i <= 30; i += 2)
- if (usedmask[FREG]&(3<<i)) {
- print("l.d $f%d,%d($sp)\n", i, saved);
- saved += 8;
- }
- for (i = 16; i <= 31; i++)
- if (usedmask[IREG]&(1<<i)) {
- print("lw $%d,%d($sp)\n", i, saved);
- saved += 4;
- }
- if (framesize > 0)
- print("addu $sp,$sp,%d\n", framesize);
- print("j $31\n");
- print(".end %s\n", f->x.name);
-}
-static void defconst(int suffix, int size, Value v) {
- if (suffix == F && size == 4) {
- float f = v.d;
- print(".word 0x%x\n", *(unsigned *)&f);
- }
- else if (suffix == F && size == 8) {
- double d = v.d;
- unsigned *p = (unsigned *)&d;
- print(".word 0x%x\n.word 0x%x\n", p[swap], p[!swap]);
- }
- else if (suffix == P)
- print(".word 0x%x\n", v.p);
- else if (size == 1)
- print(".byte 0x%x\n", suffix == I ? v.i : v.u);
- else if (size == 2)
- print(".half 0x%x\n", suffix == I ? v.i : v.u);
- else if (size == 4)
- print(".word 0x%x\n", suffix == I ? v.i : v.u);
-}
-static void defaddress(Symbol p) {
- if (pic && p->scope == LABELS)
- print(".gpword %s\n", p->x.name);
- else
- print(".word %s\n", p->x.name);
-}
-static void defstring(int n, char *str) {
- char *s;
-
- for (s = str; s < str + n; s++)
- print(".byte %d\n", (*s)&0377);
-}
-static void export(Symbol p) {
- print(".globl %s\n", p->x.name);
-}
-static void import(Symbol p) {
- if (!isfunc(p->type))
- print(".extern %s %d\n", p->name, p->type->size);
-}
-static void defsymbol(Symbol p) {
- if (p->scope >= LOCAL && p->sclass == STATIC)
- p->x.name = stringf("L.%d", genlabel(1));
- else if (p->generated)
- p->x.name = stringf("L.%s", p->name);
- else
- assert(p->scope != CONSTANTS || isint(p->type) || isptr(p->type)),
- p->x.name = p->name;
-}
-static void address(Symbol q, Symbol p, long n) {
- if (p->scope == GLOBAL
- || p->sclass == STATIC || p->sclass == EXTERN)
- q->x.name = stringf("%s%s%D", p->x.name,
- n >= 0 ? "+" : "", n);
- else {
- assert(n <= INT_MAX && n >= INT_MIN);
- q->x.offset = p->x.offset + n;
- q->x.name = stringd(q->x.offset);
- }
-}
-static void global(Symbol p) {
- if (p->u.seg == BSS) {
- if (p->sclass == STATIC || Aflag >= 2)
- print(".lcomm %s,%d\n", p->x.name, p->type->size);
- else
- print( ".comm %s,%d\n", p->x.name, p->type->size);
- } else {
- if (p->u.seg == DATA
- && (p->type->size == 0 || p->type->size > gnum))
- print(".data\n");
- else if (p->u.seg == DATA)
- print(".sdata\n");
- print(".align %c\n", ".01.2...3"[p->type->align]);
- print("%s:\n", p->x.name);
- }
-}
-static void segment(int n) {
- cseg = n;
- switch (n) {
- case CODE: print(".text\n"); break;
- case LIT: print(".rdata\n"); break;
- }
-}
-static void space(int n) {
- if (cseg != BSS)
- print(".space %d\n", n);
-}
-static void blkloop(int dreg, int doff, int sreg, int soff, int size, int tmps[]) {
- int lab = genlabel(1);
-
- print("addu $%d,$%d,%d\n", sreg, sreg, size&~7);
- print("addu $%d,$%d,%d\n", tmps[2], dreg, size&~7);
- blkcopy(tmps[2], doff, sreg, soff, size&7, tmps);
- print("L.%d:\n", lab);
- print("addu $%d,$%d,%d\n", sreg, sreg, -8);
- print("addu $%d,$%d,%d\n", tmps[2], tmps[2], -8);
- blkcopy(tmps[2], doff, sreg, soff, 8, tmps);
- print("bltu $%d,$%d,L.%d\n", dreg, tmps[2], lab);
-}
-static void blkfetch(int size, int off, int reg, int tmp) {
- assert(size == 1 || size == 2 || size == 4);
- if (size == 1)
- print("lbu $%d,%d($%d)\n", tmp, off, reg);
- else if (salign >= size && size == 2)
- print("lhu $%d,%d($%d)\n", tmp, off, reg);
- else if (salign >= size)
- print("lw $%d,%d($%d)\n", tmp, off, reg);
- else if (size == 2)
- print("ulhu $%d,%d($%d)\n", tmp, off, reg);
- else
- print("ulw $%d,%d($%d)\n", tmp, off, reg);
-}
-static void blkstore(int size, int off, int reg, int tmp) {
- if (size == 1)
- print("sb $%d,%d($%d)\n", tmp, off, reg);
- else if (dalign >= size && size == 2)
- print("sh $%d,%d($%d)\n", tmp, off, reg);
- else if (dalign >= size)
- print("sw $%d,%d($%d)\n", tmp, off, reg);
- else if (size == 2)
- print("ush $%d,%d($%d)\n", tmp, off, reg);
- else
- print("usw $%d,%d($%d)\n", tmp, off, reg);
-}
-static void stabinit(char *, int, char *[]);
-static void stabline(Coordinate *);
-static void stabsym(Symbol);
-
-static char *currentfile;
-
-static int bitcount(unsigned mask) {
- unsigned i, n = 0;
-
- for (i = 1; i; i <<= 1)
- if (mask&i)
- n++;
- return n;
-}
-
-/* stabinit - initialize stab output */
-static void stabinit(char *file, int argc, char *argv[]) {
- if (file) {
- print(".file 2,\"%s\"\n", file);
- currentfile = file;
- }
-}
-
-/* stabline - emit stab entry for source coordinate *cp */
-static void stabline(Coordinate *cp) {
- if (cp->file && cp->file != currentfile) {
- print(".file 2,\"%s\"\n", cp->file);
- currentfile = cp->file;
- }
- print(".loc 2,%d\n", cp->y);
-}
-
-/* stabsym - output a stab entry for symbol p */
-static void stabsym(Symbol p) {
- if (p == cfunc && IR->stabline)
- (*IR->stabline)(&p->src);
-}
-Interface mipsebIR = {
- 1, 1, 0, /* char */
- 2, 2, 0, /* short */
- 4, 4, 0, /* int */
- 4, 4, 0, /* long */
- 4, 4, 0, /* long long */
- 4, 4, 1, /* float */
- 8, 8, 1, /* double */
- 8, 8, 1, /* long double */
- 4, 4, 0, /* T * */
- 0, 1, 0, /* struct */
- 0, /* little_endian */
- 0, /* mulops_calls */
- 0, /* wants_callb */
- 1, /* wants_argb */
- 1, /* left_to_right */
- 0, /* wants_dag */
- 0, /* unsigned_char */
- address,
- blockbeg,
- blockend,
- defaddress,
- defconst,
- defstring,
- defsymbol,
- emit,
- export,
- function,
- gen,
- global,
- import,
- local,
- progbeg,
- progend,
- segment,
- space,
- 0, 0, 0, stabinit, stabline, stabsym, 0,
- {
- 4, /* max_unaligned_load */
- rmap,
- blkfetch, blkstore, blkloop,
- _label,
- _rule,
- _nts,
- _kids,
- _string,
- _templates,
- _isinstruction,
- _ntname,
- emit2,
- doarg,
- target,
- clobber,
-
- }
-}, mipselIR = {
- 1, 1, 0, /* char */
- 2, 2, 0, /* short */
- 4, 4, 0, /* int */
- 4, 4, 0, /* long */
- 4, 4, 0, /* long long */
- 4, 4, 1, /* float */
- 8, 8, 1, /* double */
- 8, 8, 1, /* long double */
- 4, 4, 0, /* T * */
- 0, 1, 0, /* struct */
- 1, /* little_endian */
- 0, /* mulops_calls */
- 0, /* wants_callb */
- 1, /* wants_argb */
- 1, /* left_to_right */
- 0, /* wants_dag */
- 0, /* unsigned_char */
- address,
- blockbeg,
- blockend,
- defaddress,
- defconst,
- defstring,
- defsymbol,
- emit,
- export,
- function,
- gen,
- global,
- import,
- local,
- progbeg,
- progend,
- segment,
- space,
- 0, 0, 0, stabinit, stabline, stabsym, 0,
- {
- 4, /* max_unaligned_load */
- rmap,
- blkfetch, blkstore, blkloop,
- _label,
- _rule,
- _nts,
- _kids,
- _string,
- _templates,
- _isinstruction,
- _ntname,
- emit2,
- doarg,
- target,
- clobber,
-
- }
-};
-static char rcsid[] = "$Id: mips.md 145 2001-10-17 21:53:10Z timo $";
diff --git a/code/tools/lcc/src/pass2.c b/code/tools/lcc/src/pass2.c
deleted file mode 100644
index 08d73cf..0000000
--- a/code/tools/lcc/src/pass2.c
+++ /dev/null
@@ -1,665 +0,0 @@
-#include "c.h"
-#include "rcc.h"
-#if WIN32
-#include <fcntl.h>
-#include <io.h>
-#endif
-
-
-Interface *IR = NULL;
-int Aflag; /* >= 0 if -A specified */
-int Pflag; /* != 0 if -P specified */
-int glevel; /* == [0-9] if -g[0-9] specified */
-int xref; /* != 0 for cross-reference data */
-Symbol YYnull; /* _YYnull symbol if -n or -nvalidate specified */
-Symbol YYcheck; /* _YYcheck symbol if -nvalidate,check specified */
-
-static int verbose = 1;
-#define VERBOSE(n,arg) (verbose >= n ? (void)(arg):(void)0)
-static int nuids;
-static rcc_item_ty *items;
-static void **itemmap;
-
-static void *uid2type(int uid) {
- assert(uid >= 0 && uid < nuids);
- if (itemmap[uid] == NULL) {
- Type ty;
- rcc_type_ty type = (void *)items[uid];
- assert(items[uid]);
- assert(items[uid]->uid == uid);
- assert(items[uid]->kind == rcc_Type_enum);
- type = items[uid]->v.rcc_Type.type;
- assert(type);
- switch (type->kind) {
- case rcc_INT_enum:
- ty = btot(INT, type->size);
- assert(ty->align == type->align);
- break;
- case rcc_UNSIGNED_enum:
- ty = btot(UNSIGNED, type->size);
- assert(ty->align == type->align);
- break;
- case rcc_FLOAT_enum:
- ty = btot(FLOAT, type->size);
- assert(ty->align == type->align);
- break;
- case rcc_VOID_enum:
- ty = voidtype;
- break;
- case rcc_POINTER_enum:
- ty = ptr(uid2type(type->v.rcc_POINTER.type));
- break;
- case rcc_ARRAY_enum:
- ty = uid2type(type->v.rcc_ARRAY.type);
- assert(ty->size > 0);
- ty = array(ty, type->size/ty->size, 0);
- break;
- case rcc_CONST_enum:
- ty = qual(CONST, uid2type(type->v.rcc_CONST.type));
- break;
- case rcc_VOLATILE_enum:
- ty = qual(VOLATILE, uid2type(type->v.rcc_VOLATILE.type));
- break;
- case rcc_ENUM_enum: {
- int i, n = Seq_length(type->v.rcc_ENUM.ids);
- ty = newstruct(ENUM, string(type->v.rcc_ENUM.tag));
- ty->type = inttype;
- ty->size = ty->type->size;
- ty->align = ty->type->align;
- ty->u.sym->u.idlist = newarray(n + 1, sizeof *ty->u.sym->u.idlist, PERM);
- for (i = 0; i < n; i++) {
- rcc_enum__ty e = Seq_remlo(type->v.rcc_ENUM.ids);
- Symbol p = install(e->id, &identifiers, GLOBAL, PERM);
- p->type = ty;
- p->sclass = ENUM;
- p->u.value = e->value;
- ty->u.sym->u.idlist[i] = p;
- free(e);
- }
- ty->u.sym->u.idlist[i] = NULL;
- Seq_free(&type->v.rcc_ENUM.ids);
- break;
- }
- case rcc_STRUCT_enum: case rcc_UNION_enum: {
- int i, n;
- Field *tail;
- list_ty fields;
- if (type->kind == rcc_STRUCT_enum) {
- ty = newstruct(STRUCT, string(type->v.rcc_STRUCT.tag));
- fields = type->v.rcc_STRUCT.fields;
- } else {
- ty = newstruct(UNION, string(type->v.rcc_UNION.tag));
- fields = type->v.rcc_UNION.fields;
- }
- itemmap[uid] = ty; /* recursive types */
- ty->size = type->size;
- ty->align = type->align;
- tail = &ty->u.sym->u.s.flist;
- n = Seq_length(fields);
- for (i = 0; i < n; i++) {
- rcc_field_ty field = Seq_remlo(fields);
- NEW0(*tail, PERM);
- (*tail)->name = (char *)field->id;
- (*tail)->type = uid2type(field->type);
- (*tail)->offset = field->offset;
- (*tail)->bitsize = field->bitsize;
- (*tail)->lsb = field->lsb;
- if (isconst((*tail)->type))
- ty->u.sym->u.s.cfields = 1;
- if (isvolatile((*tail)->type))
- ty->u.sym->u.s.vfields = 1;
- tail = &(*tail)->link;
- free(field);
- }
- Seq_free(&fields);
- break;
- }
- case rcc_FUNCTION_enum: {
- int n = Seq_length(type->v.rcc_FUNCTION.formals);
- if (n > 0) {
- int i;
- Type *proto = newarray(n + 1, sizeof *proto, PERM);
- for (i = 0; i < n; i++) {
- int *formal = Seq_remlo(type->v.rcc_FUNCTION.formals);
- proto[i] = uid2type(*formal);
- free(formal);
- }
- proto[i] = NULL;
- ty = func(uid2type(type->v.rcc_FUNCTION.type), proto, 0);
- } else
- ty = func(uid2type(type->v.rcc_FUNCTION.type), NULL, 1);
- Seq_free(&type->v.rcc_FUNCTION.formals);
- break;
- }
- default: assert(0);
- }
- if (itemmap[uid] == NULL) {
- itemmap[uid] = ty;
- free(type);
- free(items[uid]);
- items[uid] = NULL;
- } else
- assert(itemmap[uid] == ty);
- }
- return itemmap[uid];
-}
-
-static Symbol uid2symbol(int uid) {
- assert(uid >= 0 && uid < nuids);
- if (itemmap[uid] == NULL) {
- Symbol p;
- rcc_symbol_ty symbol;
- assert(items[uid]);
- assert(items[uid]->uid == uid);
- assert(items[uid]->kind == rcc_Symbol_enum);
- symbol = items[uid]->v.rcc_Symbol.symbol;
- assert(symbol);
- NEW0(p, PERM);
- p->name = (char *)symbol->id;
- p->scope = symbol->scope;
- p->sclass = symbol->sclass;
- p->type = uid2type(symbol->type);
-#define xx(f,n) p->f = symbol->flags>>n;
- xx(structarg,0)
- xx(addressed,1)
- xx(computed,2)
- xx(temporary,3)
- xx(generated,4)
-#undef xx
- p->ref = symbol->ref/10000.0;
- assert(p->scope != CONSTANTS && p->scope != LABELS);
- if (p->scope == GLOBAL || p->sclass == STATIC || p->sclass == EXTERN)
- (*IR->defsymbol)(p);
- itemmap[uid] = p;
- free(symbol);
- free(items[uid]);
- items[uid] = NULL;
- }
- return itemmap[uid];
-}
-
-#define xx(s) static void do##s(rcc_interface_ty);
-xx(Export)
-xx(Import)
-xx(Global)
-xx(Local)
-xx(Address)
-xx(Segment)
-xx(Defaddress)
-xx(Deflabel)
-xx(Defconst)
-xx(Defconstf)
-xx(Defstring)
-xx(Space)
-xx(Function)
-xx(Blockbeg)
-xx(Blockend)
-xx(Forest)
-#undef xx
-static void (*doX[])(rcc_interface_ty in) = {
-#define xx(s) 0,
-xx(Export)
-xx(Import)
-xx(Global)
-xx(Local)
-xx(Address)
-xx(Segment)
-xx(Defaddress)
-xx(Deflabel)
-xx(Defconst)
-xx(Defconstf)
-xx(Defstring)
-xx(Space)
-xx(Function)
-xx(Blockbeg)
-xx(Blockend)
-xx(Forest)
- 0
-#undef xx
-};
-
-static void interface(rcc_interface_ty in) {
- assert(in);
- (*doX[in->kind])(in);
- free(in);
-}
-
-static void doExport(rcc_interface_ty in) {
- (*IR->export)(uid2symbol(in->v.rcc_Export.p));
-}
-
-static void doImport(rcc_interface_ty in) {
- Symbol p = uid2symbol(in->v.rcc_Export.p);
-
- (*IR->import)(p);
- p->defined = 1;
-}
-
-static void doGlobal(rcc_interface_ty in) {
- Symbol p = uid2symbol(in->v.rcc_Global.p);
-
- p->u.seg = in->v.rcc_Global.seg;
- (*IR->global)(p);
- p->defined = 1;
-}
-
-static void doLocal(rcc_interface_ty in) {
- int uid = in->v.rcc_Local.uid;
-
- assert(uid >= 0 && uid < nuids);
- assert(items[uid] == NULL);
- items[uid] = rcc_Symbol(uid, in->v.rcc_Local.p);
- if (in->v.rcc_Local.p->scope >= LOCAL)
- addlocal(uid2symbol(uid));
-}
-
-static void doAddress(rcc_interface_ty in) {
- int uid = in->v.rcc_Address.uid;
- Symbol p = uid2symbol(in->v.rcc_Address.p);
-
- assert(uid >= 0 && uid < nuids);
- assert(items[uid] == NULL);
- items[uid] = rcc_Symbol(uid, in->v.rcc_Address.q);
- if (p->scope == GLOBAL || p->sclass == STATIC || p->sclass == EXTERN)
- (*IR->address)(uid2symbol(uid), p, in->v.rcc_Address.n);
- else {
- Code cp = code(Address);
- cp->u.addr.sym = uid2symbol(uid);
- cp->u.addr.base = p;
- cp->u.addr.offset = in->v.rcc_Address.n;
- }
-}
-
-static void doSegment(rcc_interface_ty in) {
- (*IR->segment)(in->v.rcc_Segment.seg);
-}
-
-static void doDefaddress(rcc_interface_ty in) {
- (*IR->defaddress)(uid2symbol(in->v.rcc_Defaddress.p));
-}
-
-static void doDeflabel(rcc_interface_ty in) {
- (*IR->defaddress)(findlabel(in->v.rcc_Deflabel.label));
-}
-
-static void doDefconst(rcc_interface_ty in) {
- Value v;
-
- v.i = in->v.rcc_Defconst.value;
- (*IR->defconst)(in->v.rcc_Defconst.suffix, in->v.rcc_Defconst.size, v);
-}
-
-static void doDefconstf(rcc_interface_ty in) {
- Value v;
- unsigned *p = (unsigned *)&v.d;
-
- p[swap] = in->v.rcc_Defconstf.value->msb;
- p[1-swap] = in->v.rcc_Defconstf.value->lsb;
- (*IR->defconst)(F, in->v.rcc_Defconstf.size, v);
- free(in->v.rcc_Defconstf.value);
-}
-
-static void doDefstring(rcc_interface_ty in) {
- (*IR->defstring)(in->v.rcc_Defstring.s.len, (char *)in->v.rcc_Defstring.s.str);
- free((char *)in->v.rcc_Defstring.s.str);
-}
-
-static void doSpace(rcc_interface_ty in) {
- (*IR->space)(in->v.rcc_Space.n);
-}
-
-static void doFunction(rcc_interface_ty in) {
- int i, n;
- Symbol *caller, *callee;
-
- /*
- Initialize:
- define the function symbol,
- initialize callee and caller arrays.
- */
- cfunc = uid2symbol(in->v.rcc_Function.f);
- labels = table(NULL, LABELS);
- enterscope();
- n = Seq_length(in->v.rcc_Function.caller);
- caller = newarray(n + 1, sizeof *caller, FUNC);
- for (i = 0; i < n; i++) {
- int *uid = Seq_remlo(in->v.rcc_Function.caller);
- caller[i] = uid2symbol(*uid);
- free(uid);
- }
- caller[i] = NULL;
- Seq_free(&in->v.rcc_Function.caller);
- callee = newarray(n + 1, sizeof *callee, FUNC);
- for (i = 0; i < n; i++) {
- int *uid = Seq_remlo(in->v.rcc_Function.callee);
- callee[i] = uid2symbol(*uid);
- free(uid);
- }
- callee[i] = NULL;
- Seq_free(&in->v.rcc_Function.callee);
- cfunc->u.f.callee = callee;
- cfunc->defined = 1;
- /*
- Initialize the code list,
- traverse the interfaces inside the function;
- each call appends code list entries.
- */
- codelist = &codehead;
- codelist->next = NULL;
- n = Seq_length(in->v.rcc_Function.codelist);
- for (i = 0; i < n; i++)
- interface(Seq_remlo(in->v.rcc_Function.codelist));
- Seq_free(&in->v.rcc_Function.codelist);
- /*
- Call the back end,
- Wrap-up.
- */
- exitscope();
- (*IR->function)(cfunc, caller, callee, in->v.rcc_Function.ncalls);
- cfunc = NULL;
- labels = NULL;
-}
-
-static struct block {
- Code begin;
- struct block *prev;
-} *blockstack = NULL;
-
-static void doBlockbeg(rcc_interface_ty in) {
- struct block *b;
- Code cp = code(Blockbeg);
-
- enterscope();
- cp->u.block.level = level;
- cp->u.block.locals = newarray(1, sizeof *cp->u.block.locals, FUNC);
- cp->u.block.locals[0] = NULL;
- cp->u.block.identifiers = NULL;
- cp->u.block.types = NULL;
- NEW(b, FUNC);
- b->begin = cp;
- b->prev = blockstack;
- blockstack = b;
-}
-
-static void doBlockend(rcc_interface_ty in) {
- assert(blockstack);
- code(Blockend)->u.begin = blockstack->begin;
- blockstack = blockstack->prev;
- exitscope();
-}
-
-static Node visit(rcc_node_ty node) {
- int op;
- Node left = NULL, right = NULL, p = NULL;
- Symbol sym = NULL;
-
- switch (node->kind) {
-#define T(x) rcc_##x##_enum
- case T(CSE): {
- Symbol q = uid2symbol(node->v.rcc_CSE.uid);
- assert(q->temporary);
- q->u.t.cse = p = visit(node->v.rcc_CSE.node);
- break;
- }
- case T(CNST): {
- Value v;
- v.i = node->v.rcc_CNST.value;
- sym = constant(btot(node->suffix, node->size), v);
- op = CNST;
- break;
- }
- case T(CNSTF): {
- Value v;
- unsigned *p = (unsigned *)&v.d;
- p[swap] = node->v.rcc_CNSTF.value->msb;
- p[1-swap] = node->v.rcc_CNSTF.value->lsb;
- sym = constant(btot(node->suffix, node->size), v);
- free(node->v.rcc_CNSTF.value);
- op = CNST;
- break;
- }
- case T(ARG):
- p = newnode(ARG + node->suffix + sizeop(node->size),
- visit(node->v.rcc_ARG.left), NULL,
- intconst(node->v.rcc_ARG.len));
- p->syms[1] = intconst(node->v.rcc_ARG.align);
- break;
- case T(ASGN):
- p = newnode(ASGN + node->suffix + sizeop(node->size),
- visit(node->v.rcc_ASGN.left), visit(node->v.rcc_ASGN.right),
- intconst(node->v.rcc_ASGN.len));
- p->syms[1] = intconst(node->v.rcc_ASGN.align);
- break;
- case T(CVT):
- op = node->v.rcc_CVT.op;
- left = visit(node->v.rcc_CVT.left);
- sym = intconst(node->v.rcc_CVT.fromsize);
- break;
- case T(CALL):
- op = CALL;
- left = visit(node->v.rcc_CALL.left);
- NEW0(sym, FUNC);
- sym->type = uid2type(node->v.rcc_CALL.type);
- break;
- case T(CALLB):
- op = CALL;
- left = visit(node->v.rcc_CALLB.left);
- right = visit(node->v.rcc_CALLB.right);
- NEW0(sym, FUNC);
- sym->type = uid2type(node->v.rcc_CALLB.type);
- break;
- case T(RET):
- op = RET;
- break;
- case T(ADDRG):
- op = ADDRG;
- sym = uid2symbol(node->v.rcc_ADDRG.uid);
- break;
- case T(ADDRL):
- op = ADDRL;
- sym = uid2symbol(node->v.rcc_ADDRG.uid);
- break;
- case T(ADDRF):
- op = ADDRF;
- sym = uid2symbol(node->v.rcc_ADDRG.uid);
- break;
- case T(Unary):
- op = node->v.rcc_Unary.op;
- left = visit(node->v.rcc_Unary.left);
- break;
- case T(Binary):
- op = node->v.rcc_Binary.op;
- left = visit(node->v.rcc_Binary.left);
- right = visit(node->v.rcc_Binary.right);
- break;
- case T(Compare):
- op = node->v.rcc_Compare.op;
- left = visit(node->v.rcc_Compare.left);
- right = visit(node->v.rcc_Compare.right);
- sym = findlabel(node->v.rcc_Compare.label);
- break;
- case T(LABEL):
- op = LABEL;
- sym = findlabel(node->v.rcc_LABEL.label);
- break;
- case T(BRANCH):
- op = JUMP;
- left = newnode(ADDRG+P+sizeop(voidptype->size), NULL, NULL, findlabel(node->v.rcc_BRANCH.label));
- break;
-#undef T
- default: assert(0);
- }
- if (p == NULL)
- p = newnode(op + node->suffix + sizeop(node->size), left, right, sym);
- free(node);
- return p;
-}
-
-static void doForest(rcc_interface_ty in) {
- Node *tail = &code(Gen)->u.forest;
- int i, n = Seq_length(in->v.rcc_Forest.nodes);
-
- for (i = 0; i < n; i++) {
- *tail = visit(Seq_remlo(in->v.rcc_Forest.nodes));
- assert(*tail);
- tail = &(*tail)->link;
- }
- *tail = NULL;
- Seq_free(&in->v.rcc_Forest.nodes);
-}
-
-int main(int argc, char *argv[]) {
- int i, version;
- float stamp = (assert(strstr(rcsid, ",v")), strtod(strstr(rcsid, ",v")+2, NULL))
-;
- char *infile = NULL, *outfile = NULL;
- rcc_program_ty pickle;
-
- for (i = 1; i < argc; i++)
- if (*argv[i] != '-' || strcmp(argv[i], "-") == 0) {
- if (infile == NULL)
- infile = argv[i];
- else if (outfile == NULL)
- outfile = argv[i];
- }
- if (infile != NULL && strcmp(infile, "-") != 0
- && freopen(infile, "rb", stdin) == NULL) {
- fprint(stderr, "%s: can't read `%s'\n", argv[0], infile);
- exit(EXIT_FAILURE);
- }
-#if WIN32
- else
- _setmode(_fileno(stdin), _O_BINARY);
-#endif
- if (outfile != NULL && strcmp(outfile, "-") != 0
- && freopen(outfile, "w", stdout) == NULL) {
- fprint(stderr, "%s: can't write `%s'\n", argv[0], outfile);
- exit(EXIT_FAILURE);
- }
- version = read_int(stdin);
- assert(version/100 == (int)stamp);
- pickle = rcc_read_program(stdin);
- argc = pickle->argc;
- argv = newarray(argc + 1, sizeof *argv, PERM);
- {
- for (i = 0; i < argc; i++) {
- string_ty *arg = Seq_remlo(pickle->argv);
- argv[i] = (char *)arg->str;
- free(arg);
- }
- argv[i] = NULL;
- assert(i == argc);
- Seq_free(&pickle->argv);
- }
- for (i = argc - 1; i > 0; i--)
- if (strncmp(argv[i], "-target=", 8) == 0)
- break;
- if (i > 0) {
- int j;
- for (j = 0; bindings[j].name && bindings[j].ir; j++)
- if (strcmp(&argv[i][8], bindings[j].name) == 0) {
- IR = bindings[j].ir;
- break;
- }
- }
- if (!IR) {
- fprint(stderr, "%s: unknown target", argv[0]);
- if (i > 0)
- fprint(stderr, " `%s'", &argv[i][8]);
- fprint(stderr, "; must specify one of\n");
- for (i = 0; bindings[i].name; i++)
- fprint(stderr, "\t-target=%s\n", bindings[i].name);
- exit(EXIT_FAILURE);
- }
- IR->wants_dag = 0; /* pickle's hold trees */
- init(argc, argv);
- genlabel(pickle->nlabels);
- level = GLOBAL;
- {
- int i, count;
- nuids = pickle->nuids;
- items = newarray(nuids, sizeof *items, PERM);
- itemmap = newarray(nuids, sizeof *items, PERM);
- for (i = 0; i < nuids; i++) {
- itemmap[i] = NULL;
- items[i] = NULL;
- }
- (*IR->progbeg)(argc, argv);
- count = Seq_length(pickle->items);
- for (i = 0; i < count; i++) {
- rcc_item_ty item = Seq_remlo(pickle->items);
- int uid = item->uid;
- assert(uid >= 0 && uid < nuids);
- assert(items[uid] == NULL);
- items[uid] = item;
- }
- Seq_free(&pickle->items);
-#define xx(s) assert(rcc_##s##_enum < sizeof doX/sizeof doX[0] && doX[rcc_##s##_enum]==0); \
- doX[rcc_##s##_enum] = do##s;
- xx(Export)
- xx(Import)
- xx(Global)
- xx(Local)
- xx(Address)
- xx(Segment)
- xx(Defaddress)
- xx(Deflabel)
- xx(Defconst)
- xx(Defconstf)
- xx(Defstring)
- xx(Space)
- xx(Function)
- xx(Blockbeg)
- xx(Blockend)
- xx(Forest)
-#undef xx
- count = Seq_length(pickle->interfaces);
- for (i = 0; i < count; i++)
- interface(Seq_remlo(pickle->interfaces));
- Seq_free(&pickle->interfaces);
- free(pickle);
- (*IR->progend)();
- }
- deallocate(PERM);
- return errcnt > 0;
-}
-
-/* main_init - process program arguments */
-void main_init(int argc, char *argv[]) {
- int i;
- static int inited;
-
- if (inited)
- return;
- inited = 1;
- for (i = 1; i < argc; i++)
- if (strcmp(argv[i], "-g") == 0 || strcmp(argv[i], "-g2") == 0)
- glevel = 2;
- else if (strcmp(argv[i], "-w") == 0)
- wflag++;
- else if (strcmp(argv[i], "-v") == 0) {
- fprint(stderr, "%s %s\n", argv[0], rcsid);
- verbose++;
- } else if (strncmp(argv[i], "-errout=", 8) == 0) {
- FILE *f = fopen(argv[i]+8, "w");
- if (f == NULL) {
- fprint(stderr, "%s: can't write errors to `%s'\n", argv[0], argv[i]+8);
- exit(EXIT_FAILURE);
- }
- fclose(f);
- f = freopen(argv[i]+8, "w", stderr);
- assert(f);
- } else if (strncmp(argv[i], "-e", 2) == 0) {
- int x;
- if ((x = strtol(&argv[i][2], NULL, 0)) > 0)
- errlimit = x;
- }
-}
-
-void init(int argc, char *argv[]) {
- {extern void main_init(int, char *[]); main_init(argc, argv);}
- {extern void prof_init(int, char *[]); prof_init(argc, argv);}
- {extern void trace_init(int, char *[]); trace_init(argc, argv);}
- {extern void type_init(int, char *[]); type_init(argc, argv);}
- {extern void x86linux_init(int, char *[]); x86linux_init(argc, argv);}
-}
diff --git a/code/tools/lcc/src/sparc.md b/code/tools/lcc/src/sparc.md
deleted file mode 100644
index f956d46..0000000
--- a/code/tools/lcc/src/sparc.md
+++ /dev/null
@@ -1,1163 +0,0 @@
-%{
-#include "c.h"
-#define NODEPTR_TYPE Node
-#define OP_LABEL(p) ((p)->op)
-#define LEFT_CHILD(p) ((p)->kids[0])
-#define RIGHT_CHILD(p) ((p)->kids[1])
-#define STATE_LABEL(p) ((p)->x.state)
-static void address(Symbol, Symbol, long);
-static void blkfetch(int, int, int, int);
-static void blkloop(int, int, int, int, int, int[]);
-static void blkstore(int, int, int, int);
-static void defaddress(Symbol);
-static void defconst(int, int, Value);
-static void defstring(int, char *);
-static void defsymbol(Symbol);
-static void doarg(Node);
-static void emit2(Node);
-static void export(Symbol);
-static void clobber(Node);
-static void function(Symbol, Symbol [], Symbol [], int);
-static void global(Symbol);
-static void import(Symbol);
-static void local(Symbol);
-static void progbeg(int, char **);
-static void progend(void);
-static void segment(int);
-static void space(int);
-static void target(Node);
-static int imm(Node);
-static void renameregs(void);
-extern Interface sparcIR, solarisIR;
-static void defsymbol2(Symbol);
-static void export2(Symbol);
-static void globalend(void);
-static void global2(Symbol);
-static void segment2(int);
-static void progend2(void);
-
-extern char *stabprefix;
-extern void stabblock(int, int, Symbol*);
-extern void stabend(Coordinate *, Symbol, Coordinate **, Symbol *, Symbol *);
-extern void stabfend(Symbol, int);
-extern void stabinit(char *, int, char *[]);
-extern void stabline(Coordinate *);
-extern void stabsym(Symbol);
-extern void stabtype(Symbol);
-static Symbol greg[32], gregw;
-static Symbol *oreg = &greg[8], *ireg = &greg[24];
-static Symbol freg[32], freg2[32];
-static Symbol fregw, freg2w;
-
-static int regvars;
-static int retstruct;
-
-static int pflag = 0;
-
-static int cseg;
-
-%}
-%start stmt
-%term CNSTF4=4113
-%term CNSTF8=8209
-%term CNSTF16=16401
-%term CNSTI1=1045
-%term CNSTI2=2069
-%term CNSTI4=4117
-%term CNSTI8=8213
-%term CNSTP4=4119
-%term CNSTP8=8215
-%term CNSTU1=1046
-%term CNSTU2=2070
-%term CNSTU4=4118
-%term CNSTU8=8214
-
-%term ARGB=41
-%term ARGF4=4129
-%term ARGF8=8225
-%term ARGF16=16417
-%term ARGI4=4133
-%term ARGI8=8229
-%term ARGP4=4135
-%term ARGP8=8231
-%term ARGU4=4134
-%term ARGU8=8230
-
-%term ASGNB=57
-%term ASGNF4=4145
-%term ASGNF8=8241
-%term ASGNF16=16433
-%term ASGNI1=1077
-%term ASGNI2=2101
-%term ASGNI4=4149
-%term ASGNI8=8245
-%term ASGNP4=4151
-%term ASGNP8=8247
-%term ASGNU1=1078
-%term ASGNU2=2102
-%term ASGNU4=4150
-%term ASGNU8=8246
-
-%term INDIRB=73
-%term INDIRF4=4161
-%term INDIRF8=8257
-%term INDIRF16=16449
-%term INDIRI1=1093
-%term INDIRI2=2117
-%term INDIRI4=4165
-%term INDIRI8=8261
-%term INDIRP4=4167
-%term INDIRP8=8263
-%term INDIRU1=1094
-%term INDIRU2=2118
-%term INDIRU4=4166
-%term INDIRU8=8262
-
-%term CVFF4=4209
-%term CVFF8=8305
-%term CVFF16=16497
-%term CVFI4=4213
-%term CVFI8=8309
-
-%term CVIF4=4225
-%term CVIF8=8321
-%term CVIF16=16513
-%term CVII1=1157
-%term CVII2=2181
-%term CVII4=4229
-%term CVII8=8325
-%term CVIU1=1158
-%term CVIU2=2182
-%term CVIU4=4230
-%term CVIU8=8326
-
-%term CVPP4=4247
-%term CVPP8=8343
-%term CVPP16=16535
-%term CVPU4=4246
-%term CVPU8=8342
-
-%term CVUI1=1205
-%term CVUI2=2229
-%term CVUI4=4277
-%term CVUI8=8373
-%term CVUP4=4279
-%term CVUP8=8375
-%term CVUP16=16567
-%term CVUU1=1206
-%term CVUU2=2230
-%term CVUU4=4278
-%term CVUU8=8374
-
-%term NEGF4=4289
-%term NEGF8=8385
-%term NEGF16=16577
-%term NEGI4=4293
-%term NEGI8=8389
-
-%term CALLB=217
-%term CALLF4=4305
-%term CALLF8=8401
-%term CALLF16=16593
-%term CALLI4=4309
-%term CALLI8=8405
-%term CALLP4=4311
-%term CALLP8=8407
-%term CALLU4=4310
-%term CALLU8=8406
-%term CALLV=216
-
-%term RETF4=4337
-%term RETF8=8433
-%term RETF16=16625
-%term RETI4=4341
-%term RETI8=8437
-%term RETP4=4343
-%term RETP8=8439
-%term RETU4=4342
-%term RETU8=8438
-%term RETV=248
-
-%term ADDRGP4=4359
-%term ADDRGP8=8455
-
-%term ADDRFP4=4375
-%term ADDRFP8=8471
-
-%term ADDRLP4=4391
-%term ADDRLP8=8487
-
-%term ADDF4=4401
-%term ADDF8=8497
-%term ADDF16=16689
-%term ADDI4=4405
-%term ADDI8=8501
-%term ADDP4=4407
-%term ADDP8=8503
-%term ADDU4=4406
-%term ADDU8=8502
-
-%term SUBF4=4417
-%term SUBF8=8513
-%term SUBF16=16705
-%term SUBI4=4421
-%term SUBI8=8517
-%term SUBP4=4423
-%term SUBP8=8519
-%term SUBU4=4422
-%term SUBU8=8518
-
-%term LSHI4=4437
-%term LSHI8=8533
-%term LSHU4=4438
-%term LSHU8=8534
-
-%term MODI4=4453
-%term MODI8=8549
-%term MODU4=4454
-%term MODU8=8550
-
-%term RSHI4=4469
-%term RSHI8=8565
-%term RSHU4=4470
-%term RSHU8=8566
-
-%term BANDI4=4485
-%term BANDI8=8581
-%term BANDU4=4486
-%term BANDU8=8582
-
-%term BCOMI4=4501
-%term BCOMI8=8597
-%term BCOMU4=4502
-%term BCOMU8=8598
-
-%term BORI4=4517
-%term BORI8=8613
-%term BORU4=4518
-%term BORU8=8614
-
-%term BXORI4=4533
-%term BXORI8=8629
-%term BXORU4=4534
-%term BXORU8=8630
-
-%term DIVF4=4545
-%term DIVF8=8641
-%term DIVF16=16833
-%term DIVI4=4549
-%term DIVI8=8645
-%term DIVU4=4550
-%term DIVU8=8646
-
-%term MULF4=4561
-%term MULF8=8657
-%term MULF16=16849
-%term MULI4=4565
-%term MULI8=8661
-%term MULU4=4566
-%term MULU8=8662
-
-%term EQF4=4577
-%term EQF8=8673
-%term EQF16=16865
-%term EQI4=4581
-%term EQI8=8677
-%term EQU4=4582
-%term EQU8=8678
-
-%term GEF4=4593
-%term GEF8=8689
-%term GEI4=4597
-%term GEI8=8693
-%term GEI16=16885
-%term GEU4=4598
-%term GEU8=8694
-
-%term GTF4=4609
-%term GTF8=8705
-%term GTF16=16897
-%term GTI4=4613
-%term GTI8=8709
-%term GTU4=4614
-%term GTU8=8710
-
-%term LEF4=4625
-%term LEF8=8721
-%term LEF16=16913
-%term LEI4=4629
-%term LEI8=8725
-%term LEU4=4630
-%term LEU8=8726
-
-%term LTF4=4641
-%term LTF8=8737
-%term LTF16=16929
-%term LTI4=4645
-%term LTI8=8741
-%term LTU4=4646
-%term LTU8=8742
-
-%term NEF4=4657
-%term NEF8=8753
-%term NEF16=16945
-%term NEI4=4661
-%term NEI8=8757
-%term NEU4=4662
-%term NEU8=8758
-
-%term JUMPV=584
-
-%term LABELV=600
-
-%term LOADB=233
-%term LOADF4=4321
-%term LOADF8=8417
-%term LOADF16=16609
-%term LOADI1=1253
-%term LOADI2=2277
-%term LOADI4=4325
-%term LOADI8=8421
-%term LOADP4=4327
-%term LOADP8=8423
-%term LOADU1=1254
-%term LOADU2=2278
-%term LOADU4=4326
-%term LOADU8=8422
-
-%term VREGP=711
-%%
-reg: INDIRI1(VREGP) "# read register\n"
-reg: INDIRU1(VREGP) "# read register\n"
-
-reg: INDIRI2(VREGP) "# read register\n"
-reg: INDIRU2(VREGP) "# read register\n"
-
-reg: INDIRF4(VREGP) "# read register\n"
-reg: INDIRI4(VREGP) "# read register\n"
-reg: INDIRP4(VREGP) "# read register\n"
-reg: INDIRU4(VREGP) "# read register\n"
-
-reg: INDIRF8(VREGP) "# read register\n"
-reg: INDIRI8(VREGP) "# read register\n"
-reg: INDIRP8(VREGP) "# read register\n"
-reg: INDIRU8(VREGP) "# read register\n"
-
-stmt: ASGNI1(VREGP,reg) "# write register\n"
-stmt: ASGNU1(VREGP,reg) "# write register\n"
-
-stmt: ASGNI2(VREGP,reg) "# write register\n"
-stmt: ASGNU2(VREGP,reg) "# write register\n"
-
-stmt: ASGNF4(VREGP,reg) "# write register\n"
-stmt: ASGNI4(VREGP,reg) "# write register\n"
-stmt: ASGNP4(VREGP,reg) "# write register\n"
-stmt: ASGNU4(VREGP,reg) "# write register\n"
-
-stmt: ASGNF8(VREGP,reg) "# write register\n"
-stmt: ASGNI8(VREGP,reg) "# write register\n"
-stmt: ASGNP8(VREGP,reg) "# write register\n"
-stmt: ASGNU8(VREGP,reg) "# write register\n"
-con: CNSTI1 "%a"
-con: CNSTU1 "%a"
-
-con: CNSTI2 "%a"
-con: CNSTU2 "%a"
-
-con: CNSTI4 "%a"
-con: CNSTU4 "%a"
-con: CNSTP4 "%a"
-
-con: CNSTI8 "%a"
-con: CNSTU8 "%a"
-con: CNSTP8 "%a"
-stmt: reg ""
-reg: ADDRGP4 "set %a,%%%c\n" 1
-stk13: ADDRFP4 "%a" imm(a)
-stk13: ADDRLP4 "%a" imm(a)
-reg: stk13 "add %0,%%fp,%%%c\n" 1
-stk: ADDRFP4 "set %a,%%%c\n" 2
-stk: ADDRLP4 "set %a,%%%c\n" 2
-reg: ADDRFP4 "set %a,%%%c\nadd %%%c,%%fp,%%%c\n" 3
-reg: ADDRLP4 "set %a,%%%c\nadd %%%c,%%fp,%%%c\n" 3
-con13: CNSTI1 "%a" imm(a)
-con13: CNSTI2 "%a" imm(a)
-con13: CNSTI4 "%a" imm(a)
-con13: CNSTU1 "%a" imm(a)
-con13: CNSTU2 "%a" imm(a)
-con13: CNSTU4 "%a" imm(a)
-con13: CNSTP4 "%a" imm(a)
-base: ADDI4(reg,con13) "%%%0+%1"
-base: ADDP4(reg,con13) "%%%0+%1"
-base: ADDU4(reg,con13) "%%%0+%1"
-base: reg "%%%0"
-base: con13 "%0"
-base: stk13 "%%fp+%0"
-addr: base "%0"
-addr: ADDI4(reg,reg) "%%%0+%%%1"
-addr: ADDP4(reg,reg) "%%%0+%%%1"
-addr: ADDU4(reg,reg) "%%%0+%%%1"
-addr: stk "%%fp+%%%0"
-reg: INDIRI1(addr) "ldsb [%0],%%%c\n" 1
-reg: INDIRI2(addr) "ldsh [%0],%%%c\n" 1
-reg: INDIRI4(addr) "ld [%0],%%%c\n" 1
-reg: INDIRU1(addr) "ldub [%0],%%%c\n" 1
-reg: INDIRU2(addr) "lduh [%0],%%%c\n" 1
-reg: INDIRU4(addr) "ld [%0],%%%c\n" 1
-reg: INDIRP4(addr) "ld [%0],%%%c\n" 1
-reg: INDIRF4(addr) "ld [%0],%%f%c\n" 1
-stmt: ASGNI1(addr,reg) "stb %%%1,[%0]\n" 1
-stmt: ASGNI2(addr,reg) "sth %%%1,[%0]\n" 1
-stmt: ASGNI4(addr,reg) "st %%%1,[%0]\n" 1
-stmt: ASGNU1(addr,reg) "stb %%%1,[%0]\n" 1
-stmt: ASGNU2(addr,reg) "sth %%%1,[%0]\n" 1
-stmt: ASGNU4(addr,reg) "st %%%1,[%0]\n" 1
-stmt: ASGNP4(addr,reg) "st %%%1,[%0]\n" 1
-stmt: ASGNF4(addr,reg) "st %%f%1,[%0]\n" 1
-addrl: ADDRLP4 "%%%fp+%a" imm(a)
-
-reg: INDIRF8(addrl) "ldd [%0],%%f%c\n" 1
-stmt: ASGNF8(addrl,reg) "std %%f%1,[%0]\n" 1
-reg: INDIRF8(base) "ld2 [%0],%%f%c\n" 2
-stmt: ASGNF8(base,reg) "st2 %%f%1,[%0]\n" 2
-spill: ADDRLP4 "%a" !imm(a)
-
-stmt: ASGNI1(spill,reg) "set %0,%%g1\nstb %%%1,[%%fp+%%g1]\n"
-stmt: ASGNI2(spill,reg) "set %0,%%g1\nsth %%%1,[%%fp+%%g1]\n"
-stmt: ASGNI4(spill,reg) "set %0,%%g1\nst %%%1,[%%fp+%%g1]\n"
-stmt: ASGNU1(spill,reg) "set %0,%%g1\nstb %%%1,[%%fp+%%g1]\n"
-stmt: ASGNU2(spill,reg) "set %0,%%g1\nsth %%%1,[%%fp+%%g1]\n"
-stmt: ASGNU4(spill,reg) "set %0,%%g1\nst %%%1,[%%fp+%%g1]\n"
-stmt: ASGNP4(spill,reg) "set %0,%%g1\nst %%%1,[%%fp+%%g1]\n"
-stmt: ASGNF4(spill,reg) "set %0,%%g1\nst %%f%1,[%%fp+%%g1]\n"
-stmt: ASGNF8(spill,reg) "set %0,%%g1\nstd %%f%1,[%%fp+%%g1]\n"
-reg: CVII4(INDIRI1(addr)) "ldsb [%0],%%%c\n" 1
-reg: CVII4(INDIRI2(addr)) "ldsh [%0],%%%c\n" 1
-reg: CVUU4(INDIRU1(addr)) "ldub [%0],%%%c\n" 1
-reg: CVUU4(INDIRU2(addr)) "lduh [%0],%%%c\n" 1
-reg: CVUI4(INDIRU1(addr)) "ldub [%0],%%%c\n" 1
-reg: CVUI4(INDIRU2(addr)) "lduh [%0],%%%c\n" 1
-reg: LOADI1(reg) "mov %%%0,%%%c\n" move(a)
-reg: LOADI2(reg) "mov %%%0,%%%c\n" move(a)
-reg: LOADI4(reg) "mov %%%0,%%%c\n" move(a)
-reg: LOADP4(reg) "mov %%%0,%%%c\n" move(a)
-reg: LOADU1(reg) "mov %%%0,%%%c\n" move(a)
-reg: LOADU2(reg) "mov %%%0,%%%c\n" move(a)
-reg: LOADU4(reg) "mov %%%0,%%%c\n" move(a)
-reg: CNSTI1 "# reg\n" range(a, 0, 0)
-reg: CNSTI2 "# reg\n" range(a, 0, 0)
-reg: CNSTI4 "# reg\n" range(a, 0, 0)
-reg: CNSTP4 "# reg\n" range(a, 0, 0)
-reg: CNSTU1 "# reg\n" range(a, 0, 0)
-reg: CNSTU2 "# reg\n" range(a, 0, 0)
-reg: CNSTU4 "# reg\n" range(a, 0, 0)
-reg: con "set %0,%%%c\n" 1
-rc: con13 "%0"
-rc: reg "%%%0"
-reg: ADDI4(reg,rc) "add %%%0,%1,%%%c\n" 1
-reg: ADDP4(reg,rc) "add %%%0,%1,%%%c\n" 1
-reg: ADDU4(reg,rc) "add %%%0,%1,%%%c\n" 1
-reg: BANDI4(reg,rc) "and %%%0,%1,%%%c\n" 1
-reg: BORI4(reg,rc) "or %%%0,%1,%%%c\n" 1
-reg: BXORI4(reg,rc) "xor %%%0,%1,%%%c\n" 1
-reg: BANDU4(reg,rc) "and %%%0,%1,%%%c\n" 1
-reg: BORU4(reg,rc) "or %%%0,%1,%%%c\n" 1
-reg: BXORU4(reg,rc) "xor %%%0,%1,%%%c\n" 1
-reg: SUBI4(reg,rc) "sub %%%0,%1,%%%c\n" 1
-reg: SUBP4(reg,rc) "sub %%%0,%1,%%%c\n" 1
-reg: SUBU4(reg,rc) "sub %%%0,%1,%%%c\n" 1
-rc5: CNSTI4 "%a" range(a, 0, 31)
-rc5: reg "%%%0"
-reg: LSHI4(reg,rc5) "sll %%%0,%1,%%%c\n" 1
-reg: LSHU4(reg,rc5) "sll %%%0,%1,%%%c\n" 1
-reg: RSHI4(reg,rc5) "sra %%%0,%1,%%%c\n" 1
-reg: RSHU4(reg,rc5) "srl %%%0,%1,%%%c\n" 1
-reg: BANDI4(reg,BCOMI4(rc)) "andn %%%0,%1,%%%c\n" 1
-reg: BORI4(reg,BCOMI4(rc)) "orn %%%0,%1,%%%c\n" 1
-reg: BXORI4(reg,BCOMI4(rc)) "xnor %%%0,%1,%%%c\n" 1
-reg: BANDU4(reg,BCOMU4(rc)) "andn %%%0,%1,%%%c\n" 1
-reg: BORU4(reg,BCOMU4(rc)) "orn %%%0,%1,%%%c\n" 1
-reg: BXORU4(reg,BCOMU4(rc)) "xnor %%%0,%1,%%%c\n" 1
-reg: NEGI4(reg) "neg %%%0,%%%c\n" 1
-reg: BCOMI4(reg) "not %%%0,%%%c\n" 1
-reg: BCOMU4(reg) "not %%%0,%%%c\n" 1
-reg: CVII4(reg) "sll %%%0,8*(4-%a),%%%c; sra %%%c,8*(4-%a),%%%c\n" 2
-reg: CVUU4(reg) "sll %%%0,8*(4-%a),%%%c; srl %%%c,8*(4-%a),%%%c\n" 2
-reg: CVUU4(reg) "and %%%0,0xff,%%%c\n" (a->syms[0]->u.c.v.i == 1 ? 1 : LBURG_MAX)
-reg: CVUU4(reg) "set 0xffff,%%g1; and %%%0,%%g1,%%%c\n" 2
-reg: CVUI4(reg) "and %%%0,0xff,%%%c\n" (a->syms[0]->u.c.v.i == 1 ? 1 : LBURG_MAX)
-reg: CVUI4(reg) "set 0xffff,%%g1; and %%%0,%%g1,%%%c\n" 2
-addrg: ADDRGP4 "%a"
-stmt: JUMPV(addrg) "ba %0; nop\n" 2
-stmt: JUMPV(addr) "jmp %0; nop\n" 2
-stmt: LABELV "%a:\n"
-stmt: EQI4(reg,rc) "cmp %%%0,%1; be %a; nop\n" 3
-stmt: EQU4(reg,rc) "cmp %%%0,%1; be %a; nop\n" 3
-stmt: GEI4(reg,rc) "cmp %%%0,%1; bge %a; nop\n" 3
-stmt: GEU4(reg,rc) "cmp %%%0,%1; bgeu %a; nop\n" 3
-stmt: GTI4(reg,rc) "cmp %%%0,%1; bg %a; nop\n" 3
-stmt: GTU4(reg,rc) "cmp %%%0,%1; bgu %a; nop\n" 3
-stmt: LEI4(reg,rc) "cmp %%%0,%1; ble %a; nop\n" 3
-stmt: LEU4(reg,rc) "cmp %%%0,%1; bleu %a; nop\n" 3
-stmt: LTI4(reg,rc) "cmp %%%0,%1; bl %a; nop\n" 3
-stmt: LTU4(reg,rc) "cmp %%%0,%1; blu %a; nop\n" 3
-stmt: NEI4(reg,rc) "cmp %%%0,%1; bne %a; nop\n" 3
-stmt: NEU4(reg,rc) "cmp %%%0,%1; bne %a; nop\n" 3
-call: ADDRGP4 "%a"
-call: addr "%0"
-reg: CALLF8(call) "call %0; nop\n" 2
-reg: CALLF4(call) "call %0; nop\n" 2
-reg: CALLI4(call) "call %0; nop\n" 2
-reg: CALLP4(call) "call %0; nop\n" 2
-reg: CALLU4(call) "call %0; nop\n" 2
-stmt: CALLV(call) "call %0; nop\n" 2
-stmt: CALLB(call,reg) "call %0; st %%%1,[%%sp+64]; unimp %b&0xfff\n" 3
-
-stmt: RETF8(reg) "# ret\n" 1
-stmt: RETF4(reg) "# ret\n" 1
-stmt: RETI4(reg) "# ret\n" 1
-stmt: RETU4(reg) "# ret\n" 1
-stmt: RETP4(reg) "# ret\n" 1
-stmt: ARGI4(reg) "st %%%0,[%%sp+4*%c+68]\n" 1
-stmt: ARGU4(reg) "st %%%0,[%%sp+4*%c+68]\n" 1
-stmt: ARGP4(reg) "st %%%0,[%%sp+4*%c+68]\n" 1
-stmt: ARGF4(reg) "# ARGF4\n" 1
-stmt: ARGF8(reg) "# ARGF8\n" 1
-
-reg: DIVI4(reg,rc) "sra %%%0,31,%%g1; wr %%g0,%%g1,%%y; nop; nop; nop; sdiv %%%0,%1,%%%c\n" 6
-
-reg: DIVU4(reg,rc) "wr %%g0,%%g0,%%y; nop; nop; nop; udiv %%%0,%1,%%%c\n" 5
-
-reg: MODI4(reg,rc) "sra %%%0,31,%%g1; wr %%g0,%%g1,%%y; nop; nop; nop; sdiv %%%0,%1,%%g1\n; smul %%g1,%1,%%g1; sub %%%0,%%g1,%%%c\n" 8
-
-
-reg: MODU4(reg,rc) "wr %%g0,%%g0,%%y; nop; nop; nop; udiv %%%0,%1,%%g1\n; umul %%g1,%1,%%g1; sub %%%0,%%g1,%%%c\n" 7
-
-
-reg: MULI4(rc,reg) "smul %%%1,%0,%%%c\n" 1
-reg: MULU4(rc,reg) "umul %%%1,%0,%%%c\n" 1
-reg: ADDF8(reg,reg) "faddd %%f%0,%%f%1,%%f%c\n" 1
-reg: ADDF4(reg,reg) "fadds %%f%0,%%f%1,%%f%c\n" 1
-reg: DIVF8(reg,reg) "fdivd %%f%0,%%f%1,%%f%c\n" 1
-reg: DIVF4(reg,reg) "fdivs %%f%0,%%f%1,%%f%c\n" 1
-reg: MULF8(reg,reg) "fmuld %%f%0,%%f%1,%%f%c\n" 1
-reg: MULF4(reg,reg) "fmuls %%f%0,%%f%1,%%f%c\n" 1
-reg: SUBF8(reg,reg) "fsubd %%f%0,%%f%1,%%f%c\n" 1
-reg: SUBF4(reg,reg) "fsubs %%f%0,%%f%1,%%f%c\n" 1
-reg: NEGF4(reg) "fnegs %%f%0,%%f%c\n" 1
-reg: LOADF4(reg) "fmovs %%f%0,%%f%c\n" 1
-reg: CVFF4(reg) "fdtos %%f%0,%%f%c\n" 1
-reg: CVFF8(reg) "fstod %%f%0,%%f%c\n" 1
-reg: CVFI4(reg) "fstoi %%f%0,%%f0; st %%f0,[%%sp+64]; ld [%%sp+64],%%%c\n" (a->syms[0]->u.c.v.i==4?3:LBURG_MAX)
-
-reg: CVFI4(reg) "fdtoi %%f%0,%%f0; st %%f0,[%%sp+64]; ld [%%sp+64],%%%c\n" (a->syms[0]->u.c.v.i==8?3:LBURG_MAX)
-
-reg: CVIF4(reg) "st %%%0,[%%sp+64]; ld [%%sp+64],%%f%c; fitos %%f%c,%%f%c\n" 3
-
-reg: CVIF8(reg) "st %%%0,[%%sp+64]; ld [%%sp+64],%%f%c; fitod %%f%c,%%f%c\n" 3
-
-rel: EQF8(reg,reg) "fcmped %%f%0,%%f%1; nop; fbue"
-rel: EQF4(reg,reg) "fcmpes %%f%0,%%f%1; nop; fbue"
-rel: GEF8(reg,reg) "fcmped %%f%0,%%f%1; nop; fbuge"
-rel: GEF4(reg,reg) "fcmpes %%f%0,%%f%1; nop; fbuge"
-rel: GTF8(reg,reg) "fcmped %%f%0,%%f%1; nop; fbug"
-rel: GTF4(reg,reg) "fcmpes %%f%0,%%f%1; nop; fbug"
-rel: LEF8(reg,reg) "fcmped %%f%0,%%f%1; nop; fbule"
-rel: LEF4(reg,reg) "fcmpes %%f%0,%%f%1; nop; fbule"
-rel: LTF8(reg,reg) "fcmped %%f%0,%%f%1; nop; fbul"
-rel: LTF4(reg,reg) "fcmpes %%f%0,%%f%1; nop; fbul"
-rel: NEF8(reg,reg) "fcmped %%f%0,%%f%1; nop; fbne"
-rel: NEF4(reg,reg) "fcmpes %%f%0,%%f%1; nop; fbne"
-
-stmt: rel "%0 %a; nop\n" 4
-reg: LOADF8(reg) "# LOADD\n" 2
-
-reg: NEGF8(reg) "# NEGD\n" 2
-
-stmt: ASGNB(reg,INDIRB(reg)) "# ASGNB\n"
-
-%%
-static void progend(void){}
-static void progbeg(int argc, char *argv[]) {
- int i;
-
- {
- union {
- char c;
- int i;
- } u;
- u.i = 0;
- u.c = 1;
- swap = ((int)(u.i == 1)) != IR->little_endian;
- }
- parseflags(argc, argv);
- for (i = 0; i < argc; i++)
- if (strcmp(argv[i], "-p") == 0 || strcmp(argv[i], "-pg") == 0)
- pflag = 1;
- if (IR == &solarisIR)
- stabprefix = ".LL";
- else
- stabprefix = "L";
- for (i = 0; i < 8; i++) {
- greg[i + 0] = mkreg(stringf("g%d", i), i + 0, 1, IREG);
- greg[i + 8] = mkreg(stringf("o%d", i), i + 8, 1, IREG);
- greg[i + 16] = mkreg(stringf("l%d", i), i + 16, 1, IREG);
- greg[i + 24] = mkreg(stringf("i%d", i), i + 24, 1, IREG);
- }
- gregw = mkwildcard(greg);
- for (i = 0; i < 32; i++)
- freg[i] = mkreg("%d", i, 1, FREG);
- for (i = 0; i < 31; i += 2)
- freg2[i] = mkreg("%d", i, 3, FREG);
- fregw = mkwildcard(freg);
- freg2w = mkwildcard(freg2);
- tmask[IREG] = 0x3fff3e00;
- vmask[IREG] = 0x3ff00000;
- tmask[FREG] = ~(unsigned)0;
- vmask[FREG] = 0;
-}
-static Symbol rmap(int opk) {
- switch (optype(opk)) {
- case I: case U: case P: case B:
- return gregw;
- case F:
- return opsize(opk) == 4 ? fregw : freg2w;
- default:
- return 0;
- }
-}
-static void target(Node p) {
- assert(p);
- switch (specific(p->op)) {
- case CNST+I: case CNST+U: case CNST+P:
- if (range(p, 0, 0) == 0) {
- setreg(p, greg[0]);
- p->x.registered = 1;
- }
- break;
- case CALL+B:
- assert(p->syms[1] && p->syms[1]->type && isfunc(p->syms[1]->type));
- p->syms[1] = intconst(freturn(p->syms[1]->type)->size);
- break;
- case CALL+F: setreg(p, opsize(p->op)==4?freg[0]:freg2[0]); break;
- case CALL+I: case CALL+P: case CALL+U:
- case CALL+V: setreg(p, oreg[0]); break;
- case RET+F: rtarget(p, 0, opsize(p->op)==4?freg[0]:freg2[0]); break;
- case RET+I: case RET+P: case RET+U:
- rtarget(p, 0, ireg[0]);
- p->kids[0]->x.registered = 1;
- break;
- case ARG+I: case ARG+P: case ARG+U:
- if (p->syms[RX]->u.c.v.i < 6) {
- rtarget(p, 0, oreg[p->syms[RX]->u.c.v.i]);
- p->op = LOAD+opkind(p->op);
- setreg(p, oreg[p->syms[RX]->u.c.v.i]);
- }
- break;
- }
-}
-static void clobber(Node p) {
- assert(p);
- switch (specific(p->op)) {
- case CALL+B: case CALL+F: case CALL+I:
- spill(~(unsigned)3, FREG, p);
- break;
- case CALL+V:
- spill(oreg[0]->x.regnode->mask, IREG, p);
- spill(~(unsigned)3, FREG, p);
- break;
- case ARG+F:
- if (opsize(p->op) == 4 && p->syms[2]->u.c.v.i <= 6)
- spill((1<<(p->syms[2]->u.c.v.i + 8)), IREG, p);
- else if (opsize(p->op) == 8 && p->syms[2]->u.c.v.i <= 5)
- spill((3<<(p->syms[2]->u.c.v.i + 8))&0xff00, IREG, p);
- break;
- }
-}
-static int imm(Node p) {
- return range(p, -4096, 4091);
-}
-static void doarg(Node p) {
- assert(p && p->syms[0] && p->op != ARG+B);
- p->syms[RX] = intconst(mkactual(4,
- p->syms[0]->u.c.v.i)/4);
-}
-static void emit2(Node p) {
- switch (p->op) {
- case ARG+F+sizeop(4): {
- int n = p->syms[RX]->u.c.v.i;
- print("st %%f%d,[%%sp+4*%d+68]\n",
- getregnum(p->x.kids[0]), n);
- if (n <= 5)
- print("ld [%%sp+4*%d+68],%%o%d\n", n, n);
- break;
- }
- case ARG+F+sizeop(8): {
- int n = p->syms[RX]->u.c.v.i;
- int src = getregnum(p->x.kids[0]);
- print("st %%f%d,[%%sp+4*%d+68]\n", src, n);
- print("st %%f%d,[%%sp+4*%d+68]\n", src+1, n+1);
- if (n <= 5)
- print("ld [%%sp+4*%d+68],%%o%d\n", n, n);
- if (n <= 4)
- print("ld [%%sp+4*%d+68],%%o%d\n", n+1, n+1);
- break;
- }
- case LOAD+F+sizeop(8): {
- int dst = getregnum(p);
- int src = getregnum(p->x.kids[0]);
- print("fmovs %%f%d,%%f%d; ", src, dst);
- print("fmovs %%f%d,%%f%d\n", src+1, dst+1);
- break;
- }
- case NEG+F+sizeop(8): {
- int dst = getregnum(p);
- int src = getregnum(p->x.kids[0]);
- print("fnegs %%f%d,%%f%d; ", src, dst);
- print("fmovs %%f%d,%%f%d\n", src+1, dst+1);
- break;
- }
- case ASGN+B: {
- static int tmpregs[] = { 1, 2, 3 };
- dalign = salign = p->syms[1]->u.c.v.i;
- blkcopy(getregnum(p->x.kids[0]), 0,
- getregnum(p->x.kids[1]), 0,
- p->syms[0]->u.c.v.i, tmpregs);
- break;
- }
- }
-}
-static void local(Symbol p) {
- if (retstruct) {
- assert(p == retv);
- p->x.name = stringd(4*16);
- p->x.offset = 4*16;
- p->sclass = AUTO;
- retstruct = 0;
- return;
- }
- if (isscalar(p->type) && !p->addressed && !isfloat(p->type))
- p->sclass = REGISTER;
- if (askregvar(p, rmap(ttob(p->type))) == 0)
- mkauto(p);
- else if (p->scope > LOCAL)
- regvars++;
-}
-static void function(Symbol f, Symbol caller[], Symbol callee[], int ncalls) {
- int autos = 0, i, leaf, reg, varargs;
-
- if (IR == &solarisIR)
- globalend();
- regvars = 0;
- for (i = 0; callee[i]; i++)
- ;
- varargs = variadic(f->type)
- || i > 0 && strcmp(callee[i-1]->name,
- "__builtin_va_alist") == 0;
- usedmask[0] = usedmask[1] = 0;
- freemask[0] = freemask[1] = ~(unsigned)0;
- for (i = 0; i < 8; i++)
- ireg[i]->x.regnode->vbl = NULL;
- offset = 68;
- maxargoffset = 24;
- reg = 0;
- for (i = 0; callee[i]; i++) {
- Symbol p = callee[i], q = caller[i];
- int size = roundup(q->type->size, 4);
- assert(q);
- if (isfloat(p->type) || reg >= 6) {
- p->x.offset = q->x.offset = offset;
- p->x.name = q->x.name = stringd(offset);
- p->sclass = q->sclass = AUTO;
- autos++;
- }
- else if (p->addressed || varargs) {
- p->x.offset = offset;
- p->x.name = stringd(p->x.offset);
- p->sclass = AUTO;
- q->sclass = REGISTER;
- askregvar(q, ireg[reg]);
- assert(q->x.regnode);
- autos++;
- }
- else {
- p->sclass = q->sclass = REGISTER;
- askregvar(p, ireg[reg]);
- assert(p->x.regnode);
- q->x.name = p->x.name;
- }
- offset += size;
- reg += isstruct(p->type) ? 1 : size/4;
- }
- assert(caller[i] == 0);
- offset = maxoffset = 0;
- retstruct = isstruct(freturn(f->type));
- gencode(caller, callee);
- maxargoffset = roundup(maxargoffset, 4);
- framesize = roundup(maxoffset + maxargoffset + 4*(16+1), 8);
- assert(!varargs || autos);
- leaf = (!ncalls
- && !maxoffset && !autos && !regvars
- && !isstruct(freturn(f->type))
- && !(usedmask[IREG]&0x00ffff01)
- && !(usedmask[FREG]&~(unsigned)3)
- && !pflag && !glevel);
- print(".align 4\n%s:\n", f->x.name);
- if (leaf) {
- for (i = 0; caller[i] && callee[i]; i++) {
- Symbol p = caller[i], q = callee[i];
- if (p->sclass == REGISTER && q->sclass == REGISTER) {
- assert(q->x.regnode);
- assert(q->x.regnode->set == IREG);
- assert(q->x.regnode->number >= 24);
- assert(q->x.regnode->number <= 31);
- p->x.name = greg[q->x.regnode->number - 16]->x.name;
- }
- }
- renameregs();
- } else if (framesize <= 4095)
- print("save %%sp,%d,%%sp\n", -framesize);
- else
- print("set %d,%%g1; save %%sp,%%g1,%%sp\n", -framesize);
- if (varargs)
- for (; reg < 6; reg++)
- print("st %%i%d,[%%fp+%d]\n", reg, 4*reg + 68);
- else {
- offset = 4*(16 + 1);
- reg = 0;
- for (i = 0; caller[i]; i++) {
- Symbol p = caller[i];
- if (isfloat(p->type) && p->type->size == 8 && reg <= 4) {
- print("st %%r%d,[%%fp+%d]\n",
- ireg[reg++]->x.regnode->number, offset);
- print("st %%r%d,[%%fp+%d]\n",
- ireg[reg++]->x.regnode->number, offset + 4);
- } else if (isfloat(p->type) && p->type->size == 4 && reg <= 5)
- print("st %%r%d,[%%fp+%d]\n",
- ireg[reg++]->x.regnode->number, offset);
- else
- reg++;
- offset += roundup(p->type->size, 4);
- }
- }
- if (pflag) {
- int lab = genlabel(1);
- print("set L%d,%%o0; call mcount; nop\n", lab);
- print(".seg \"data\"\n.align 4; L%d:.word 0\n.seg \"text\"\n", lab);
- }
- emitcode();
- if (isstruct(freturn(f->type)))
- print("jmp %%i7+12; restore\n");
- else if (!leaf)
- print("ret; restore\n");
- else {
- renameregs();
- print("retl; nop\n");
- }
- if (IR == &solarisIR) {
- print(".type %s,#function\n", f->x.name);
- print(".size %s,.-%s\n", f->x.name, f->x.name);
- }
-}
-#define exch(x, y, t) (((t) = x), ((x) = (y)), ((y) = (t)))
-
-static void renameregs(void) {
- int i;
-
- for (i = 0; i < 8; i++) {
- char *ptmp;
- int itmp;
- if (ireg[i]->x.regnode->vbl)
- ireg[i]->x.regnode->vbl->x.name = oreg[i]->x.name;
- exch(ireg[i]->x.name, oreg[i]->x.name, ptmp);
- exch(ireg[i]->x.regnode->number,
- oreg[i]->x.regnode->number, itmp);
- }
-}
-static void defconst(int suffix, int size, Value v) {
- if (suffix == F && size == 4) {
- float f = v.d;
- print(".word 0x%x\n", *(unsigned *)&f);
- } else if (suffix == F && size == 8) {
- double d = v.d;
- unsigned *p = (unsigned *)&d;
- print(".word 0x%x\n.word 0x%x\n", p[swap], p[!swap]);
- } else if (suffix == P)
- print(".word 0x%x\n", v.p);
- else if (size == 1)
- print(".byte 0x%x\n", suffix == I ? v.i : v.u);
- else if (size == 2)
- print(".half 0x%x\n", suffix == I ? v.i : v.u);
- else if (size == 4)
- print(".word 0x%x\n", suffix == I ? v.i : v.u);
- else assert(0);
-}
-
-static void defaddress(Symbol p) {
- print(".word %s\n", p->x.name);
-}
-
-static void defstring(int n, char *str) {
- char *s;
-
- for (s = str; s < str + n; s++)
- print(".byte %d\n", (*s)&0377);
-}
-
-static void address(Symbol q, Symbol p, long n) {
- if (p->scope == GLOBAL || p->sclass == STATIC || p->sclass == EXTERN)
- q->x.name = stringf("%s%s%D", p->x.name, n >= 0 ? "+" : "", n);
- else {
- assert(n <= INT_MAX && n >= INT_MIN);
- q->x.offset = p->x.offset + n;
- q->x.name = stringd(q->x.offset);
- }
-}
-static void export(Symbol p) {
- print(".global %s\n", p->x.name);
-}
-static void import(Symbol p) {}
-static void defsymbol(Symbol p) {
- if (p->scope >= LOCAL && p->sclass == STATIC)
- p->x.name = stringf("%d", genlabel(1));
- else
- assert(p->scope != CONSTANTS || isint(p->type) || isptr(p->type)),
- p->x.name = p->name;
- if (p->scope >= LABELS)
- p->x.name = stringf(p->generated ? "L%s" : "_%s",
- p->x.name);
-}
-static void segment(int n) {
- cseg = n;
- switch (n) {
- case CODE: print(".seg \"text\"\n"); break;
- case BSS: print(".seg \"bss\"\n"); break;
- case DATA: print(".seg \"data\"\n"); break;
- case LIT: print(".seg \"text\"\n"); break;
- }
-}
-static void space(int n) {
- if (cseg != BSS)
- print(".skip %d\n", n);
-}
-static void global(Symbol p) {
- print(".align %d\n", p->type->align);
- assert(p->u.seg);
- if (p->u.seg == BSS
- && (p->sclass == STATIC || Aflag >= 2))
- print(".reserve %s,%d\n", p->x.name, p->type->size);
- else if (p->u.seg == BSS)
- print(".common %s,%d\n", p->x.name, p->type->size);
- else
- print("%s:\n", p->x.name);
-}
-static void blkfetch(int k, int off, int reg, int tmp) {
- assert(k == 1 || k == 2 || k == 4);
- assert(salign >= k);
- if (k == 1)
- print("ldub [%%r%d+%d],%%r%d\n", reg, off, tmp);
- else if (k == 2)
- print("lduh [%%r%d+%d],%%r%d\n", reg, off, tmp);
- else
- print("ld [%%r%d+%d],%%r%d\n", reg, off, tmp);
-}
-static void blkstore(int k, int off, int reg, int tmp) {
- assert(k == 1 || k == 2 || k == 4);
- assert(dalign >= k);
- if (k == 1)
- print("stb %%r%d,[%%r%d+%d]\n", tmp, reg, off);
- else if (k == 2)
- print("sth %%r%d,[%%r%d+%d]\n", tmp, reg, off);
- else
- print("st %%r%d,[%%r%d+%d]\n", tmp, reg, off);
-}
-static void blkloop(int dreg, int doff, int sreg, int soff, int size, int tmps[]) {
- if ((size&~7) < 4096) {
- print("add %%r%d,%d,%%r%d\n", sreg, size&~7, sreg);
- print("add %%r%d,%d,%%r%d\n", dreg, size&~7, tmps[2]);
- } else {
- print("set %d,%%r%d\n", size&~7, tmps[2]);
- print("add %%r%d,%%r%d,%%r%d\n", sreg, tmps[2], sreg);
- print("add %%r%d,%%r%d,%%r%d\n", dreg, tmps[2], tmps[2]);
- }
- blkcopy(tmps[2], doff, sreg, soff, size&7, tmps);
- print("1: dec 8,%%r%d\n", tmps[2]);
- blkcopy(tmps[2], doff, sreg, soff - 8, 8, tmps);
- print("cmp %%r%d,%%r%d; ", tmps[2], dreg);
- print("bgt 1b; ");
- print("dec 8,%%r%d\n", sreg);
-}
-static void defsymbol2(Symbol p) {
- if (p->scope >= LOCAL && p->sclass == STATIC)
- p->x.name = stringf(".%d", genlabel(1));
- else
- assert(p->scope != CONSTANTS || isint(p->type) || isptr(p->type)),
- p->x.name = p->name;
- if (p->scope >= LABELS)
- p->x.name = stringf(p->generated ? ".L%s" : "%s",
- p->x.name);
-}
-
-static Symbol prevg;
-
-static void globalend(void) {
- if (prevg && prevg->type->size > 0)
- print(".size %s,%d\n", prevg->x.name, prevg->type->size);
- prevg = NULL;
-}
-
-static void export2(Symbol p) {
- globalend();
- print(".global %s\n", p->x.name);
-}
-
-static void progend2(void) {
- globalend();
-}
-
-static void global2(Symbol p) {
- globalend();
- assert(p->u.seg);
- if (!p->generated) {
- print(".type %s,#%s\n", p->x.name,
- isfunc(p->type) ? "function" : "object");
- if (p->type->size > 0)
- print(".size %s,%d\n", p->x.name, p->type->size);
- else
- prevg = p;
- }
- if (p->u.seg == BSS && p->sclass == STATIC)
- print(".local %s\n.common %s,%d,%d\n", p->x.name, p->x.name,
- p->type->size, p->type->align);
- else if (p->u.seg == BSS && Aflag >= 2)
- print(".align %d\n%s:.skip %d\n", p->type->align, p->x.name,
- p->type->size);
- else if (p->u.seg == BSS)
- print(".common %s,%d,%d\n", p->x.name, p->type->size, p->type->align);
- else
- print(".align %d\n%s:\n", p->type->align, p->x.name);
-}
-
-static void segment2(int n) {
- cseg = n;
- switch (n) {
- case CODE: print(".section \".text\"\n"); break;
- case BSS: print(".section \".bss\"\n"); break;
- case DATA: print(".section \".data\"\n"); break;
- case LIT: print(".section \".rodata\"\n"); break;
- }
-}
-Interface sparcIR = {
- 1, 1, 0, /* char */
- 2, 2, 0, /* short */
- 4, 4, 0, /* int */
- 4, 4, 0, /* long */
- 4, 4, 0, /* long long */
- 4, 4, 1, /* float */
- 8, 8, 1, /* double */
- 8, 8, 1, /* long double */
- 4, 4, 0, /* T * */
- 0, 1, 0, /* struct */
- 0, /* little_endian */
- 0, /* mulops_calls */
- 1, /* wants_callb */
- 0, /* wants_argb */
- 1, /* left_to_right */
- 0, /* wants_dag */
- 0, /* unsigned_char */
- address,
- blockbeg,
- blockend,
- defaddress,
- defconst,
- defstring,
- defsymbol,
- emit,
- export,
- function,
- gen,
- global,
- import,
- local,
- progbeg,
- progend,
- segment,
- space,
- stabblock, 0, 0, stabinit, stabline, stabsym, stabtype,
- {
- 1, /* max_unaligned_load */
- rmap,
- blkfetch, blkstore, blkloop,
- _label,
- _rule,
- _nts,
- _kids,
- _string,
- _templates,
- _isinstruction,
- _ntname,
- emit2,
- doarg,
- target,
- clobber,
-
- }
-};
-
-Interface solarisIR = {
- 1, 1, 0, /* char */
- 2, 2, 0, /* short */
- 4, 4, 0, /* int */
- 4, 4, 0, /* long */
- 4, 4, 0, /* long long */
- 4, 4, 1, /* float */
- 8, 8, 1, /* double */
- 8, 8, 1, /* long double */
- 4, 4, 0, /* T * */
- 0, 1, 0, /* struct */
- 0, /* little_endian */
- 0, /* mulops_calls */
- 1, /* wants_callb */
- 0, /* wants_argb */
- 1, /* left_to_right */
- 0, /* wants_dag */
- 0, /* unsigned_char */
- address,
- blockbeg,
- blockend,
- defaddress,
- defconst,
- defstring,
- defsymbol2,
- emit,
- export2,
- function,
- gen,
- global2,
- import,
- local,
- progbeg,
- progend2,
- segment2,
- space,
- stabblock, 0, 0, stabinit, stabline, stabsym, stabtype,
- {
- 1, /* max_unaligned_load */
- rmap,
- blkfetch, blkstore, blkloop,
- _label,
- _rule,
- _nts,
- _kids,
- _string,
- _templates,
- _isinstruction,
- _ntname,
- emit2,
- doarg,
- target,
- clobber,
-
- }
-};
-static char rcsid[] = "$Id: sparc.md 145 2001-10-17 21:53:10Z timo $";
diff --git a/code/tools/lcc/src/x86.md b/code/tools/lcc/src/x86.md
deleted file mode 100644
index 6c4e1c4..0000000
--- a/code/tools/lcc/src/x86.md
+++ /dev/null
@@ -1,998 +0,0 @@
-%{
-enum { EAX=0, ECX=1, EDX=2, EBX=3, ESI=6, EDI=7 };
-#include "c.h"
-#define NODEPTR_TYPE Node
-#define OP_LABEL(p) ((p)->op)
-#define LEFT_CHILD(p) ((p)->kids[0])
-#define RIGHT_CHILD(p) ((p)->kids[1])
-#define STATE_LABEL(p) ((p)->x.state)
-static void address(Symbol, Symbol, long);
-static void blkfetch(int, int, int, int);
-static void blkloop(int, int, int, int, int, int[]);
-static void blkstore(int, int, int, int);
-static void defaddress(Symbol);
-static void defconst(int, int, Value);
-static void defstring(int, char *);
-static void defsymbol(Symbol);
-static void doarg(Node);
-static void emit2(Node);
-static void export(Symbol);
-static void clobber(Node);
-static void function(Symbol, Symbol [], Symbol [], int);
-static void global(Symbol);
-static void import(Symbol);
-static void local(Symbol);
-static void progbeg(int, char **);
-static void progend(void);
-static void segment(int);
-static void space(int);
-static void target(Node);
-extern int ckstack(Node, int);
-extern int memop(Node);
-extern int sametree(Node, Node);
-static Symbol charreg[32], shortreg[32], intreg[32];
-static Symbol fltreg[32];
-
-static Symbol charregw, shortregw, intregw, fltregw;
-
-static int cseg;
-
-static Symbol quo, rem;
-
-%}
-%start stmt
-%term CNSTF4=4113
-%term CNSTF8=8209
-%term CNSTF16=16401
-%term CNSTI1=1045
-%term CNSTI2=2069
-%term CNSTI4=4117
-%term CNSTI8=8213
-%term CNSTP4=4119
-%term CNSTP8=8215
-%term CNSTU1=1046
-%term CNSTU2=2070
-%term CNSTU4=4118
-%term CNSTU8=8214
-
-%term ARGB=41
-%term ARGF4=4129
-%term ARGF8=8225
-%term ARGF16=16417
-%term ARGI4=4133
-%term ARGI8=8229
-%term ARGP4=4135
-%term ARGP8=8231
-%term ARGU4=4134
-%term ARGU8=8230
-
-%term ASGNB=57
-%term ASGNF4=4145
-%term ASGNF8=8241
-%term ASGNF16=16433
-%term ASGNI1=1077
-%term ASGNI2=2101
-%term ASGNI4=4149
-%term ASGNI8=8245
-%term ASGNP4=4151
-%term ASGNP8=8247
-%term ASGNU1=1078
-%term ASGNU2=2102
-%term ASGNU4=4150
-%term ASGNU8=8246
-
-%term INDIRB=73
-%term INDIRF4=4161
-%term INDIRF8=8257
-%term INDIRF16=16449
-%term INDIRI1=1093
-%term INDIRI2=2117
-%term INDIRI4=4165
-%term INDIRI8=8261
-%term INDIRP4=4167
-%term INDIRP8=8263
-%term INDIRU1=1094
-%term INDIRU2=2118
-%term INDIRU4=4166
-%term INDIRU8=8262
-
-%term CVFF4=4209
-%term CVFF8=8305
-%term CVFF16=16497
-%term CVFI4=4213
-%term CVFI8=8309
-
-%term CVIF4=4225
-%term CVIF8=8321
-%term CVIF16=16513
-%term CVII1=1157
-%term CVII2=2181
-%term CVII4=4229
-%term CVII8=8325
-%term CVIU1=1158
-%term CVIU2=2182
-%term CVIU4=4230
-%term CVIU8=8326
-
-%term CVPP4=4247
-%term CVPP8=8343
-%term CVPP16=16535
-%term CVPU4=4246
-%term CVPU8=8342
-
-%term CVUI1=1205
-%term CVUI2=2229
-%term CVUI4=4277
-%term CVUI8=8373
-%term CVUP4=4279
-%term CVUP8=8375
-%term CVUP16=16567
-%term CVUU1=1206
-%term CVUU2=2230
-%term CVUU4=4278
-%term CVUU8=8374
-
-%term NEGF4=4289
-%term NEGF8=8385
-%term NEGF16=16577
-%term NEGI4=4293
-%term NEGI8=8389
-
-%term CALLB=217
-%term CALLF4=4305
-%term CALLF8=8401
-%term CALLF16=16593
-%term CALLI4=4309
-%term CALLI8=8405
-%term CALLP4=4311
-%term CALLP8=8407
-%term CALLU4=4310
-%term CALLU8=8406
-%term CALLV=216
-
-%term RETF4=4337
-%term RETF8=8433
-%term RETF16=16625
-%term RETI4=4341
-%term RETI8=8437
-%term RETP4=4343
-%term RETP8=8439
-%term RETU4=4342
-%term RETU8=8438
-%term RETV=248
-
-%term ADDRGP4=4359
-%term ADDRGP8=8455
-
-%term ADDRFP4=4375
-%term ADDRFP8=8471
-
-%term ADDRLP4=4391
-%term ADDRLP8=8487
-
-%term ADDF4=4401
-%term ADDF8=8497
-%term ADDF16=16689
-%term ADDI4=4405
-%term ADDI8=8501
-%term ADDP4=4407
-%term ADDP8=8503
-%term ADDU4=4406
-%term ADDU8=8502
-
-%term SUBF4=4417
-%term SUBF8=8513
-%term SUBF16=16705
-%term SUBI4=4421
-%term SUBI8=8517
-%term SUBP4=4423
-%term SUBP8=8519
-%term SUBU4=4422
-%term SUBU8=8518
-
-%term LSHI4=4437
-%term LSHI8=8533
-%term LSHU4=4438
-%term LSHU8=8534
-
-%term MODI4=4453
-%term MODI8=8549
-%term MODU4=4454
-%term MODU8=8550
-
-%term RSHI4=4469
-%term RSHI8=8565
-%term RSHU4=4470
-%term RSHU8=8566
-
-%term BANDI4=4485
-%term BANDI8=8581
-%term BANDU4=4486
-%term BANDU8=8582
-
-%term BCOMI4=4501
-%term BCOMI8=8597
-%term BCOMU4=4502
-%term BCOMU8=8598
-
-%term BORI4=4517
-%term BORI8=8613
-%term BORU4=4518
-%term BORU8=8614
-
-%term BXORI4=4533
-%term BXORI8=8629
-%term BXORU4=4534
-%term BXORU8=8630
-
-%term DIVF4=4545
-%term DIVF8=8641
-%term DIVF16=16833
-%term DIVI4=4549
-%term DIVI8=8645
-%term DIVU4=4550
-%term DIVU8=8646
-
-%term MULF4=4561
-%term MULF8=8657
-%term MULF16=16849
-%term MULI4=4565
-%term MULI8=8661
-%term MULU4=4566
-%term MULU8=8662
-
-%term EQF4=4577
-%term EQF8=8673
-%term EQF16=16865
-%term EQI4=4581
-%term EQI8=8677
-%term EQU4=4582
-%term EQU8=8678
-
-%term GEF4=4593
-%term GEF8=8689
-%term GEI4=4597
-%term GEI8=8693
-%term GEI16=16885
-%term GEU4=4598
-%term GEU8=8694
-
-%term GTF4=4609
-%term GTF8=8705
-%term GTF16=16897
-%term GTI4=4613
-%term GTI8=8709
-%term GTU4=4614
-%term GTU8=8710
-
-%term LEF4=4625
-%term LEF8=8721
-%term LEF16=16913
-%term LEI4=4629
-%term LEI8=8725
-%term LEU4=4630
-%term LEU8=8726
-
-%term LTF4=4641
-%term LTF8=8737
-%term LTF16=16929
-%term LTI4=4645
-%term LTI8=8741
-%term LTU4=4646
-%term LTU8=8742
-
-%term NEF4=4657
-%term NEF8=8753
-%term NEF16=16945
-%term NEI4=4661
-%term NEI8=8757
-%term NEU4=4662
-%term NEU8=8758
-
-%term JUMPV=584
-
-%term LABELV=600
-
-%term LOADB=233
-%term LOADF4=4321
-%term LOADF8=8417
-%term LOADF16=16609
-%term LOADI1=1253
-%term LOADI2=2277
-%term LOADI4=4325
-%term LOADI8=8421
-%term LOADP4=4327
-%term LOADP8=8423
-%term LOADU1=1254
-%term LOADU2=2278
-%term LOADU4=4326
-%term LOADU8=8422
-
-%term VREGP=711
-%%
-reg: INDIRI1(VREGP) "# read register\n"
-reg: INDIRU1(VREGP) "# read register\n"
-
-reg: INDIRI2(VREGP) "# read register\n"
-reg: INDIRU2(VREGP) "# read register\n"
-
-reg: INDIRF4(VREGP) "# read register\n"
-reg: INDIRI4(VREGP) "# read register\n"
-reg: INDIRP4(VREGP) "# read register\n"
-reg: INDIRU4(VREGP) "# read register\n"
-
-reg: INDIRF8(VREGP) "# read register\n"
-reg: INDIRI8(VREGP) "# read register\n"
-reg: INDIRP8(VREGP) "# read register\n"
-reg: INDIRU8(VREGP) "# read register\n"
-
-stmt: ASGNI1(VREGP,reg) "# write register\n"
-stmt: ASGNU1(VREGP,reg) "# write register\n"
-
-stmt: ASGNI2(VREGP,reg) "# write register\n"
-stmt: ASGNU2(VREGP,reg) "# write register\n"
-
-stmt: ASGNF4(VREGP,reg) "# write register\n"
-stmt: ASGNI4(VREGP,reg) "# write register\n"
-stmt: ASGNP4(VREGP,reg) "# write register\n"
-stmt: ASGNU4(VREGP,reg) "# write register\n"
-
-stmt: ASGNF8(VREGP,reg) "# write register\n"
-stmt: ASGNI8(VREGP,reg) "# write register\n"
-stmt: ASGNP8(VREGP,reg) "# write register\n"
-stmt: ASGNU8(VREGP,reg) "# write register\n"
-con: CNSTI1 "%a"
-con: CNSTU1 "%a"
-
-con: CNSTI2 "%a"
-con: CNSTU2 "%a"
-
-con: CNSTI4 "%a"
-con: CNSTU4 "%a"
-con: CNSTP4 "%a"
-
-con: CNSTI8 "%a"
-con: CNSTU8 "%a"
-con: CNSTP8 "%a"
-stmt: reg ""
-acon: ADDRGP4 "(%a)"
-acon: con "(%0)"
-base: ADDRGP4 "(%a)"
-base: reg "[%0]"
-base: ADDI4(reg,acon) "%1[%0]"
-base: ADDP4(reg,acon) "%1[%0]"
-base: ADDU4(reg,acon) "%1[%0]"
-base: ADDRFP4 "(%a)[ebp]"
-base: ADDRLP4 "(%a)[ebp]"
-index: reg "%0"
-index: LSHI4(reg,con1) "%0*2"
-index: LSHI4(reg,con2) "%0*4"
-index: LSHI4(reg,con3) "%0*8"
-
-con1: CNSTI4 "1" range(a, 1, 1)
-con1: CNSTU4 "1" range(a, 1, 1)
-con2: CNSTI4 "2" range(a, 2, 2)
-con2: CNSTU4 "2" range(a, 2, 2)
-con3: CNSTI4 "3" range(a, 3, 3)
-con3: CNSTU4 "3" range(a, 3, 3)
-index: LSHU4(reg,con1) "%0*2"
-index: LSHU4(reg,con2) "%0*4"
-index: LSHU4(reg,con3) "%0*8"
-addr: base "%0"
-addr: ADDI4(index,base) "%1[%0]"
-addr: ADDP4(index,base) "%1[%0]"
-addr: ADDU4(index,base) "%1[%0]"
-addr: index "[%0]"
-mem: INDIRI1(addr) "byte ptr %0"
-mem: INDIRI2(addr) "word ptr %0"
-mem: INDIRI4(addr) "dword ptr %0"
-mem: INDIRU1(addr) "byte ptr %0"
-mem: INDIRU2(addr) "word ptr %0"
-mem: INDIRU4(addr) "dword ptr %0"
-mem: INDIRP4(addr) "dword ptr %0"
-rc: reg "%0"
-rc: con "%0"
-
-mr: reg "%0"
-mr: mem "%0"
-
-mrc0: mem "%0"
-mrc0: rc "%0"
-mrc1: mem "%0" 1
-mrc1: rc "%0"
-
-mrc3: mem "%0" 3
-mrc3: rc "%0"
-reg: addr "lea %c,%0\n" 1
-reg: mrc0 "mov %c,%0\n" 1
-reg: LOADI1(reg) "# move\n" 1
-reg: LOADI2(reg) "# move\n" 1
-reg: LOADI4(reg) "# move\n" move(a)
-reg: LOADU1(reg) "# move\n" 1
-reg: LOADU2(reg) "# move\n" 1
-reg: LOADU4(reg) "# move\n" move(a)
-reg: LOADP4(reg) "# move\n" move(a)
-reg: ADDI4(reg,mrc1) "?mov %c,%0\nadd %c,%1\n" 1
-reg: ADDP4(reg,mrc1) "?mov %c,%0\nadd %c,%1\n" 1
-reg: ADDU4(reg,mrc1) "?mov %c,%0\nadd %c,%1\n" 1
-reg: SUBI4(reg,mrc1) "?mov %c,%0\nsub %c,%1\n" 1
-reg: SUBP4(reg,mrc1) "?mov %c,%0\nsub %c,%1\n" 1
-reg: SUBU4(reg,mrc1) "?mov %c,%0\nsub %c,%1\n" 1
-reg: BANDI4(reg,mrc1) "?mov %c,%0\nand %c,%1\n" 1
-reg: BORI4(reg,mrc1) "?mov %c,%0\nor %c,%1\n" 1
-reg: BXORI4(reg,mrc1) "?mov %c,%0\nxor %c,%1\n" 1
-reg: BANDU4(reg,mrc1) "?mov %c,%0\nand %c,%1\n" 1
-reg: BORU4(reg,mrc1) "?mov %c,%0\nor %c,%1\n" 1
-reg: BXORU4(reg,mrc1) "?mov %c,%0\nxor %c,%1\n" 1
-stmt: ASGNI4(addr,ADDI4(mem,con1)) "inc %1\n" memop(a)
-stmt: ASGNI4(addr,ADDU4(mem,con1)) "inc %1\n" memop(a)
-stmt: ASGNP4(addr,ADDP4(mem,con1)) "inc %1\n" memop(a)
-stmt: ASGNI4(addr,SUBI4(mem,con1)) "dec %1\n" memop(a)
-stmt: ASGNI4(addr,SUBU4(mem,con1)) "dec %1\n" memop(a)
-stmt: ASGNP4(addr,SUBP4(mem,con1)) "dec %1\n" memop(a)
-stmt: ASGNI4(addr,ADDI4(mem,rc)) "add %1,%2\n" memop(a)
-stmt: ASGNI4(addr,SUBI4(mem,rc)) "sub %1,%2\n" memop(a)
-stmt: ASGNU4(addr,ADDU4(mem,rc)) "add %1,%2\n" memop(a)
-stmt: ASGNU4(addr,SUBU4(mem,rc)) "sub %1,%2\n" memop(a)
-
-stmt: ASGNI4(addr,BANDI4(mem,rc)) "and %1,%2\n" memop(a)
-stmt: ASGNI4(addr,BORI4(mem,rc)) "or %1,%2\n" memop(a)
-stmt: ASGNI4(addr,BXORI4(mem,rc)) "xor %1,%2\n" memop(a)
-stmt: ASGNU4(addr,BANDU4(mem,rc)) "and %1,%2\n" memop(a)
-stmt: ASGNU4(addr,BORU4(mem,rc)) "or %1,%2\n" memop(a)
-stmt: ASGNU4(addr,BXORU4(mem,rc)) "xor %1,%2\n" memop(a)
-reg: BCOMI4(reg) "?mov %c,%0\nnot %c\n" 2
-reg: BCOMU4(reg) "?mov %c,%0\nnot %c\n" 2
-reg: NEGI4(reg) "?mov %c,%0\nneg %c\n" 2
-
-stmt: ASGNI4(addr,BCOMI4(mem)) "not %1\n" memop(a)
-stmt: ASGNU4(addr,BCOMU4(mem)) "not %1\n" memop(a)
-stmt: ASGNI4(addr,NEGI4(mem)) "neg %1\n" memop(a)
-reg: LSHI4(reg,con5) "?mov %c,%0\nsal %c,%1\n" 2
-reg: LSHU4(reg,con5) "?mov %c,%0\nshl %c,%1\n" 2
-reg: RSHI4(reg,con5) "?mov %c,%0\nsar %c,%1\n" 2
-reg: RSHU4(reg,con5) "?mov %c,%0\nshr %c,%1\n" 2
-
-stmt: ASGNI4(addr,LSHI4(mem,con5)) "sal %1,%2\n" memop(a)
-stmt: ASGNI4(addr,LSHU4(mem,con5)) "shl %1,%2\n" memop(a)
-stmt: ASGNI4(addr,RSHI4(mem,con5)) "sar %1,%2\n" memop(a)
-stmt: ASGNI4(addr,RSHU4(mem,con5)) "shr %1,%2\n" memop(a)
-
-con5: CNSTI4 "%a" range(a, 0, 31)
-
-reg: LSHI4(reg,reg) "?mov %c,%0\nmov ecx,%1\nsal %c,cl\n" 3
-reg: LSHU4(reg,reg) "?mov %c,%0\nmov ecx,%1\nshl %c,cl\n" 2
-reg: RSHI4(reg,reg) "?mov %c,%0\nmov ecx,%1\nsar %c,cl\n" 2
-reg: RSHU4(reg,reg) "?mov %c,%0\nmov ecx,%1\nshr %c,cl\n" 2
-reg: MULI4(reg,mrc3) "?mov %c,%0\nimul %c,%1\n" 14
-reg: MULI4(con,mr) "imul %c,%1,%0\n" 13
-reg: MULU4(reg,mr) "mul %1\n" 13
-reg: DIVU4(reg,reg) "xor edx,edx\ndiv %1\n"
-reg: MODU4(reg,reg) "xor edx,edx\ndiv %1\n"
-reg: DIVI4(reg,reg) "cdq\nidiv %1\n"
-reg: MODI4(reg,reg) "cdq\nidiv %1\n"
-reg: CVPU4(reg) "mov %c,%0\n" move(a)
-reg: CVUP4(reg) "mov %c,%0\n" move(a)
-reg: CVII4(INDIRI1(addr)) "movsx %c,byte ptr %0\n" 3
-reg: CVII4(INDIRI2(addr)) "movsx %c,word ptr %0\n" 3
-reg: CVUU4(INDIRU1(addr)) "movzx %c,byte ptr %0\n" 3
-reg: CVUU4(INDIRU2(addr)) "movzx %c,word ptr %0\n" 3
-reg: CVII4(reg) "# extend\n" 3
-reg: CVIU4(reg) "# extend\n" 3
-reg: CVUI4(reg) "# extend\n" 3
-reg: CVUU4(reg) "# extend\n" 3
-
-reg: CVII1(reg) "# truncate\n" 1
-reg: CVII2(reg) "# truncate\n" 1
-reg: CVUU1(reg) "# truncate\n" 1
-reg: CVUU2(reg) "# truncate\n" 1
-stmt: ASGNI1(addr,rc) "mov byte ptr %0,%1\n" 1
-stmt: ASGNI2(addr,rc) "mov word ptr %0,%1\n" 1
-stmt: ASGNI4(addr,rc) "mov dword ptr %0,%1\n" 1
-stmt: ASGNU1(addr,rc) "mov byte ptr %0,%1\n" 1
-stmt: ASGNU2(addr,rc) "mov word ptr %0,%1\n" 1
-stmt: ASGNU4(addr,rc) "mov dword ptr %0,%1\n" 1
-stmt: ASGNP4(addr,rc) "mov dword ptr %0,%1\n" 1
-stmt: ARGI4(mrc3) "push %0\n" 1
-stmt: ARGU4(mrc3) "push %0\n" 1
-stmt: ARGP4(mrc3) "push %0\n" 1
-stmt: ASGNB(reg,INDIRB(reg)) "mov ecx,%a\nrep movsb\n"
-stmt: ARGB(INDIRB(reg)) "sub esp,%a\nmov edi,esp\nmov ecx,%a\nrep movsb\n"
-
-memf: INDIRF8(addr) "qword ptr %0"
-memf: INDIRF4(addr) "dword ptr %0"
-memf: CVFF8(INDIRF4(addr)) "dword ptr %0"
-reg: memf "fld %0\n" 3
-stmt: ASGNF8(addr,reg) "fstp qword ptr %0\n" 7
-stmt: ASGNF4(addr,reg) "fstp dword ptr %0\n" 7
-stmt: ASGNF4(addr,CVFF4(reg)) "fstp dword ptr %0\n" 7
-stmt: ARGF8(reg) "sub esp,8\nfstp qword ptr [esp]\n"
-stmt: ARGF4(reg) "sub esp,4\nfstp dword ptr [esp]\n"
-reg: NEGF8(reg) "fchs\n"
-reg: NEGF4(reg) "fchs\n"
-flt: memf " %0"
-flt: reg "p st(1),st"
-reg: ADDF8(reg,flt) "fadd%1\n"
-reg: ADDF4(reg,flt) "fadd%1\n"
-reg: DIVF8(reg,flt) "fdiv%1\n"
-reg: DIVF4(reg,flt) "fdiv%1\n"
-reg: MULF8(reg,flt) "fmul%1\n"
-reg: MULF4(reg,flt) "fmul%1\n"
-reg: SUBF8(reg,flt) "fsub%1\n"
-reg: SUBF4(reg,flt) "fsub%1\n"
-reg: CVFF8(reg) "# CVFF8\n"
-reg: CVFF4(reg) "sub esp,4\nfstp dword ptr 0[esp]\nfld dword ptr 0[esp]\nadd esp,4\n" 12
-
-reg: CVFI4(reg) "call __ftol\n" 31
-reg: CVIF8(INDIRI4(addr)) "fild dword ptr %0\n" 10
-reg: CVIF4(reg) "push %0\nfild dword ptr 0[esp]\nadd esp,4\n" 12
-
-reg: CVIF8(reg) "push %0\nfild dword ptr 0[esp]\nadd esp,4\n" 12
-
-addrj: ADDRGP4 "%a"
-addrj: reg "%0" 2
-addrj: mem "%0" 2
-
-stmt: JUMPV(addrj) "jmp %0\n" 3
-stmt: LABELV "%a:\n"
-stmt: EQI4(mem,rc) "cmp %0,%1\nje %a\n" 5
-stmt: GEI4(mem,rc) "cmp %0,%1\njge %a\n" 5
-stmt: GTI4(mem,rc) "cmp %0,%1\njg %a\n" 5
-stmt: LEI4(mem,rc) "cmp %0,%1\njle %a\n" 5
-stmt: LTI4(mem,rc) "cmp %0,%1\njl %a\n" 5
-stmt: NEI4(mem,rc) "cmp %0,%1\njne %a\n" 5
-stmt: GEU4(mem,rc) "cmp %0,%1\njae %a\n" 5
-stmt: GTU4(mem,rc) "cmp %0,%1\nja %a\n" 5
-stmt: LEU4(mem,rc) "cmp %0,%1\njbe %a\n" 5
-stmt: LTU4(mem,rc) "cmp %0,%1\njb %a\n" 5
-stmt: EQI4(reg,mrc1) "cmp %0,%1\nje %a\n" 4
-stmt: GEI4(reg,mrc1) "cmp %0,%1\njge %a\n" 4
-stmt: GTI4(reg,mrc1) "cmp %0,%1\njg %a\n" 4
-stmt: LEI4(reg,mrc1) "cmp %0,%1\njle %a\n" 4
-stmt: LTI4(reg,mrc1) "cmp %0,%1\njl %a\n" 4
-stmt: NEI4(reg,mrc1) "cmp %0,%1\njne %a\n" 4
-
-stmt: EQU4(reg,mrc1) "cmp %0,%1\nje %a\n" 4
-stmt: GEU4(reg,mrc1) "cmp %0,%1\njae %a\n" 4
-stmt: GTU4(reg,mrc1) "cmp %0,%1\nja %a\n" 4
-stmt: LEU4(reg,mrc1) "cmp %0,%1\njbe %a\n" 4
-stmt: LTU4(reg,mrc1) "cmp %0,%1\njb %a\n" 4
-stmt: NEU4(reg,mrc1) "cmp %0,%1\njne %a\n" 4
-cmpf: memf " %0"
-cmpf: reg "p"
-stmt: EQF8(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\nje %a\n"
-stmt: GEF8(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\njbe %a\n"
-stmt: GTF8(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\njb %a\n"
-stmt: LEF8(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\njae %a\n"
-stmt: LTF8(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\nja %a\n"
-stmt: NEF8(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\njne %a\n"
-
-stmt: EQF4(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\nje %a\n"
-stmt: GEF4(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\njbe %a\n"
-stmt: GTF4(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\njb %a\n"
-stmt: LEF4(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\njae %a\n"
-stmt: LTF4(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\nja %a\n"
-stmt: NEF4(cmpf,reg) "fcomp%0\nfstsw ax\nsahf\njne %a\n"
-reg: CALLI4(addrj) "call %0\nadd esp,%a\n"
-reg: CALLU4(addrj) "call %0\nadd esp,%a\n"
-reg: CALLP4(addrj) "call %0\nadd esp,%a\n"
-stmt: CALLV(addrj) "call %0\nadd esp,%a\n"
-reg: CALLF4(addrj) "call %0\nadd esp,%a\n"
-reg: CALLF8(addrj) "call %0\nadd esp,%a\n"
-stmt: CALLF4(addrj) "call %0\nadd esp,%a\nfstp\n"
-stmt: CALLF8(addrj) "call %0\nadd esp,%a\nfstp\n"
-
-stmt: RETI4(reg) "# ret\n"
-stmt: RETU4(reg) "# ret\n"
-stmt: RETP4(reg) "# ret\n"
-stmt: RETF4(reg) "# ret\n"
-stmt: RETF8(reg) "# ret\n"
-%%
-static void progbeg(int argc, char *argv[]) {
- int i;
-
- {
- union {
- char c;
- int i;
- } u;
- u.i = 0;
- u.c = 1;
- swap = ((int)(u.i == 1)) != IR->little_endian;
- }
- parseflags(argc, argv);
- intreg[EAX] = mkreg("eax", EAX, 1, IREG);
- intreg[EDX] = mkreg("edx", EDX, 1, IREG);
- intreg[ECX] = mkreg("ecx", ECX, 1, IREG);
- intreg[EBX] = mkreg("ebx", EBX, 1, IREG);
- intreg[ESI] = mkreg("esi", ESI, 1, IREG);
- intreg[EDI] = mkreg("edi", EDI, 1, IREG);
-
- shortreg[EAX] = mkreg("ax", EAX, 1, IREG);
- shortreg[ECX] = mkreg("cx", ECX, 1, IREG);
- shortreg[EDX] = mkreg("dx", EDX, 1, IREG);
- shortreg[EBX] = mkreg("bx", EBX, 1, IREG);
- shortreg[ESI] = mkreg("si", ESI, 1, IREG);
- shortreg[EDI] = mkreg("di", EDI, 1, IREG);
-
- charreg[EAX] = mkreg("al", EAX, 1, IREG);
- charreg[ECX] = mkreg("cl", ECX, 1, IREG);
- charreg[EDX] = mkreg("dl", EDX, 1, IREG);
- charreg[EBX] = mkreg("bl", EBX, 1, IREG);
- for (i = 0; i < 8; i++)
- fltreg[i] = mkreg("%d", i, 0, FREG);
- charregw = mkwildcard(charreg);
- shortregw = mkwildcard(shortreg);
- intregw = mkwildcard(intreg);
- fltregw = mkwildcard(fltreg);
-
- tmask[IREG] = (1<<EDI) | (1<<ESI) | (1<<EBX)
- | (1<<EDX) | (1<<ECX) | (1<<EAX);
- vmask[IREG] = 0;
- tmask[FREG] = 0xff;
- vmask[FREG] = 0;
- print(".486\n");
- print(".model flat\n");
- print("extrn __fltused:near\n");
- print("extrn __ftol:near\n");
- cseg = 0;
- quo = mkreg("eax", EAX, 1, IREG);
- quo->x.regnode->mask |= 1<<EDX;
- rem = mkreg("edx", EDX, 1, IREG);
- rem->x.regnode->mask |= 1<<EAX;
-}
-static Symbol rmap(int opk) {
- switch (optype(opk)) {
- case B: case P:
- return intregw;
- case I: case U:
- if (opsize(opk) == 1)
- return charregw;
- else if (opsize(opk) == 2)
- return shortregw;
- else
- return intregw;
- case F:
- return fltregw;
- default:
- return 0;
- }
-}
-static void segment(int n) {
- if (n == cseg)
- return;
- if (cseg == CODE || cseg == LIT)
- print("_TEXT ends\n");
- else if (cseg == DATA || cseg == BSS)
- print("_DATA ends\n");
- cseg = n;
- if (cseg == CODE || cseg == LIT)
- print("_TEXT segment\n");
- else if (cseg == DATA || cseg == BSS)
- print("_DATA segment\n");
-}
-static void progend(void) {
- segment(0);
- print("end\n");
-}
-static void target(Node p) {
- assert(p);
- switch (specific(p->op)) {
- case MUL+U:
- setreg(p, quo);
- rtarget(p, 0, intreg[EAX]);
- break;
- case DIV+I: case DIV+U:
- setreg(p, quo);
- rtarget(p, 0, quo);
- break;
- case MOD+I: case MOD+U:
- setreg(p, rem);
- rtarget(p, 0, quo);
- break;
- case ASGN+B:
- rtarget(p, 0, intreg[EDI]);
- rtarget(p->kids[1], 0, intreg[ESI]);
- break;
- case ARG+B:
- rtarget(p->kids[0], 0, intreg[ESI]);
- break;
- case CVF+I:
- setreg(p, intreg[EAX]);
- break;
- case CALL+I: case CALL+U: case CALL+P: case CALL+V:
- setreg(p, intreg[EAX]);
- break;
- case RET+I: case RET+U: case RET+P:
- rtarget(p, 0, intreg[EAX]);
- break;
- }
-}
-
-static void clobber(Node p) {
- static int nstack = 0;
-
- assert(p);
- nstack = ckstack(p, nstack);
- switch (specific(p->op)) {
- case RSH+I: case RSH+U: case LSH+I: case LSH+U:
- if (generic(p->kids[1]->op) != CNST
- && !( generic(p->kids[1]->op) == INDIR
- && specific(p->kids[1]->kids[0]->op) == VREG+P
- && p->kids[1]->syms[RX]->u.t.cse
- && generic(p->kids[1]->syms[RX]->u.t.cse->op) == CNST
-)) {
- spill(1<<ECX, 1, p);
- }
- break;
- case ASGN+B: case ARG+B:
- spill(1<<ECX | 1<<ESI | 1<<EDI, IREG, p);
- break;
- case EQ+F: case LE+F: case GE+F: case LT+F: case GT+F: case NE+F:
- spill(1<<EAX, IREG, p);
- break;
- case CALL+F:
- spill(1<<EDX | 1<<EAX | 1<<ECX, IREG, p);
- break;
- case CALL+I: case CALL+U: case CALL+P: case CALL+V:
- spill(1<<EDX | 1<<ECX, IREG, p);
- break;
- }
-}
-#define isfp(p) (optype((p)->op)==F)
-
-int ckstack(Node p, int n) {
- int i;
-
- for (i = 0; i < NELEMS(p->x.kids) && p->x.kids[i]; i++)
- if (isfp(p->x.kids[i]))
- n--;
- if (isfp(p) && p->count > 0)
- n++;
- if (n > 8)
- error("expression too complicated\n");
- debug(fprint(stderr, "(ckstack(%x)=%d)\n", p, n));
- assert(n >= 0);
- return n;
-}
-int memop(Node p) {
- assert(p);
- assert(generic(p->op) == ASGN);
- assert(p->kids[0]);
- assert(p->kids[1]);
- if (generic(p->kids[1]->kids[0]->op) == INDIR
- && sametree(p->kids[0], p->kids[1]->kids[0]->kids[0]))
- return 3;
- else
- return LBURG_MAX;
-}
-int sametree(Node p, Node q) {
- return p == NULL && q == NULL
- || p && q && p->op == q->op && p->syms[0] == q->syms[0]
- && sametree(p->kids[0], q->kids[0])
- && sametree(p->kids[1], q->kids[1]);
-}
-static void emit2(Node p) {
- int op = specific(p->op);
-#define preg(f) ((f)[getregnum(p->x.kids[0])]->x.name)
-
- if (op == CVI+I && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 1)
- print("movsx %s,%s\n", p->syms[RX]->x.name
-, preg(charreg));
- else if (op == CVI+U && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 1)
- print("movsx %s,%s\n", p->syms[RX]->x.name
-, preg(charreg));
- else if (op == CVI+I && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 2)
- print("movsx %s,%s\n", p->syms[RX]->x.name
-, preg(shortreg));
- else if (op == CVI+U && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 2)
- print("movsx %s,%s\n", p->syms[RX]->x.name
-, preg(shortreg));
-
- else if (op == CVU+I && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 1)
- print("movzx %s,%s\n", p->syms[RX]->x.name
-, preg(charreg));
- else if (op == CVU+U && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 1)
- print("movzx %s,%s\n", p->syms[RX]->x.name
-, preg(charreg));
- else if (op == CVU+I && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 2)
- print("movzx %s,%s\n", p->syms[RX]->x.name
-, preg(shortreg));
- else if (op == CVU+U && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 2)
- print("movzx %s,%s\n", p->syms[RX]->x.name
-, preg(shortreg));
- else if (generic(op) == CVI || generic(op) == CVU || generic(op) == LOAD) {
- char *dst = intreg[getregnum(p)]->x.name;
- char *src = preg(intreg);
- assert(opsize(p->op) <= opsize(p->x.kids[0]->op));
- if (dst != src)
- print("mov %s,%s\n", dst, src);
- }
-}
-
-static void doarg(Node p) {
- assert(p && p->syms[0]);
- mkactual(4, p->syms[0]->u.c.v.i);
-}
-static void blkfetch(int k, int off, int reg, int tmp) {}
-static void blkstore(int k, int off, int reg, int tmp) {}
-static void blkloop(int dreg, int doff, int sreg, int soff,
- int size, int tmps[]) {}
-static void local(Symbol p) {
- if (isfloat(p->type))
- p->sclass = AUTO;
- if (askregvar(p, (*IR->x.rmap)(ttob(p->type))) == 0)
- mkauto(p);
-}
-static void function(Symbol f, Symbol caller[], Symbol callee[], int n) {
- int i;
-
- print("%s:\n", f->x.name);
- print("push ebx\n");
- print("push esi\n");
- print("push edi\n");
- print("push ebp\n");
- print("mov ebp,esp\n");
- usedmask[0] = usedmask[1] = 0;
- freemask[0] = freemask[1] = ~(unsigned)0;
- offset = 16 + 4;
- for (i = 0; callee[i]; i++) {
- Symbol p = callee[i];
- Symbol q = caller[i];
- assert(q);
- p->x.offset = q->x.offset = offset;
- p->x.name = q->x.name = stringf("%d", p->x.offset);
- p->sclass = q->sclass = AUTO;
- offset += roundup(q->type->size, 4);
- }
- assert(caller[i] == 0);
- offset = maxoffset = 0;
- gencode(caller, callee);
- framesize = roundup(maxoffset, 4);
- if (framesize > 0)
- print("sub esp,%d\n", framesize);
- emitcode();
- print("mov esp,ebp\n");
- print("pop ebp\n");
- print("pop edi\n");
- print("pop esi\n");
- print("pop ebx\n");
- print("ret\n");
-}
-static void defsymbol(Symbol p) {
- if (p->scope >= LOCAL && p->sclass == STATIC)
- p->x.name = stringf("L%d", genlabel(1));
- else if (p->generated)
- p->x.name = stringf("L%s", p->name);
- else if (p->scope == GLOBAL || p->sclass == EXTERN)
- p->x.name = stringf("_%s", p->name);
- else if (p->scope == CONSTANTS
- && (isint(p->type) || isptr(p->type))
- && p->name[0] == '0' && p->name[1] == 'x')
- p->x.name = stringf("0%sH", &p->name[2]);
- else
- p->x.name = p->name;
-}
-static void address(Symbol q, Symbol p, long n) {
- if (p->scope == GLOBAL
- || p->sclass == STATIC || p->sclass == EXTERN)
- q->x.name = stringf("%s%s%D",
- p->x.name, n >= 0 ? "+" : "", n);
- else {
- assert(n <= INT_MAX && n >= INT_MIN);
- q->x.offset = p->x.offset + n;
- q->x.name = stringd(q->x.offset);
- }
-}
-static void defconst(int suffix, int size, Value v) {
- if (suffix == I && size == 1)
- print("db %d\n", v.u);
- else if (suffix == I && size == 2)
- print("dw %d\n", v.i);
- else if (suffix == I && size == 4)
- print("dd %d\n", v.i);
- else if (suffix == U && size == 1)
- print("db 0%xH\n", v.u);
- else if (suffix == U && size == 2)
- print("dw 0%xH\n", v.u);
- else if (suffix == U && size == 4)
- print("dd 0%xH\n", v.u);
- else if (suffix == P && size == 4)
- print("dd 0%xH\n", v.p);
- else if (suffix == F && size == 4) {
- float f = v.d;
- print("dd 0%xH\n", *(unsigned *)&f);
- }
- else if (suffix == F && size == 8) {
- double d = v.d;
- unsigned *p = (unsigned *)&d;
- print("dd 0%xH\ndd 0%xH\n", p[swap], p[!swap]);
- }
- else assert(0);
-}
-static void defaddress(Symbol p) {
- print("dd %s\n", p->x.name);
-}
-static void defstring(int n, char *str) {
- char *s;
-
- for (s = str; s < str + n; s++)
- print("db %d\n", (*s)&0377);
-}
-static void export(Symbol p) {
- print("public %s\n", p->x.name);
-}
-static void import(Symbol p) {
- int oldseg = cseg;
-
- if (p->ref > 0) {
- segment(0);
- print("extrn %s:near\n", p->x.name);
- segment(oldseg);
- }
-}
-static void global(Symbol p) {
- print("align %d\n",
- p->type->align > 4 ? 4 : p->type->align);
- print("%s label byte\n", p->x.name);
- if (p->u.seg == BSS)
- print("db %d dup (0)\n", p->type->size);
-}
-static void space(int n) {
- if (cseg != BSS)
- print("db %d dup (0)\n", n);
-}
-Interface x86IR = {
- 1, 1, 0, /* char */
- 2, 2, 0, /* short */
- 4, 4, 0, /* int */
- 4, 4, 0, /* long */
- 4, 4, 0, /* long long */
- 4, 4, 1, /* float */
- 8, 4, 1, /* double */
- 8, 4, 1, /* long double */
- 4, 4, 0, /* T * */
- 0, 4, 0, /* struct; so that ARGB keeps stack aligned */
- 1, /* little_endian */
- 0, /* mulops_calls */
- 0, /* wants_callb */
- 1, /* wants_argb */
- 0, /* left_to_right */
- 0, /* wants_dag */
- 0, /* unsigned_char */
- address,
- blockbeg,
- blockend,
- defaddress,
- defconst,
- defstring,
- defsymbol,
- emit,
- export,
- function,
- gen,
- global,
- import,
- local,
- progbeg,
- progend,
- segment,
- space,
- 0, 0, 0, 0, 0, 0, 0,
- {1, rmap,
- blkfetch, blkstore, blkloop,
- _label,
- _rule,
- _nts,
- _kids,
- _string,
- _templates,
- _isinstruction,
- _ntname,
- emit2,
- doarg,
- target,
- clobber,
-}
-};
-static char rcsid[] = "$Id: x86.md 145 2001-10-17 21:53:10Z timo $";
diff --git a/code/tools/lcc/src/x86linux.md b/code/tools/lcc/src/x86linux.md
deleted file mode 100644
index d185f56..0000000
--- a/code/tools/lcc/src/x86linux.md
+++ /dev/null
@@ -1,1081 +0,0 @@
-%{
-/* x86/linux lburg spec. Derived from x86.md by
-Marcos Ramirez <marcos@inf.utfsm.cl>
-Horst von Brand <vonbrand@sleipnir.valparaiso.cl>
-Jacob Navia <jacob@jacob.remcomp.fr>
-*/
-enum { EAX=0, ECX=1, EDX=2, EBX=3, ESI=6, EDI=7 };
-#include "c.h"
-#define NODEPTR_TYPE Node
-#define OP_LABEL(p) ((p)->op)
-#define LEFT_CHILD(p) ((p)->kids[0])
-#define RIGHT_CHILD(p) ((p)->kids[1])
-#define STATE_LABEL(p) ((p)->x.state)
-extern int ckstack(Node, int);
-extern int memop(Node);
-extern int sametree(Node, Node);
-static Symbol charreg[32], shortreg[32], intreg[32];
-static Symbol fltreg[32];
-
-static Symbol charregw, shortregw, intregw, fltregw;
-
-static int cseg;
-
-static Symbol quo, rem;
-
-extern char *stabprefix;
-extern void stabblock(int, int, Symbol*);
-extern void stabend(Coordinate *, Symbol, Coordinate **, Symbol *, Symbol *);
-extern void stabfend(Symbol, int);
-extern void stabinit(char *, int, char *[]);
-extern void stabline(Coordinate *);
-extern void stabsym(Symbol);
-extern void stabtype(Symbol);
-
-static int pflag = 0;
-static char rcsid[] = "$Id: x86linux.md 145 2001-10-17 21:53:10Z timo $";
-
-#define hasargs(p) (p->syms[0] && p->syms[0]->u.c.v.i > 0 ? 0 : LBURG_MAX)
-%}
-%start stmt
-%term CNSTF4=4113
-%term CNSTF8=8209
-%term CNSTF16=16401
-%term CNSTI1=1045
-%term CNSTI2=2069
-%term CNSTI4=4117
-%term CNSTI8=8213
-%term CNSTP4=4119
-%term CNSTP8=8215
-%term CNSTU1=1046
-%term CNSTU2=2070
-%term CNSTU4=4118
-%term CNSTU8=8214
-
-%term ARGB=41
-%term ARGF4=4129
-%term ARGF8=8225
-%term ARGF16=16417
-%term ARGI4=4133
-%term ARGI8=8229
-%term ARGP4=4135
-%term ARGP8=8231
-%term ARGU4=4134
-%term ARGU8=8230
-
-%term ASGNB=57
-%term ASGNF4=4145
-%term ASGNF8=8241
-%term ASGNF16=16433
-%term ASGNI1=1077
-%term ASGNI2=2101
-%term ASGNI4=4149
-%term ASGNI8=8245
-%term ASGNP4=4151
-%term ASGNP8=8247
-%term ASGNU1=1078
-%term ASGNU2=2102
-%term ASGNU4=4150
-%term ASGNU8=8246
-
-%term INDIRB=73
-%term INDIRF4=4161
-%term INDIRF8=8257
-%term INDIRF16=16449
-%term INDIRI1=1093
-%term INDIRI2=2117
-%term INDIRI4=4165
-%term INDIRI8=8261
-%term INDIRP4=4167
-%term INDIRP8=8263
-%term INDIRU1=1094
-%term INDIRU2=2118
-%term INDIRU4=4166
-%term INDIRU8=8262
-
-%term CVFF4=4209
-%term CVFF8=8305
-%term CVFF16=16497
-%term CVFI4=4213
-%term CVFI8=8309
-
-%term CVIF4=4225
-%term CVIF8=8321
-%term CVIF16=16513
-%term CVII1=1157
-%term CVII2=2181
-%term CVII4=4229
-%term CVII8=8325
-%term CVIU1=1158
-%term CVIU2=2182
-%term CVIU4=4230
-%term CVIU8=8326
-
-%term CVPP4=4247
-%term CVPP8=8343
-%term CVPP16=16535
-%term CVPU4=4246
-%term CVPU8=8342
-
-%term CVUI1=1205
-%term CVUI2=2229
-%term CVUI4=4277
-%term CVUI8=8373
-%term CVUP4=4279
-%term CVUP8=8375
-%term CVUP16=16567
-%term CVUU1=1206
-%term CVUU2=2230
-%term CVUU4=4278
-%term CVUU8=8374
-
-%term NEGF4=4289
-%term NEGF8=8385
-%term NEGF16=16577
-%term NEGI4=4293
-%term NEGI8=8389
-
-%term CALLB=217
-%term CALLF4=4305
-%term CALLF8=8401
-%term CALLF16=16593
-%term CALLI4=4309
-%term CALLI8=8405
-%term CALLP4=4311
-%term CALLP8=8407
-%term CALLU4=4310
-%term CALLU8=8406
-%term CALLV=216
-
-%term RETF4=4337
-%term RETF8=8433
-%term RETF16=16625
-%term RETI4=4341
-%term RETI8=8437
-%term RETP4=4343
-%term RETP8=8439
-%term RETU4=4342
-%term RETU8=8438
-%term RETV=248
-
-%term ADDRGP4=4359
-%term ADDRGP8=8455
-
-%term ADDRFP4=4375
-%term ADDRFP8=8471
-
-%term ADDRLP4=4391
-%term ADDRLP8=8487
-
-%term ADDF4=4401
-%term ADDF8=8497
-%term ADDF16=16689
-%term ADDI4=4405
-%term ADDI8=8501
-%term ADDP4=4407
-%term ADDP8=8503
-%term ADDU4=4406
-%term ADDU8=8502
-
-%term SUBF4=4417
-%term SUBF8=8513
-%term SUBF16=16705
-%term SUBI4=4421
-%term SUBI8=8517
-%term SUBP4=4423
-%term SUBP8=8519
-%term SUBU4=4422
-%term SUBU8=8518
-
-%term LSHI4=4437
-%term LSHI8=8533
-%term LSHU4=4438
-%term LSHU8=8534
-
-%term MODI4=4453
-%term MODI8=8549
-%term MODU4=4454
-%term MODU8=8550
-
-%term RSHI4=4469
-%term RSHI8=8565
-%term RSHU4=4470
-%term RSHU8=8566
-
-%term BANDI4=4485
-%term BANDI8=8581
-%term BANDU4=4486
-%term BANDU8=8582
-
-%term BCOMI4=4501
-%term BCOMI8=8597
-%term BCOMU4=4502
-%term BCOMU8=8598
-
-%term BORI4=4517
-%term BORI8=8613
-%term BORU4=4518
-%term BORU8=8614
-
-%term BXORI4=4533
-%term BXORI8=8629
-%term BXORU4=4534
-%term BXORU8=8630
-
-%term DIVF4=4545
-%term DIVF8=8641
-%term DIVF16=16833
-%term DIVI4=4549
-%term DIVI8=8645
-%term DIVU4=4550
-%term DIVU8=8646
-
-%term MULF4=4561
-%term MULF8=8657
-%term MULF16=16849
-%term MULI4=4565
-%term MULI8=8661
-%term MULU4=4566
-%term MULU8=8662
-
-%term EQF4=4577
-%term EQF8=8673
-%term EQF16=16865
-%term EQI4=4581
-%term EQI8=8677
-%term EQU4=4582
-%term EQU8=8678
-
-%term GEF4=4593
-%term GEF8=8689
-%term GEI4=4597
-%term GEI8=8693
-%term GEI16=16885
-%term GEU4=4598
-%term GEU8=8694
-
-%term GTF4=4609
-%term GTF8=8705
-%term GTF16=16897
-%term GTI4=4613
-%term GTI8=8709
-%term GTU4=4614
-%term GTU8=8710
-
-%term LEF4=4625
-%term LEF8=8721
-%term LEF16=16913
-%term LEI4=4629
-%term LEI8=8725
-%term LEU4=4630
-%term LEU8=8726
-
-%term LTF4=4641
-%term LTF8=8737
-%term LTF16=16929
-%term LTI4=4645
-%term LTI8=8741
-%term LTU4=4646
-%term LTU8=8742
-
-%term NEF4=4657
-%term NEF8=8753
-%term NEF16=16945
-%term NEI4=4661
-%term NEI8=8757
-%term NEU4=4662
-%term NEU8=8758
-
-%term JUMPV=584
-
-%term LABELV=600
-
-%term LOADB=233
-%term LOADF4=4321
-%term LOADF8=8417
-%term LOADF16=16609
-%term LOADI1=1253
-%term LOADI2=2277
-%term LOADI4=4325
-%term LOADI8=8421
-%term LOADP4=4327
-%term LOADP8=8423
-%term LOADU1=1254
-%term LOADU2=2278
-%term LOADU4=4326
-%term LOADU8=8422
-
-%term VREGP=711
-%%
-reg: INDIRI1(VREGP) "# read register\n"
-reg: INDIRU1(VREGP) "# read register\n"
-
-reg: INDIRI2(VREGP) "# read register\n"
-reg: INDIRU2(VREGP) "# read register\n"
-
-reg: INDIRI4(VREGP) "# read register\n"
-reg: INDIRP4(VREGP) "# read register\n"
-reg: INDIRU4(VREGP) "# read register\n"
-
-reg: INDIRI8(VREGP) "# read register\n"
-reg: INDIRP8(VREGP) "# read register\n"
-reg: INDIRU8(VREGP) "# read register\n"
-
-freg: INDIRF4(VREGP) "# read register\n"
-freg: INDIRF8(VREGP) "# read register\n"
-
-stmt: ASGNI1(VREGP,reg) "# write register\n"
-stmt: ASGNU1(VREGP,reg) "# write register\n"
-
-stmt: ASGNI2(VREGP,reg) "# write register\n"
-stmt: ASGNU2(VREGP,reg) "# write register\n"
-
-stmt: ASGNF4(VREGP,reg) "# write register\n"
-stmt: ASGNI4(VREGP,reg) "# write register\n"
-stmt: ASGNP4(VREGP,reg) "# write register\n"
-stmt: ASGNU4(VREGP,reg) "# write register\n"
-
-stmt: ASGNF8(VREGP,reg) "# write register\n"
-stmt: ASGNI8(VREGP,reg) "# write register\n"
-stmt: ASGNP8(VREGP,reg) "# write register\n"
-stmt: ASGNU8(VREGP,reg) "# write register\n"
-
-cnst: CNSTI1 "%a"
-cnst: CNSTU1 "%a"
-
-cnst: CNSTI2 "%a"
-cnst: CNSTU2 "%a"
-
-cnst: CNSTI4 "%a"
-cnst: CNSTU4 "%a"
-cnst: CNSTP4 "%a"
-
-cnst: CNSTI8 "%a"
-cnst: CNSTU8 "%a"
-cnst: CNSTP8 "%a"
-
-con: cnst "$%0"
-
-stmt: reg ""
-stmt: freg ""
-
-acon: ADDRGP4 "%a"
-acon: ADDRGP8 "%a"
-acon: cnst "%0"
-
-baseaddr: ADDRGP4 "%a"
-base: reg "(%0)"
-base: ADDI4(reg,acon) "%1(%0)"
-base: ADDP4(reg,acon) "%1(%0)"
-base: ADDU4(reg,acon) "%1(%0)"
-base: ADDRFP4 "%a(%%ebp)"
-base: ADDRLP4 "%a(%%ebp)"
-
-index: reg "%0"
-index: LSHI4(reg,con1) "%0,2"
-index: LSHI4(reg,con2) "%0,4"
-index: LSHI4(reg,con3) "%0,8"
-index: LSHU4(reg,con1) "%0,2"
-index: LSHU4(reg,con2) "%0,4"
-index: LSHU4(reg,con3) "%0,8"
-
-con0: CNSTI4 "1" range(a, 0, 0)
-con0: CNSTU4 "1" range(a, 0, 0)
-con1: CNSTI4 "1" range(a, 1, 1)
-con1: CNSTU4 "1" range(a, 1, 1)
-con2: CNSTI4 "2" range(a, 2, 2)
-con2: CNSTU4 "2" range(a, 2, 2)
-con3: CNSTI4 "3" range(a, 3, 3)
-con3: CNSTU4 "3" range(a, 3, 3)
-
-addr: base "%0"
-addr: baseaddr "%0"
-addr: ADDI4(index,baseaddr) "%1(,%0)"
-addr: ADDP4(index,baseaddr) "%1(,%0)"
-addr: ADDU4(index,baseaddr) "%1(,%0)"
-
-addr: ADDI4(reg,baseaddr) "%1(%0)"
-addr: ADDP4(reg,baseaddr) "%1(%0)"
-addr: ADDU4(reg,baseaddr) "%1(%0)"
-
-addr: ADDI4(index,reg) "(%1,%0)"
-addr: ADDP4(index,reg) "(%1,%0)"
-addr: ADDU4(index,reg) "(%1,%0)"
-
-addr: index "(,%0)"
-
-mem1: INDIRI1(addr) "%0"
-mem1: INDIRU1(addr) "%0"
-mem2: INDIRI2(addr) "%0"
-mem2: INDIRU2(addr) "%0"
-mem4: INDIRI4(addr) "%0"
-mem4: INDIRU4(addr) "%0"
-mem4: INDIRP4(addr) "%0"
-
-rc: reg "%0"
-rc: con "%0"
-
-mr: reg "%0"
-mr: mem4 "%0"
-
-mr1: reg "%0"
-mr1: mem1 "%0"
-
-mr2: reg "%0"
-mr2: mem2 "%0"
-
-mrc: mem4 "%0" 1
-mrc: mem1 "%0" 1
-mrc: mem2 "%0" 1
-mrc: rc "%0"
-
-reg: addr "leal %0,%c\n" 1
-reg: mr "movl %0,%c\n" 1
-reg: mr1 "movb %0,%c\n" 1
-reg: mr2 "movw %0,%c\n" 1
-reg: con "movl %0,%c\n" 1
-
-reg: LOADI1(reg) "# move\n" 1
-reg: LOADI2(reg) "# move\n" 1
-reg: LOADI4(reg) "# move\n" move(a)
-reg: LOADU1(reg) "# move\n" 1
-reg: LOADU2(reg) "# move\n" 1
-reg: LOADU4(reg) "# move\n" move(a)
-reg: LOADP4(reg) "# move\n" move(a)
-reg: ADDI4(reg,mrc) "?movl %0,%c\naddl %1,%c\n" 1
-reg: ADDP4(reg,mrc) "?movl %0,%c\naddl %1,%c\n" 1
-reg: ADDU4(reg,mrc) "?movl %0,%c\naddl %1,%c\n" 1
-reg: SUBI4(reg,mrc) "?movl %0,%c\nsubl %1,%c\n" 1
-reg: SUBP4(reg,mrc) "?movl %0,%c\nsubl %1,%c\n" 1
-reg: SUBU4(reg,mrc) "?movl %0,%c\nsubl %1,%c\n" 1
-reg: BANDI4(reg,mrc) "?movl %0,%c\nandl %1,%c\n" 1
-reg: BORI4(reg,mrc) "?movl %0,%c\norl %1,%c\n" 1
-reg: BXORI4(reg,mrc) "?movl %0,%c\nxorl %1,%c\n" 1
-reg: BANDU4(reg,mrc) "?movl %0,%c\nandl %1,%c\n" 1
-reg: BORU4(reg,mrc) "?movl %0,%c\norl %1,%c\n" 1
-reg: BXORU4(reg,mrc) "?movl %0,%c\nxorl %1,%c\n" 1
-
-stmt: ASGNI4(addr,ADDI4(mem4,con1)) "incl %1\n" memop(a)
-stmt: ASGNI4(addr,ADDU4(mem4,con1)) "incl %1\n" memop(a)
-stmt: ASGNP4(addr,ADDP4(mem4,con1)) "incl %1\n" memop(a)
-stmt: ASGNI4(addr,SUBI4(mem4,con1)) "decl %1\n" memop(a)
-stmt: ASGNI4(addr,SUBU4(mem4,con1)) "decl %1\n" memop(a)
-stmt: ASGNP4(addr,SUBP4(mem4,con1)) "decl %1\n" memop(a)
-stmt: ASGNI4(addr,ADDI4(mem4,rc)) "addl %2,%1\n" memop(a)
-stmt: ASGNI4(addr,SUBI4(mem4,rc)) "sub %2,%1\n" memop(a)
-stmt: ASGNU4(addr,ADDU4(mem4,rc)) "add %2,%1\n" memop(a)
-stmt: ASGNU4(addr,SUBU4(mem4,rc)) "sub %2,%1\n" memop(a)
-
-stmt: ASGNI4(addr,BANDI4(mem4,rc)) "andl %2,%1\n" memop(a)
-stmt: ASGNI4(addr,BORI4(mem4,rc)) "orl %2,%1\n" memop(a)
-stmt: ASGNI4(addr,BXORI4(mem4,rc)) "xorl %2,%1\n" memop(a)
-stmt: ASGNU4(addr,BANDU4(mem4,rc)) "andl %2,%1\n" memop(a)
-stmt: ASGNU4(addr,BORU4(mem4,rc)) "orl %2,%1\n" memop(a)
-stmt: ASGNU4(addr,BXORU4(mem4,rc)) "xorl %2,%1\n" memop(a)
-reg: BCOMI4(reg) "?movl %0,%c\nnotl %c\n" 2
-reg: BCOMU4(reg) "?movl %0,%c\nnotl %c\n" 2
-reg: NEGI4(reg) "?movl %0,%c\nnegl %c\n" 2
-
-stmt: ASGNI4(addr,BCOMI4(mem4)) "notl %1\n" memop(a)
-stmt: ASGNU4(addr,BCOMU4(mem4)) "notl %1\n" memop(a)
-stmt: ASGNI4(addr,NEGI4(mem4)) "negl %1\n" memop(a)
-reg: LSHI4(reg,rc5) "?movl %0,%c\nsall %1,%c\n" 2
-reg: LSHU4(reg,rc5) "?movl %0,%c\nshll %1,%c\n" 2
-reg: RSHI4(reg,rc5) "?movl %0,%c\nsarl %1,%c\n" 2
-reg: RSHU4(reg,rc5) "?movl %0,%c\nshrl %1,%c\n" 2
-
-stmt: ASGNI4(addr,LSHI4(mem4,rc5)) "sall %2,%1\n" memop(a)
-stmt: ASGNI4(addr,LSHU4(mem4,rc5)) "shll %2,%1\n" memop(a)
-stmt: ASGNI4(addr,RSHI4(mem4,rc5)) "sarl %2,%1\n" memop(a)
-stmt: ASGNI4(addr,RSHU4(mem4,rc5)) "shrl %2,%1\n" memop(a)
-
-rc5: CNSTI4 "$%a" range(a, 0, 31)
-rc5: reg "%%cl"
-reg: MULI4(reg,mrc) "?movl %0,%c\nimull %1,%c\n" 14
-reg: MULI4(con,mr) "imul %0,%1,%c\n" 13
-reg: MULU4(reg,mr) "mull %1\n" 13
-reg: DIVU4(reg,reg) "xorl %%edx,%%edx\ndivl %1\n"
-reg: MODU4(reg,reg) "xorl %%edx,%%edx\ndivl %1\n"
-reg: DIVI4(reg,reg) "cdq\nidivl %1\n"
-reg: MODI4(reg,reg) "cdq\nidivl %1\n"
-reg: CVPU4(reg) "movl %0,%c\n" move(a)
-reg: CVUP4(reg) "movl %0,%c\n" move(a)
-reg: CVII4(INDIRI1(addr)) "movsbl %0,%c\n" 3
-reg: CVII4(INDIRI2(addr)) "movswl %0,%c\n" 3
-reg: CVUU4(INDIRU1(addr)) "movzbl %0,%c\n" 3
-reg: CVUU4(INDIRU2(addr)) "movzwl %0,%c\n" 3
-reg: CVII4(reg) "# extend\n" 3
-reg: CVIU4(reg) "# extend\n" 3
-reg: CVUI4(reg) "# extend\n" 3
-reg: CVUU4(reg) "# extend\n" 3
-
-reg: CVII1(reg) "# truncate\n" 1
-reg: CVII2(reg) "# truncate\n" 1
-reg: CVUU1(reg) "# truncate\n" 1
-reg: CVUU2(reg) "# truncate\n" 1
-
-mrca: mem4 "%0"
-mrca: rc "%0"
-mrca: ADDRGP4 "$%a"
-mrca: ADDRGP8 "$%a"
-
-stmt: ASGNI1(addr,rc) "movb %1,%0\n" 1
-stmt: ASGNI2(addr,rc) "movw %1,%0\n" 1
-stmt: ASGNI4(addr,rc) "movl %1,%0\n" 1
-stmt: ASGNU1(addr,rc) "movb %1,%0\n" 1
-stmt: ASGNU2(addr,rc) "movw %1,%0\n" 1
-stmt: ASGNU4(addr,rc) "movl %1,%0\n" 1
-stmt: ASGNP4(addr,rc) "movl %1,%0\n" 1
-stmt: ARGI4(mrca) "pushl %0\n" 1
-stmt: ARGU4(mrca) "pushl %0\n" 1
-stmt: ARGP4(mrca) "pushl %0\n" 1
-stmt: ASGNB(reg,INDIRB(reg)) "movl $%a,%%ecx\nrep\nmovsb\n"
-stmt: ARGB(INDIRB(reg)) "subl $%a,%%esp\nmovl %%esp,%%edi\nmovl $%a,%%ecx\nrep\nmovsb\n"
-
-memf: INDIRF8(addr) "l %0"
-memf: INDIRF4(addr) "s %0"
-memf: CVFF8(INDIRF4(addr)) "s %0"
-memf: CVFF4(INDIRF8(addr)) "l %0"
-
-freg: memf "fld%0\n" 3
-
-stmt: ASGNF8(addr,freg) "fstpl %0\n" 7
-stmt: ASGNF4(addr,freg) "fstps %0\n" 7
-stmt: ASGNF4(addr,CVFF4(freg)) "fstps %0\n" 7
-
-stmt: ARGF8(freg) "subl $8,%%esp\nfstpl (%%esp)\n"
-stmt: ARGF4(freg) "subl $4,%%esp\nfstps (%%esp)\n"
-freg: NEGF8(freg) "fchs\n"
-freg: NEGF4(freg) "fchs\n"
-
-flt: memf "%0"
-flt: freg "p %%st(1),%%st"
-
-freg: ADDF4(freg,flt) "fadd%1\n"
-freg: ADDF8(freg,flt) "fadd%1\n"
-
-freg: DIVF4(freg,flt) "fdiv%1\n"
-freg: DIVF8(freg,flt) "fdiv%1\n"
-
-freg: MULF4(freg,flt) "fmul%1\n"
-freg: MULF8(freg,flt) "fmul%1\n"
-
-freg: SUBF4(freg,flt) "fsub%1\n"
-freg: SUBF8(freg,flt) "fsub%1\n"
-
-freg: CVFF8(freg) "# CVFF8\n"
-freg: CVFF4(freg) "sub $4,%%esp\nfstps (%%esp)\nflds (%%esp)\naddl $4,%%esp\n" 12
-
-stmt: ASGNI4(addr,CVFI4(freg)) "fistpl %0\n" 29
-reg: CVFI4(freg) "subl $4,%%esp\nfistpl 0(%%esp)\npopl %c\n" 31
-
-freg: CVIF8(INDIRI4(addr)) "fildl %0\n" 10
-freg: CVIF8(reg) "pushl %0\nfildl (%%esp)\naddl $4,%%esp\n" 12
-
-freg: CVIF4(INDIRI4(addr)) "fildl %0\n" 10
-freg: CVIF4(reg) "pushl %0\nfildl (%%esp)\naddl $4,%%esp\n" 12
-
-addrj: ADDRGP4 "%a"
-addrj: reg "*%0" 2
-addrj: mem4 "*%0" 2
-
-stmt: LABELV "%a:\n"
-stmt: JUMPV(addrj) "jmp %0\n" 3
-stmt: EQI4(mem4,rc) "cmpl %1,%0\nje %a\n" 5
-stmt: GEI4(mem4,rc) "cmpl %1,%0\njge %a\n" 5
-stmt: GTI4(mem4,rc) "cmpl %1,%0\njg %a\n" 5
-stmt: LEI4(mem4,rc) "cmpl %1,%0\njle %a\n" 5
-stmt: LTI4(mem4,rc) "cmpl %1,%0\njl %a\n" 5
-stmt: NEI4(mem4,rc) "cmpl %1,%0\njne %a\n" 5
-stmt: GEU4(mem4,rc) "cmpl %1,%0\njae %a\n" 5
-stmt: GTU4(mem4,rc) "cmpl %1,%0\nja %a\n" 5
-stmt: LEU4(mem4,rc) "cmpl %1,%0\njbe %a\n" 5
-stmt: LTU4(mem4,rc) "cmpl %1,%0\njb %a\n" 5
-stmt: EQI4(reg,mrc) "cmpl %1,%0\nje %a\n" 4
-stmt: GEI4(reg,mrc) "cmpl %1,%0\njge %a\n" 4
-stmt: GTI4(reg,mrc) "cmpl %1,%0\njg %a\n" 4
-stmt: LEI4(reg,mrc) "cmpl %1,%0\njle %a\n" 4
-stmt: LTI4(reg,mrc) "cmpl %1,%0\njl %a\n" 4
-stmt: NEI4(reg,mrc) "cmpl %1,%0\njne %a\n" 4
-
-stmt: EQU4(reg,mrc) "cmpl %1,%0\nje %a\n" 4
-stmt: GEU4(reg,mrc) "cmpl %1,%0\njae %a\n" 4
-stmt: GTU4(reg,mrc) "cmpl %1,%0\nja %a\n" 4
-stmt: LEU4(reg,mrc) "cmpl %1,%0\njbe %a\n" 4
-stmt: LTU4(reg,mrc) "cmpl %1,%0\njb %a\n" 4
-stmt: NEU4(reg,mrc) "cmpl %1,%0\njne %a\n" 4
-
-stmt: EQI4(BANDU4(mr,con),con0) "testl %1,%0\nje %a\n" 3
-stmt: NEI4(BANDU4(mr,con),con0) "testl %1,%0\njne %a\n"
-
-stmt: EQI4(BANDU4(CVII2(INDIRI2(addr)),con),con0) "testw %1,%0\nje %a\n"
-stmt: NEI4(BANDU4(CVII2(INDIRI2(addr)),con),con0) "testw %1,%0\njne %a\n"
-stmt: EQI4(BANDU4(CVIU2(INDIRI2(addr)),con),con0) "testw %1,%0\nje %a\n"
-stmt: NEI4(BANDU4(CVIU2(INDIRI2(addr)),con),con0) "testw %1,%0\njne %a\n"
-stmt: EQI4(BANDU4(CVII1(INDIRI1(addr)),con),con0) "testb %1,%0\nje %a\n"
-
-cmpf: INDIRF8(addr) "l %0"
-cmpf: INDIRF4(addr) "s %0"
-cmpf: CVFF8(INDIRF4(addr)) "s %0"
-cmpf: freg "p"
-
-stmt: EQF8(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\nje %a\n"
-stmt: GEF8(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\njbe %a\n"
-stmt: GTF8(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\njb %a\n"
-stmt: LEF8(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\njae %a\n"
-stmt: LTF8(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\nja %a\n"
-stmt: NEF8(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\njne %a\n"
-
-stmt: EQF4(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\nje %a\n"
-stmt: GEF4(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\njbe %a\n"
-stmt: GTF4(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\njb %a\n"
-stmt: LEF4(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\njae %a\n"
-stmt: LTF4(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\nja %a\n"
-stmt: NEF4(cmpf,freg) "fcomp%0\nfstsw %%ax\nsahf\njne %a\n"
-
-freg: DIVF8(freg,CVIF8(INDIRI4(addr))) "fidivl %1\n"
-freg: DIVF8(CVIF8(INDIRI4(addr)),freg) "fidivrl %0\n"
-freg: DIVF8(freg,CVIF8(CVII2(INDIRI2(addr)))) "fidivs %1\n"
-freg: DIVF8(CVIF8(CVII2(INDIRI2(addr))),freg) "fidivrs %0\n"
-freg: MULF8(freg,CVIF8(INDIRI4(addr))) "fimull %1\n"
-freg: MULF8(freg,CVIF8(CVII2(INDIRI2(addr)))) "fimuls %1\n"
-freg: SUBF8(freg,CVIF8(INDIRI4(addr))) "fisubl %1\n"
-freg: SUBF8(CVIF8(INDIRI4(addr)),freg) "fisubrl %0\n"
-freg: SUBF8(freg,CVIF8(CVII2(INDIRI2(addr)))) "fisubs %1\n"
-freg: SUBF8(CVIF8(CVII2(INDIRI2(addr))),freg) "fisubrs %0\n"
-freg: ADDF8(freg,CVIF8(INDIRI4(addr))) "fiaddl %1\n"
-freg: ADDF8(freg,CVIF8(CVII2(INDIRI2(addr)))) "fiadds %1\n"
-freg: ADDF8(freg,CVFF8(INDIRF4(addr))) "fdivs %1\n"
-freg: SUBF8(freg,CVFF8(INDIRF4(addr))) "fsubs %1\n"
-freg: MULF8(freg,CVFF8(INDIRF4(addr))) "fmuls %1\n"
-freg: DIVF8(freg,CVFF8(INDIRF4(addr))) "fdivs %1\n"
-freg: LOADF8(memf) "fld%0\n"
-
-reg: CALLI4(addrj) "call %0\naddl $%a,%%esp\n" hasargs(a)
-reg: CALLU4(addrj) "call %0\naddl $%a,%%esp\n" hasargs(a)
-reg: CALLP4(addrj) "call %0\naddl $%a,%%esp\n" hasargs(a)
-
-reg: CALLI4(addrj) "call %0\n" 1
-reg: CALLU4(addrj) "call %0\n" 1
-reg: CALLP4(addrj) "call %0\n" 1
-
-stmt: CALLV(addrj) "call %0\naddl $%a,%%esp\n" hasargs(a)
-stmt: CALLV(addrj) "call %0\n" 1
-
-freg: CALLF4(addrj) "call %0\naddl $%a,%%esp\n" hasargs(a)
-freg: CALLF4(addrj) "call %0\n" 1
-
-stmt: CALLF4(addrj) "call %0\naddl $%a,%%esp\nfstp %%st(0)\n" hasargs(a)
-stmt: CALLF4(addrj) "call %0\nfstp %%st(0)\n" 1
-
-freg: CALLF8(addrj) "call %0\naddl $%a,%%esp\n" hasargs(a)
-freg: CALLF8(addrj) "call %0\n" 1
-
-stmt: CALLF8(addrj) "call %0\naddl $%a,%%esp\nfstp %%st(0)\n" hasargs(a)
-stmt: CALLF8(addrj) "call %0\nfstp %%st(0)\n" 1
-
-stmt: RETI4(reg) "# ret\n"
-stmt: RETU4(reg) "# ret\n"
-stmt: RETP4(reg) "# ret\n"
-stmt: RETF4(freg) "# ret\n"
-stmt: RETF8(freg) "# ret\n"
-%%
-static void progbeg(int argc, char *argv[]) {
- int i;
-
- {
- union {
- char c;
- int i;
- } u;
- u.i = 0;
- u.c = 1;
- swap = ((int)(u.i == 1)) != IR->little_endian;
- }
- parseflags(argc, argv);
- for (i = 0; i < argc; i++)
- if (strcmp(argv[i], "-p") == 0 || strcmp(argv[i], "-pg") == 0)
- pflag = 1;
- intreg[EAX] = mkreg("%%eax", EAX, 1, IREG);
- intreg[EDX] = mkreg("%%edx", EDX, 1, IREG);
- intreg[ECX] = mkreg("%%ecx", ECX, 1, IREG);
- intreg[EBX] = mkreg("%%ebx", EBX, 1, IREG);
- intreg[ESI] = mkreg("%%esi", ESI, 1, IREG);
- intreg[EDI] = mkreg("%%edi", EDI, 1, IREG);
- shortreg[EAX] = mkreg("%%ax", EAX, 1, IREG);
- shortreg[ECX] = mkreg("%%cx", ECX, 1, IREG);
- shortreg[EDX] = mkreg("%%dx", EDX, 1, IREG);
- shortreg[EBX] = mkreg("%%bx", EBX, 1, IREG);
- shortreg[ESI] = mkreg("%%si", ESI, 1, IREG);
- shortreg[EDI] = mkreg("%%di", EDI, 1, IREG);
- charreg[EAX] = mkreg("%%al", EAX, 1, IREG);
- charreg[ECX] = mkreg("%%cl", ECX, 1, IREG);
- charreg[EDX] = mkreg("%%dl", EDX, 1, IREG);
- charreg[EBX] = mkreg("%%bl", EBX, 1, IREG);
- for (i = 0; i < 8; i++)
- fltreg[i] = mkreg("%d", i, 0, FREG);
- charregw = mkwildcard(charreg);
- shortregw = mkwildcard(shortreg);
- intregw = mkwildcard(intreg);
- fltregw = mkwildcard(fltreg);
-
- tmask[IREG] = (1<<EDI) | (1<<ESI) | (1<<EBX)
- | (1<<EDX) | (1<<ECX) | (1<<EAX);
- vmask[IREG] = 0;
- tmask[FREG] = 0xff;
- vmask[FREG] = 0;
-
- cseg = 0;
- quo = mkreg("%%eax", EAX, 1, IREG);
- quo->x.regnode->mask |= 1<<EDX;
- rem = mkreg("%%edx", EDX, 1, IREG);
- rem->x.regnode->mask |= 1<<EAX;
-
- stabprefix = ".LL";
-}
-
-static Symbol rmap(int opk) {
- switch (optype(opk)) {
- case B: case P:
- return intregw;
- case I: case U:
- if (opsize(opk) == 1)
- return charregw;
- else if (opsize(opk) == 2)
- return shortregw;
- else
- return intregw;
- case F:
- return fltregw;
- default:
- return 0;
- }
-}
-
-static Symbol prevg;
-
-static void globalend(void) {
- if (prevg && prevg->type->size > 0)
- print(".size %s,%d\n", prevg->x.name, prevg->type->size);
- prevg = NULL;
-}
-
-static void progend(void) {
- globalend();
- (*IR->segment)(CODE);
- print(".ident \"LCC: 4.1\"\n");
-}
-
-static void target(Node p) {
- assert(p);
- switch (specific(p->op)) {
- case RSH+I: case RSH+U: case LSH+I: case LSH+U:
- if (generic(p->kids[1]->op) != CNST
- && !( generic(p->kids[1]->op) == INDIR
- && specific(p->kids[1]->kids[0]->op) == VREG+P
- && p->kids[1]->syms[RX]->u.t.cse
- && generic(p->kids[1]->syms[RX]->u.t.cse->op) == CNST)) {
- rtarget(p, 1, intreg[ECX]);
- setreg(p, intreg[EAX]);
- }
- break;
- case MUL+U:
- setreg(p, quo);
- rtarget(p, 0, intreg[EAX]);
- break;
- case DIV+I: case DIV+U:
- setreg(p, quo);
- rtarget(p, 0, intreg[EAX]);
- rtarget(p, 1, intreg[ECX]);
- break;
- case MOD+I: case MOD+U:
- setreg(p, rem);
- rtarget(p, 0, intreg[EAX]);
- rtarget(p, 1, intreg[ECX]);
- break;
- case ASGN+B:
- rtarget(p, 0, intreg[EDI]);
- rtarget(p->kids[1], 0, intreg[ESI]);
- break;
- case ARG+B:
- rtarget(p->kids[0], 0, intreg[ESI]);
- break;
- case CVF+I:
- setreg(p, intreg[EAX]);
- break;
- case CALL+I: case CALL+U: case CALL+P: case CALL+V:
- setreg(p, intreg[EAX]);
- break;
- case RET+I: case RET+U: case RET+P:
- rtarget(p, 0, intreg[EAX]);
- break;
- }
-}
-
-static void clobber(Node p) {
- static int nstack = 0;
-
- assert(p);
- nstack = ckstack(p, nstack);
- switch (specific(p->op)) {
- case ASGN+B: case ARG+B:
- spill(1<<ECX | 1<<ESI | 1<<EDI, IREG, p);
- break;
- case EQ+F: case LE+F: case GE+F: case LT+F: case GT+F: case NE+F:
- spill(1<<EAX, IREG, p);
- break;
- case CALL+F:
- spill(1<<EDX | 1<<EAX | 1<<ECX, IREG, p);
- break;
- case CALL+I: case CALL+U: case CALL+P: case CALL+V:
- spill(1<<EDX | 1<<ECX, IREG, p);
- break;
- }
-}
-
-static void emit2(Node p) {
- int op = specific(p->op);
-#define preg(f) ((f)[getregnum(p->x.kids[0])]->x.name)
-
- if (op == CVI+I && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 1)
- print("movsbl %s,%s\n", preg(charreg), p->syms[RX]->x.name);
- else if (op == CVI+U && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 1)
- print("movsbl %s,%s\n", preg(charreg), p->syms[RX]->x.name);
- else if (op == CVI+I && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 2)
- print("movswl %s,%s\n", preg(shortreg), p->syms[RX]->x.name);
- else if (op == CVI+U && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 2)
- print("movswl %s,%s\n", preg(shortreg), p->syms[RX]->x.name);
- else if (op == CVU+I && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 1)
- print("movzbl %s,%s\n", preg(charreg), p->syms[RX]->x.name);
- else if (op == CVU+U && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 1)
- print("movzbl %s,%s\n", preg(charreg), p->syms[RX]->x.name);
- else if (op == CVU+I && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 2)
- print("movzwl %s,%s\n", preg(shortreg), p->syms[RX]->x.name);
- else if (op == CVU+U && opsize(p->op) == 4 && opsize(p->x.kids[0]->op) == 2)
- print("movzwl %s,%s\n", preg(shortreg), p->syms[RX]->x.name);
- else if (generic(op) == CVI || generic(op) == CVU || generic(op) == LOAD) {
- char *dst = intreg[getregnum(p)]->x.name;
- char *src = preg(intreg);
- assert(opsize(p->op) <= opsize(p->x.kids[0]->op));
- if (dst != src)
- print("movl %s,%s\n", src, dst);
- }
-}
-
-static void function(Symbol f, Symbol caller[], Symbol callee[], int n) {
- int i;
-
- globalend();
- print(".align 16\n");
- print(".type %s,@function\n", f->x.name);
- print("%s:\n", f->x.name);
- print("pushl %%ebp\n");
- if (pflag) {
- static int plab;
- print("movl %%esp,%%ebp\n");
- (*IR->segment)(DATA);
- print(".align 4\n.LP%d:\n.long 0\n", plab);
- (*IR->segment)(CODE);
- print("movl $.LP%d,%%edx\ncall mcount\n", plab);
- plab++;
- }
- print("pushl %%ebx\n");
- print("pushl %%esi\n");
- print("pushl %%edi\n");
- print("movl %%esp,%%ebp\n");
-
- usedmask[0] = usedmask[1] = 0;
- freemask[0] = freemask[1] = ~0U;
- offset = 16 + 4;
- for (i = 0; callee[i]; i++) {
- Symbol p = callee[i];
- Symbol q = caller[i];
- assert(q);
- offset = roundup(offset, q->type->align);
- p->x.offset = q->x.offset = offset;
- p->x.name = q->x.name = stringf("%d", p->x.offset);
- p->sclass = q->sclass = AUTO;
- offset += roundup(q->type->size, 4);
- }
- assert(caller[i] == 0);
- offset = maxoffset = 0;
- gencode(caller, callee);
- framesize = roundup(maxoffset, 4);
- if (framesize > 0)
- print("subl $%d,%%esp\n", framesize);
- emitcode();
- print("movl %%ebp,%%esp\n");
- print("popl %%edi\n");
- print("popl %%esi\n");
- print("popl %%ebx\n");
- print("popl %%ebp\n");
- print("ret\n");
- { int l = genlabel(1);
- print(".Lf%d:\n", l);
- print(".size %s,.Lf%d-%s\n", f->x.name, l, f->x.name);
- }
-}
-
-static void defsymbol(Symbol p) {
- if (p->scope >= LOCAL && p->sclass == STATIC)
- p->x.name = stringf("%s.%d", p->name, genlabel(1));
- else if (p->generated)
- p->x.name = stringf(".LC%s", p->name);
- else if (p->scope == GLOBAL || p->sclass == EXTERN)
- p->x.name = stringf("%s", p->name);
- else
- p->x.name = p->name;
-}
-
-static void segment(int n) {
- if (n == cseg)
- return;
- cseg = n;
- if (cseg == CODE)
- print(".text\n");
- else if (cseg == BSS)
- print(".bss\n");
- else if (cseg == DATA || cseg == LIT)
- print(".data\n");
-}
-
-static void defconst(int suffix, int size, Value v) {
- if (suffix == I && size == 1)
- print(".byte %d\n", v.u);
- else if (suffix == I && size == 2)
- print(".word %d\n", v.i);
- else if (suffix == I && size == 4)
- print(".long %d\n", v.i);
- else if (suffix == U && size == 1)
- print(".byte %d\n", v.u);
- else if (suffix == U && size == 2)
- print(".word %d\n", v.u);
- else if (suffix == U && size == 4)
- print(".long %d\n", v.u);
- else if (suffix == P && size == 4)
- print(".long %d\n", v.p);
- else if (suffix == F && size == 4) {
- float f = v.d;
- print(".long %d\n", *(unsigned *)&f);
- } else if (suffix == F && size == 8) {
- double d = v.d;
- unsigned *p = (unsigned *)&d;
- print(".long %d\n.long %d\n", p[swap], p[!swap]);
- }
- else assert(0);
-}
-
-static void defaddress(Symbol p) {
- print(".long %s\n", p->x.name);
-}
-
-static void defstring(int n, char *str) {
- char *s;
-
- for (s = str; s < str + n; s++)
- print(".byte %d\n", (*s)&0377);
-}
-
-static void export(Symbol p) {
- globalend();
- print(".globl %s\n", p->x.name);
-}
-
-static void import(Symbol p) {}
-
-static void global(Symbol p) {
- globalend();
- print(".align %d\n", p->type->align > 4 ? 4 : p->type->align);
- if (!p->generated) {
- print(".type %s,@%s\n", p->x.name,
- isfunc(p->type) ? "function" : "object");
- if (p->type->size > 0)
- print(".size %s,%d\n", p->x.name, p->type->size);
- else
- prevg = p;
- }
- if (p->u.seg == BSS) {
- if (p->sclass == STATIC)
- print(".lcomm %s,%d\n", p->x.name, p->type->size);
- else
- print(".comm %s,%d\n", p->x.name, p->type->size);
- } else {
- print("%s:\n", p->x.name);
- }
-}
-
-static void space(int n) {
- if (cseg != BSS)
- print(".space %d\n", n);
-}
-
-Interface x86linuxIR = {
- 1, 1, 0, /* char */
- 2, 2, 0, /* short */
- 4, 4, 0, /* int */
- 4, 4, 0, /* long */
- 4, 4, 0, /* long long */
- 4, 4, 1, /* float */
- 8, 4, 1, /* double */
- 8, 4, 1, /* long double */
- 4, 4, 0, /* T * */
- 0, 4, 0, /* struct; so that ARGB keeps stack aligned */
- 1, /* little_endian */
- 0, /* mulops_calls */
- 0, /* wants_callb */
- 1, /* wants_argb */
- 0, /* left_to_right */
- 0, /* wants_dag */
- 0, /* unsigned_char */
- 0, /* address */
- blockbeg,
- blockend,
- defaddress,
- defconst,
- defstring,
- defsymbol,
- emit,
- export,
- function,
- gen,
- global,
- import,
- 0, /* local */
- progbeg,
- progend,
- segment,
- space,
- stabblock, stabend, 0, stabinit, stabline, stabsym, stabtype,
- {1, rmap,
- 0, 0, 0, /* blkfetch, blkstore, blkloop */
- _label,
- _rule,
- _nts,
- _kids,
- _string,
- _templates,
- _isinstruction,
- _ntname,
- emit2,
- 0, /* doarg */
- target,
- clobber,
- }
-};
-
-void x86linux_init(int argc, char *argv[]) {
- static int inited;
- extern Interface x86IR;
-
- if (inited)
- return;
- inited = 1;
-#define xx(f) assert(!x86linuxIR.f); x86linuxIR.f = x86IR.f
- xx(address);
- xx(local);
- xx(x.blkfetch);
- xx(x.blkstore);
- xx(x.blkloop);
- xx(x.doarg);
-#undef xx
-}