Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#define	EXTERN
2
#include "a.h"
3
#include "y.tab.h"
4
#include <ctype.h>
5
 
6
void
7
main(int argc, char *argv[])
8
{
9
	char *p;
10
	int nout, nproc, status, i, c;
11
 
12
	thechar = 'q';
13
	thestring = "power";
14
	memset(debug, 0, sizeof(debug));
15
	cinit();
16
	outfile = 0;
17
	include[ninclude++] = ".";
18
	ARGBEGIN {
19
	default:
20
		c = ARGC();
21
		if(c >= 0 || c < sizeof(debug))
22
			debug[c] = 1;
23
		break;
24
 
25
	case 'o':
26
		outfile = ARGF();
27
		break;
28
 
29
	case 'D':
30
		p = ARGF();
31
		if(p)
32
			Dlist[nDlist++] = p;
33
		break;
34
 
35
	case 'I':
36
		p = ARGF();
37
		setinclude(p);
38
		break;
39
	} ARGEND
40
	if(*argv == 0) {
41
		print("usage: %ca [-options] file.s\n", thechar);
42
		errorexit();
43
	}
44
	if(argc > 1 && systemtype(Windows)){
45
		print("can't assemble multiple files on windows\n");
46
		errorexit();
47
	}
48
	if(argc > 1) {
49
		nproc = 1;
50
		if(p = getenv("NPROC"))
51
			nproc = atol(p);
52
		c = 0;
53
		nout = 0;
54
		for(;;) {
55
			while(nout < nproc && argc > 0) {
56
				i = myfork();
57
				if(i < 0) {
58
					i = mywait(&status);
59
					if(i < 0)
60
						errorexit();
61
					if(status)
62
						c++;
63
					nout--;
64
					continue;
65
				}
66
				if(i == 0) {
67
					print("%s:\n", *argv);
68
					if(assemble(*argv))
69
						errorexit();
70
					exits(0);
71
				}
72
				nout++;
73
				argc--;
74
				argv++;
75
			}
76
			i = mywait(&status);
77
			if(i < 0) {
78
				if(c)
79
					errorexit();
80
				exits(0);
81
			}
82
			if(status)
83
				c++;
84
			nout--;
85
		}
86
	}
87
	if(assemble(argv[0]))
88
		errorexit();
89
	exits(0);
90
}
91
 
92
int
93
assemble(char *file)
94
{
95
	char ofile[100], incfile[20], *p;
96
	int i, of;
97
 
98
	strcpy(ofile, file);
99
	if(p = strrchr(ofile, pathchar())) {
100
		include[0] = ofile;
101
		*p++ = 0;
102
	} else
103
		p = ofile;
104
	if(outfile == 0) {
105
		outfile = p;
106
		if(p = strrchr(outfile, '.'))
107
			if(p[1] == 's' && p[2] == 0)
108
				p[0] = 0;
109
		p = strrchr(outfile, 0);
110
		p[0] = '.';
111
		p[1] = thechar;
112
		p[2] = 0;
113
	}
114
	p = getenv("INCLUDE");
115
	if(p) {
116
		setinclude(p);
117
	} else {
118
		if(systemtype(Plan9)) {
119
			sprint(incfile,"/%s/include", thestring);
120
			setinclude(strdup(incfile));
121
		}
122
	}
123
 
124
	of = mycreat(outfile, 0664);
125
	if(of < 0) {
126
		yyerror("%ca: cannot create %s", thechar, outfile);
127
		errorexit();
128
	}
129
	Binit(&obuf, of, OWRITE);
130
 
131
	pass = 1;
132
	nosched = 0;
133
	pinit(file);
134
	for(i=0; i<nDlist; i++)
135
		dodefine(Dlist[i]);
136
	yyparse();
137
	if(nerrors) {
138
		cclean();
139
		return nerrors;
140
	}
141
 
142
	pass = 2;
143
	nosched = 0;
144
	outhist();
145
	pinit(file);
146
	for(i=0; i<nDlist; i++)
147
		dodefine(Dlist[i]);
148
	yyparse();
149
	cclean();
150
	return nerrors;
151
}
152
 
153
struct
154
{
155
	char	*name;
156
	ushort	type;
157
	ushort	value;
158
} itab[] =
159
{
160
	"SP",		LSP,	D_AUTO,
161
	"SB",		LSB,	D_EXTERN,
162
	"FP",		LFP,	D_PARAM,
163
	"PC",		LPC,	D_BRANCH,
164
 
165
	"LR",		LLR,	D_LR,
166
	"CTR",		LCTR,	D_CTR,
167
 
168
	"XER",		LSPREG,	D_XER,
169
	"MSR",		LMSR,	D_MSR,
170
	"FPSCR",	LFPSCR,	D_FPSCR,
171
	"SPR",		LSPR,	D_SPR,
172
	"DCR",		LDCR,	D_DCR,
173
 
174
	"SEG",		LSEG,	D_SREG,
175
 
176
	"CR",		LCR,	0,
177
	"CR0",		LCREG,	0,
178
	"CR1",		LCREG,	1,
179
	"CR2",		LCREG,	2,
180
	"CR3",		LCREG,	3,
181
	"CR4",		LCREG,	4,
182
	"CR5",		LCREG,	5,
183
	"CR6",		LCREG,	6,
184
	"CR7",		LCREG,	7,
185
 
186
	"R",		LR,	0,
187
	"R0",		LREG,	0,
188
	"R1",		LREG,	1,
189
	"R2",		LREG,	2,
190
	"R3",		LREG,	3,
191
	"R4",		LREG,	4,
192
	"R5",		LREG,	5,
193
	"R6",		LREG,	6,
194
	"R7",		LREG,	7,
195
	"R8",		LREG,	8,
196
	"R9",		LREG,	9,
197
	"R10",		LREG,	10,
198
	"R11",		LREG,	11,
199
	"R12",		LREG,	12,
200
	"R13",		LREG,	13,
201
	"R14",		LREG,	14,
202
	"R15",		LREG,	15,
203
	"R16",		LREG,	16,
204
	"R17",		LREG,	17,
205
	"R18",		LREG,	18,
206
	"R19",		LREG,	19,
207
	"R20",		LREG,	20,
208
	"R21",		LREG,	21,
209
	"R22",		LREG,	22,
210
	"R23",		LREG,	23,
211
	"R24",		LREG,	24,
212
	"R25",		LREG,	25,
213
	"R26",		LREG,	26,
214
	"R27",		LREG,	27,
215
	"R28",		LREG,	28,
216
	"R29",		LREG,	29,
217
	"R30",		LREG,	30,
218
	"R31",		LREG,	31,
219
 
220
	"F",		LF,	0,
221
	"F0",		LFREG,	0,
222
	"F1",		LFREG,	1,
223
	"F2",		LFREG,	2,
224
	"F3",		LFREG,	3,
225
	"F4",		LFREG,	4,
226
	"F5",		LFREG,	5,
227
	"F6",		LFREG,	6,
228
	"F7",		LFREG,	7,
229
	"F8",		LFREG,	8,
230
	"F9",		LFREG,	9,
231
	"F10",		LFREG,	10,
232
	"F11",		LFREG,	11,
233
	"F12",		LFREG,	12,
234
	"F13",		LFREG,	13,
235
	"F14",		LFREG,	14,
236
	"F15",		LFREG,	15,
237
	"F16",		LFREG,	16,
238
	"F17",		LFREG,	17,
239
	"F18",		LFREG,	18,
240
	"F19",		LFREG,	19,
241
	"F20",		LFREG,	20,
242
	"F21",		LFREG,	21,
243
	"F22",		LFREG,	22,
244
	"F23",		LFREG,	23,
245
	"F24",		LFREG,	24,
246
	"F25",		LFREG,	25,
247
	"F26",		LFREG,	26,
248
	"F27",		LFREG,	27,
249
	"F28",		LFREG,	28,
250
	"F29",		LFREG,	29,
251
	"F30",		LFREG,	30,
252
	"F31",		LFREG,	31,
253
 
254
	"CREQV",	LCROP, ACREQV,
255
	"CRXOR",	LCROP, ACRXOR,
256
	"CRAND",	LCROP, ACRAND,
257
	"CROR",		LCROP, ACROR,
258
	"CRANDN",	LCROP, ACRANDN,
259
	"CRORN",	LCROP, ACRORN,
260
	"CRNAND",	LCROP, ACRNAND,
261
	"CRNOR",	LCROP, ACRNOR,
262
 
263
	"ADD",		LADDW, AADD,
264
	"ADDV",		LADDW, AADDV,
265
	"ADDCC",	LADDW, AADDCC,
266
	"ADDVCC",	LADDW, AADDVCC,
267
	"ADDC",		LADDW, AADDC,
268
	"ADDCV",	LADDW, AADDCV,
269
	"ADDCCC",	LADDW, AADDCCC,
270
	"ADDCVCC",	LADDW, AADDCVCC,
271
	"ADDE",		LLOGW, AADDE,
272
	"ADDEV",	LLOGW, AADDEV,
273
	"ADDECC",	LLOGW, AADDECC,
274
	"ADDEVCC",	LLOGW, AADDEVCC,
275
 
276
	"ADDME",	LABS, AADDME,
277
	"ADDMEV",	LABS, AADDMEV,
278
	"ADDMECC",	LABS, AADDMECC,
279
	"ADDMEVCC",	LABS, AADDMEVCC,
280
	"ADDZE",	LABS, AADDZE,
281
	"ADDZEV",	LABS, AADDZEV,
282
	"ADDZECC",	LABS, AADDZECC,
283
	"ADDZEVCC",	LABS, AADDZEVCC,
284
 
285
	"SUB",		LADDW, ASUB,
286
	"SUBV",		LADDW, ASUBV,
287
	"SUBCC",	LADDW, ASUBCC,
288
	"SUBVCC",	LADDW, ASUBVCC,
289
	"SUBE",		LLOGW, ASUBE,
290
	"SUBECC",	LLOGW, ASUBECC,
291
	"SUBEV",	LLOGW, ASUBEV,
292
	"SUBEVCC",	LLOGW, ASUBEVCC,
293
	"SUBC",		LADDW, ASUBC,
294
	"SUBCCC",	LADDW, ASUBCCC,
295
	"SUBCV",	LADDW, ASUBCV,
296
	"SUBCVCC",	LADDW, ASUBCVCC,
297
 
298
	"SUBME",	LABS, ASUBME,
299
	"SUBMEV",	LABS, ASUBMEV,
300
	"SUBMECC",	LABS, ASUBMECC,
301
	"SUBMEVCC",	LABS, ASUBMEVCC,
302
	"SUBZE",	LABS, ASUBZE,
303
	"SUBZEV",	LABS, ASUBZEV,
304
	"SUBZECC",	LABS, ASUBZECC,
305
	"SUBZEVCC",	LABS, ASUBZEVCC,
306
 
307
	"AND",		LADDW, AAND,
308
	"ANDCC",	LADDW, AANDCC,	/* includes andil & andiu */
309
	"ANDN",		LLOGW, AANDN,
310
	"ANDNCC",	LLOGW, AANDNCC,
311
	"EQV",		LLOGW, AEQV,
312
	"EQVCC",	LLOGW, AEQVCC,
313
	"NAND",		LLOGW, ANAND,
314
	"NANDCC",	LLOGW, ANANDCC,
315
	"NOR",		LLOGW, ANOR,
316
	"NORCC",	LLOGW, ANORCC,
317
	"OR",		LADDW, AOR,	/* includes oril & oriu */
318
	"ORCC",		LADDW, AORCC,
319
	"ORN",		LLOGW, AORN,
320
	"ORNCC",	LLOGW, AORNCC,
321
	"XOR",		LADDW, AXOR,	/* includes xoril & xoriu */
322
	"XORCC",	LLOGW, AXORCC,
323
 
324
	"EXTSB",	LABS,	AEXTSB,
325
	"EXTSBCC",	LABS,	AEXTSBCC,
326
	"EXTSH",	LABS, AEXTSH,
327
	"EXTSHCC",	LABS, AEXTSHCC,
328
 
329
	"CNTLZW",	LABS, ACNTLZW,
330
	"CNTLZWCC",	LABS, ACNTLZWCC,
331
 
332
	"RLWMI",	LRLWM, ARLWMI,
333
	"RLWMICC",	LRLWM, ARLWMICC,
334
	"RLWNM",	LRLWM, ARLWNM,
335
	"RLWNMCC", LRLWM, ARLWNMCC,
336
 
337
	"SLW",		LSHW, ASLW,
338
	"SLWCC",	LSHW, ASLWCC,
339
	"SRW",		LSHW, ASRW,
340
	"SRWCC",	LSHW, ASRWCC,
341
	"SRAW",		LSHW, ASRAW,
342
	"SRAWCC",	LSHW, ASRAWCC,
343
 
344
	"BR",		LBRA, ABR,
345
	"BC",		LBRA, ABC,
346
	"BCL",		LBRA, ABC,
347
	"BL",		LBRA, ABL,
348
	"BEQ",		LBRA, ABEQ,
349
	"BNE",		LBRA, ABNE,
350
	"BGT",		LBRA, ABGT,
351
	"BGE",		LBRA, ABGE,
352
	"BLT",		LBRA, ABLT,
353
	"BLE",		LBRA, ABLE,
354
	"BVC",		LBRA, ABVC,
355
	"BVS",		LBRA, ABVS,
356
 
357
	"CMP",		LCMP, ACMP,
358
	"CMPU",		LCMP, ACMPU,
359
 
360
	"DIVW",		LLOGW, ADIVW,
361
	"DIVWV",	LLOGW, ADIVWV,
362
	"DIVWCC",	LLOGW, ADIVWCC,
363
	"DIVWVCC",	LLOGW, ADIVWVCC,
364
	"DIVWU",	LLOGW, ADIVWU,
365
	"DIVWUV",	LLOGW, ADIVWUV,
366
	"DIVWUCC",	LLOGW, ADIVWUCC,
367
	"DIVWUVCC",	LLOGW, ADIVWUVCC,
368
 
369
	"FABS",		LFCONV,	AFABS,
370
	"FABSCC",	LFCONV,	AFABSCC,
371
	"FNEG",		LFCONV,	AFNEG,
372
	"FNEGCC",	LFCONV,	AFNEGCC,
373
	"FNABS",	LFCONV,	AFNABS,
374
	"FNABSCC",	LFCONV,	AFNABSCC,
375
 
376
	"FADD",		LFADD,	AFADD,
377
	"FADDCC",	LFADD,	AFADDCC,
378
	"FSUB",		LFADD,  AFSUB,
379
	"FSUBCC",	LFADD,	AFSUBCC,
380
	"FMUL",		LFADD,	AFMUL,
381
	"FMULCC",	LFADD,	AFMULCC,
382
	"FDIV",		LFADD,	AFDIV,
383
	"FDIVCC",	LFADD,	AFDIVCC,
384
	"FRSP",		LFCONV,	AFRSP,
385
	"FRSPCC",	LFCONV,	AFRSPCC,
386
 
387
	"FMADD",	LFMA, AFMADD,
388
	"FMADDCC",	LFMA, AFMADDCC,
389
	"FMSUB",	LFMA, AFMSUB,
390
	"FMSUBCC",	LFMA, AFMSUBCC,
391
	"FNMADD",	LFMA, AFNMADD,
392
	"FNMADDCC",	LFMA, AFNMADDCC,
393
	"FNMSUB",	LFMA, AFNMSUB,
394
	"FNMSUBCC",	LFMA, AFNMSUBCC,
395
	"FMADDS",	LFMA, AFMADDS,
396
	"FMADDSCC",	LFMA, AFMADDSCC,
397
	"FMSUBS",	LFMA, AFMSUBS,
398
	"FMSUBSCC",	LFMA, AFMSUBSCC,
399
	"FNMADDS",	LFMA, AFNMADDS,
400
	"FNMADDSCC",	LFMA, AFNMADDSCC,
401
	"FNMSUBS",	LFMA, AFNMSUBS,
402
	"FNMSUBSCC",	LFMA, AFNMSUBSCC,
403
 
404
	"FCMPU",	LFCMP, AFCMPU,
405
	"FCMPO",	LFCMP, AFCMPO,
406
	"MTFSB0",	LMTFSB, AMTFSB0,
407
	"MTFSB1",	LMTFSB,	AMTFSB1,
408
 
409
	"FMOVD",	LFMOV, AFMOVD,
410
	"FMOVS",	LFMOV, AFMOVS,
411
	"FMOVDCC",	LFCONV,	AFMOVDCC,	/* fmr. */
412
 
413
	"GLOBL",	LTEXT, AGLOBL,
414
 
415
	"MOVB",		LMOVB, AMOVB,
416
	"MOVBZ",	LMOVB, AMOVBZ,
417
	"MOVBU",	LMOVB, AMOVBU,
418
	"MOVBZU", LMOVB, AMOVBZU,
419
	"MOVH",		LMOVB, AMOVH,
420
	"MOVHZ",	LMOVB, AMOVHZ,
421
	"MOVHU",	LMOVB, AMOVHU,
422
	"MOVHZU", LMOVB, AMOVHZU,
423
	"MOVHBR", 	LXMV, AMOVHBR,
424
	"MOVWBR",	LXMV, AMOVWBR,
425
	"MOVW",		LMOVW, AMOVW,
426
	"MOVWU",	LMOVW, AMOVWU,
427
	"MOVMW",	LMOVMW, AMOVMW,
428
	"MOVFL",	LMOVW,	AMOVFL,
429
 
430
	"MULLW",	LADDW, AMULLW,		/* includes multiply immediate 10-139 */
431
	"MULLWV",	LLOGW, AMULLWV,
432
	"MULLWCC",	LLOGW, AMULLWCC,
433
	"MULLWVCC",	LLOGW, AMULLWVCC,
434
 
435
	"MULHW",	LLOGW, AMULHW,
436
	"MULHWCC",	LLOGW, AMULHWCC,
437
	"MULHWU",	LLOGW, AMULHWU,
438
	"MULHWUCC",	LLOGW, AMULHWUCC,
439
 
440
	"NEG",		LABS, ANEG,
441
	"NEGV",		LABS, ANEGV,
442
	"NEGCC",	LABS, ANEGCC,
443
	"NEGVCC",	LABS, ANEGVCC,
444
 
445
	"NOP",		LNOP, ANOP,	/* ori 0,0,0 */
446
	"SYSCALL",	LNOP, ASYSCALL,
447
 
448
	"RETURN",	LRETRN, ARETURN,
449
	"RFI",		LRETRN,	ARFI,
450
	"RFCI",		LRETRN,	ARFCI,
451
 
452
	"DATA",		LDATA, ADATA,
453
	"END",		LEND, AEND,
454
	"TEXT",		LTEXT, ATEXT,
455
 
456
	/* IBM powerpc embedded  */
457
	"MACCHW", LMA, AMACCHW,
458
	"MACCHWCC", LMA, AMACCHWCC,
459
	"MACCHWS", LMA, AMACCHWS,
460
	"MACCHWSCC", LMA, AMACCHWSCC,
461
	"MACCHWSU", LMA, AMACCHWSU,
462
	"MACCHWSUCC", LMA, AMACCHWSUCC,
463
	"MACCHWSUV", LMA, AMACCHWSUV,
464
	"MACCHWSUVCC", LMA, AMACCHWSUVCC,
465
	"MACCHWSV", LMA, AMACCHWSV,
466
	"MACCHWSVCC", LMA, AMACCHWSVCC,
467
	"MACCHWU", LMA, AMACCHWU,
468
	"MACCHWUCC", LMA, AMACCHWUCC,
469
	"MACCHWUV", LMA, AMACCHWUV,
470
	"MACCHWUVCC", LMA, AMACCHWUVCC,
471
	"MACCHWV", LMA, AMACCHWV,
472
	"MACCHWVCC", LMA, AMACCHWVCC,
473
	"MACHHW", LMA, AMACHHW,
474
	"MACHHWCC", LMA, AMACHHWCC,
475
	"MACHHWS", LMA, AMACHHWS,
476
	"MACHHWSCC", LMA, AMACHHWSCC,
477
	"MACHHWSU", LMA, AMACHHWSU,
478
	"MACHHWSUCC", LMA, AMACHHWSUCC,
479
	"MACHHWSUV", LMA, AMACHHWSUV,
480
	"MACHHWSUVCC", LMA, AMACHHWSUVCC,
481
	"MACHHWSV", LMA, AMACHHWSV,
482
	"MACHHWSVCC", LMA, AMACHHWSVCC,
483
	"MACHHWU", LMA, AMACHHWU,
484
	"MACHHWUCC", LMA, AMACHHWUCC,
485
	"MACHHWUV", LMA, AMACHHWUV,
486
	"MACHHWUVCC", LMA, AMACHHWUVCC,
487
	"MACHHWV", LMA, AMACHHWV,
488
	"MACHHWVCC", LMA, AMACHHWVCC,
489
	"MACLHW", LMA, AMACLHW,
490
	"MACLHWCC", LMA, AMACLHWCC,
491
	"MACLHWS", LMA, AMACLHWS,
492
	"MACLHWSCC", LMA, AMACLHWSCC,
493
	"MACLHWSU", LMA, AMACLHWSU,
494
	"MACLHWSUCC", LMA, AMACLHWSUCC,
495
	"MACLHWSUV", LMA, AMACLHWSUV,
496
	"MACLHWSUVCC", LMA, AMACLHWSUVCC,
497
	"MACLHWSV", LMA, AMACLHWSV,
498
	"MACLHWSVCC", LMA, AMACLHWSVCC,
499
	"MACLHWU", LMA, AMACLHWU,
500
	"MACLHWUCC", LMA, AMACLHWUCC,
501
	"MACLHWUV", LMA, AMACLHWUV,
502
	"MACLHWUVCC", LMA, AMACLHWUVCC,
503
	"MACLHWV", LMA, AMACLHWV,
504
	"MACLHWVCC", LMA, AMACLHWVCC,
505
	"MULCHW",	LLOGW, AMULCHW,
506
	"MULCHWCC",	LLOGW, AMULCHWCC,
507
	"MULCHWU",	LLOGW, AMULCHWU,
508
	"MULCHWUCC",	LLOGW, AMULCHWUCC,
509
	"MULHHW",	LLOGW, AMULHHW,
510
	"MULHHWCC",	LLOGW, AMULHHWCC,
511
	"MULHHWU",	LLOGW, AMULHHWU,
512
	"MULHHWUCC",	LLOGW, AMULHHWUCC,
513
	"MULLHW",	LLOGW, AMULLHW,
514
	"MULLHWCC",	LLOGW, AMULLHWCC,
515
	"MULLHWU",	LLOGW, AMULLHWU,
516
	"MULLHWUCC",	LLOGW, AMULLHWUCC,
517
	"NMACCHW", LMA, ANMACCHW,
518
	"NMACCHWCC", LMA, ANMACCHWCC,
519
	"NMACCHWS", LMA, ANMACCHWS,
520
	"NMACCHWSCC", LMA, ANMACCHWSCC,
521
	"NMACCHWSV", LMA, ANMACCHWSV,
522
	"NMACCHWSVCC", LMA, ANMACCHWSVCC,
523
	"NMACCHWV", LMA, ANMACCHWV,
524
	"NMACCHWVCC", LMA, ANMACCHWVCC,
525
	"NMACHHW", LMA, ANMACHHW,
526
	"NMACHHWCC", LMA, ANMACHHWCC,
527
	"NMACHHWS", LMA, ANMACHHWS,
528
	"NMACHHWSCC", LMA, ANMACHHWSCC,
529
	"NMACHHWSV", LMA, ANMACHHWSV,
530
	"NMACHHWSVCC", LMA, ANMACHHWSVCC,
531
	"NMACHHWV", LMA, ANMACHHWV,
532
	"NMACHHWVCC", LMA, ANMACHHWVCC,
533
	"NMACLHW", LMA, ANMACLHW,
534
	"NMACLHWCC", LMA, ANMACLHWCC,
535
	"NMACLHWS", LMA, ANMACLHWS,
536
	"NMACLHWSCC", LMA, ANMACLHWSCC,
537
	"NMACLHWSV", LMA, ANMACLHWSV,
538
	"NMACLHWSVCC", LMA, ANMACLHWSVCC,
539
	"NMACLHWV", LMA, ANMACLHWV,
540
	"NMACLHWVCC", LMA, ANMACLHWVCC,
541
 
542
	/* optional on 32-bit */
543
	"FRES", LFCONV, AFRES,
544
	"FRESCC", LFCONV, AFRESCC,
545
	"FRSQRTE", LFCONV, AFRSQRTE,
546
	"FRSQRTECC", LFCONV, AFRSQRTECC,
547
	"FSEL", LFMA, AFSEL,
548
	"FSELCC", LFMA, AFSELCC,
549
	"FSQRT", LFCONV, AFSQRT,
550
	"FSQRTCC", LFCONV, AFSQRTCC,
551
	"FSQRTS", LFCONV, AFSQRTS,
552
	"FSQRTSCC", LFCONV, AFSQRTSCC,
553
 
554
	/* parallel, cross, and secondary (fp2) */
555
	"FPSEL", LFMA, AFPSEL,
556
	"FPMUL", LFADD, AFPMUL,
557
	"FXMUL", LFADD, AFXMUL,
558
	"FXPMUL", LFADD, AFXPMUL,
559
	"FXSMUL", LFADD, AFXSMUL,
560
	"FPADD", LFADD, AFPADD,
561
	"FPSUB", LFADD, AFPSUB,
562
	"FPRE", LFCONV, AFPRE,
563
	"FPRSQRTE", LFCONV, AFPRSQRTE,
564
	"FPMADD", LFMA, AFPMADD,
565
	"FXMADD", LFMA, AFXMADD,
566
	"FXCPMADD", LFMA, AFXCPMADD,
567
	"FXCSMADD", LFMA, AFXCSMADD,
568
	"FPNMADD", LFMA, AFPNMADD,
569
	"FXNMADD", LFMA, AFXNMADD,
570
	"FXCPNMADD", LFMA, AFXCPNMADD,
571
	"FXCSNMADD", LFMA, AFXCSNMADD,
572
	"FPMSUB", LFMA, AFPMSUB,
573
	"FXMSUB", LFMA, AFXMSUB,
574
	"FXCPMSUB", LFMA, AFXCPMSUB,
575
	"FXCSMSUB", LFMA, AFXCSMSUB,
576
	"FPNMSUB", LFMA, AFPNMSUB,
577
	"FXNMSUB", LFMA, AFXNMSUB,
578
	"FXCPNMSUB", LFMA, AFXCPNMSUB,
579
	"FXCSNMSUB", LFMA, AFXCSNMSUB,
580
	"FPABS", LFCONV, AFPABS,
581
	"FPNEG", LFCONV, AFPNEG,
582
	"FPRSP", LFCONV, AFPRSP,
583
	"FPNABS", LFCONV, AFPNABS,
584
	"FSMOVD", LFMOV, AFSMOVD,
585
	"FSCMP", LFCMP, AFSCMP,
586
	"FSABS", LFCONV, AFSABS,
587
	"FSNEG", LFCONV, AFSNEG,
588
	"FSNABS", LFCONV, AFSNABS,
589
	"FPCTIW", LFCONV, AFPCTIW,
590
	"FPCTIWZ", LFCONV, AFPCTIWZ,
591
	"FMOVSPD", LFCONV, AFMOVSPD,
592
	"FMOVPSD", LFCONV, AFMOVPSD,
593
	"FXCPNPMA", LFMA, AFXCPNPMA,
594
	"FXCSNPMA", LFMA, AFXCSNPMA,
595
	"FXCPNSMA", LFMA, AFXCPNSMA,
596
	"FXCSNSMA", LFMA, AFXCSNSMA,
597
	"FXCXNPMA", LFMA, AFXCXNPMA,
598
	"FXCXNSMA", LFMA, AFXCXNSMA,
599
	"FXCXMA", LFMA, AFXCXMA,
600
	"FXCXNMS", LFMA, AFXCXNMS,
601
 
602
	/* parallel, cross, and secondary load and store (fp2) */
603
	"FSMOVS", LFMOVX, AFSMOVS,
604
	"FSMOVSU", LFMOVX, AFSMOVSU,
605
	"FSMOVD", LFMOVX, AFSMOVD,
606
	"FSMOVDU", LFMOVX, AFSMOVDU,
607
	"FXMOVS", LFMOVX, AFXMOVS,
608
	"FXMOVSU", LFMOVX, AFXMOVSU,
609
	"FXMOVD", LFMOVX, AFXMOVD,
610
	"FXMOVDU", LFMOVX, AFXMOVDU,
611
	"FPMOVS", LFMOVX, AFPMOVS,
612
	"FPMOVSU", LFMOVX, AFPMOVSU,
613
	"FPMOVD", LFMOVX, AFPMOVD,
614
	"FPMOVDU", LFMOVX, AFPMOVDU,
615
	"FPMOVIW", LFMOVX, AFPMOVIW,
616
 
617
	"AFMOVSPD",	LFMOV,	AFMOVSPD,
618
	"AFMOVPSD",	LFMOV,	AFMOVPSD,
619
 
620
	/* special instructions */
621
	"DCBF",		LXOP,	ADCBF,
622
	"DCBI",		LXOP,	ADCBI,
623
	"DCBST",	LXOP,	ADCBST,
624
	"DCBT",		LXOP,	ADCBT,
625
	"DCBTST",	LXOP,	ADCBTST,
626
	"DCBZ",		LXOP,	ADCBZ,
627
	"ICBI",		LXOP,	AICBI,
628
 
629
	"ECIWX",	LXLD,	AECIWX,
630
	"ECOWX",	LXST,	AECOWX,
631
	"LWAR", LXLD, ALWAR,
632
	"STWCCC", LXST, ASTWCCC,
633
	"EIEIO",	LRETRN,	AEIEIO,
634
	"TLBIE",	LNOP,	ATLBIE,
635
	"LSW",	LXLD, ALSW,
636
	"STSW",	LXST, ASTSW,
637
 
638
	"ISYNC",	LRETRN, AISYNC,
639
	"SYNC",		LRETRN, ASYNC,
640
/*	"TW",		LADDW,	ATW,*/
641
 
642
	"WORD",		LWORD, AWORD,
643
	"SCHED",	LSCHED, 0,
644
	"NOSCHED",	LSCHED,	0x80,
645
 
646
 
647
};
648
 
649
void
650
cinit(void)
651
{
652
	Sym *s;
653
	int i;
654
 
655
	nullgen.sym = S;
656
	nullgen.offset = 0;
657
	nullgen.type = D_NONE;
658
	nullgen.name = D_NONE;
659
	nullgen.reg = NREG;
660
	nullgen.xreg = NREG;
661
	if(FPCHIP)
662
		nullgen.dval = 0;
663
	for(i=0; i<sizeof(nullgen.sval); i++)
664
		nullgen.sval[i] = 0;
665
 
666
	nerrors = 0;
667
	iostack = I;
668
	iofree = I;
669
	peekc = IGN;
670
	nhunk = 0;
671
	for(i=0; i<NHASH; i++)
672
		hash[i] = S;
673
	for(i=0; itab[i].name; i++) {
674
		s = slookup(itab[i].name);
675
		s->type = itab[i].type;
676
		s->value = itab[i].value;
677
	}
678
	ALLOCN(pathname, 0, 100);
679
	if(mygetwd(pathname, 99) == 0) {
680
		ALLOCN(pathname, 100, 900);
681
		if(mygetwd(pathname, 999) == 0)
682
			strcpy(pathname, "/???");
683
	}
684
}
685
 
686
void
687
syminit(Sym *s)
688
{
689
 
690
	s->type = LNAME;
691
	s->value = 0;
692
}
693
 
694
void
695
cclean(void)
696
{
697
 
698
	outcode(AEND, &nullgen, NREG, &nullgen);
699
	Bflush(&obuf);
700
}
701
 
702
void
703
zname(char *n, int t, int s)
704
{
705
 
706
	Bputc(&obuf, ANAME);
707
	Bputc(&obuf, ANAME>>8);
708
	Bputc(&obuf, t);	/* type */
709
	Bputc(&obuf, s);	/* sym */
710
	while(*n) {
711
		Bputc(&obuf, *n);
712
		n++;
713
	}
714
	Bputc(&obuf, 0);
715
}
716
 
717
void
718
zaddr(Gen *a, int s)
719
{
720
	long l;
721
	int i;
722
	char *n;
723
	Ieee e;
724
 
725
	Bputc(&obuf, a->type);
726
	Bputc(&obuf, a->reg);
727
	Bputc(&obuf, s);
728
	Bputc(&obuf, a->name);
729
	switch(a->type) {
730
	default:
731
		print("unknown type %d\n", a->type);
732
		exits("arg");
733
 
734
	case D_NONE:
735
	case D_REG:
736
	case D_FREG:
737
	case D_CREG:
738
	case D_FPSCR:
739
	case D_MSR:
740
	case D_SREG:
741
	case D_OPT:
742
		break;
743
 
744
	case D_DCR:
745
	case D_SPR:
746
	case D_OREG:
747
	case D_CONST:
748
	case D_BRANCH:
749
		l = a->offset;
750
		Bputc(&obuf, l);
751
		Bputc(&obuf, l>>8);
752
		Bputc(&obuf, l>>16);
753
		Bputc(&obuf, l>>24);
754
		break;
755
 
756
	case D_SCONST:
757
		n = a->sval;
758
		for(i=0; i<NSNAME; i++) {
759
			Bputc(&obuf, *n);
760
			n++;
761
		}
762
		break;
763
 
764
	case D_FCONST:
765
		ieeedtod(&e, a->dval);
766
		Bputc(&obuf, e.l);
767
		Bputc(&obuf, e.l>>8);
768
		Bputc(&obuf, e.l>>16);
769
		Bputc(&obuf, e.l>>24);
770
		Bputc(&obuf, e.h);
771
		Bputc(&obuf, e.h>>8);
772
		Bputc(&obuf, e.h>>16);
773
		Bputc(&obuf, e.h>>24);
774
		break;
775
	}
776
}
777
 
778
int
779
outsim(Gen *g)
780
{
781
	Sym *s;
782
	int sno, t;
783
 
784
	s = g->sym;
785
	if(s == S)
786
		return 0;
787
	sno = s->sym;
788
	if(sno < 0 || sno >= NSYM)
789
		sno = 0;
790
	t = g->name;
791
	if(h[sno].type == t && h[sno].sym == s)
792
		return sno;
793
	zname(s->name, t, sym);
794
	s->sym = sym;
795
	h[sym].sym = s;
796
	h[sym].type = t;
797
	sno = sym;
798
	sym++;
799
	if(sym >= NSYM)
800
		sym = 1;
801
	return sno;
802
}
803
 
804
void
805
outcode(int a, Gen *g1, int reg, Gen *g2)
806
{
807
	int sf, st;
808
 
809
	if(a != AGLOBL && a != ADATA)
810
		pc++;
811
	if(pass == 1)
812
		return;
813
	if(g1->xreg != NREG) {
814
		if(reg != NREG || g2->xreg != NREG)
815
			yyerror("bad addressing modes");
816
		reg = g1->xreg;
817
	} else
818
	if(g2->xreg != NREG) {
819
		if(reg != NREG)
820
			yyerror("bad addressing modes");
821
		reg = g2->xreg;
822
	}
823
	do {
824
		sf = outsim(g1);
825
		st = outsim(g2);
826
	} while(sf != 0 && st == sf);
827
	Bputc(&obuf, a);
828
	Bputc(&obuf, a>>8);
829
	Bputc(&obuf, reg|nosched);
830
	Bputc(&obuf, lineno);
831
	Bputc(&obuf, lineno>>8);
832
	Bputc(&obuf, lineno>>16);
833
	Bputc(&obuf, lineno>>24);
834
	zaddr(g1, sf);
835
	zaddr(g2, st);
836
}
837
 
838
void
839
outgcode(int a, Gen *g1, int reg, Gen *g2, Gen *g3)
840
{
841
	int s1, s2, s3, flag; 
842
 
843
	if(a != AGLOBL && a != ADATA)
844
		pc++;
845
	if(pass == 1)
846
		return;
847
	do {
848
		s1 = outsim(g1);
849
		s2 = outsim(g2);
850
		s3 = outsim(g3);
851
	} while(s1 && (s2 && s1 == s2 || s3 && s1 == s3) || s2 && (s3 && s2 == s3));
852
	flag = 0;
853
	if(g2->type != D_NONE)
854
		flag = 0x40;	/* flags extra operand */
855
	Bputc(&obuf, a);
856
	Bputc(&obuf, a>>8);
857
	Bputc(&obuf, reg | nosched | flag);
858
	Bputc(&obuf, lineno);
859
	Bputc(&obuf, lineno>>8);
860
	Bputc(&obuf, lineno>>16);
861
	Bputc(&obuf, lineno>>24);
862
	zaddr(g1, s1);
863
	if(flag)
864
		zaddr(g2, s2);
865
	zaddr(g3, s3);
866
}
867
 
868
void
869
outhist(void)
870
{
871
	Gen g;
872
	Hist *h;
873
	char *p, *q, *op, c;
874
	int n;
875
 
876
	g = nullgen;
877
	c = pathchar();
878
	for(h = hist; h != H; h = h->link) {
879
		p = h->name;
880
		op = 0;
881
		/* on windows skip drive specifier in pathname */
882
		if(systemtype(Windows) && p && p[1] == ':'){
883
			p += 2;
884
			c = *p;
885
		}
886
		if(p && p[0] != c && h->offset == 0 && pathname){
887
			/* on windows skip drive specifier in pathname */
888
			if(systemtype(Windows) && pathname[1] == ':') {
889
				op = p;
890
				p = pathname+2;
891
				c = *p;
892
			} else if(pathname[0] == c){
893
				op = p;
894
				p = pathname;
895
			}
896
		}
897
		while(p) {
898
			q = strchr(p, c);
899
			if(q) {
900
				n = q-p;
901
				if(n == 0){
902
					n = 1;	/* leading "/" */
903
					*p = '/';	/* don't emit "\" on windows */
904
				}
905
				q++;
906
			} else {
907
				n = strlen(p);
908
				q = 0;
909
			}
910
			if(n) {
911
				Bputc(&obuf, ANAME);
912
				Bputc(&obuf, ANAME>>8);
913
				Bputc(&obuf, D_FILE);	/* type */
914
				Bputc(&obuf, 1);	/* sym */
915
				Bputc(&obuf, '<');
916
				Bwrite(&obuf, p, n);
917
				Bputc(&obuf, 0);
918
			}
919
			p = q;
920
			if(p == 0 && op) {
921
				p = op;
922
				op = 0;
923
			}
924
		}
925
		g.offset = h->offset;
926
 
927
		Bputc(&obuf, AHISTORY);
928
		Bputc(&obuf, AHISTORY>>8);
929
		Bputc(&obuf, 0);
930
		Bputc(&obuf, h->line);
931
		Bputc(&obuf, h->line>>8);
932
		Bputc(&obuf, h->line>>16);
933
		Bputc(&obuf, h->line>>24);
934
		zaddr(&nullgen, 0);
935
		zaddr(&g, 0);
936
	}
937
}
938
 
939
#include "../cc/lexbody"
940
#include "../cc/macbody"
941
#include "../cc/compat"