xref: /inferno-os/libinterp/conv.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1 #include "lib9.h"
2 #include "isa.h"
3 #include "interp.h"
4 #include "mathi.h"
5 
6 enum
7 {
8 	TOKI0,
9 	TOKI1,
10 	TOKI2,
11 	TOKI3,
12 	TOKSB,
13 	TOKFP
14 };
15 #include "tab.h"
16 
17 typedef struct Addr	Addr;
18 struct Addr
19 {
20 	uchar	mode;
21 	Adr	a;
22 };
23 
24 #pragma	varargck	type	"a"	Addr*
25 
26 char*	opnam[256];
27 int	iconv(Fmt*);
28 int	aconv(Fmt*);
29 
30 int
aconv(Fmt * f)31 aconv(Fmt *f)
32 {
33 	Addr *a;
34 	char buf[64];
35 
36 	a = va_arg(f->args, Addr*);
37 	if(a == nil)
38 		return fmtstrcpy(f, "AZ");
39 	switch(a->mode & AMASK) {
40 	case AFP:	sprint(buf, "%d(fp)", a->a.ind);	break;
41 	case AMP:	sprint(buf, "%d(mp)", a->a.ind);	break;
42 	case AIMM:	sprint(buf, "$%d", a->a.imm);		break;
43 	case AIND|AFP:	sprint(buf, "%d(%d(fp))", a->a.i.s, a->a.i.f); break;
44 	case AIND|AMP:	sprint(buf, "%d(%d(mp))", a->a.i.s, a->a.i.f); break;
45 	}
46 	return fmtstrcpy(f, buf);
47 }
48 
49 int
Dconv(Fmt * f)50 Dconv(Fmt *f)
51 {
52 	int j;
53 	Inst *i;
54 	Addr s, d;
55 	char buf[128];
56 	static int init;
57 
58 	if(init == 0) {
59 		for(j = 0; keywds[j].name != nil; j++)
60 			opnam[keywds[j].op] = keywds[j].name;
61 
62 		fmtinstall('a', aconv);
63 		init = 1;
64 	}
65 
66 	i = va_arg(f->args, Inst*);
67 	if(i == nil)
68 		return fmtstrcpy(f, "IZ");
69 
70 	switch(keywds[i->op].terminal) {
71 	case TOKI0:
72 		sprint(buf, "%s", opnam[i->op]);
73 		break;
74 	case TOKI1:
75 		d.a = i->d;
76 		d.mode = UDST(i->add);
77 		sprint(buf, "%s\t%a", opnam[i->op], &d);
78 		break;
79 	case TOKI3:
80 		d.a = i->d;
81 		d.mode = UDST(i->add);
82 		s.a = i->s;
83 		s.mode = USRC(i->add);
84 		switch(i->add&ARM) {
85 		default:
86 			sprint(buf, "%s\t%a, %a", opnam[i->op], &s, &d);
87 			break;
88 		case AXIMM:
89 			sprint(buf, "%s\t%a, $%d, %a", opnam[i->op], &s, i->reg, &d);
90 			break;
91 		case AXINF:
92 			sprint(buf, "%s\t%a, %d(fp), %a", opnam[i->op], &s, i->reg, &d);
93 			break;
94 		case AXINM:
95 			sprint(buf, "%s\t%a, %d(mp), %a", opnam[i->op], &s, i->reg, &d);
96 			break;
97 		}
98 		break;
99 	case TOKI2:
100 		d.a = i->d;
101 		d.mode = UDST(i->add);
102 		s.a = i->s;
103 		s.mode = USRC(i->add);
104 		sprint(buf, "%s\t%a, %a", opnam[i->op], &s, &d);
105 		break;
106 	}
107 
108 	return fmtstrcpy(f, buf);
109 }
110 
111