gen.c 19 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096
  1. #include "limbo.h"
  2. static int addrmode[Rend] =
  3. {
  4. /* Rreg */ Afp,
  5. /* Rmreg */ Amp,
  6. /* Roff */ Aoff,
  7. /* Rnoff */ Anoff,
  8. /* Rdesc */ Adesc,
  9. /* Rdescp */ Adesc,
  10. /* Rconst */ Aimm,
  11. /* Ralways */ Aerr,
  12. /* Radr */ Afpind,
  13. /* Rmadr */ Ampind,
  14. /* Rcant */ Aerr,
  15. /* Rpc */ Apc,
  16. /* Rmpc */ Aerr,
  17. /* Rareg */ Aerr,
  18. /* Ramreg */ Aerr,
  19. /* Raadr */ Aerr,
  20. /* Ramadr */ Aerr,
  21. /* Rldt */ Aldt,
  22. };
  23. static Decl *wtemp;
  24. static Decl *bigtemp;
  25. static int ntemp;
  26. static Node retnode;
  27. static Inst zinst;
  28. int *blockstack;
  29. int blockdep;
  30. int nblocks;
  31. static int lenblockstack;
  32. static Node *ntoz;
  33. static Inst* genfixop(Src *src, int op, Node *s, Node *m, Node *d);
  34. void
  35. genstart(void)
  36. {
  37. Decl *d;
  38. d = mkdecl(&nosrc, Dlocal, tint);
  39. d->sym = enter(".ret", 0);
  40. d->offset = IBY2WD * REGRET;
  41. retnode = znode;
  42. retnode.op = Oname;
  43. retnode.addable = Rreg;
  44. retnode.decl = d;
  45. retnode.ty = tint;
  46. zinst.op = INOP;
  47. zinst.sm = Anone;
  48. zinst.dm = Anone;
  49. zinst.mm = Anone;
  50. firstinst = allocmem(sizeof *firstinst);
  51. *firstinst = zinst;
  52. lastinst = firstinst;
  53. blocks = -1;
  54. blockdep = 0;
  55. nblocks = 0;
  56. }
  57. /*
  58. * manage nested control flow blocks
  59. */
  60. int
  61. pushblock(void)
  62. {
  63. if(blockdep >= lenblockstack){
  64. lenblockstack = blockdep + 32;
  65. blockstack = reallocmem(blockstack, lenblockstack * sizeof *blockstack);
  66. }
  67. blockstack[blockdep++] = blocks;
  68. return blocks = nblocks++;
  69. }
  70. void
  71. repushblock(int b)
  72. {
  73. blockstack[blockdep++] = blocks;
  74. blocks = b;
  75. }
  76. void
  77. popblock(void)
  78. {
  79. blocks = blockstack[blockdep -= 1];
  80. }
  81. void
  82. tinit(void)
  83. {
  84. wtemp = nil;
  85. bigtemp = nil;
  86. }
  87. Decl*
  88. tdecls(void)
  89. {
  90. Decl *d;
  91. for(d = wtemp; d != nil; d = d->next){
  92. if(d->tref != 1)
  93. fatal("temporary %s has %d references", d->sym->name, d->tref-1);
  94. }
  95. for(d = bigtemp; d != nil; d = d->next){
  96. if(d->tref != 1)
  97. fatal("temporary %s has %d references", d->sym->name, d->tref-1);
  98. }
  99. return appdecls(wtemp, bigtemp);
  100. }
  101. Node*
  102. talloc(Node *n, Type *t, Node *nok)
  103. {
  104. Decl *d, *ok;
  105. Desc *desc;
  106. char buf[StrSize];
  107. ok = nil;
  108. if(nok != nil)
  109. ok = nok->decl;
  110. if(ok == nil || ok->tref == 0 || tattr[ok->ty->kind].big != tattr[t->kind].big || ok->ty->align != t->align)
  111. ok = nil;
  112. *n = znode;
  113. n->op = Oname;
  114. n->addable = Rreg;
  115. n->ty = t;
  116. if(tattr[t->kind].big){
  117. desc = mktdesc(t);
  118. if(ok != nil && ok->desc == desc){
  119. ok->tref++;
  120. ok->refs++;
  121. n->decl = ok;
  122. return n;
  123. }
  124. for(d = bigtemp; d != nil; d = d->next){
  125. if(d->tref == 1 && d->desc == desc && d->ty->align == t->align){
  126. d->tref++;
  127. d->refs++;
  128. n->decl = d;
  129. return n;
  130. }
  131. }
  132. d = mkdecl(&nosrc, Dlocal, t);
  133. d->desc = desc;
  134. d->tref = 2;
  135. d->refs = 1;
  136. n->decl = d;
  137. seprint(buf, buf+sizeof(buf), ".b%d", ntemp++);
  138. d->sym = enter(buf, 0);
  139. d->next = bigtemp;
  140. bigtemp = d;
  141. return n;
  142. }
  143. if(ok != nil
  144. && tattr[ok->ty->kind].isptr == tattr[t->kind].isptr
  145. && ok->ty->size == t->size){
  146. ok->tref++;
  147. n->decl = ok;
  148. return n;
  149. }
  150. for(d = wtemp; d != nil; d = d->next){
  151. if(d->tref == 1
  152. && tattr[d->ty->kind].isptr == tattr[t->kind].isptr
  153. && d->ty->size == t->size
  154. && d->ty->align == t->align){
  155. d->tref++;
  156. n->decl = d;
  157. return n;
  158. }
  159. }
  160. d = mkdecl(&nosrc, Dlocal, t);
  161. d->tref = 2;
  162. d->refs = 1;
  163. n->decl = d;
  164. seprint(buf, buf+sizeof(buf), ".t%d", ntemp++);
  165. d->sym = enter(buf, 0);
  166. d->next = wtemp;
  167. wtemp = d;
  168. return n;
  169. }
  170. void
  171. tfree(Node *n)
  172. {
  173. if(n == nil || n->decl == nil || n->decl->tref == 0)
  174. return;
  175. if(n->decl->tref == 1)
  176. fatal("double free of temporary %s", n->decl->sym->name);
  177. if (--n->decl->tref == 1)
  178. zcom1(n, nil);
  179. }
  180. void
  181. tfreelater(Node *n)
  182. {
  183. if(n == nil || n->decl == nil || n->decl->tref == 0)
  184. return;
  185. if(n->decl->tref == 1)
  186. fatal("double free of temporary %s", n->decl->sym->name);
  187. if(--n->decl->tref == 1){
  188. Node *nn = mkn(Oname, nil, nil);
  189. *nn = *n;
  190. nn->left = ntoz;
  191. ntoz = nn;
  192. n->decl->tref++;
  193. }
  194. }
  195. void
  196. tfreenow()
  197. {
  198. Node *n, *nn;
  199. for(n = ntoz; n != nil; n = nn){
  200. nn = n->left;
  201. n->left = nil;
  202. if(n->decl->tref != 2)
  203. fatal("bad free of temporary %s", n->decl->sym->name);
  204. --n->decl->tref;
  205. zcom1(n, nil);
  206. }
  207. ntoz = nil;
  208. }
  209. /*
  210. * realloc a temporary after it's been freed
  211. */
  212. Node*
  213. tacquire(Node *n)
  214. {
  215. if(n == nil || n->decl == nil || n->decl->tref == 0)
  216. return n;
  217. /*
  218. if(n->decl->tref != 1)
  219. fatal("tacquire ref != 1: %d", n->decl->tref);
  220. */
  221. n->decl->tref++;
  222. return n;
  223. }
  224. void
  225. trelease(Node *n)
  226. {
  227. if(n == nil || n->decl == nil || n->decl->tref == 0)
  228. return;
  229. if(n->decl->tref == 1)
  230. fatal("double release of temporary %s", n->decl->sym->name);
  231. n->decl->tref--;
  232. }
  233. Inst*
  234. mkinst(void)
  235. {
  236. Inst *in;
  237. in = lastinst->next;
  238. if(in == nil){
  239. in = allocmem(sizeof *in);
  240. *in = zinst;
  241. lastinst->next = in;
  242. }
  243. lastinst = in;
  244. in->block = blocks;
  245. if(blocks < 0)
  246. fatal("mkinst no block");
  247. return in;
  248. }
  249. Inst*
  250. nextinst(void)
  251. {
  252. Inst *in;
  253. in = lastinst->next;
  254. if(in != nil)
  255. return in;
  256. in = allocmem(sizeof(*in));
  257. *in = zinst;
  258. lastinst->next = in;
  259. return in;
  260. }
  261. /*
  262. * allocate a node for returning
  263. */
  264. Node*
  265. retalloc(Node *n, Node *nn)
  266. {
  267. if(nn->ty == tnone)
  268. return nil;
  269. *n = znode;
  270. n->op = Oind;
  271. n->addable = Radr;
  272. n->left = dupn(1, &n->src, &retnode);
  273. n->ty = nn->ty;
  274. return n;
  275. }
  276. Inst*
  277. genrawop(Src *src, int op, Node *s, Node *m, Node *d)
  278. {
  279. Inst *in;
  280. in = mkinst();
  281. in->op = op;
  282. in->src = *src;
  283. if(in->sm != Anone || in->mm != Anone || in->dm != Anone)
  284. fatal("bogus mkinst in genrawop: %I\n", in);
  285. if(s != nil){
  286. in->s = genaddr(s);
  287. in->sm = addrmode[s->addable];
  288. }
  289. if(m != nil){
  290. in->m = genaddr(m);
  291. in->mm = addrmode[m->addable];
  292. if(in->mm == Ampind || in->mm == Afpind)
  293. fatal("illegal addressing mode in register %n", m);
  294. }
  295. if(d != nil){
  296. in->d = genaddr(d);
  297. in->dm = addrmode[d->addable];
  298. }
  299. return in;
  300. }
  301. Inst*
  302. genop(Src *src, int op, Node *s, Node *m, Node *d)
  303. {
  304. Inst *in;
  305. int iop;
  306. iop = disoptab[op][opind[d->ty->kind]];
  307. if(iop == 0)
  308. fatal("can't deal with op %s on %n %n %n in genop", opname[op], s, m, d);
  309. if(iop == IMULX || iop == IDIVX)
  310. return genfixop(src, iop, s, m, d);
  311. in = mkinst();
  312. in->op = iop;
  313. in->src = *src;
  314. if(s != nil){
  315. in->s = genaddr(s);
  316. in->sm = addrmode[s->addable];
  317. }
  318. if(m != nil){
  319. in->m = genaddr(m);
  320. in->mm = addrmode[m->addable];
  321. if(in->mm == Ampind || in->mm == Afpind)
  322. fatal("illegal addressing mode in register %n", m);
  323. }
  324. if(d != nil){
  325. in->d = genaddr(d);
  326. in->dm = addrmode[d->addable];
  327. }
  328. return in;
  329. }
  330. Inst*
  331. genbra(Src *src, int op, Node *s, Node *m)
  332. {
  333. Type *t;
  334. Inst *in;
  335. int iop;
  336. t = s->ty;
  337. if(t == tany)
  338. t = m->ty;
  339. iop = disoptab[op][opind[t->kind]];
  340. if(iop == 0)
  341. fatal("can't deal with op %s on %n %n in genbra", opname[op], s, m);
  342. in = mkinst();
  343. in->op = iop;
  344. in->src = *src;
  345. if(s != nil){
  346. in->s = genaddr(s);
  347. in->sm = addrmode[s->addable];
  348. }
  349. if(m != nil){
  350. in->m = genaddr(m);
  351. in->mm = addrmode[m->addable];
  352. if(in->mm == Ampind || in->mm == Afpind)
  353. fatal("illegal addressing mode in register %n", m);
  354. }
  355. return in;
  356. }
  357. Inst*
  358. genchan(Src *src, Node *sz, Type *mt, Node *d)
  359. {
  360. Inst *in;
  361. Desc *td;
  362. Addr reg;
  363. int op, regm;
  364. regm = Anone;
  365. reg.decl = nil;
  366. reg.reg = 0;
  367. reg.offset = 0;
  368. op = chantab[mt->kind];
  369. if(op == 0)
  370. fatal("can't deal with op %d in genchan", mt->kind);
  371. switch(mt->kind){
  372. case Tadt:
  373. case Tadtpick:
  374. case Ttuple:
  375. td = mktdesc(mt);
  376. if(td->nmap != 0){
  377. op++; /* sleazy */
  378. usedesc(td);
  379. regm = Adesc;
  380. reg.decl = mt->decl;
  381. }else{
  382. regm = Aimm;
  383. reg.offset = mt->size;
  384. }
  385. break;
  386. }
  387. in = mkinst();
  388. in->op = op;
  389. in->src = *src;
  390. in->s = reg;
  391. in->sm = regm;
  392. if(sz != nil){
  393. in->m = genaddr(sz);
  394. in->mm = addrmode[sz->addable];
  395. }
  396. if(d != nil){
  397. in->d = genaddr(d);
  398. in->dm = addrmode[d->addable];
  399. }
  400. return in;
  401. }
  402. Inst*
  403. genmove(Src *src, int how, Type *mt, Node *s, Node *d)
  404. {
  405. Inst *in;
  406. Desc *td;
  407. Addr reg;
  408. int op, regm;
  409. regm = Anone;
  410. reg.decl = nil;
  411. reg.reg = 0;
  412. reg.offset = 0;
  413. op = movetab[how][mt->kind];
  414. if(op == 0)
  415. fatal("can't deal with op %d on %n %n in genmove", how, s, d);
  416. switch(mt->kind){
  417. case Tadt:
  418. case Tadtpick:
  419. case Ttuple:
  420. case Texception:
  421. if(mt->size == 0 && how == Mas)
  422. return nil;
  423. td = mktdesc(mt);
  424. if(td->nmap != 0){
  425. op++; /* sleazy */
  426. usedesc(td);
  427. regm = Adesc;
  428. reg.decl = mt->decl;
  429. }else{
  430. regm = Aimm;
  431. reg.offset = mt->size;
  432. }
  433. break;
  434. }
  435. in = mkinst();
  436. in->op = op;
  437. in->src = *src;
  438. if(s != nil){
  439. in->s = genaddr(s);
  440. in->sm = addrmode[s->addable];
  441. }
  442. in->m = reg;
  443. in->mm = regm;
  444. if(d != nil){
  445. in->d = genaddr(d);
  446. in->dm = addrmode[d->addable];
  447. }
  448. if(s->addable == Rpc)
  449. in->op = IMOVPC;
  450. return in;
  451. }
  452. void
  453. patch(Inst *b, Inst *dst)
  454. {
  455. Inst *n;
  456. for(; b != nil; b = n){
  457. n = b->branch;
  458. b->branch = dst;
  459. }
  460. }
  461. long
  462. getpc(Inst *i)
  463. {
  464. if(i->pc == 0 && i != firstinst && (firstinst->op != INOOP || i != firstinst->next)){
  465. do
  466. i = i->next;
  467. while(i != nil && i->pc == 0);
  468. if(i == nil || i->pc == 0)
  469. fatal("bad instruction in getpc");
  470. }
  471. return i->pc;
  472. }
  473. /*
  474. * follow all possible paths from n,
  475. * marking reached code, compressing branches, and reclaiming unreached insts
  476. */
  477. void
  478. reach(Inst *in)
  479. {
  480. Inst *last;
  481. foldbranch(in);
  482. last = in;
  483. for(in = in->next; in != nil; in = in->next){
  484. if(!in->reach)
  485. last->next = in->next;
  486. else
  487. last = in;
  488. }
  489. lastinst = last;
  490. }
  491. /*
  492. * follow all possible paths from n,
  493. * marking reached code, compressing branches, and eliminating tail recursion
  494. */
  495. void
  496. foldbranch(Inst *in)
  497. {
  498. Inst *b, *next;
  499. Label *lab;
  500. int i, n;
  501. while(in != nil && !in->reach){
  502. in->reach = 1;
  503. if(in->branch != nil)
  504. while(in->branch->op == IJMP){
  505. if(in == in->branch || in->branch == in->branch->branch)
  506. break;
  507. in->branch = in->branch->branch;
  508. }
  509. switch(in->op){
  510. case IGOTO:
  511. case ICASE:
  512. case ICASEL:
  513. case ICASEC:
  514. case IEXC:
  515. foldbranch(in->d.decl->ty->cse->iwild);
  516. lab = in->d.decl->ty->cse->labs;
  517. n = in->d.decl->ty->cse->nlab;
  518. for(i = 0; i < n; i++)
  519. foldbranch(lab[i].inst);
  520. if(in->op == IEXC)
  521. in->op = INOOP;
  522. return;
  523. case IEXC0:
  524. foldbranch(in->branch);
  525. in->op = INOOP;
  526. break;
  527. case IRET:
  528. case IEXIT:
  529. case IRAISE:
  530. return;
  531. case IJMP:
  532. b = in->branch;
  533. switch(b->op){
  534. case ICASE:
  535. case ICASEL:
  536. case ICASEC:
  537. case IRET:
  538. case IEXIT:
  539. next = in->next;
  540. *in = *b;
  541. in->next = next;
  542. continue;
  543. }
  544. foldbranch(b);
  545. return;
  546. default:
  547. if(in->branch != nil)
  548. foldbranch(in->branch);
  549. break;
  550. }
  551. in = in->next;
  552. }
  553. }
  554. /*
  555. * convert the addressable node into an operand
  556. * see the comment for sumark
  557. */
  558. Addr
  559. genaddr(Node *n)
  560. {
  561. Addr a;
  562. a.reg = 0;
  563. a.offset = 0;
  564. a.decl = nil;
  565. if(n == nil)
  566. return a;
  567. switch(n->addable){
  568. case Rreg:
  569. if(n->decl != nil)
  570. a.decl = n->decl;
  571. else
  572. a = genaddr(n->left);
  573. break;
  574. case Rmreg:
  575. if(n->decl != nil)
  576. a.decl = n->decl;
  577. else
  578. a = genaddr(n->left);
  579. break;
  580. case Rdesc:
  581. a.decl = n->ty->decl;
  582. break;
  583. case Roff:
  584. case Rnoff:
  585. a.decl = n->decl;
  586. break;
  587. case Rconst:
  588. a.offset = n->val;
  589. break;
  590. case Radr:
  591. a = genaddr(n->left);
  592. break;
  593. case Rmadr:
  594. a = genaddr(n->left);
  595. break;
  596. case Rareg:
  597. case Ramreg:
  598. a = genaddr(n->left);
  599. if(n->op == Oadd)
  600. a.reg += n->right->val;
  601. break;
  602. case Raadr:
  603. case Ramadr:
  604. a = genaddr(n->left);
  605. if(n->op == Oadd)
  606. a.offset += n->right->val;
  607. break;
  608. case Rldt:
  609. a.decl = n->decl;
  610. break;
  611. case Rdescp:
  612. case Rpc:
  613. a.decl = n->decl;
  614. break;
  615. default:
  616. fatal("can't deal with %n in genaddr", n);
  617. break;
  618. }
  619. return a;
  620. }
  621. int
  622. sameaddr(Node *n, Node *m)
  623. {
  624. Addr a, b;
  625. if(n->addable != m->addable)
  626. return 0;
  627. a = genaddr(n);
  628. b = genaddr(m);
  629. return a.offset == b.offset && a.reg == b.reg && a.decl == b.decl;
  630. }
  631. long
  632. resolvedesc(Decl *mod, long length, Decl *decls)
  633. {
  634. Desc *g, *d, *last;
  635. int descid;
  636. g = gendesc(mod, length, decls);
  637. g->used = 0;
  638. last = nil;
  639. for(d = descriptors; d != nil; d = d->next){
  640. if(!d->used){
  641. if(last != nil)
  642. last->next = d->next;
  643. else
  644. descriptors = d->next;
  645. continue;
  646. }
  647. last = d;
  648. }
  649. g->next = descriptors;
  650. descriptors = g;
  651. descid = 0;
  652. for(d = descriptors; d != nil; d = d->next)
  653. d->id = descid++;
  654. if(g->id != 0)
  655. fatal("bad global descriptor id");
  656. return descid;
  657. }
  658. int
  659. resolvemod(Decl *m)
  660. {
  661. Decl *id, *d;
  662. for(id = m->ty->ids; id != nil; id = id->next){
  663. switch(id->store){
  664. case Dfn:
  665. id->iface->pc = id->pc;
  666. id->iface->desc = id->desc;
  667. if(debug['v']) print("R1: %s %p %p %p\n", id->sym->name, id, id->iface, id->pc);
  668. break;
  669. case Dtype:
  670. if(id->ty->kind != Tadt)
  671. break;
  672. for(d = id->ty->ids; d != nil; d = d->next){
  673. if(d->store == Dfn){
  674. d->iface->pc = d->pc;
  675. d->iface->desc = d->desc;
  676. if(debug['v']) print("R2: %s %p %p %p\n", d->sym->name, d, d->iface, d->pc);
  677. }
  678. }
  679. break;
  680. }
  681. }
  682. /* for addiface */
  683. for(id = m->ty->tof->ids; id != nil; id = id->next){
  684. if(id->store == Dfn){
  685. if(id->pc == nil)
  686. id->pc = id->iface->pc;
  687. if(id->desc == nil)
  688. id->desc = id->iface->desc;
  689. if(debug['v']) print("R3: %s %p %p %p\n", id->sym->name, id, id->iface, id->pc);
  690. }
  691. }
  692. return m->ty->tof->decl->init->val;
  693. }
  694. /*
  695. * place the Tiface decs in another list
  696. */
  697. Decl*
  698. resolveldts(Decl *d, Decl **dd)
  699. {
  700. Decl *d1, *ld1, *d2, *ld2, *n;
  701. d1 = d2 = nil;
  702. ld1 = ld2 = nil;
  703. for( ; d != nil; d = n){
  704. n = d->next;
  705. d->next = nil;
  706. if(d->ty->kind == Tiface){
  707. if(d2 == nil)
  708. d2 = d;
  709. else
  710. ld2->next = d;
  711. ld2 = d;
  712. }
  713. else{
  714. if(d1 == nil)
  715. d1 = d;
  716. else
  717. ld1->next = d;
  718. ld1 = d;
  719. }
  720. }
  721. *dd = d2;
  722. return d1;
  723. }
  724. /*
  725. * fix up all pc's
  726. * finalize all data offsets
  727. * fix up instructions with offsets too large
  728. */
  729. long
  730. resolvepcs(Inst *inst)
  731. {
  732. Decl *d;
  733. Inst *in;
  734. int op;
  735. ulong r, off;
  736. long v, pc;
  737. pc = 0;
  738. for(in = inst; in != nil; in = in->next){
  739. if(!in->reach || in->op == INOP)
  740. fatal("unreachable pc: %I %ld", in, pc);
  741. if(in->op == INOOP){
  742. in->pc = pc;
  743. continue;
  744. }
  745. d = in->s.decl;
  746. if(d != nil){
  747. if(in->sm == Adesc){
  748. if(d->desc != nil)
  749. in->s.offset = d->desc->id;
  750. }else
  751. in->s.reg += d->offset;
  752. }
  753. r = in->s.reg;
  754. off = in->s.offset;
  755. if((in->sm == Afpind || in->sm == Ampind)
  756. && (r >= MaxReg || off >= MaxReg))
  757. fatal("big offset in %I\n", in);
  758. d = in->m.decl;
  759. if(d != nil){
  760. if(in->mm == Adesc){
  761. if(d->desc != nil)
  762. in->m.offset = d->desc->id;
  763. }else
  764. in->m.reg += d->offset;
  765. }
  766. v = 0;
  767. switch(in->mm){
  768. case Anone:
  769. break;
  770. case Aimm:
  771. case Apc:
  772. case Adesc:
  773. v = in->m.offset;
  774. break;
  775. case Aoff:
  776. case Anoff:
  777. v = in->m.decl->iface->offset;
  778. break;
  779. case Afp:
  780. case Amp:
  781. case Aldt:
  782. v = in->m.reg;
  783. if(v < 0)
  784. v = 0x8000;
  785. break;
  786. default:
  787. fatal("can't deal with %I's m mode\n", in);
  788. break;
  789. }
  790. if(v > 0x7fff || v < -0x8000){
  791. switch(in->op){
  792. case IALT:
  793. case IINDX:
  794. warn(in->src.start, "possible bug: temp m too big in %I: %ld %ld %d\n", in, in->m.reg, in->m.reg, MaxReg);
  795. rewritedestreg(in, IMOVW, RTemp);
  796. break;
  797. default:
  798. op = IMOVW;
  799. if(isbyteinst[in->op])
  800. op = IMOVB;
  801. in = rewritesrcreg(in, op, RTemp, pc++);
  802. break;
  803. }
  804. }
  805. d = in->d.decl;
  806. if(d != nil){
  807. if(in->dm == Apc)
  808. in->d.offset = d->pc->pc;
  809. else
  810. in->d.reg += d->offset;
  811. }
  812. r = in->d.reg;
  813. off = in->d.offset;
  814. if((in->dm == Afpind || in->dm == Ampind)
  815. && (r >= MaxReg || off >= MaxReg))
  816. fatal("big offset in %I\n", in);
  817. in->pc = pc;
  818. pc++;
  819. }
  820. for(in = inst; in != nil; in = in->next){
  821. d = in->s.decl;
  822. if(d != nil && in->sm == Apc)
  823. in->s.offset = d->pc->pc;
  824. d = in->d.decl;
  825. if(d != nil && in->dm == Apc)
  826. in->d.offset = d->pc->pc;
  827. if(in->branch != nil){
  828. in->dm = Apc;
  829. in->d.offset = in->branch->pc;
  830. }
  831. }
  832. return pc;
  833. }
  834. /*
  835. * fixp up a big register constant uses as a source
  836. * ugly: smashes the instruction
  837. */
  838. Inst*
  839. rewritesrcreg(Inst *in, int op, int treg, int pc)
  840. {
  841. Inst *new;
  842. Addr a;
  843. int am;
  844. a = in->m;
  845. am = in->mm;
  846. in->mm = Afp;
  847. in->m.reg = treg;
  848. in->m.decl = nil;
  849. new = allocmem(sizeof(*in));
  850. *new = *in;
  851. *in = zinst;
  852. in->src = new->src;
  853. in->next = new;
  854. in->op = op;
  855. in->s = a;
  856. in->sm = am;
  857. in->dm = Afp;
  858. in->d.reg = treg;
  859. in->pc = pc;
  860. in->reach = 1;
  861. in->block = new->block;
  862. return new;
  863. }
  864. /*
  865. * fix up a big register constant by moving to the destination
  866. * after the instruction completes
  867. */
  868. Inst*
  869. rewritedestreg(Inst *in, int op, int treg)
  870. {
  871. Inst *n;
  872. n = allocmem(sizeof(*n));
  873. *n = zinst;
  874. n->next = in->next;
  875. in->next = n;
  876. n->src = in->src;
  877. n->op = op;
  878. n->sm = Afp;
  879. n->s.reg = treg;
  880. n->d = in->m;
  881. n->dm = in->mm;
  882. n->reach = 1;
  883. n->block = in->block;
  884. in->mm = Afp;
  885. in->m.reg = treg;
  886. in->m.decl = nil;
  887. return n;
  888. }
  889. int
  890. instconv(Fmt *f)
  891. {
  892. Inst *in;
  893. char buf[512], *p;
  894. char *op, *comma;
  895. in = va_arg(f->args, Inst*);
  896. op = nil;
  897. if(in->op < MAXDIS)
  898. op = instname[in->op];
  899. if(op == nil)
  900. op = "??";
  901. buf[0] = '\0';
  902. if(in->op == INOP)
  903. return fmtstrcpy(f, "\tnop");
  904. p = seprint(buf, buf + sizeof(buf), "\t%s\t", op);
  905. comma = "";
  906. if(in->sm != Anone){
  907. p = addrprint(p, buf + sizeof(buf), in->sm, &in->s);
  908. comma = ",";
  909. }
  910. if(in->mm != Anone){
  911. p = seprint(p, buf + sizeof(buf), "%s", comma);
  912. p = addrprint(p, buf + sizeof(buf), in->mm, &in->m);
  913. comma = ",";
  914. }
  915. if(in->dm != Anone){
  916. p = seprint(p, buf + sizeof(buf), "%s", comma);
  917. p = addrprint(p, buf + sizeof(buf), in->dm, &in->d);
  918. }
  919. if(asmsym && in->s.decl != nil && in->sm == Adesc)
  920. p = seprint(p, buf+sizeof(buf), " #%D", in->s.decl);
  921. if(0 && asmsym && in->m.decl != nil)
  922. p = seprint(p, buf+sizeof(buf), " #%D", in->m.decl);
  923. if(asmsym && in->d.decl != nil && in->dm == Apc)
  924. p = seprint(p, buf+sizeof(buf), " #%D", in->d.decl);
  925. if(asmsym)
  926. p = seprint(p, buf+sizeof(buf), " #%U", in->src);
  927. USED(p);
  928. return fmtstrcpy(f, buf);
  929. }
  930. char*
  931. addrprint(char *buf, char *end, int am, Addr *a)
  932. {
  933. switch(am){
  934. case Anone:
  935. return buf;
  936. case Aimm:
  937. case Apc:
  938. case Adesc:
  939. return seprint(buf, end, "$%ld", a->offset);
  940. case Aoff:
  941. return seprint(buf, end, "$%ld", a->decl->iface->offset);
  942. case Anoff:
  943. return seprint(buf, end, "-$%ld", a->decl->iface->offset);
  944. case Afp:
  945. return seprint(buf, end, "%ld(fp)", a->reg);
  946. case Afpind:
  947. return seprint(buf, end, "%ld(%ld(fp))", a->offset, a->reg);
  948. case Amp:
  949. return seprint(buf, end, "%ld(mp)", a->reg);
  950. case Ampind:
  951. return seprint(buf, end, "%ld(%ld(mp))", a->offset, a->reg);
  952. case Aldt:
  953. return seprint(buf, end, "$%ld", a->reg);
  954. case Aerr:
  955. default:
  956. return seprint(buf, end, "%ld(%ld(?%d?))", a->offset, a->reg, am);
  957. }
  958. }
  959. static void
  960. genstore(Src *src, Node *n, int offset)
  961. {
  962. Decl *de;
  963. Node d;
  964. de = mkdecl(&nosrc, Dlocal, tint);
  965. de->sym = nil;
  966. de->offset = offset;
  967. d = znode;
  968. d.op = Oname;
  969. d.addable = Rreg;
  970. d.decl = de;
  971. d.ty = tint;
  972. genrawop(src, IMOVW, n, nil, &d);
  973. }
  974. static Inst*
  975. genfixop(Src *src, int op, Node *s, Node *m, Node *d)
  976. {
  977. int p, a;
  978. Node *mm;
  979. Inst *i;
  980. mm = m ? m: d;
  981. op = fixop(op, mm->ty, s->ty, d->ty, &p, &a);
  982. if(op == IMOVW){ /* just zero d */
  983. s = sumark(mkconst(src, 0));
  984. return genrawop(src, op, s, nil, d);
  985. }
  986. if(op != IMULX && op != IDIVX)
  987. genstore(src, sumark(mkconst(src, a)), STemp);
  988. genstore(src, sumark(mkconst(src, p)), DTemp);
  989. i = genrawop(src, op, s, m, d);
  990. return i;
  991. }
  992. Inst*
  993. genfixcastop(Src *src, int op, Node *s, Node *d)
  994. {
  995. int p, a;
  996. Node *m;
  997. op = fixop(op, s->ty, tint, d->ty, &p, &a);
  998. if(op == IMOVW){ /* just zero d */
  999. s = sumark(mkconst(src, 0));
  1000. return genrawop(src, op, s, nil, d);
  1001. }
  1002. m = sumark(mkconst(src, p));
  1003. if(op != ICVTXX)
  1004. genstore(src, sumark(mkconst(src, a)), STemp);
  1005. return genrawop(src, op, s, m, d);
  1006. }