@designliquido/delegua 1.26.0 → 1.26.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/analisador-semantico/analisador-semantico.d.ts +4 -1
  2. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  3. package/analisador-semantico/analisador-semantico.js +36 -8
  4. package/analisador-semantico/analisador-semantico.js.map +1 -1
  5. package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts.map +1 -1
  6. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +11 -12
  7. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
  8. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  9. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +14 -12
  10. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  11. package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.d.ts.map +1 -1
  12. package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.js +5 -3
  13. package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.js.map +1 -1
  14. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
  15. package/bibliotecas/dialetos/pitugues/biblioteca-global.js +1 -1
  16. package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
  17. package/bibliotecas/dialetos/pitugues/primitivas-dicionario.js +3 -3
  18. package/bibliotecas/dialetos/pitugues/primitivas-dicionario.js.map +1 -1
  19. package/bibliotecas/dialetos/pitugues/primitivas-numero.js +8 -8
  20. package/bibliotecas/dialetos/pitugues/primitivas-numero.js.map +1 -1
  21. package/bibliotecas/dialetos/pitugues/primitivas-texto.js +22 -22
  22. package/bibliotecas/dialetos/pitugues/primitivas-texto.js.map +1 -1
  23. package/bibliotecas/dialetos/pitugues/primitivas-vetor.d.ts.map +1 -1
  24. package/bibliotecas/dialetos/pitugues/primitivas-vetor.js +16 -16
  25. package/bibliotecas/dialetos/pitugues/primitivas-vetor.js.map +1 -1
  26. package/bin/package.json +2 -2
  27. package/excecoes/index.d.ts +1 -0
  28. package/excecoes/index.d.ts.map +1 -1
  29. package/excecoes/index.js +1 -0
  30. package/excecoes/index.js.map +1 -1
  31. package/excecoes/mensagem-erro.d.ts +17 -0
  32. package/excecoes/mensagem-erro.d.ts.map +1 -0
  33. package/excecoes/mensagem-erro.js +31 -0
  34. package/excecoes/mensagem-erro.js.map +1 -0
  35. package/interpretador/depuracao/avaliador-expressao-depuracao.d.ts.map +1 -1
  36. package/interpretador/depuracao/avaliador-expressao-depuracao.js +2 -1
  37. package/interpretador/depuracao/avaliador-expressao-depuracao.js.map +1 -1
  38. package/interpretador/depuracao/comum.d.ts.map +1 -1
  39. package/interpretador/depuracao/comum.js +6 -1
  40. package/interpretador/depuracao/comum.js.map +1 -1
  41. package/interpretador/dialetos/pitugues/comum.d.ts +3 -3
  42. package/interpretador/dialetos/pitugues/comum.d.ts.map +1 -1
  43. package/interpretador/dialetos/pitugues/comum.js +18 -4
  44. package/interpretador/dialetos/pitugues/comum.js.map +1 -1
  45. package/interpretador/dialetos/pitugues/interpretador-pitugues.js +2 -2
  46. package/interpretador/dialetos/pitugues/interpretador-pitugues.js.map +1 -1
  47. package/interpretador/interpretador-base.d.ts.map +1 -1
  48. package/interpretador/interpretador-base.js +2 -1
  49. package/interpretador/interpretador-base.js.map +1 -1
  50. package/interpretador/interpretador.js +3 -3
  51. package/interpretador/interpretador.js.map +1 -1
  52. package/lexador/lexador.d.ts.map +1 -1
  53. package/lexador/lexador.js.map +1 -1
  54. package/package.json +2 -2
  55. package/tipos-de-dados/dialetos/pitugues.d.ts +0 -4
  56. package/tipos-de-dados/dialetos/pitugues.d.ts.map +1 -1
  57. package/tipos-de-dados/dialetos/pitugues.js +0 -4
  58. package/tipos-de-dados/dialetos/pitugues.js.map +1 -1
  59. package/tradutores/tradutor-assembly-x64.d.ts +11 -96
  60. package/tradutores/tradutor-assembly-x64.d.ts.map +1 -1
  61. package/tradutores/tradutor-assembly-x64.js +25 -761
  62. package/tradutores/tradutor-assembly-x64.js.map +1 -1
  63. package/tradutores/tradutor-javascript.d.ts +1 -1
  64. package/tradutores/tradutor-javascript.d.ts.map +1 -1
  65. package/tradutores/tradutor-javascript.js +7 -0
  66. package/tradutores/tradutor-javascript.js.map +1 -1
  67. package/tradutores/tradutor-python.d.ts +8 -0
  68. package/tradutores/tradutor-python.d.ts.map +1 -1
  69. package/tradutores/tradutor-python.js +35 -4
  70. package/tradutores/tradutor-python.js.map +1 -1
  71. package/tradutores/tradutor-reverso-javascript.d.ts.map +1 -1
  72. package/tradutores/tradutor-reverso-javascript.js +3 -0
  73. package/tradutores/tradutor-reverso-javascript.js.map +1 -1
  74. package/tradutores/x64/alocador-registradores.d.ts +29 -0
  75. package/tradutores/x64/alocador-registradores.d.ts.map +1 -0
  76. package/tradutores/x64/alocador-registradores.js +192 -0
  77. package/tradutores/x64/alocador-registradores.js.map +1 -0
  78. package/tradutores/x64/codegen.d.ts +43 -0
  79. package/tradutores/x64/codegen.d.ts.map +1 -0
  80. package/tradutores/x64/codegen.js +416 -0
  81. package/tradutores/x64/codegen.js.map +1 -0
  82. package/tradutores/x64/dessa.d.ts +9 -0
  83. package/tradutores/x64/dessa.d.ts.map +1 -0
  84. package/tradutores/x64/dessa.js +124 -0
  85. package/tradutores/x64/dessa.js.map +1 -0
  86. package/tradutores/x64/dominancia.d.ts +25 -0
  87. package/tradutores/x64/dominancia.d.ts.map +1 -0
  88. package/tradutores/x64/dominancia.js +129 -0
  89. package/tradutores/x64/dominancia.js.map +1 -0
  90. package/tradutores/x64/ir.d.ts +144 -0
  91. package/tradutores/x64/ir.d.ts.map +1 -0
  92. package/tradutores/x64/ir.js +44 -0
  93. package/tradutores/x64/ir.js.map +1 -0
  94. package/tradutores/x64/liveness.d.ts +12 -0
  95. package/tradutores/x64/liveness.d.ts.map +1 -0
  96. package/tradutores/x64/liveness.js +159 -0
  97. package/tradutores/x64/liveness.js.map +1 -0
  98. package/tradutores/x64/lowering.d.ts +7 -0
  99. package/tradutores/x64/lowering.d.ts.map +1 -0
  100. package/tradutores/x64/lowering.js +904 -0
  101. package/tradutores/x64/lowering.js.map +1 -0
  102. package/tradutores/x64/ssa.d.ts +9 -0
  103. package/tradutores/x64/ssa.d.ts.map +1 -0
  104. package/tradutores/x64/ssa.js +170 -0
  105. package/tradutores/x64/ssa.js.map +1 -0
  106. package/tradutores/x64/tipos-x64.d.ts +12 -0
  107. package/tradutores/x64/tipos-x64.d.ts.map +1 -0
  108. package/tradutores/x64/tipos-x64.js +59 -0
  109. package/tradutores/x64/tipos-x64.js.map +1 -0
  110. package/umd/delegua.js +6053 -4480
@@ -0,0 +1,29 @@
1
+ import { IRFuncao } from './ir';
2
+ export type Alocacao = {
3
+ tipo: 'registrador';
4
+ fisico: string;
5
+ } | {
6
+ tipo: 'pilha';
7
+ offsetBytes: number;
8
+ };
9
+ export interface ResultadoAlocacao {
10
+ alocacao: Map<string, Alocacao>;
11
+ /** Bytes de pilha reservados só para slots de spill (função ainda soma vetores locais por cima). */
12
+ tamanhoSpillBytes: number;
13
+ }
14
+ /**
15
+ * Aloca registradores por coloração de grafo (Chaitin: simplifica removendo nós de grau
16
+ * < k, desempata heurística de spill pelo maior grau, depois seleciona cores na ordem
17
+ * inversa da pilha de simplificação).
18
+ *
19
+ * Simplificação deliberada em relação ao Chaitin-Briggs "clássico": um nó que não
20
+ * consegue cor na seleção não gera reescrita do IR com nova ronda de vivacidade — ele é
21
+ * marcado como residente em memória (`pilha`) permanentemente. Como valores em memória
22
+ * nunca ocupam a paleta, eles não geram pressão de registrador nenhuma, e o
23
+ * carregamento/gravação em torno de cada uso/definição é sintetizado depois, direto no
24
+ * codegen, usando os escradores rax/rdx (sempre reservados, fora da paleta). Isso evita
25
+ * o laço iterativo clássico de reescrita+recoloração mantendo a alocação corretamente
26
+ * livre de conflitos.
27
+ */
28
+ export declare function alocarRegistradores(funcao: IRFuncao, paleta: string[]): ResultadoAlocacao;
29
+ //# sourceMappingURL=alocador-registradores.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alocador-registradores.d.ts","sourceRoot":"","sources":["../../../fontes/tradutores/x64/alocador-registradores.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAW,MAAM,MAAM,CAAC;AAEzC,MAAM,MAAM,QAAQ,GACd;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,oGAAoG;IACpG,iBAAiB,EAAE,MAAM,CAAC;CAC7B;AAuGD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,CA4EzF"}
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.alocarRegistradores = alocarRegistradores;
4
+ const liveness_1 = require("./liveness");
5
+ function usosEDstDoValor(valor, saida) {
6
+ if (valor.classe === 'registrador')
7
+ saida.add(valor.nome);
8
+ }
9
+ /**
10
+ * Constrói o grafo de interferência de `funcao` (já em SSA) varrendo cada bloco de trás
11
+ * para frente a partir de liveOut, no estilo clássico (Appel, "Modern Compiler
12
+ * Implementation"). Phis são tratados como definições paralelas no topo do bloco: cada
13
+ * phi.dst interfere com liveIn(bloco) e com os demais phis do mesmo bloco.
14
+ */
15
+ function construirGrafoInterferencia(funcao) {
16
+ const vivacidade = (0, liveness_1.analisarVivacidade)(funcao);
17
+ const grafo = new Map();
18
+ function no(nome) {
19
+ if (!grafo.has(nome))
20
+ grafo.set(nome, new Set());
21
+ return grafo.get(nome);
22
+ }
23
+ function ligar(a, b) {
24
+ if (a === b)
25
+ return;
26
+ no(a).add(b);
27
+ no(b).add(a);
28
+ }
29
+ for (const [blocoId, bloco] of funcao.blocos) {
30
+ const vivacidadeBloco = vivacidade.get(blocoId);
31
+ const live = new Set(vivacidadeBloco.liveOut);
32
+ for (let i = bloco.instrucoes.length - 1; i >= 0; i--) {
33
+ const instrucao = bloco.instrucoes[i];
34
+ let dst = null;
35
+ if (instrucao.op === 'const' ||
36
+ instrucao.op === 'copia' ||
37
+ instrucao.op === 'bin' ||
38
+ instrucao.op === 'neg' ||
39
+ instrucao.op === 'nao' ||
40
+ instrucao.op === 'enderecoRotulo' ||
41
+ instrucao.op === 'carregarGlobal' ||
42
+ instrucao.op === 'indiceLer') {
43
+ dst = instrucao.dst;
44
+ }
45
+ else if (instrucao.op === 'chamada') {
46
+ dst = instrucao.dst;
47
+ }
48
+ if (dst) {
49
+ no(dst);
50
+ for (const outro of live)
51
+ ligar(dst, outro);
52
+ live.delete(dst);
53
+ }
54
+ const usos = new Set();
55
+ switch (instrucao.op) {
56
+ case 'copia':
57
+ usosEDstDoValor(instrucao.src, usos);
58
+ break;
59
+ case 'bin':
60
+ usosEDstDoValor(instrucao.esquerda, usos);
61
+ usosEDstDoValor(instrucao.direita, usos);
62
+ break;
63
+ case 'neg':
64
+ case 'nao':
65
+ usosEDstDoValor(instrucao.src, usos);
66
+ break;
67
+ case 'indiceLer':
68
+ usosEDstDoValor(instrucao.indice, usos);
69
+ break;
70
+ case 'indiceEscrever':
71
+ usosEDstDoValor(instrucao.indice, usos);
72
+ usosEDstDoValor(instrucao.valor, usos);
73
+ break;
74
+ case 'armazenarGlobal':
75
+ usosEDstDoValor(instrucao.valor, usos);
76
+ break;
77
+ case 'chamada':
78
+ for (const argumento of instrucao.argumentos)
79
+ usosEDstDoValor(argumento, usos);
80
+ break;
81
+ case 'imprimirNumero':
82
+ usosEDstDoValor(instrucao.valor, usos);
83
+ break;
84
+ default:
85
+ break;
86
+ }
87
+ for (const reg of usos)
88
+ live.add(reg);
89
+ }
90
+ for (let i = 0; i < bloco.phis.length; i++) {
91
+ const phi = bloco.phis[i];
92
+ no(phi.dst);
93
+ for (const outro of live)
94
+ ligar(phi.dst, outro);
95
+ for (let j = 0; j < bloco.phis.length; j++) {
96
+ if (i !== j)
97
+ ligar(phi.dst, bloco.phis[j].dst);
98
+ }
99
+ }
100
+ }
101
+ return grafo;
102
+ }
103
+ /**
104
+ * Aloca registradores por coloração de grafo (Chaitin: simplifica removendo nós de grau
105
+ * < k, desempata heurística de spill pelo maior grau, depois seleciona cores na ordem
106
+ * inversa da pilha de simplificação).
107
+ *
108
+ * Simplificação deliberada em relação ao Chaitin-Briggs "clássico": um nó que não
109
+ * consegue cor na seleção não gera reescrita do IR com nova ronda de vivacidade — ele é
110
+ * marcado como residente em memória (`pilha`) permanentemente. Como valores em memória
111
+ * nunca ocupam a paleta, eles não geram pressão de registrador nenhuma, e o
112
+ * carregamento/gravação em torno de cada uso/definição é sintetizado depois, direto no
113
+ * codegen, usando os escradores rax/rdx (sempre reservados, fora da paleta). Isso evita
114
+ * o laço iterativo clássico de reescrita+recoloração mantendo a alocação corretamente
115
+ * livre de conflitos.
116
+ */
117
+ function alocarRegistradores(funcao, paleta) {
118
+ const grafo = construirGrafoInterferencia(funcao);
119
+ const grauAtual = new Map();
120
+ for (const [no, vizinhos] of grafo)
121
+ grauAtual.set(no, vizinhos.size);
122
+ const removidos = new Set();
123
+ const pilha = [];
124
+ const todosOsNos = [...grafo.keys()];
125
+ function grauEfetivo(no) {
126
+ let grau = 0;
127
+ for (const vizinho of grafo.get(no)) {
128
+ if (!removidos.has(vizinho))
129
+ grau++;
130
+ }
131
+ return grau;
132
+ }
133
+ while (removidos.size < todosOsNos.length) {
134
+ let escolhido = null;
135
+ for (const no of todosOsNos) {
136
+ if (removidos.has(no))
137
+ continue;
138
+ if (grauEfetivo(no) < paleta.length) {
139
+ escolhido = no;
140
+ break;
141
+ }
142
+ }
143
+ if (!escolhido) {
144
+ let maiorGrau = -1;
145
+ for (const no of todosOsNos) {
146
+ if (removidos.has(no))
147
+ continue;
148
+ const grau = grauEfetivo(no);
149
+ if (grau > maiorGrau) {
150
+ maiorGrau = grau;
151
+ escolhido = no;
152
+ }
153
+ }
154
+ }
155
+ if (!escolhido)
156
+ break;
157
+ pilha.push(escolhido);
158
+ removidos.add(escolhido);
159
+ }
160
+ const corPorNo = new Map();
161
+ const spilled = new Set();
162
+ while (pilha.length > 0) {
163
+ const no = pilha.pop();
164
+ const coresVizinhas = new Set();
165
+ for (const vizinho of grafo.get(no)) {
166
+ const cor = corPorNo.get(vizinho);
167
+ if (cor)
168
+ coresVizinhas.add(cor);
169
+ }
170
+ const disponivel = paleta.find((cor) => !coresVizinhas.has(cor));
171
+ if (disponivel) {
172
+ corPorNo.set(no, disponivel);
173
+ }
174
+ else {
175
+ spilled.add(no);
176
+ }
177
+ }
178
+ const alocacao = new Map();
179
+ let proximoSlot = 0;
180
+ for (const no of todosOsNos) {
181
+ const cor = corPorNo.get(no);
182
+ if (cor) {
183
+ alocacao.set(no, { tipo: 'registrador', fisico: cor });
184
+ }
185
+ else {
186
+ proximoSlot++;
187
+ alocacao.set(no, { tipo: 'pilha', offsetBytes: -8 * proximoSlot });
188
+ }
189
+ }
190
+ return { alocacao, tamanhoSpillBytes: 8 * proximoSlot };
191
+ }
192
+ //# sourceMappingURL=alocador-registradores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alocador-registradores.js","sourceRoot":"","sources":["../../../fontes/tradutores/x64/alocador-registradores.ts"],"names":[],"mappings":";;AAgIA,kDA4EC;AA5MD,yCAAgD;AAahD,SAAS,eAAe,CAAC,KAAc,EAAE,KAAkB;IACvD,IAAI,KAAK,CAAC,MAAM,KAAK,aAAa;QAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,SAAS,2BAA2B,CAAC,MAAgB;IACjD,MAAM,UAAU,GAAG,IAAA,6BAAkB,EAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE7C,SAAS,EAAE,CAAC,IAAY;QACpB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACjD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;IAC5B,CAAC;IAED,SAAS,KAAK,CAAC,CAAS,EAAE,CAAS;QAC/B,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO;QACpB,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACb,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC3C,MAAM,eAAe,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAE9C,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACpD,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,GAAG,GAAkB,IAAI,CAAC;YAC9B,IACI,SAAS,CAAC,EAAE,KAAK,OAAO;gBACxB,SAAS,CAAC,EAAE,KAAK,OAAO;gBACxB,SAAS,CAAC,EAAE,KAAK,KAAK;gBACtB,SAAS,CAAC,EAAE,KAAK,KAAK;gBACtB,SAAS,CAAC,EAAE,KAAK,KAAK;gBACtB,SAAS,CAAC,EAAE,KAAK,gBAAgB;gBACjC,SAAS,CAAC,EAAE,KAAK,gBAAgB;gBACjC,SAAS,CAAC,EAAE,KAAK,WAAW,EAC9B,CAAC;gBACC,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;YACxB,CAAC;iBAAM,IAAI,SAAS,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;gBACpC,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;YACxB,CAAC;YAED,IAAI,GAAG,EAAE,CAAC;gBACN,EAAE,CAAC,GAAG,CAAC,CAAC;gBACR,KAAK,MAAM,KAAK,IAAI,IAAI;oBAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC5C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAC/B,QAAQ,SAAS,CAAC,EAAE,EAAE,CAAC;gBACnB,KAAK,OAAO;oBACR,eAAe,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBACrC,MAAM;gBACV,KAAK,KAAK;oBACN,eAAe,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;oBAC1C,eAAe,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;oBACzC,MAAM;gBACV,KAAK,KAAK,CAAC;gBACX,KAAK,KAAK;oBACN,eAAe,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBACrC,MAAM;gBACV,KAAK,WAAW;oBACZ,eAAe,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;oBACxC,MAAM;gBACV,KAAK,gBAAgB;oBACjB,eAAe,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;oBACxC,eAAe,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBACvC,MAAM;gBACV,KAAK,iBAAiB;oBAClB,eAAe,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBACvC,MAAM;gBACV,KAAK,SAAS;oBACV,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,UAAU;wBAAE,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;oBAC/E,MAAM;gBACV,KAAK,gBAAgB;oBACjB,eAAe,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBACvC,MAAM;gBACV;oBACI,MAAM;YACd,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,IAAI;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1B,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACZ,KAAK,MAAM,KAAK,IAAI,IAAI;gBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,IAAI,CAAC,KAAK,CAAC;oBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACnD,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAgB,mBAAmB,CAAC,MAAgB,EAAE,MAAgB;IAClE,MAAM,KAAK,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,KAAK;QAAE,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAErE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAErC,SAAS,WAAW,CAAC,EAAU;QAC3B,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAE,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,IAAI,EAAE,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,SAAS,CAAC,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;QACxC,IAAI,SAAS,GAAkB,IAAI,CAAC;QAEpC,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC1B,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,SAAS;YAChC,IAAI,WAAW,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,SAAS,GAAG,EAAE,CAAC;gBACf,MAAM;YACV,CAAC;QACL,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;YACnB,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;gBAC1B,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;oBAAE,SAAS;gBAChC,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;gBAC7B,IAAI,IAAI,GAAG,SAAS,EAAE,CAAC;oBACnB,SAAS,GAAG,IAAI,CAAC;oBACjB,SAAS,GAAG,EAAE,CAAC;gBACnB,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,CAAC,SAAS;YAAE,MAAM;QACtB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QACxB,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QACxC,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAE,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,GAAG;gBAAE,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,IAAI,UAAU,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,GAAG,EAAE,CAAC;YACN,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACJ,WAAW,EAAE,CAAC;YACd,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,GAAG,WAAW,EAAE,CAAC,CAAC;QACvE,CAAC;IACL,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { Alocacao } from './alocador-registradores';
2
+ import { IRFuncao, IRPrograma } from './ir';
3
+ export type PlataformaAlvo = 'linux' | 'windows';
4
+ export interface FuncaoProcessada {
5
+ funcao: IRFuncao;
6
+ alocacao: Map<string, Alocacao>;
7
+ }
8
+ /**
9
+ * Gera NASM a partir do IR já processado (SSA destruída, com alocação de registradores).
10
+ * Quadro de pilha de cada função real, de cima (perto de rbp) para baixo:
11
+ * 1) área de salvamento dos registradores callee-saved usados pela paleta (a função,
12
+ * como "callee", é responsável por preservá-los perante quem a chamou);
13
+ * 2) slots de spill decididos pelo alocador de registradores;
14
+ * 3) vetores de tamanho fixo locais à função.
15
+ * `_start`/`main` (o "principal" implícito) não tem quem preservar registradores para —
16
+ * ninguém retorna para ele — então pula a área (1).
17
+ */
18
+ export declare class CodegenX64 {
19
+ private alvo;
20
+ private paleta;
21
+ private linhas;
22
+ /** Deslocamento (negativo) onde começam spills/vetores da função atual, abaixo da área de registradores salvos. */
23
+ private deslocamentoBase;
24
+ constructor(alvo: PlataformaAlvo, paleta: string[]);
25
+ gerar(programa: IRPrograma, funcoes: FuncaoProcessada[]): string;
26
+ private rotuloDoBloco;
27
+ private resolverOperando;
28
+ private armazenar;
29
+ private enderecoBaseArranjo;
30
+ private gerarInstrucao;
31
+ private gerarBinario;
32
+ private gerarEnderecoIndice;
33
+ private gerarTerminador;
34
+ private gerarSaidaDoPrograma;
35
+ /** Offsets (relativos a rbp) dos vetores locais, logo abaixo dos slots de spill (que começam em `deslocamentoBase`). */
36
+ private calcularOffsetsArranjosLocais;
37
+ private gerarFuncaoPrincipal;
38
+ private gerarFuncao;
39
+ private tamanhoSpillBytes;
40
+ private gerarBlocosSemRotuloEntrada;
41
+ private gerarHelperImprimirNumero;
42
+ }
43
+ //# sourceMappingURL=codegen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../../fontes/tradutores/x64/codegen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAW,QAAQ,EAAe,UAAU,EAAW,MAAM,MAAM,CAAC;AAE3E,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,SAAS,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,QAAQ,CAAC;IACjB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CACnC;AAmBD;;;;;;;;;GASG;AACH,qBAAa,UAAU;IAMf,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,MAAM;IANlB,OAAO,CAAC,MAAM,CAAgB;IAC9B,mHAAmH;IACnH,OAAO,CAAC,gBAAgB,CAAK;gBAGjB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,MAAM,EAAE;IAG5B,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM;IA8ChE,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,cAAc;IAmGtB,OAAO,CAAC,YAAY;IA0DpB,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,eAAe;IA+BvB,OAAO,CAAC,oBAAoB;IAW5B,wHAAwH;IACxH,OAAO,CAAC,6BAA6B;IAUrC,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,2BAA2B;IAiBnC,OAAO,CAAC,yBAAyB;CA8BpC"}