|
|
1.1 root 1: /* C compiler: MIPS configuration parameters */
2:
3: #define IREG 0 /* a general-purpose register */
4: #define FREG 1 /* a floating-point register */
5:
6: #include "gen.h"
7:
8: dclproto(extern Symbol argreg,(int, int, int, int));
9: dclproto(extern void emitargb,(Node));
10: dclproto(extern void emitasgnb,(Node));
11: dclproto(extern void addnops,(void));
12: extern int framesize;
13: extern int gnum;
14: extern char *nrflag;
15:
16: #define announce(p) (bflag ? put.stackvar(p) : (unsigned)0)
17: #define strtod(a,b) atof(a)
18: dclproto(extern double atof,(char *));
19:
20: struct emit {
21: dclproto(void (*seg),(int));
22: dclproto(void (*spacen),(int, char *));
23: dclproto(void (*string),(char*, char*, int, char*));
24: dclproto(unsigned (*emit),(unsigned, int, int, int, int));
25: dclproto(void (*addr),(Symbol, Symbol, int));
26: dclproto(unsigned (*def),(Symbol));
27: dclproto(void (*defaddr),(Symbol));
28: dclproto(void (*end),(Symbol));
29: dclproto(void (*entry),(Symbol, int, int));
30: dclproto(int (*offset),(int));
31: dclproto(void (*symbol),(int, Symbol));
32: dclproto(void (*word),(unsigned, int));
33: };
34:
35: extern struct emit put;
36:
37: #define r_at 1
38: #define r_gp 28
39: #define r_sp 29
40:
41: #define ea_base(wd) ((wd >> 21) & 0x001f)
42: #define ea_offset(wd) ((wd) & 0xffff)
43: #define ea_addr(off,base) (assert(ea_base(off)==0), (((base&0x001f)<<21) | ea_offset(off)))
44:
45: #define o_add_s (((unsigned)021<<26)|(020<<21)|0)
46: #define o_add_d (((unsigned)021<<26)|(021<<21)|0)
47: #define o_sub_s (((unsigned)021<<26)|(020<<21)|1)
48: #define o_sub_d (((unsigned)021<<26)|(021<<21)|1)
49: #define o_mul_s (((unsigned)021<<26)|(020<<21)|2)
50: #define o_mul_d (((unsigned)021<<26)|(021<<21)|2)
51: #define o_div_s (((unsigned)021<<26)|(020<<21)|3)
52: #define o_div_d (((unsigned)021<<26)|(021<<21)|3)
53: #define o_mov_s (((unsigned)021<<26)|(020<<21)|6)
54: #define o_mov_d (((unsigned)021<<26)|(021<<21)|6)
55: #define o_neg_s (((unsigned)021<<26)|(020<<21)|7)
56: #define o_neg_d (((unsigned)021<<26)|(021<<21)|7)
57: #define o_cvt_d_s (((unsigned)021<<26)|(020<<21)|33)
58: #define o_cvt_d_w (((unsigned)021<<26)|(024<<21)|33)
59: #define o_cvt_s_d (((unsigned)021<<26)|(021<<21)|32)
60: #define o_cvt_w_s (((unsigned)021<<26)|(020<<21)|36)
61: #define o_cvt_w_d (((unsigned)021<<26)|(021<<21)|36)
62: #define o_c_eq_s (((unsigned)021<<26)|(020<<21)|50)
63: #define o_c_eq_d (((unsigned)021<<26)|(021<<21)|50)
64: #define o_c_le_s (((unsigned)021<<26)|(020<<21)|62)
65: #define o_c_le_d (((unsigned)021<<26)|(021<<21)|62)
66: #define o_c_lt_s (((unsigned)021<<26)|(020<<21)|60)
67: #define o_c_lt_d (((unsigned)021<<26)|(021<<21)|60)
68: #define o_mfc1_s (((unsigned)021<<26)|(0<<21)|0) /* mfc1 */
69: #define o_mtc1_s (((unsigned)021<<26)|(4<<21)|0) /* mtc1 */
70: #define o_mfc1_d (((unsigned)021<<26)|(1<<21)|0) /* fake mfc1 */
71: #define o_mtc1_d (((unsigned)021<<26)|(5<<21)|0) /* fake mtc1 */
72: #define o_cfc1 (((unsigned)021<<26)|(2<<21)|0)
73: #define o_ctc1 (((unsigned)021<<26)|(6<<21)|0)
74: #define o_l_s ((unsigned)061<<26) /* lwc1 */
75: #define o_l_d ((unsigned)065<<26) /* ldc1 */
76: #define o_s_s ((unsigned)071<<26) /* swc1 */
77: #define o_s_d ((unsigned)075<<26) /* sdc1 */
78: #define o_bc1f (((unsigned)021<<26)|(0400<<16))
79: #define o_bc1t (((unsigned)021<<26)|(0401<<16))
80: #define o_lui ((unsigned)017<<26)
81: #define o_lb ((unsigned)040<<26)
82: #define o_lbu ((unsigned)044<<26)
83: #define o_lh ((unsigned)041<<26)
84: #define o_lhu ((unsigned)045<<26)
85: #define o_lw ((unsigned)043<<26)
86: #define o_sb ((unsigned)050<<26)
87: #define o_sh ((unsigned)051<<26)
88: #define o_sw ((unsigned)053<<26)
89: #define o_lwl ((unsigned)042<<26)
90: #define o_lwr ((unsigned)046<<26)
91: #define o_swl ((unsigned)052<<26)
92: #define o_swr ((unsigned)056<<26)
93: #define o_add (((unsigned)0<<26)|040)
94: #define o_addu (((unsigned)0<<26)|041)
95: #define o_addi ((unsigned)010<<26)
96: #define o_addui ((unsigned)011<<26) /* addiu */
97: #define o_and (((unsigned)0<<26)|044)
98: #define o_andi ((unsigned)014<<26)
99: #define o_sub (((unsigned)0<<26)|042)
100: #define o_subu (((unsigned)0<<26)|043)
101: #define o_subui ((unsigned)011<<26) /* addiu */
102: #define o_or (((unsigned)0<<26)|045)
103: #define o_ori ((unsigned)015<<26)
104: #define o_xor (((unsigned)0<<26)|046)
105: #define o_xori ((unsigned)016<<26)
106: #define o_not (((unsigned)0<<26)|047) /* nor */
107: #define o_mul (((unsigned)0<<26)|030)
108: #define o_mulu (((unsigned)0<<26)|031)
109: #define o_div (((unsigned)0<<26)|032)
110: #define o_divu (((unsigned)0<<26)|033)
111: #define o_rem o_div
112: #define o_remu o_divu
113: #define o_negu o_subu
114: #define o_sll (((unsigned)0<<26)|04) /* sllv */
115: #define o_slli (((unsigned)0<<26)|0) /* sll */
116: #define o_srl (((unsigned)0<<26)|06) /* srlv */
117: #define o_srli (((unsigned)0<<26)|02) /* srl */
118: #define o_sra (((unsigned)0<<26)|07) /* srav */
119: #define o_srai (((unsigned)0<<26)|03) /* sra */
120: #define o_slt (((unsigned)0<<26)|052)
121: #define o_slti ((unsigned)012<<26)
122: #define o_sltu (((unsigned)0<<26)|053)
123: #define o_sltui ((unsigned)013<<26)
124: #define o_beq ((unsigned)04<<26)
125: #define o_bne ((unsigned)05<<26)
126: #define o_bge (((unsigned)01<<26)|(1<<16)) /* bgez */
127: #define o_bgt ((unsigned)07<<26) /* bgtz */
128: #define o_ble ((unsigned)06<<26) /* blez */
129: #define o_blt (((unsigned)01<<26)|(0<<16)) /* bltz */
130: #define o_b ((unsigned)02<<26) /* j */
131: #define o_jal ((unsigned)03<<26) /* jalr */
132: #define o_jalr (((unsigned)0<<26)|011) /* jalr */
133: #define o_jr (((unsigned)0<<26)|010) /* jr */
134: #define o_move o_addu
135: #define o_mfhi (((unsigned)0<<26)|020)
136: #define o_mflo (((unsigned)0<<26)|022)
137: #define o_break (((unsigned)0<<26)|015)
138: #define o_syscall (((unsigned)0<<26)|014)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.