Allocation.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. ///*
  2. // * To change this license header, choose License Headers in Project Properties.
  3. // * To change this template file, choose Tools | Templates
  4. // * and open the template in the editor.
  5. // */
  6. //package IntermediaryCode;
  7. //
  8. //import Processors.Ocorrence;
  9. //import java.util.ArrayList;
  10. //import java.util.HashMap;
  11. //import java.util.Map;
  12. //
  13. ///**
  14. // *
  15. // * @author Eugenio
  16. // */
  17. //public class Allocation {
  18. //
  19. // protected static int registerCount = 32;
  20. // protected int lastLine = 0;
  21. // protected HashMap<String, Ocorrence> vars;
  22. //// HashMap<String, HashMap<Integer, Integer>> vars;
  23. // HashMap<String, ArrayList<ArrayList<Integer>>> intervals;
  24. // protected static ArrayList<String> labels;
  25. // protected ArrayList<Boolean> registers;
  26. // protected HashMap<String, Integer> assigns;
  27. // protected HashMap<String, String> regAssigns;
  28. // protected Integer swapRegister;
  29. // protected Integer currentRegister;
  30. // protected ArrayList<Integer> interval;
  31. //
  32. // public Allocation(int sizeOfBlock, HashMap<String, Ocorrence> varOcorrences) {
  33. // vars = varOcorrences;
  34. // lastLine = sizeOfBlock;
  35. // intervals = new HashMap<>();
  36. // labels = new ArrayList<>();
  37. // registers = new ArrayList<>();
  38. // assigns = new HashMap<>();
  39. // regAssigns = new HashMap<>();
  40. //
  41. // initRegisters();
  42. // }
  43. //
  44. // @Override
  45. // public String toString() {
  46. // return "Allocation:\n"
  47. // + "Registers\n" + registers.toString()
  48. // + "\nAssigns\n" + assigns.toString()
  49. // + "\nReg->Var\n" + regAssigns.toString();
  50. // }
  51. //
  52. // public static String reg2Str(int reg) {
  53. // return labels.get(reg);
  54. // }
  55. //
  56. // public static int reg2Int(String regis) {
  57. // return labels.indexOf(regis);
  58. // }
  59. //
  60. // public void put(int line, String var, int reg) {
  61. //// System.out.println("Put:" + var + ":" + line + ":" + reg);
  62. // assigns.put(var + "." + line, reg);
  63. // regAssigns.put(reg + "." + line, var);
  64. //// System.out.println("assigns:" + assigns + ":" + regAssigns);
  65. // }
  66. //
  67. // public void remove(int line, String var, int reg) {
  68. // assigns.remove(var + "." + line);
  69. // regAssigns.remove(reg + "." + line);
  70. // }
  71. //
  72. // public String get(int line, String var) {
  73. // String key = var + "." + line;
  74. // if (assigns.containsKey(key)) {
  75. // return reg2Str(assigns.get(key));
  76. // }
  77. // return "undefined";
  78. // }
  79. //
  80. // public String var(int line, String reg) {
  81. // String key = reg + "." + line;
  82. // if (regAssigns.containsKey(key)) {
  83. // return regAssigns.get(key);
  84. // }
  85. // return "undefined";
  86. // }
  87. //
  88. // public void register(int line, String var) throws Exception {
  89. // if (!var.matches("^_.*")) {
  90. // return;
  91. // }
  92. //// System.out.println("Register:" + line + ":" + var);
  93. //
  94. // Integer reg;
  95. // /*Se não existe um registrador associado a variavel retorna*/
  96. // if (!alive(line, var)) {
  97. //
  98. // /*Tenta alocar um registrador para variavel*/
  99. // reg = assign(line, var);
  100. //
  101. // /*Se não existem registradores disponiveis executa a troca*/
  102. // if (reg == null) {
  103. // reg = swap(line, var);
  104. //
  105. // }
  106. // /*Atribui o registrador ao intervalo atual*/
  107. // interval.set(2, reg);
  108. //
  109. // } else {
  110. // /* atribui o registrador do intervalo*/
  111. // reg = interval.get(2);
  112. // }
  113. //
  114. // System.out.println("put_register:" + line + ":" + var + ":" + reg);
  115. //
  116. // put(line, var, reg);
  117. // }
  118. //
  119. // protected ArrayList<Integer> newInterval(int line, String var) {
  120. // interval = new ArrayList<>();
  121. //
  122. // interval.add(line);//inicio do intervalo
  123. // interval.add(vars.get(var).last());//fim do intervalo
  124. // interval.add(-1);//não possui registrador
  125. //
  126. // intervals.get(var).add(interval);
  127. //
  128. // return interval;
  129. // }
  130. //
  131. // /**
  132. // * Verifica se a variavel possui um registrador associado na a um intervalo
  133. // *
  134. // * @param line
  135. // * @param var
  136. // * @return
  137. // * @throws java.lang.Exception
  138. // */
  139. // public boolean alive(int line, String var) throws Exception {
  140. //// return !dead(line, var);
  141. //// return vars.get(var).last() >= line;
  142. // interval = interval(line, var);
  143. // return interval.get(2) >= 0;
  144. // }
  145. //
  146. // protected boolean dead(int line, String var) throws Exception {
  147. // if (!vars.containsKey(var)) {
  148. // throw new Exception("Var '" + var + "' not found!");
  149. // }
  150. // return vars.get(var).last() < line;
  151. // }
  152. //
  153. // protected ArrayList<ArrayList<Integer>> intervals(int line, int regb, int rege) {
  154. //
  155. // for (Map.Entry<String, ArrayList<ArrayList<Integer>>> entry : intervals.entrySet()) {
  156. // String string = entry.getKey();
  157. //// Ocorrence ocorrence = entry.getValue();
  158. //
  159. // }
  160. //
  161. // return null;
  162. // }
  163. //
  164. // protected ArrayList<Integer> interval(int line, String var) {
  165. //
  166. // if (!intervals.containsKey(var)) {
  167. // intervals.put(var, new ArrayList<ArrayList<Integer>>());
  168. // return newInterval(line, var);
  169. // }
  170. // /*Verifica se o intervalo existe*/
  171. // ArrayList<ArrayList<Integer>> itens = intervals.get(var);
  172. // ArrayList<Integer> i;
  173. // for (int count = itens.size() - 1; count >= 0; count--) {
  174. // i = itens.get(count);
  175. //
  176. // if (line >= i.get(0) && line <= i.get(1)) {
  177. // return i;
  178. // }
  179. // }
  180. //
  181. //
  182. // /*Cria o intervalo caso não exista */
  183. // return newInterval(line, var);
  184. //
  185. // }
  186. //
  187. // protected int coust(int line, String var) throws Exception {
  188. // if (!vars.containsKey(var)) {
  189. // throw new Exception("[Coust] Var '" + var + "' not found!");
  190. // }
  191. // return vars.get(var).nextOcorrenceAfter(line);
  192. // }
  193. //
  194. // protected Integer swap(int line, String var) throws Exception {
  195. //// int[] result = {0, -1};
  196. //
  197. //// Integer reg = free(regType(var), true, line);
  198. ////
  199. //// if (reg != null) {
  200. //// result[0] = 1;
  201. //// result[1] = reg;
  202. //// }
  203. // return free(regType(var), true, line, var);
  204. // /*Verifica se existe alguma variavel que não possui mais ocorrencia apos a linha atual.
  205. // * Retorno é um vetor de inteiros. o primeiro indice indica se encontrou ou não e o segundo
  206. // * é o valor do registrador.
  207. // */ // int[] result = ;
  208. // // Integer reg = null;
  209. // // if (result[0] == 0) {
  210. // // /*Se não encontrou um registrador disponivel forca a troca*/
  211. // // reg = swapRegister;
  212. // // } else {
  213. // // reg = result[1];
  214. // // }
  215. // }
  216. //
  217. // protected Integer assign(int line, String var) throws Exception {
  218. // return free(regType(var), false, line, var);
  219. // }
  220. //
  221. // protected Integer free(String base, boolean recicle, int line, String var) throws Exception {
  222. // int start, end;
  223. //
  224. // switch (base) {
  225. // case "v":
  226. // start = 2;
  227. // end = 3;
  228. // break;
  229. // case "a":
  230. // start = 4;
  231. // end = 7;
  232. // break;
  233. // case "s":
  234. // start = 16;
  235. // end = 23;
  236. // break;
  237. // case "k":
  238. // start = 26;
  239. // end = 27;
  240. // break;
  241. // case "t":
  242. // Integer result = free(8, 15, recicle, line, var);
  243. // if (result == null) {
  244. // result = free(24, 25, recicle, line, var);
  245. // }
  246. // return result;
  247. //
  248. // default:
  249. // throw new Exception("Register type " + base + " not defined!");
  250. // }
  251. //
  252. // return free(start, end, recicle, line, var);
  253. // }
  254. //
  255. // protected Integer recicle(int begin, int end, int line, String var) throws Exception {
  256. // int[] result = {0, 0};
  257. // int limit = 0, coust;
  258. // return 1;
  259. //
  260. //// ArrayList<Integer> lowCoust;
  261. ////
  262. ////// for (int reg = begin; reg <= end; reg++) {
  263. //// try {
  264. ////
  265. //// for (ArrayList<Integer> interval : intervals(line, begin, end)) {
  266. ////
  267. //// }
  268. ////
  269. //// } catch (DeadInterval e) {
  270. //// return e.getRegister();
  271. //// }
  272. //////
  273. ////// if (dead(line, var)) {
  274. ////// return interval.get(2);
  275. ////// }
  276. ////
  277. ////// var = regAssigns.get(reg + "." + line);
  278. //////
  279. //////
  280. //////
  281. ////// coust = coust(line, var);
  282. //////
  283. ////// if (coust > limit) {
  284. ////// limit = coust;
  285. ////// swapRegister = reg;
  286. ////// }
  287. // }
  288. //
  289. // protected Integer free(int begin, int end, boolean recicle, int line, String var) throws Exception {
  290. //
  291. // if (recicle) {
  292. // return recicle(begin, end, line, var);
  293. // }
  294. //
  295. // for (int i = begin; i <= end; i++) {
  296. // if (!registers.get(i)) {
  297. // registers.set(i, true);
  298. // return i;
  299. // }
  300. // }
  301. //
  302. // return null;
  303. // }
  304. //
  305. // protected String regType(String var) throws Exception {
  306. // var = var.replace("*", "")
  307. // .replace("&", "")
  308. // .substring(0, 2);
  309. //
  310. // switch (var) {
  311. // case "_T":
  312. // case "_C":
  313. // return "t";
  314. // case "_I":
  315. // case "_V":
  316. // case "_P":
  317. // case "_Y":
  318. // case "_X":
  319. // case "_G":
  320. // return "s";
  321. // case "_A":
  322. // return "a";
  323. // }
  324. // throw new Exception("Invalid label '" + var + "'!");
  325. // }
  326. //
  327. // protected void initRegisters() {
  328. // for (int i = 0; i < registerCount; i++) {
  329. // registers.add(false);
  330. // }
  331. // //Zero
  332. // labels.add("zero");
  333. // //Assembler
  334. // labels.add("$at");
  335. // //Returns
  336. // labels.add("$v0");
  337. // labels.add("$v1");
  338. // //Arguments
  339. // labels.add("$a0");
  340. // labels.add("$a1");
  341. // labels.add("$a2");
  342. // labels.add("$a3");
  343. // //Temporary
  344. // labels.add("$t0");
  345. // labels.add("$t1");
  346. // labels.add("$t2");
  347. // labels.add("$t3");
  348. // labels.add("$t4");
  349. // labels.add("$t5");
  350. // labels.add("$t6");
  351. // labels.add("$t7");
  352. // //Saved
  353. // labels.add("$s0");
  354. // labels.add("$s1");
  355. // labels.add("$s2");
  356. // labels.add("$s3");
  357. // labels.add("$s4");
  358. // labels.add("$s5");
  359. // labels.add("$s6");
  360. // labels.add("$s7");
  361. // //Temporary
  362. // labels.add("$t8");
  363. // labels.add("$t9");
  364. // //Kernel
  365. // labels.add("$k0");
  366. // labels.add("$k1");
  367. // //Stack control
  368. // labels.add("$gp");
  369. // labels.add("$sp");
  370. // labels.add("$fp");
  371. // //Return address
  372. // labels.add("$ra");
  373. // }
  374. //
  375. //}