list.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. #define EXTERN
  2. #include "gc.h"
  3. void
  4. listinit(void)
  5. {
  6. fmtinstall('R', Rconv);
  7. fmtinstall('A', Aconv);
  8. fmtinstall('D', Dconv);
  9. fmtinstall('P', Pconv);
  10. fmtinstall('S', Sconv);
  11. fmtinstall('X', Xconv);
  12. fmtinstall('B', Bconv);
  13. }
  14. int
  15. Bconv(Fmt *fp)
  16. {
  17. char str[STRINGSZ], ss[STRINGSZ], *s;
  18. Bits bits;
  19. int i;
  20. str[0] = 0;
  21. bits = va_arg(fp->args, Bits);
  22. while(bany(&bits)) {
  23. i = bnum(bits);
  24. if(str[0])
  25. strcat(str, " ");
  26. if(var[i].sym == S) {
  27. sprint(ss, "$%ld", var[i].offset);
  28. s = ss;
  29. } else
  30. s = var[i].sym->name;
  31. if(strlen(str) + strlen(s) + 1 >= STRINGSZ)
  32. break;
  33. strcat(str, s);
  34. bits.b[i/32] &= ~(1L << (i%32));
  35. }
  36. return fmtstrcpy(fp, str);
  37. }
  38. int
  39. Pconv(Fmt *fp)
  40. {
  41. char str[STRINGSZ], s[20];
  42. Prog *p;
  43. p = va_arg(fp->args, Prog*);
  44. sprint(str, " %A %D,%D", p->as, &p->from, &p->to);
  45. if(p->from.field) {
  46. sprint(s, ",%d,%d", p->to.field, p->from.field);
  47. strcat(str, s);
  48. }
  49. return fmtstrcpy(fp, str);
  50. }
  51. int
  52. Aconv(Fmt *fp)
  53. {
  54. int r;
  55. r = va_arg(fp->args, int);
  56. return fmtstrcpy(fp, anames[r]);
  57. }
  58. int
  59. Xconv(Fmt *fp)
  60. {
  61. char str[20], s[10];
  62. Index x;
  63. int i;
  64. x = va_arg(fp->args, Index);
  65. str[0] = 0;
  66. i = x.o0 & D_MASK;
  67. if(i != D_NONE) {
  68. sprint(str, "(%R.", i);
  69. i = x.o1;
  70. sprint(s, "%c*%c)",
  71. "WWWWLLLL"[i],
  72. "12481248"[i]);
  73. strcat(str, s);
  74. }
  75. return fmtstrcpy(fp, str);
  76. }
  77. int
  78. Dconv(Fmt *fp)
  79. {
  80. char str[40], s[20];
  81. Adr *a;
  82. int i, j;
  83. long d;
  84. a = va_arg(fp->args, Adr*);
  85. i = a->index;
  86. if(i != D_NONE) {
  87. a->index = D_NONE;
  88. d = a->displace;
  89. j = a->scale;
  90. a->displace = 0;
  91. switch(i & I_MASK) {
  92. default:
  93. sprint(str, "???%ld(%D%X)", d, a, (Index){i, j});
  94. break;
  95. case I_INDEX1:
  96. sprint(str, "%D%X", a, (Index){i, a->scale});
  97. break;
  98. case I_INDEX2:
  99. if(d)
  100. sprint(str, "%ld(%D)%X", d, a, (Index){i, j});
  101. else
  102. sprint(str, "(%D)%X", a, (Index){i, j});
  103. break;
  104. case I_INDEX3:
  105. if(d)
  106. sprint(str, "%ld(%D%X)", d, a, (Index){i, j});
  107. else
  108. sprint(str, "(%D%X)", a, (Index){i, j});
  109. break;
  110. }
  111. a->displace = d;
  112. a->index = i;
  113. goto out;
  114. }
  115. i = a->type;
  116. j = i & I_MASK;
  117. if(j) {
  118. a->type = i & D_MASK;
  119. d = a->offset;
  120. a->offset = 0;
  121. switch(j) {
  122. case I_INDINC:
  123. sprint(str, "(%D)+", a);
  124. break;
  125. case I_INDDEC:
  126. sprint(str, "-(%D)", a);
  127. break;
  128. case I_INDIR:
  129. if(a->type == D_CONST)
  130. sprint(str, "%ld", d);
  131. else
  132. if(d)
  133. sprint(str, "%ld(%D)", d, a);
  134. else
  135. sprint(str, "(%D)", a);
  136. break;
  137. case I_ADDR:
  138. a->offset = d;
  139. sprint(str, "$%D", a);
  140. break;
  141. }
  142. a->type = i;
  143. a->offset = d;
  144. goto out;
  145. }
  146. switch(i) {
  147. default:
  148. sprint(str, "%R", i);
  149. break;
  150. case D_NONE:
  151. str[0] = 0;
  152. break;
  153. case D_BRANCH:
  154. sprint(str, "%ld(PC)", a->offset-pc);
  155. break;
  156. case D_EXTERN:
  157. sprint(str, "%s+%ld(SB)", a->sym->name, a->offset);
  158. break;
  159. case D_STATIC:
  160. sprint(str, "%s<>+%ld(SB)", a->sym->name, a->offset);
  161. break;
  162. case D_AUTO:
  163. sprint(str, "%s-%ld(SP)", a->sym->name, -a->offset);
  164. break;
  165. case D_PARAM:
  166. sprint(str, "%s+%ld(FP)", a->sym->name, a->offset);
  167. break;
  168. case D_CONST:
  169. sprint(str, "$%ld", a->offset);
  170. break;
  171. case D_STACK:
  172. sprint(str, "TOS+%ld", a->offset);
  173. break;
  174. case D_FCONST:
  175. sprint(str, "$%.17e", a->dval);
  176. goto out;
  177. case D_SCONST:
  178. sprint(str, "$\"%S\"", a->sval);
  179. goto out;
  180. }
  181. if(a->displace) {
  182. sprint(s, "/%ld", a->displace);
  183. strcat(str, s);
  184. }
  185. out:
  186. return fmtstrcpy(fp, str);
  187. }
  188. int
  189. Rconv(Fmt *fp)
  190. {
  191. char str[20];
  192. int r;
  193. r = va_arg(fp->args, int);
  194. if(r >= D_R0 && r < D_R0+NREG)
  195. sprint(str, "R%d", r-D_R0);
  196. else
  197. if(r >= D_A0 && r < D_A0+NREG)
  198. sprint(str, "A%d", r-D_A0);
  199. else
  200. if(r >= D_F0 && r < D_F0+NREG)
  201. sprint(str, "F%d", r-D_F0);
  202. else
  203. switch(r) {
  204. default:
  205. sprint(str, "gok(%d)", r);
  206. break;
  207. case D_NONE:
  208. sprint(str, "NONE");
  209. break;
  210. case D_TOS:
  211. sprint(str, "TOS");
  212. break;
  213. case D_CCR:
  214. sprint(str, "CCR");
  215. break;
  216. case D_SR:
  217. sprint(str, "SR");
  218. break;
  219. case D_SFC:
  220. sprint(str, "SFC");
  221. break;
  222. case D_DFC:
  223. sprint(str, "DFC");
  224. break;
  225. case D_CACR:
  226. sprint(str, "CACR");
  227. break;
  228. case D_USP:
  229. sprint(str, "USP");
  230. break;
  231. case D_VBR:
  232. sprint(str, "VBR");
  233. break;
  234. case D_CAAR:
  235. sprint(str, "CAAR");
  236. break;
  237. case D_MSP:
  238. sprint(str, "MSP");
  239. break;
  240. case D_ISP:
  241. sprint(str, "ISP");
  242. break;
  243. case D_TREE:
  244. sprint(str, "TREE");
  245. break;
  246. case D_FPCR:
  247. sprint(str, "FPCR");
  248. break;
  249. case D_FPSR:
  250. sprint(str, "FPSR");
  251. break;
  252. case D_FPIAR:
  253. sprint(str, "FPIAR");
  254. break;
  255. case D_TC:
  256. sprint(str, "TC");
  257. break;
  258. case D_ITT0:
  259. sprint(str, "ITT0");
  260. break;
  261. case D_ITT1:
  262. sprint(str, "ITT1");
  263. break;
  264. case D_DTT0:
  265. sprint(str, "DTT0");
  266. break;
  267. case D_DTT1:
  268. sprint(str, "DTT1");
  269. break;
  270. case D_MMUSR:
  271. sprint(str, "MMUSR");
  272. break;
  273. case D_URP:
  274. sprint(str, "URP");
  275. break;
  276. case D_SRP:
  277. sprint(str, "SRP");
  278. break;
  279. }
  280. return fmtstrcpy(fp, str);
  281. }
  282. int
  283. Sconv(Fmt *fp)
  284. {
  285. int i, c;
  286. char str[30], *p, *s;
  287. s = va_arg(fp->args, char*);
  288. p = str;
  289. for(i=0; i<sizeof(double); i++) {
  290. c = s[i] & 0xff;
  291. if(c != '\\' && c != '"' && isprint(c)) {
  292. *p++ = c;
  293. continue;
  294. }
  295. *p++ = '\\';
  296. switch(c) {
  297. case 0:
  298. *p++ = '0';
  299. continue;
  300. case '\\':
  301. case '"':
  302. *p++ = c;
  303. continue;
  304. case '\n':
  305. *p++ = 'n';
  306. continue;
  307. case '\t':
  308. *p++ = 't';
  309. continue;
  310. }
  311. *p++ = ((c>>6) & 7) + '0';
  312. *p++ = ((c>>3) & 7) + '0';
  313. *p++ = ((c>>0) & 7) + '0';
  314. }
  315. *p = 0;
  316. return fmtstrcpy(fp, str);
  317. }