reg.c 22 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367
  1. /*
  2. * This file is part of the UCB release of Plan 9. It is subject to the license
  3. * terms in the LICENSE file found in the top-level directory of this
  4. * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
  5. * part of the UCB release of Plan 9, including this file, may be copied,
  6. * modified, propagated, or distributed except according to the terms contained
  7. * in the LICENSE file.
  8. */
  9. #include "gc.h"
  10. Reg*
  11. rega(void)
  12. {
  13. Reg *r;
  14. r = freer;
  15. if(r == R) {
  16. r = alloc(sizeof(*r));
  17. } else
  18. freer = r->link;
  19. *r = zreg;
  20. return r;
  21. }
  22. int
  23. rcmp(const void *a1, const void *a2)
  24. {
  25. Rgn *p1, *p2;
  26. int c1, c2;
  27. p1 = (Rgn*)a1;
  28. p2 = (Rgn*)a2;
  29. c1 = p2->cost;
  30. c2 = p1->cost;
  31. if(c1 -= c2)
  32. return c1;
  33. return p2->varno - p1->varno;
  34. }
  35. void
  36. regopt(Prog *p)
  37. {
  38. Reg *r, *r1, *r2;
  39. Prog *p1;
  40. int i, z;
  41. int32_t initpc, val, npc;
  42. uint32_t vreg;
  43. Bits bit;
  44. struct
  45. {
  46. int32_t m;
  47. int32_t c;
  48. Reg* p;
  49. } log5[6], *lp;
  50. firstr = R;
  51. lastr = R;
  52. nvar = 0;
  53. regbits = RtoB(D_SP) | RtoB(D_AX) | RtoB(D_X0);
  54. if(REGEXT)
  55. regbits |= RtoB(REGEXT) | RtoB(REGEXT-1);
  56. for(z=0; z<BITS; z++) {
  57. externs.b[z] = 0;
  58. params.b[z] = 0;
  59. consts.b[z] = 0;
  60. addrs.b[z] = 0;
  61. }
  62. /*
  63. * pass 1
  64. * build aux data structure
  65. * allocate pcs
  66. * find use and set of variables
  67. */
  68. val = 5L * 5L * 5L * 5L * 5L;
  69. lp = log5;
  70. for(i=0; i<5; i++) {
  71. lp->m = val;
  72. lp->c = 0;
  73. lp->p = R;
  74. val /= 5L;
  75. lp++;
  76. }
  77. val = 0;
  78. for(; p != P; p = p->link) {
  79. switch(p->as) {
  80. case ADATA:
  81. case AGLOBL:
  82. case ANAME:
  83. case ASIGNAME:
  84. continue;
  85. }
  86. r = rega();
  87. if(firstr == R) {
  88. firstr = r;
  89. lastr = r;
  90. } else {
  91. lastr->link = r;
  92. r->p1 = lastr;
  93. lastr->s1 = r;
  94. lastr = r;
  95. }
  96. r->prog = p;
  97. r->pc = val;
  98. val++;
  99. lp = log5;
  100. for(i=0; i<5; i++) {
  101. lp->c--;
  102. if(lp->c <= 0) {
  103. lp->c = lp->m;
  104. if(lp->p != R)
  105. lp->p->log5 = r;
  106. lp->p = r;
  107. (lp+1)->c = 0;
  108. break;
  109. }
  110. lp++;
  111. }
  112. r1 = r->p1;
  113. if(r1 != R)
  114. switch(r1->prog->as) {
  115. case ARET:
  116. case AJMP:
  117. case AIRETL:
  118. case AIRETQ:
  119. r->p1 = R;
  120. r1->s1 = R;
  121. }
  122. bit = mkvar(r, &p->from);
  123. if(bany(&bit))
  124. switch(p->as) {
  125. /*
  126. * funny
  127. */
  128. case ALEAL:
  129. case ALEAQ:
  130. for(z=0; z<BITS; z++)
  131. addrs.b[z] |= bit.b[z];
  132. break;
  133. /*
  134. * left side read
  135. */
  136. default:
  137. for(z=0; z<BITS; z++)
  138. r->use1.b[z] |= bit.b[z];
  139. break;
  140. }
  141. bit = mkvar(r, &p->to);
  142. if(bany(&bit))
  143. switch(p->as) {
  144. default:
  145. diag(Z, "reg: unknown op: %A", p->as);
  146. break;
  147. /*
  148. * right side read
  149. */
  150. case ACMPB:
  151. case ACMPL:
  152. case ACMPQ:
  153. case ACMPW:
  154. case ACOMISS:
  155. case ACOMISD:
  156. case AUCOMISS:
  157. case AUCOMISD:
  158. for(z=0; z<BITS; z++)
  159. r->use2.b[z] |= bit.b[z];
  160. break;
  161. /*
  162. * right side write
  163. */
  164. case ANOP:
  165. case AMOVL:
  166. case AMOVQ:
  167. case AMOVB:
  168. case AMOVW:
  169. case AMOVBLSX:
  170. case AMOVBLZX:
  171. case AMOVBQSX:
  172. case AMOVBQZX:
  173. case AMOVLQSX:
  174. case AMOVLQZX:
  175. case AMOVWLSX:
  176. case AMOVWLZX:
  177. case AMOVWQSX:
  178. case AMOVWQZX:
  179. case AMOVSS:
  180. case AMOVSD:
  181. case ACVTSD2SL:
  182. case ACVTSD2SQ:
  183. case ACVTSD2SS:
  184. case ACVTSL2SD:
  185. case ACVTSL2SS:
  186. case ACVTSQ2SD:
  187. case ACVTSQ2SS:
  188. case ACVTSS2SD:
  189. case ACVTSS2SL:
  190. case ACVTSS2SQ:
  191. case ACVTTSD2SL:
  192. case ACVTTSD2SQ:
  193. case ACVTTSS2SL:
  194. case ACVTTSS2SQ:
  195. for(z=0; z<BITS; z++)
  196. r->set.b[z] |= bit.b[z];
  197. break;
  198. /*
  199. * right side read+write
  200. */
  201. case AADDB:
  202. case AADDL:
  203. case AADDQ:
  204. case AADDW:
  205. case AANDB:
  206. case AANDL:
  207. case AANDQ:
  208. case AANDW:
  209. case ASUBB:
  210. case ASUBL:
  211. case ASUBQ:
  212. case ASUBW:
  213. case AORB:
  214. case AORL:
  215. case AORQ:
  216. case AORW:
  217. case AXORB:
  218. case AXORL:
  219. case AXORQ:
  220. case AXORW:
  221. case ASALB:
  222. case ASALL:
  223. case ASALQ:
  224. case ASALW:
  225. case ASARB:
  226. case ASARL:
  227. case ASARQ:
  228. case ASARW:
  229. case AROLB:
  230. case AROLL:
  231. case AROLQ:
  232. case AROLW:
  233. case ARORB:
  234. case ARORL:
  235. case ARORQ:
  236. case ARORW:
  237. case ASHLB:
  238. case ASHLL:
  239. case ASHLQ:
  240. case ASHLW:
  241. case ASHRB:
  242. case ASHRL:
  243. case ASHRQ:
  244. case ASHRW:
  245. case AIMULL:
  246. case AIMULQ:
  247. case AIMULW:
  248. case ANEGL:
  249. case ANEGQ:
  250. case ANOTL:
  251. case ANOTQ:
  252. case AADCL:
  253. case AADCQ:
  254. case ASBBL:
  255. case ASBBQ:
  256. case AADDSD:
  257. case AADDSS:
  258. case ACMPSD:
  259. case ACMPSS:
  260. case ADIVSD:
  261. case ADIVSS:
  262. case AMAXSD:
  263. case AMAXSS:
  264. case AMINSD:
  265. case AMINSS:
  266. case AMULSD:
  267. case AMULSS:
  268. case ARCPSS:
  269. case ARSQRTSS:
  270. case ASQRTSD:
  271. case ASQRTSS:
  272. case ASUBSD:
  273. case ASUBSS:
  274. case AXORPD:
  275. for(z=0; z<BITS; z++) {
  276. r->set.b[z] |= bit.b[z];
  277. r->use2.b[z] |= bit.b[z];
  278. }
  279. break;
  280. /*
  281. * funny
  282. */
  283. case ACALL:
  284. for(z=0; z<BITS; z++)
  285. addrs.b[z] |= bit.b[z];
  286. break;
  287. }
  288. switch(p->as) {
  289. case AIMULL:
  290. case AIMULQ:
  291. case AIMULW:
  292. if(p->to.type != D_NONE)
  293. break;
  294. case AIDIVB:
  295. case AIDIVL:
  296. case AIDIVQ:
  297. case AIDIVW:
  298. case AIMULB:
  299. case ADIVB:
  300. case ADIVL:
  301. case ADIVQ:
  302. case ADIVW:
  303. case AMULB:
  304. case AMULL:
  305. case AMULQ:
  306. case AMULW:
  307. case ACWD:
  308. case ACDQ:
  309. case ACQO:
  310. r->regu |= RtoB(D_AX) | RtoB(D_DX);
  311. break;
  312. case AREP:
  313. case AREPN:
  314. case ALOOP:
  315. case ALOOPEQ:
  316. case ALOOPNE:
  317. r->regu |= RtoB(D_CX);
  318. break;
  319. case AMOVSB:
  320. case AMOVSL:
  321. case AMOVSQ:
  322. case AMOVSW:
  323. case ACMPSB:
  324. case ACMPSL:
  325. case ACMPSQ:
  326. case ACMPSW:
  327. r->regu |= RtoB(D_SI) | RtoB(D_DI);
  328. break;
  329. case ASTOSB:
  330. case ASTOSL:
  331. case ASTOSQ:
  332. case ASTOSW:
  333. case ASCASB:
  334. case ASCASL:
  335. case ASCASQ:
  336. case ASCASW:
  337. r->regu |= RtoB(D_AX) | RtoB(D_DI);
  338. break;
  339. case AINSB:
  340. case AINSL:
  341. case AINSW:
  342. case AOUTSB:
  343. case AOUTSL:
  344. case AOUTSW:
  345. r->regu |= RtoB(D_DI) | RtoB(D_DX);
  346. break;
  347. }
  348. }
  349. if(firstr == R)
  350. return;
  351. initpc = pc - val;
  352. npc = val;
  353. /*
  354. * pass 2
  355. * turn branch references to pointers
  356. * build back pointers
  357. */
  358. for(r = firstr; r != R; r = r->link) {
  359. p = r->prog;
  360. if(p->to.type == D_BRANCH) {
  361. val = p->to.offset - initpc;
  362. r1 = firstr;
  363. while(r1 != R) {
  364. r2 = r1->log5;
  365. if(r2 != R && val >= r2->pc) {
  366. r1 = r2;
  367. continue;
  368. }
  369. if(r1->pc == val)
  370. break;
  371. r1 = r1->link;
  372. }
  373. if(r1 == R) {
  374. nearln = p->lineno;
  375. diag(Z, "ref not found\n%P", p);
  376. continue;
  377. }
  378. if(r1 == r) {
  379. nearln = p->lineno;
  380. diag(Z, "ref to self\n%P", p);
  381. continue;
  382. }
  383. r->s2 = r1;
  384. r->p2link = r1->p2;
  385. r1->p2 = r;
  386. }
  387. }
  388. if(debug['R']) {
  389. p = firstr->prog;
  390. print("\n%L %D\n", p->lineno, &p->from);
  391. }
  392. /*
  393. * pass 2.5
  394. * find looping structure
  395. */
  396. for(r = firstr; r != R; r = r->link)
  397. r->active = 0;
  398. change = 0;
  399. loopit(firstr, npc);
  400. if(debug['R'] && debug['v']) {
  401. print("\nlooping structure:\n");
  402. for(r = firstr; r != R; r = r->link) {
  403. print("%ld:%P", r->loop, r->prog);
  404. for(z=0; z<BITS; z++)
  405. bit.b[z] = r->use1.b[z] |
  406. r->use2.b[z] |
  407. r->set.b[z];
  408. if(bany(&bit)) {
  409. print("\t");
  410. if(bany(&r->use1))
  411. print(" u1=%B", r->use1);
  412. if(bany(&r->use2))
  413. print(" u2=%B", r->use2);
  414. if(bany(&r->set))
  415. print(" st=%B", r->set);
  416. }
  417. print("\n");
  418. }
  419. }
  420. /*
  421. * pass 3
  422. * iterate propagating usage
  423. * back until flow graph is complete
  424. */
  425. loop1:
  426. change = 0;
  427. for(r = firstr; r != R; r = r->link)
  428. r->active = 0;
  429. for(r = firstr; r != R; r = r->link)
  430. if(r->prog->as == ARET)
  431. prop(r, zbits, zbits);
  432. loop11:
  433. /* pick up unreachable code */
  434. i = 0;
  435. for(r = firstr; r != R; r = r1) {
  436. r1 = r->link;
  437. if(r1 && r1->active && !r->active) {
  438. prop(r, zbits, zbits);
  439. i = 1;
  440. }
  441. }
  442. if(i)
  443. goto loop11;
  444. if(change)
  445. goto loop1;
  446. /*
  447. * pass 4
  448. * iterate propagating register/variable synchrony
  449. * forward until graph is complete
  450. */
  451. loop2:
  452. change = 0;
  453. for(r = firstr; r != R; r = r->link)
  454. r->active = 0;
  455. synch(firstr, zbits);
  456. if(change)
  457. goto loop2;
  458. /*
  459. * pass 5
  460. * isolate regions
  461. * calculate costs (paint1)
  462. */
  463. r = firstr;
  464. if(r) {
  465. for(z=0; z<BITS; z++)
  466. bit.b[z] = (r->refahead.b[z] | r->calahead.b[z]) &
  467. ~(externs.b[z] | params.b[z] | addrs.b[z] | consts.b[z]);
  468. if(bany(&bit)) {
  469. nearln = r->prog->lineno;
  470. warn(Z, "used and not set: %B", bit);
  471. if(debug['R'] && !debug['w'])
  472. print("used and not set: %B\n", bit);
  473. }
  474. }
  475. if(debug['R'] && debug['v'])
  476. print("\nprop structure:\n");
  477. for(r = firstr; r != R; r = r->link)
  478. r->act = zbits;
  479. rgp = region;
  480. nregion = 0;
  481. for(r = firstr; r != R; r = r->link) {
  482. if(debug['R'] && debug['v']) {
  483. print("%P\t", r->prog);
  484. if(bany(&r->set))
  485. print("s:%B ", r->set);
  486. if(bany(&r->refahead))
  487. print("ra:%B ", r->refahead);
  488. if(bany(&r->calahead))
  489. print("ca:%B ", r->calahead);
  490. print("\n");
  491. }
  492. for(z=0; z<BITS; z++)
  493. bit.b[z] = r->set.b[z] &
  494. ~(r->refahead.b[z] | r->calahead.b[z] | addrs.b[z]);
  495. if(bany(&bit)) {
  496. nearln = r->prog->lineno;
  497. warn(Z, "set and not used: %B", bit);
  498. if(debug['R'])
  499. print("set and not used: %B\n", bit);
  500. excise(r);
  501. }
  502. for(z=0; z<BITS; z++)
  503. bit.b[z] = LOAD(r) & ~(r->act.b[z] | addrs.b[z]);
  504. while(bany(&bit)) {
  505. i = bnum(bit);
  506. rgp->enter = r;
  507. rgp->varno = i;
  508. change = 0;
  509. if(debug['R'] && debug['v'])
  510. print("\n");
  511. paint1(r, i);
  512. bit.b[i/32] &= ~(1L<<(i%32));
  513. if(change <= 0) {
  514. if(debug['R'])
  515. print("%L$%d: %B\n",
  516. r->prog->lineno, change, blsh(i));
  517. continue;
  518. }
  519. rgp->cost = change;
  520. nregion++;
  521. if(nregion >= NRGN) {
  522. warn(Z, "too many regions");
  523. goto brk;
  524. }
  525. rgp++;
  526. }
  527. }
  528. brk:
  529. qsort(region, nregion, sizeof(region[0]), rcmp);
  530. /*
  531. * pass 6
  532. * determine used registers (paint2)
  533. * replace code (paint3)
  534. */
  535. rgp = region;
  536. for(i=0; i<nregion; i++) {
  537. bit = blsh(rgp->varno);
  538. vreg = paint2(rgp->enter, rgp->varno);
  539. vreg = allreg(vreg, rgp);
  540. if(debug['R']) {
  541. print("%L$%d %R: %B\n",
  542. rgp->enter->prog->lineno,
  543. rgp->cost,
  544. rgp->regno,
  545. bit);
  546. }
  547. if(rgp->regno != 0)
  548. paint3(rgp->enter, rgp->varno, vreg, rgp->regno);
  549. rgp++;
  550. }
  551. /*
  552. * pass 7
  553. * peep-hole on basic block
  554. */
  555. if(!debug['R'] || debug['P'])
  556. peep();
  557. /*
  558. * pass 8
  559. * recalculate pc
  560. */
  561. val = initpc;
  562. for(r = firstr; r != R; r = r1) {
  563. r->pc = val;
  564. p = r->prog;
  565. p1 = P;
  566. r1 = r->link;
  567. if(r1 != R)
  568. p1 = r1->prog;
  569. for(; p != p1; p = p->link) {
  570. switch(p->as) {
  571. default:
  572. val++;
  573. break;
  574. case ANOP:
  575. case ADATA:
  576. case AGLOBL:
  577. case ANAME:
  578. case ASIGNAME:
  579. break;
  580. }
  581. }
  582. }
  583. pc = val;
  584. /*
  585. * fix up branches
  586. */
  587. if(debug['R'])
  588. if(bany(&addrs))
  589. print("addrs: %B\n", addrs);
  590. r1 = 0; /* set */
  591. for(r = firstr; r != R; r = r->link) {
  592. p = r->prog;
  593. if(p->to.type == D_BRANCH)
  594. p->to.offset = r->s2->pc;
  595. r1 = r;
  596. }
  597. /*
  598. * last pass
  599. * eliminate nops
  600. * free aux structures
  601. */
  602. for(p = firstr->prog; p != P; p = p->link){
  603. while(p->link && p->link->as == ANOP)
  604. p->link = p->link->link;
  605. }
  606. if(r1 != R) {
  607. r1->link = freer;
  608. freer = firstr;
  609. }
  610. }
  611. /*
  612. * add mov b,rn
  613. * just after r
  614. */
  615. void
  616. addmove(Reg *r, int bn, int rn, int f)
  617. {
  618. Prog *p, *p1;
  619. Adr *a;
  620. Var *v;
  621. p1 = alloc(sizeof(*p1));
  622. *p1 = zprog;
  623. p = r->prog;
  624. p1->link = p->link;
  625. p->link = p1;
  626. p1->lineno = p->lineno;
  627. v = var + bn;
  628. a = &p1->to;
  629. a->sym = v->sym;
  630. a->offset = v->offset;
  631. a->etype = v->etype;
  632. a->type = v->name;
  633. p1->as = AMOVL;
  634. if(v->etype == TCHAR || v->etype == TUCHAR)
  635. p1->as = AMOVB;
  636. if(v->etype == TSHORT || v->etype == TUSHORT)
  637. p1->as = AMOVW;
  638. if(v->etype == TVLONG || v->etype == TUVLONG || v->etype == TIND)
  639. p1->as = AMOVQ;
  640. if(v->etype == TFLOAT)
  641. p1->as = AMOVSS;
  642. if(v->etype == TDOUBLE)
  643. p1->as = AMOVSD;
  644. p1->from.type = rn;
  645. if(!f) {
  646. p1->from = *a;
  647. *a = zprog.from;
  648. a->type = rn;
  649. if(v->etype == TUCHAR)
  650. p1->as = AMOVB;
  651. if(v->etype == TUSHORT)
  652. p1->as = AMOVW;
  653. }
  654. if(debug['R'])
  655. print("%P\t.a%P\n", p, p1);
  656. }
  657. uint32_t
  658. doregbits(int r)
  659. {
  660. uint32_t b;
  661. b = 0;
  662. if(r >= D_INDIR)
  663. r -= D_INDIR;
  664. if(r >= D_AX && r <= D_R15)
  665. b |= RtoB(r);
  666. else
  667. if(r >= D_AL && r <= D_R15B)
  668. b |= RtoB(r-D_AL+D_AX);
  669. else
  670. if(r >= D_AH && r <= D_BH)
  671. b |= RtoB(r-D_AH+D_AX);
  672. else
  673. if(r >= D_X0 && r <= D_X0+15)
  674. b |= FtoB(r);
  675. return b;
  676. }
  677. Bits
  678. mkvar(Reg *r, Adr *a)
  679. {
  680. Var *v;
  681. int i, t, n, et, z;
  682. int32_t o;
  683. Bits bit;
  684. Sym *s;
  685. /*
  686. * mark registers used
  687. */
  688. t = a->type;
  689. r->regu |= doregbits(t);
  690. r->regu |= doregbits(a->index);
  691. switch(t) {
  692. default:
  693. goto none;
  694. case D_ADDR:
  695. a->type = a->index;
  696. bit = mkvar(r, a);
  697. for(z=0; z<BITS; z++)
  698. addrs.b[z] |= bit.b[z];
  699. a->type = t;
  700. goto none;
  701. case D_EXTERN:
  702. case D_STATIC:
  703. case D_PARAM:
  704. case D_AUTO:
  705. n = t;
  706. break;
  707. }
  708. s = a->sym;
  709. if(s == S)
  710. goto none;
  711. if(s->name[0] == '.')
  712. goto none;
  713. et = a->etype;
  714. o = a->offset;
  715. v = var;
  716. for(i=0; i<nvar; i++) {
  717. if(s == v->sym)
  718. if(n == v->name)
  719. if(o == v->offset)
  720. goto out;
  721. v++;
  722. }
  723. if(nvar >= NVAR) {
  724. if(debug['w'] > 1 && s)
  725. warn(Z, "variable not optimized: %s", s->name);
  726. goto none;
  727. }
  728. i = nvar;
  729. nvar++;
  730. v = &var[i];
  731. v->sym = s;
  732. v->offset = o;
  733. v->name = n;
  734. v->etype = et;
  735. if(debug['R'])
  736. print("bit=%2d et=%2d %D\n", i, et, a);
  737. out:
  738. bit = blsh(i);
  739. if(n == D_EXTERN || n == D_STATIC)
  740. for(z=0; z<BITS; z++)
  741. externs.b[z] |= bit.b[z];
  742. if(n == D_PARAM)
  743. for(z=0; z<BITS; z++)
  744. params.b[z] |= bit.b[z];
  745. if(v->etype != et || !(typechlpfd[et] || typev[et])) /* funny punning */
  746. for(z=0; z<BITS; z++)
  747. addrs.b[z] |= bit.b[z];
  748. return bit;
  749. none:
  750. return zbits;
  751. }
  752. void
  753. prop(Reg *r, Bits ref, Bits cal)
  754. {
  755. Reg *r1, *r2;
  756. int z;
  757. for(r1 = r; r1 != R; r1 = r1->p1) {
  758. for(z=0; z<BITS; z++) {
  759. ref.b[z] |= r1->refahead.b[z];
  760. if(ref.b[z] != r1->refahead.b[z]) {
  761. r1->refahead.b[z] = ref.b[z];
  762. change++;
  763. }
  764. cal.b[z] |= r1->calahead.b[z];
  765. if(cal.b[z] != r1->calahead.b[z]) {
  766. r1->calahead.b[z] = cal.b[z];
  767. change++;
  768. }
  769. }
  770. switch(r1->prog->as) {
  771. case ACALL:
  772. for(z=0; z<BITS; z++) {
  773. cal.b[z] |= ref.b[z] | externs.b[z];
  774. ref.b[z] = 0;
  775. }
  776. break;
  777. case ATEXT:
  778. for(z=0; z<BITS; z++) {
  779. cal.b[z] = 0;
  780. ref.b[z] = 0;
  781. }
  782. break;
  783. case ARET:
  784. for(z=0; z<BITS; z++) {
  785. cal.b[z] = externs.b[z];
  786. ref.b[z] = 0;
  787. }
  788. }
  789. for(z=0; z<BITS; z++) {
  790. ref.b[z] = (ref.b[z] & ~r1->set.b[z]) |
  791. r1->use1.b[z] | r1->use2.b[z];
  792. cal.b[z] &= ~(r1->set.b[z] | r1->use1.b[z] | r1->use2.b[z]);
  793. r1->refbehind.b[z] = ref.b[z];
  794. r1->calbehind.b[z] = cal.b[z];
  795. }
  796. if(r1->active)
  797. break;
  798. r1->active = 1;
  799. }
  800. for(; r != r1; r = r->p1)
  801. for(r2 = r->p2; r2 != R; r2 = r2->p2link)
  802. prop(r2, r->refbehind, r->calbehind);
  803. }
  804. /*
  805. * find looping structure
  806. *
  807. * 1) find reverse postordering
  808. * 2) find approximate dominators,
  809. * the actual dominators if the flow graph is reducible
  810. * otherwise, dominators plus some other non-dominators.
  811. * See Matthew S. Hecht and Jeffrey D. Ullman,
  812. * "Analysis of a Simple Algorithm for Global Data Flow Problems",
  813. * Conf. Record of ACM Symp. on Principles of Prog. Langs, Boston, Massachusetts,
  814. * Oct. 1-3, 1973, pp. 207-217.
  815. * 3) find all nodes with a predecessor dominated by the current node.
  816. * such a node is a loop head.
  817. * recursively, all preds with a greater rpo number are in the loop
  818. */
  819. int32_t
  820. postorder(Reg *r, Reg **rpo2r, int32_t n)
  821. {
  822. Reg *r1;
  823. r->rpo = 1;
  824. r1 = r->s1;
  825. if(r1 && !r1->rpo)
  826. n = postorder(r1, rpo2r, n);
  827. r1 = r->s2;
  828. if(r1 && !r1->rpo)
  829. n = postorder(r1, rpo2r, n);
  830. rpo2r[n] = r;
  831. n++;
  832. return n;
  833. }
  834. int32_t
  835. rpolca(int32_t *idom, int32_t rpo1, int32_t rpo2)
  836. {
  837. int32_t t;
  838. if(rpo1 == -1)
  839. return rpo2;
  840. while(rpo1 != rpo2){
  841. if(rpo1 > rpo2){
  842. t = rpo2;
  843. rpo2 = rpo1;
  844. rpo1 = t;
  845. }
  846. while(rpo1 < rpo2){
  847. t = idom[rpo2];
  848. if(t >= rpo2)
  849. fatal(Z, "bad idom");
  850. rpo2 = t;
  851. }
  852. }
  853. return rpo1;
  854. }
  855. int
  856. doms(int32_t *idom, int32_t r, int32_t s)
  857. {
  858. while(s > r)
  859. s = idom[s];
  860. return s == r;
  861. }
  862. int
  863. loophead(int32_t *idom, Reg *r)
  864. {
  865. int32_t src;
  866. src = r->rpo;
  867. if(r->p1 != R && doms(idom, src, r->p1->rpo))
  868. return 1;
  869. for(r = r->p2; r != R; r = r->p2link)
  870. if(doms(idom, src, r->rpo))
  871. return 1;
  872. return 0;
  873. }
  874. void
  875. loopmark(Reg **rpo2r, int32_t head, Reg *r)
  876. {
  877. if(r->rpo < head || r->active == head)
  878. return;
  879. r->active = head;
  880. r->loop += LOOP;
  881. if(r->p1 != R)
  882. loopmark(rpo2r, head, r->p1);
  883. for(r = r->p2; r != R; r = r->p2link)
  884. loopmark(rpo2r, head, r);
  885. }
  886. void
  887. loopit(Reg *r, int32_t nr)
  888. {
  889. Reg *r1;
  890. int32_t i, d, me;
  891. if(nr > maxnr) {
  892. rpo2r = alloc(nr * sizeof(Reg*));
  893. idom = alloc(nr * sizeof(int32_t));
  894. maxnr = nr;
  895. }
  896. d = postorder(r, rpo2r, 0);
  897. if(d > nr)
  898. fatal(Z, "too many reg nodes");
  899. nr = d;
  900. for(i = 0; i < nr / 2; i++){
  901. r1 = rpo2r[i];
  902. rpo2r[i] = rpo2r[nr - 1 - i];
  903. rpo2r[nr - 1 - i] = r1;
  904. }
  905. for(i = 0; i < nr; i++)
  906. rpo2r[i]->rpo = i;
  907. idom[0] = 0;
  908. for(i = 0; i < nr; i++){
  909. r1 = rpo2r[i];
  910. me = r1->rpo;
  911. d = -1;
  912. if(r1->p1 != R && r1->p1->rpo < me)
  913. d = r1->p1->rpo;
  914. for(r1 = r1->p2; r1 != nil; r1 = r1->p2link)
  915. if(r1->rpo < me)
  916. d = rpolca(idom, d, r1->rpo);
  917. idom[i] = d;
  918. }
  919. for(i = 0; i < nr; i++){
  920. r1 = rpo2r[i];
  921. r1->loop++;
  922. if(r1->p2 != R && loophead(idom, r1))
  923. loopmark(rpo2r, i, r1);
  924. }
  925. }
  926. void
  927. synch(Reg *r, Bits dif)
  928. {
  929. Reg *r1;
  930. int z;
  931. for(r1 = r; r1 != R; r1 = r1->s1) {
  932. for(z=0; z<BITS; z++) {
  933. dif.b[z] = (dif.b[z] &
  934. ~(~r1->refbehind.b[z] & r1->refahead.b[z])) |
  935. r1->set.b[z] | r1->regdiff.b[z];
  936. if(dif.b[z] != r1->regdiff.b[z]) {
  937. r1->regdiff.b[z] = dif.b[z];
  938. change++;
  939. }
  940. }
  941. if(r1->active)
  942. break;
  943. r1->active = 1;
  944. for(z=0; z<BITS; z++)
  945. dif.b[z] &= ~(~r1->calbehind.b[z] & r1->calahead.b[z]);
  946. if(r1->s2 != R)
  947. synch(r1->s2, dif);
  948. }
  949. }
  950. uint32_t
  951. allreg(uint32_t b, Rgn *r)
  952. {
  953. Var *v;
  954. int i;
  955. v = var + r->varno;
  956. r->regno = 0;
  957. switch(v->etype) {
  958. default:
  959. diag(Z, "unknown etype %d/%d", bitno(b), v->etype);
  960. break;
  961. case TCHAR:
  962. case TUCHAR:
  963. case TSHORT:
  964. case TUSHORT:
  965. case TINT:
  966. case TUINT:
  967. case TLONG:
  968. case TULONG:
  969. case TVLONG:
  970. case TUVLONG:
  971. case TIND:
  972. case TARRAY:
  973. i = BtoR(~b);
  974. if(i && r->cost > 0) {
  975. r->regno = i;
  976. return RtoB(i);
  977. }
  978. break;
  979. case TDOUBLE:
  980. case TFLOAT:
  981. i = BtoF(~b);
  982. if(i && r->cost > 0) {
  983. r->regno = i;
  984. return FtoB(i);
  985. }
  986. break;
  987. }
  988. return 0;
  989. }
  990. void
  991. paint1(Reg *r, int bn)
  992. {
  993. Reg *r1;
  994. Prog *p;
  995. int z;
  996. uint32_t bb;
  997. z = bn/32;
  998. bb = 1L<<(bn%32);
  999. if(r->act.b[z] & bb)
  1000. return;
  1001. for(;;) {
  1002. if(!(r->refbehind.b[z] & bb))
  1003. break;
  1004. r1 = r->p1;
  1005. if(r1 == R)
  1006. break;
  1007. if(!(r1->refahead.b[z] & bb))
  1008. break;
  1009. if(r1->act.b[z] & bb)
  1010. break;
  1011. r = r1;
  1012. }
  1013. if(LOAD(r) & ~(r->set.b[z]&~(r->use1.b[z]|r->use2.b[z])) & bb) {
  1014. change -= CLOAD * r->loop;
  1015. if(debug['R'] && debug['v'])
  1016. print("%ld%P\tld %B $%d\n", r->loop,
  1017. r->prog, blsh(bn), change);
  1018. }
  1019. for(;;) {
  1020. r->act.b[z] |= bb;
  1021. p = r->prog;
  1022. if(r->use1.b[z] & bb) {
  1023. change += CREF * r->loop;
  1024. if(debug['R'] && debug['v'])
  1025. print("%ld%P\tu1 %B $%d\n", r->loop,
  1026. p, blsh(bn), change);
  1027. }
  1028. if((r->use2.b[z]|r->set.b[z]) & bb) {
  1029. change += CREF * r->loop;
  1030. if(debug['R'] && debug['v'])
  1031. print("%ld%P\tu2 %B $%d\n", r->loop,
  1032. p, blsh(bn), change);
  1033. }
  1034. if(STORE(r) & r->regdiff.b[z] & bb) {
  1035. change -= CLOAD * r->loop;
  1036. if(debug['R'] && debug['v'])
  1037. print("%ld%P\tst %B $%d\n", r->loop,
  1038. p, blsh(bn), change);
  1039. }
  1040. if(r->refbehind.b[z] & bb)
  1041. for(r1 = r->p2; r1 != R; r1 = r1->p2link)
  1042. if(r1->refahead.b[z] & bb)
  1043. paint1(r1, bn);
  1044. if(!(r->refahead.b[z] & bb))
  1045. break;
  1046. r1 = r->s2;
  1047. if(r1 != R)
  1048. if(r1->refbehind.b[z] & bb)
  1049. paint1(r1, bn);
  1050. r = r->s1;
  1051. if(r == R)
  1052. break;
  1053. if(r->act.b[z] & bb)
  1054. break;
  1055. if(!(r->refbehind.b[z] & bb))
  1056. break;
  1057. }
  1058. }
  1059. uint32_t
  1060. regset(Reg *r, uint32_t bb)
  1061. {
  1062. uint32_t b, set;
  1063. Adr v;
  1064. int c;
  1065. set = 0;
  1066. v = zprog.from;
  1067. while(b = bb & ~(bb-1)) {
  1068. v.type = b & 0xFFFF? BtoR(b): BtoF(b);
  1069. if(v.type == 0)
  1070. diag(Z, "zero v.type for %#lux", b);
  1071. c = copyu(r->prog, &v, A);
  1072. if(c == 3)
  1073. set |= b;
  1074. bb &= ~b;
  1075. }
  1076. return set;
  1077. }
  1078. uint32_t
  1079. reguse(Reg *r, uint32_t bb)
  1080. {
  1081. uint32_t b, set;
  1082. Adr v;
  1083. int c;
  1084. set = 0;
  1085. v = zprog.from;
  1086. while(b = bb & ~(bb-1)) {
  1087. v.type = b & 0xFFFF? BtoR(b): BtoF(b);
  1088. c = copyu(r->prog, &v, A);
  1089. if(c == 1 || c == 2 || c == 4)
  1090. set |= b;
  1091. bb &= ~b;
  1092. }
  1093. return set;
  1094. }
  1095. uint32_t
  1096. paint2(Reg *r, int bn)
  1097. {
  1098. Reg *r1;
  1099. int z;
  1100. uint32_t bb, vreg, x;
  1101. z = bn/32;
  1102. bb = 1L << (bn%32);
  1103. vreg = regbits;
  1104. if(!(r->act.b[z] & bb))
  1105. return vreg;
  1106. for(;;) {
  1107. if(!(r->refbehind.b[z] & bb))
  1108. break;
  1109. r1 = r->p1;
  1110. if(r1 == R)
  1111. break;
  1112. if(!(r1->refahead.b[z] & bb))
  1113. break;
  1114. if(!(r1->act.b[z] & bb))
  1115. break;
  1116. r = r1;
  1117. }
  1118. for(;;) {
  1119. r->act.b[z] &= ~bb;
  1120. vreg |= r->regu;
  1121. if(r->refbehind.b[z] & bb)
  1122. for(r1 = r->p2; r1 != R; r1 = r1->p2link)
  1123. if(r1->refahead.b[z] & bb)
  1124. vreg |= paint2(r1, bn);
  1125. if(!(r->refahead.b[z] & bb))
  1126. break;
  1127. r1 = r->s2;
  1128. if(r1 != R)
  1129. if(r1->refbehind.b[z] & bb)
  1130. vreg |= paint2(r1, bn);
  1131. r = r->s1;
  1132. if(r == R)
  1133. break;
  1134. if(!(r->act.b[z] & bb))
  1135. break;
  1136. if(!(r->refbehind.b[z] & bb))
  1137. break;
  1138. }
  1139. bb = vreg;
  1140. for(; r; r=r->s1) {
  1141. x = r->regu & ~bb;
  1142. if(x) {
  1143. vreg |= reguse(r, x);
  1144. bb |= regset(r, x);
  1145. }
  1146. }
  1147. return vreg;
  1148. }
  1149. void
  1150. paint3(Reg *r, int bn, int32_t rb, int rn)
  1151. {
  1152. Reg *r1;
  1153. Prog *p;
  1154. int z;
  1155. uint32_t bb;
  1156. z = bn/32;
  1157. bb = 1L << (bn%32);
  1158. if(r->act.b[z] & bb)
  1159. return;
  1160. for(;;) {
  1161. if(!(r->refbehind.b[z] & bb))
  1162. break;
  1163. r1 = r->p1;
  1164. if(r1 == R)
  1165. break;
  1166. if(!(r1->refahead.b[z] & bb))
  1167. break;
  1168. if(r1->act.b[z] & bb)
  1169. break;
  1170. r = r1;
  1171. }
  1172. if(LOAD(r) & ~(r->set.b[z] & ~(r->use1.b[z]|r->use2.b[z])) & bb)
  1173. addmove(r, bn, rn, 0);
  1174. for(;;) {
  1175. r->act.b[z] |= bb;
  1176. p = r->prog;
  1177. if(r->use1.b[z] & bb) {
  1178. if(debug['R'])
  1179. print("%P", p);
  1180. addreg(&p->from, rn);
  1181. if(debug['R'])
  1182. print("\t.c%P\n", p);
  1183. }
  1184. if((r->use2.b[z]|r->set.b[z]) & bb) {
  1185. if(debug['R'])
  1186. print("%P", p);
  1187. addreg(&p->to, rn);
  1188. if(debug['R'])
  1189. print("\t.c%P\n", p);
  1190. }
  1191. if(STORE(r) & r->regdiff.b[z] & bb)
  1192. addmove(r, bn, rn, 1);
  1193. r->regu |= rb;
  1194. if(r->refbehind.b[z] & bb)
  1195. for(r1 = r->p2; r1 != R; r1 = r1->p2link)
  1196. if(r1->refahead.b[z] & bb)
  1197. paint3(r1, bn, rb, rn);
  1198. if(!(r->refahead.b[z] & bb))
  1199. break;
  1200. r1 = r->s2;
  1201. if(r1 != R)
  1202. if(r1->refbehind.b[z] & bb)
  1203. paint3(r1, bn, rb, rn);
  1204. r = r->s1;
  1205. if(r == R)
  1206. break;
  1207. if(r->act.b[z] & bb)
  1208. break;
  1209. if(!(r->refbehind.b[z] & bb))
  1210. break;
  1211. }
  1212. }
  1213. void
  1214. addreg(Adr *a, int rn)
  1215. {
  1216. a->sym = 0;
  1217. a->offset = 0;
  1218. a->type = rn;
  1219. }
  1220. int32_t
  1221. RtoB(int r)
  1222. {
  1223. if(r < D_AX || r > D_R15)
  1224. return 0;
  1225. return 1L << (r-D_AX);
  1226. }
  1227. int
  1228. BtoR(int32_t b)
  1229. {
  1230. b &= 0xffffL;
  1231. if(b == 0)
  1232. return 0;
  1233. return bitno(b) + D_AX;
  1234. }
  1235. /*
  1236. * bit reg
  1237. * 16 X5
  1238. * 17 X6
  1239. * 18 X7
  1240. */
  1241. int32_t
  1242. FtoB(int f)
  1243. {
  1244. if(f < FREGMIN || f > FREGEXT)
  1245. return 0;
  1246. return 1L << (f - FREGMIN + 16);
  1247. }
  1248. int
  1249. BtoF(int32_t b)
  1250. {
  1251. b &= 0x70000L;
  1252. if(b == 0)
  1253. return 0;
  1254. return bitno(b) - 16 + FREGMIN;
  1255. }