|
|
1.1 root 1: /*
2:
3: * translation routines; sometimes we pass data on
4:
5: * through directly (asm syntax->asm syntax, with
6:
7: * some macro expansion), and other times we also
8:
9: * do asm syntax->gas syntax translation
10:
11: */
12:
13:
14:
15: #include "asmtrans.h"
16:
17:
18:
19: int syntax = GAS;
20:
21:
22:
23: char *
24:
25: immediate(op)
26:
27: char *op;
28:
29: {
30:
31: return concat("#", op);
32:
33: }
34:
35:
36:
37: char *
38:
39: indirect(op)
40:
41: char *op;
42:
43: {
44:
45: if (syntax == GAS) {
46:
47: return concat(op, "@");
48:
49: } else {
50:
51: return concat3("(", op, ")");
52:
53: }
54:
55: }
56:
57:
58:
59: char *
60:
61: postinc(op)
62:
63: char *op;
64:
65: {
66:
67: if (syntax == GAS) {
68:
69: return concat(op, "@+");
70:
71: } else {
72:
73: return concat3("(", op, ")+");
74:
75: }
76:
77: }
78:
79:
80:
81: char *
82:
83: predec(op)
84:
85: char *op;
86:
87: {
88:
89: if (syntax == GAS) {
90:
91: return concat(op, "@-");
92:
93: } else {
94:
95: return concat3("-(", op, ")");
96:
97: }
98:
99: }
100:
101:
102:
103: char *
104:
105: indexed(op1, op2)
106:
107: char *op1, *op2;
108:
109: {
110:
111: if (syntax == GAS) {
112:
113: return concat4(op2, "@(", op1, ")");
114:
115: } else {
116:
117: return concat4(op1, "(", op2, ")");
118:
119: }
120:
121: }
122:
123:
124:
125: char *
126:
127: sizedop(op, size)
128:
129: char *op, *size;
130:
131: {
132:
133: if (syntax == GAS) {
134:
135: return changesiz(concat(op, size));
136:
137: } else {
138:
139: return concat4("(", op, ")", size);
140:
141: }
142:
143: }
144:
145:
146:
147: char *
148:
149: twoindex(disp, base, index)
150:
151: char *disp, *base, *index;
152:
153: {
154:
155: if (syntax == GAS) {
156:
1.1.1.2 root 157: return concat6(base, "@(", disp, ",", changesiz2(index), ")");
1.1 root 158:
159: } else {
160:
161: return concat6(disp, "(", base, ",", index, ")");
162:
163: }
164:
165: }
166:
167:
168:
169: char *
170:
171: bitfield(op1, op2, op3)
172:
173: char *op1, *op2, *op3;
174:
175: {
176:
177: if (syntax == GAS) {
178:
179: return concat6(op1, "{#", op2, ":#", op3, "}");
180:
181: } else {
182:
183: return concat6(op1, "{", op2, ":", op3, "}");
184:
185: }
186:
187: }
188:
189:
190:
191: char *
192:
1.1.1.2 root 193: postindex(bd, an , index, od)
194:
195: char *bd, *an, *index , *od;
196:
197: {
198:
199: if (syntax == GAS) {
200:
201: return concat8(an, "@(", bd, ")@(", od, ",", changesiz2(index), ")");
202:
203: } else {
204:
205: return concat9("([",an, ",", bd, "],", index, ",", od ,")");
206:
207: }
208:
209: }
210:
211:
212:
213: char *
214:
215: postindex0(bd)
216:
217: char *bd;
218:
219: {
220:
221: if (syntax == GAS) {
222:
1.1.1.3 ! root 223: return concat3("@(", bd, ")@()");
1.1.1.2 root 224:
225: } else {
226:
227: return concat3("([", bd, "])");
228:
229: }
230:
231: }
232:
233:
234:
235: char *
236:
237: postindex1(bd,od)
238:
239: char *bd, *od;
240:
241: {
242:
243: if (syntax == GAS) {
244:
245: return concat5("@(", bd, ")@(", od, ")");
246:
247: } else {
248:
249: return concat5("([", bd, "],", od, ")");
250:
251: }
252:
253: }
254:
255:
256:
257: char *
258:
259: preindex(bd, an , index, od)
260:
261: char *bd, *an, *index , *od;
262:
263: {
264:
265: if (syntax == GAS) {
266:
267: return concat8(an, "@(", bd, ",", changesiz2(index), ")@(", od, ")");
268:
269: } else {
270:
271: return concat9("([",an, ",", bd, ",", index, "],", od, ")");
272:
273: }
274:
275: }
276:
277:
278:
279: char *
280:
1.1 root 281: do_ops(label, opcode, space, operand)
282:
283: char *label, *opcode, *space, *operand;
284:
285: {
286:
287: static char temp[LINSIZ];
288:
289: static char optemp[40];
290:
291: char *to, *from;
292:
293: char c;
294:
295:
296:
297: if (syntax == GAS) {
298:
299: if (!strcmp(opcode, "ds.l")) {
300:
301: strcpy(temp, "\t.even\n\t.comm");
302:
303: strcat(temp, space);
304:
305: strcat(temp, label);
306:
307: strcat(temp, ",");
308:
309: strcat(temp, "4*");
310:
311: strcat(temp, operand);
312:
313: return strdup(temp);
314:
315: } else if (!strcmp(opcode, "ds.w")) {
316:
317: strcpy(temp, "\t.even\n\t.comm");
318:
319: strcat(temp, space);
320:
321: strcat(temp, label);
322:
323: strcat(temp, ",");
324:
325: strcat(temp, "2*");
326:
327: strcat(temp, operand);
328:
329: return strdup(temp);
330:
331: } else if (!strcmp(opcode, "ds.b")) {
332:
333: strcpy(temp, "\t.comm");
334:
335: strcat(temp, space);
336:
337: strcat(temp, label);
338:
339: strcat(temp, ",");
340:
341: strcat(temp, operand);
342:
343: return strdup(temp);
344:
345: } else {
346:
347: to = optemp;
348:
349: from = opcode;
350:
351: for(;;) {
352:
353: c = *from++;
354:
355: if (!c) break;
356:
357: /* change 'foo.b' -> 'foob' */
358:
359: /* special case: bra.s -> 'bra', since gas automatically
360:
361: * selects offset sizes and since some gas's actually
362:
363: * mess up if an explicit '.s' is given
364:
365: */
366:
367: if (c == '.' && *from && from[1] == 0) {
368:
369: if (*from == 's') from++;
370:
371: continue;
372:
373: }
374:
375: *to++ = c;
376:
377: }
378:
379: *to = 0;
380:
381: opcode = optemp;
382:
383: }
384:
385: }
386:
387:
388:
389: to = temp;
390:
391:
392:
393: if (*label) {
394:
395: int colonseen = 0;
396:
397: char c;
398:
399:
400:
401: for (from = label; (c = *from++) != 0;) {
402:
403: if (c == ':') colonseen = 1;
404:
405: *to++ = c;
406:
407: }
408:
409: /* gas labels must have a ':' after them */
410:
411: if (!colonseen && syntax == GAS)
412:
413: *to++ = ':';
414:
415: }
416:
417:
418:
419: *to++ = '\t';
420:
421: strcpy(to, opcode);
422:
423: strcat(temp, space);
424:
425: strcat(temp, operand);
426:
427: return strdup(temp);
428:
429: }
430:
431:
432:
433: char *
434:
435: changesiz(op)
436:
437: char *op;
438:
439: {
440:
441: char *r = op;
442:
443:
444:
445: if (syntax != GAS) return op;
446:
447:
448:
449: while (*op) {
450:
451: if (*op == '.') *op = ':';
452:
453: op++;
454:
455: }
456:
457: return r;
458:
459: }
460:
461:
462:
463: char *
464:
1.1.1.2 root 465: changesiz2(op) /* rw: hack for scaled index */
466:
467: char *op;
468:
469: {
470:
471: char *r = op;
472:
473:
474:
475: if (syntax != GAS) return op;
476:
477:
478:
479: while (*op) {
480:
481: if (*op == '.' || *op == '*' ) *op = ':';
482:
483: op++;
484:
485: }
486:
487: return r;
488:
489: }
490:
491:
492:
493: char *
494:
1.1 root 495: hexop(op)
496:
497: char *op;
498:
499: {
500:
501: if (syntax == GAS)
502:
503: return concat("0x", op);
504:
505: else
506:
507: return concat("$", op);
508:
509: }
510:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.