@designliquido/delegua 1.26.2 → 1.27.0

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 (95) hide show
  1. package/README.md +7 -3
  2. package/avaliador-sintatico/avaliador-sintatico.d.ts +25 -0
  3. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  4. package/avaliador-sintatico/avaliador-sintatico.js +95 -6
  5. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  6. package/bin/package.json +1 -1
  7. package/interfaces/simbolo-interface.d.ts +1 -0
  8. package/interfaces/simbolo-interface.d.ts.map +1 -1
  9. package/interpretador/interpretador.d.ts +1 -1
  10. package/interpretador/interpretador.d.ts.map +1 -1
  11. package/interpretador/interpretador.js +12 -3
  12. package/interpretador/interpretador.js.map +1 -1
  13. package/lexador/lexador-base.d.ts +1 -1
  14. package/lexador/lexador-base.d.ts.map +1 -1
  15. package/lexador/lexador-base.js +2 -2
  16. package/lexador/lexador-base.js.map +1 -1
  17. package/lexador/lexador.d.ts +1 -1
  18. package/lexador/lexador.d.ts.map +1 -1
  19. package/lexador/lexador.js +3 -3
  20. package/lexador/lexador.js.map +1 -1
  21. package/lexador/simbolo.d.ts +2 -1
  22. package/lexador/simbolo.d.ts.map +1 -1
  23. package/lexador/simbolo.js +2 -1
  24. package/lexador/simbolo.js.map +1 -1
  25. package/package.json +1 -1
  26. package/tradutores/index.d.ts +0 -4
  27. package/tradutores/index.d.ts.map +1 -1
  28. package/tradutores/index.js +0 -4
  29. package/tradutores/index.js.map +1 -1
  30. package/tradutores/tradutor-elixir.d.ts +17 -0
  31. package/tradutores/tradutor-elixir.d.ts.map +1 -1
  32. package/tradutores/tradutor-elixir.js +82 -2
  33. package/tradutores/tradutor-elixir.js.map +1 -1
  34. package/tradutores/tradutor-javascript.d.ts.map +1 -1
  35. package/tradutores/tradutor-javascript.js +5 -0
  36. package/tradutores/tradutor-javascript.js.map +1 -1
  37. package/tradutores/tradutor-python.d.ts.map +1 -1
  38. package/tradutores/tradutor-python.js +5 -0
  39. package/tradutores/tradutor-python.js.map +1 -1
  40. package/tradutores/tradutor-ruby.d.ts.map +1 -1
  41. package/tradutores/tradutor-ruby.js +5 -0
  42. package/tradutores/tradutor-ruby.js.map +1 -1
  43. package/umd/delegua.js +457 -4800
  44. package/tradutores/tradutor-assembly-arm.d.ts +0 -98
  45. package/tradutores/tradutor-assembly-arm.d.ts.map +0 -1
  46. package/tradutores/tradutor-assembly-arm.js +0 -711
  47. package/tradutores/tradutor-assembly-arm.js.map +0 -1
  48. package/tradutores/tradutor-assembly-risc-v.d.ts +0 -100
  49. package/tradutores/tradutor-assembly-risc-v.d.ts.map +0 -1
  50. package/tradutores/tradutor-assembly-risc-v.js +0 -688
  51. package/tradutores/tradutor-assembly-risc-v.js.map +0 -1
  52. package/tradutores/tradutor-assembly-x64.d.ts +0 -17
  53. package/tradutores/tradutor-assembly-x64.d.ts.map +0 -1
  54. package/tradutores/tradutor-assembly-x64.js +0 -38
  55. package/tradutores/tradutor-assembly-x64.js.map +0 -1
  56. package/tradutores/tradutor-webassembly.d.ts +0 -159
  57. package/tradutores/tradutor-webassembly.d.ts.map +0 -1
  58. package/tradutores/tradutor-webassembly.js +0 -886
  59. package/tradutores/tradutor-webassembly.js.map +0 -1
  60. package/tradutores/x64/alocador-registradores.d.ts +0 -29
  61. package/tradutores/x64/alocador-registradores.d.ts.map +0 -1
  62. package/tradutores/x64/alocador-registradores.js +0 -192
  63. package/tradutores/x64/alocador-registradores.js.map +0 -1
  64. package/tradutores/x64/codegen.d.ts +0 -43
  65. package/tradutores/x64/codegen.d.ts.map +0 -1
  66. package/tradutores/x64/codegen.js +0 -416
  67. package/tradutores/x64/codegen.js.map +0 -1
  68. package/tradutores/x64/dessa.d.ts +0 -9
  69. package/tradutores/x64/dessa.d.ts.map +0 -1
  70. package/tradutores/x64/dessa.js +0 -124
  71. package/tradutores/x64/dessa.js.map +0 -1
  72. package/tradutores/x64/dominancia.d.ts +0 -25
  73. package/tradutores/x64/dominancia.d.ts.map +0 -1
  74. package/tradutores/x64/dominancia.js +0 -129
  75. package/tradutores/x64/dominancia.js.map +0 -1
  76. package/tradutores/x64/ir.d.ts +0 -144
  77. package/tradutores/x64/ir.d.ts.map +0 -1
  78. package/tradutores/x64/ir.js +0 -44
  79. package/tradutores/x64/ir.js.map +0 -1
  80. package/tradutores/x64/liveness.d.ts +0 -12
  81. package/tradutores/x64/liveness.d.ts.map +0 -1
  82. package/tradutores/x64/liveness.js +0 -159
  83. package/tradutores/x64/liveness.js.map +0 -1
  84. package/tradutores/x64/lowering.d.ts +0 -7
  85. package/tradutores/x64/lowering.d.ts.map +0 -1
  86. package/tradutores/x64/lowering.js +0 -904
  87. package/tradutores/x64/lowering.js.map +0 -1
  88. package/tradutores/x64/ssa.d.ts +0 -9
  89. package/tradutores/x64/ssa.d.ts.map +0 -1
  90. package/tradutores/x64/ssa.js +0 -170
  91. package/tradutores/x64/ssa.js.map +0 -1
  92. package/tradutores/x64/tipos-x64.d.ts +0 -12
  93. package/tradutores/x64/tipos-x64.d.ts.map +0 -1
  94. package/tradutores/x64/tipos-x64.js +0 -59
  95. package/tradutores/x64/tipos-x64.js.map +0 -1
@@ -1,416 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CodegenX64 = void 0;
4
- const dominancia_1 = require("./dominancia");
5
- const ESCRATCH_A = 'rax';
6
- const ESCRATCH_B = 'r11';
7
- const ESCRATCH_ENDERECO = 'rdx';
8
- function registradoresAbi(alvo) {
9
- return alvo === 'linux' ? ['rdi', 'rsi', 'rdx', 'rcx', 'r8', 'r9'] : ['rcx', 'rdx', 'r8', 'r9'];
10
- }
11
- function escaparTextoNasm(valor) {
12
- const partes = valor.split("'");
13
- return partes.map((parte) => `'${parte}'`).join(', 39, ');
14
- }
15
- function textoOffset(offset) {
16
- return offset >= 0 ? `+${offset}` : `${offset}`;
17
- }
18
- /**
19
- * Gera NASM a partir do IR já processado (SSA destruída, com alocação de registradores).
20
- * Quadro de pilha de cada função real, de cima (perto de rbp) para baixo:
21
- * 1) área de salvamento dos registradores callee-saved usados pela paleta (a função,
22
- * como "callee", é responsável por preservá-los perante quem a chamou);
23
- * 2) slots de spill decididos pelo alocador de registradores;
24
- * 3) vetores de tamanho fixo locais à função.
25
- * `_start`/`main` (o "principal" implícito) não tem quem preservar registradores para —
26
- * ninguém retorna para ele — então pula a área (1).
27
- */
28
- class CodegenX64 {
29
- constructor(alvo, paleta) {
30
- this.alvo = alvo;
31
- this.paleta = paleta;
32
- this.linhas = [];
33
- /** Deslocamento (negativo) onde começam spills/vetores da função atual, abaixo da área de registradores salvos. */
34
- this.deslocamentoBase = 0;
35
- }
36
- gerar(programa, funcoes) {
37
- const bss = [];
38
- const dados = [];
39
- for (const nome of programa.globaisEscalares.keys()) {
40
- bss.push(` g_${nome} resq 1`);
41
- }
42
- for (const [nome, info] of programa.globaisArranjos) {
43
- bss.push(` g_${nome} resq ${info.tamanho}`);
44
- }
45
- bss.push(' __print_buf resb 24');
46
- for (const [rotulo, texto] of programa.literaisTexto) {
47
- dados.push(` ${rotulo}: db ${escaparTextoNasm(texto)}, 0`);
48
- dados.push(` tam_${rotulo} equ $ - ${rotulo} - 1`);
49
- }
50
- if (this.alvo === 'windows') {
51
- dados.push(` __fmt_int db '%d', 10, 0`);
52
- }
53
- this.linhas = [];
54
- this.linhas.push('section .text');
55
- this.linhas.push(` ${this.alvo === 'linux' ? 'global _start' : 'global main'}`);
56
- if (this.alvo === 'windows')
57
- this.linhas.push('extern printf');
58
- const principal = funcoes.find((f) => f.funcao.ehImplicitaTopo);
59
- const outras = funcoes.filter((f) => !f.funcao.ehImplicitaTopo);
60
- this.gerarFuncaoPrincipal(principal);
61
- for (const processada of outras) {
62
- this.gerarFuncao(processada);
63
- }
64
- this.gerarHelperImprimirNumero();
65
- return ('section .bss\n' +
66
- bss.join('\n') +
67
- '\n\nsection .data\n' +
68
- dados.join('\n') +
69
- '\n\n' +
70
- this.linhas.join('\n') +
71
- '\n');
72
- }
73
- rotuloDoBloco(funcao, blocoId) {
74
- if (blocoId === funcao.blocoEntrada) {
75
- if (funcao.ehImplicitaTopo)
76
- return this.alvo === 'linux' ? '_start' : 'main';
77
- return funcao.nome;
78
- }
79
- return `${funcao.ehImplicitaTopo ? 'principal' : funcao.nome}_${blocoId}`;
80
- }
81
- resolverOperando(valor, alocacao) {
82
- switch (valor.classe) {
83
- case 'constante':
84
- if (typeof valor.valor === 'boolean')
85
- return valor.valor ? '1' : '0';
86
- return String(valor.valor);
87
- case 'registrador': {
88
- const local = alocacao.get(valor.nome);
89
- if (!local)
90
- throw new Error(`codegen: registrador '${valor.nome}' sem alocação.`);
91
- return local.tipo === 'registrador'
92
- ? local.fisico
93
- : `[rbp${textoOffset(this.deslocamentoBase + local.offsetBytes)}]`;
94
- }
95
- case 'argumentoFisico':
96
- return registradoresAbi(this.alvo)[valor.indice];
97
- case 'rotulo':
98
- return valor.nome;
99
- }
100
- }
101
- armazenar(dst, alocacao, regFisicoOrigem) {
102
- const local = alocacao.get(dst);
103
- if (!local)
104
- throw new Error(`codegen: destino '${dst}' sem alocação.`);
105
- if (local.tipo === 'registrador') {
106
- if (local.fisico !== regFisicoOrigem)
107
- this.linhas.push(` mov ${local.fisico}, ${regFisicoOrigem}`);
108
- }
109
- else {
110
- this.linhas.push(` mov [rbp${textoOffset(this.deslocamentoBase + local.offsetBytes)}], ${regFisicoOrigem}`);
111
- }
112
- }
113
- enderecoBaseArranjo(nomeArranjo, offsetsArranjosLocais) {
114
- const offsetLocal = offsetsArranjosLocais.get(nomeArranjo);
115
- if (offsetLocal !== undefined)
116
- return `rbp${textoOffset(offsetLocal)}`;
117
- return this.alvo === 'linux' ? `g_${nomeArranjo}` : `rel g_${nomeArranjo}`;
118
- }
119
- gerarInstrucao(instrucao, alocacao, offsetsArranjosLocais) {
120
- switch (instrucao.op) {
121
- case 'const':
122
- this.linhas.push(` mov ${ESCRATCH_A}, ${instrucao.valor}`);
123
- this.armazenar(instrucao.dst, alocacao, ESCRATCH_A);
124
- break;
125
- case 'copia':
126
- this.linhas.push(` mov ${ESCRATCH_A}, ${this.resolverOperando(instrucao.src, alocacao)}`);
127
- this.armazenar(instrucao.dst, alocacao, ESCRATCH_A);
128
- break;
129
- case 'bin':
130
- this.gerarBinario(instrucao, alocacao);
131
- break;
132
- case 'neg':
133
- this.linhas.push(` mov ${ESCRATCH_A}, ${this.resolverOperando(instrucao.src, alocacao)}`);
134
- this.linhas.push(` neg ${ESCRATCH_A}`);
135
- this.armazenar(instrucao.dst, alocacao, ESCRATCH_A);
136
- break;
137
- case 'nao':
138
- this.linhas.push(` mov ${ESCRATCH_A}, ${this.resolverOperando(instrucao.src, alocacao)}`);
139
- this.linhas.push(` cmp ${ESCRATCH_A}, 0`);
140
- this.linhas.push(` sete al`);
141
- this.linhas.push(` movzx ${ESCRATCH_A}, al`);
142
- this.armazenar(instrucao.dst, alocacao, ESCRATCH_A);
143
- break;
144
- case 'enderecoRotulo':
145
- if (this.alvo === 'linux') {
146
- this.linhas.push(` mov ${ESCRATCH_A}, ${instrucao.rotulo}`);
147
- }
148
- else {
149
- this.linhas.push(` lea ${ESCRATCH_A}, [rel ${instrucao.rotulo}]`);
150
- }
151
- this.armazenar(instrucao.dst, alocacao, ESCRATCH_A);
152
- break;
153
- case 'carregarGlobal':
154
- this.linhas.push(` mov ${ESCRATCH_A}, [g_${instrucao.rotulo}]`);
155
- this.armazenar(instrucao.dst, alocacao, ESCRATCH_A);
156
- break;
157
- case 'armazenarGlobal':
158
- this.linhas.push(` mov ${ESCRATCH_A}, ${this.resolverOperando(instrucao.valor, alocacao)}`);
159
- this.linhas.push(` mov [g_${instrucao.rotulo}], ${ESCRATCH_A}`);
160
- break;
161
- case 'indiceLer':
162
- this.gerarEnderecoIndice(instrucao.arranjo, instrucao.indice, alocacao, offsetsArranjosLocais);
163
- this.linhas.push(` mov ${ESCRATCH_A}, [${ESCRATCH_ENDERECO}]`);
164
- this.armazenar(instrucao.dst, alocacao, ESCRATCH_A);
165
- break;
166
- case 'indiceEscrever':
167
- this.gerarEnderecoIndice(instrucao.arranjo, instrucao.indice, alocacao, offsetsArranjosLocais);
168
- this.linhas.push(` push ${ESCRATCH_ENDERECO}`);
169
- this.linhas.push(` mov ${ESCRATCH_A}, ${this.resolverOperando(instrucao.valor, alocacao)}`);
170
- this.linhas.push(` pop ${ESCRATCH_ENDERECO}`);
171
- this.linhas.push(` mov [${ESCRATCH_ENDERECO}], ${ESCRATCH_A}`);
172
- break;
173
- case 'chamada': {
174
- const registradores = registradoresAbi(this.alvo);
175
- if (instrucao.argumentos.length > registradores.length) {
176
- throw new Error(`Chamada a '${instrucao.rotulo}' com ${instrucao.argumentos.length} argumentos excede o ` +
177
- `limite de ${registradores.length} suportado pelo tradutor para x64 (${this.alvo}).`);
178
- }
179
- instrucao.argumentos.forEach((argumento, indice) => {
180
- this.linhas.push(` mov ${registradores[indice]}, ${this.resolverOperando(argumento, alocacao)}`);
181
- });
182
- this.linhas.push(` call ${instrucao.rotulo}`);
183
- if (instrucao.dst)
184
- this.armazenar(instrucao.dst, alocacao, 'rax');
185
- break;
186
- }
187
- case 'imprimirNumero':
188
- this.linhas.push(` mov rax, ${this.resolverOperando(instrucao.valor, alocacao)}`);
189
- if (this.alvo === 'linux') {
190
- this.linhas.push(' call __delegua_print_int');
191
- }
192
- else {
193
- this.linhas.push(' mov rdx, rax');
194
- this.linhas.push(' lea rcx, [rel __fmt_int]');
195
- this.linhas.push(' call printf');
196
- }
197
- break;
198
- case 'imprimirTexto':
199
- if (this.alvo === 'linux') {
200
- this.linhas.push(` mov edx, tam_${instrucao.rotulo}`);
201
- this.linhas.push(` mov ecx, ${instrucao.rotulo}`);
202
- this.linhas.push(' mov ebx, 1');
203
- this.linhas.push(' mov eax, 4');
204
- this.linhas.push(' int 0x80');
205
- }
206
- else {
207
- this.linhas.push(` lea rcx, [rel ${instrucao.rotulo}]`);
208
- this.linhas.push(' call printf');
209
- }
210
- break;
211
- case 'lerEntradaTexto':
212
- break;
213
- }
214
- }
215
- gerarBinario(instrucao, alocacao) {
216
- this.linhas.push(` mov ${ESCRATCH_A}, ${this.resolverOperando(instrucao.esquerda, alocacao)}`);
217
- this.linhas.push(` mov ${ESCRATCH_B}, ${this.resolverOperando(instrucao.direita, alocacao)}`);
218
- switch (instrucao.operador) {
219
- case '+':
220
- this.linhas.push(` add ${ESCRATCH_A}, ${ESCRATCH_B}`);
221
- break;
222
- case '-':
223
- this.linhas.push(` sub ${ESCRATCH_A}, ${ESCRATCH_B}`);
224
- break;
225
- case '*':
226
- this.linhas.push(` imul ${ESCRATCH_A}, ${ESCRATCH_B}`);
227
- break;
228
- case '/':
229
- this.linhas.push(' cqo');
230
- this.linhas.push(` idiv ${ESCRATCH_B}`);
231
- break;
232
- case '%':
233
- this.linhas.push(' cqo');
234
- this.linhas.push(` idiv ${ESCRATCH_B}`);
235
- this.linhas.push(` mov ${ESCRATCH_A}, rdx`);
236
- break;
237
- case '<':
238
- this.linhas.push(` cmp ${ESCRATCH_A}, ${ESCRATCH_B}`);
239
- this.linhas.push(' setl al');
240
- this.linhas.push(` movzx ${ESCRATCH_A}, al`);
241
- break;
242
- case '>':
243
- this.linhas.push(` cmp ${ESCRATCH_A}, ${ESCRATCH_B}`);
244
- this.linhas.push(' setg al');
245
- this.linhas.push(` movzx ${ESCRATCH_A}, al`);
246
- break;
247
- case '<=':
248
- this.linhas.push(` cmp ${ESCRATCH_A}, ${ESCRATCH_B}`);
249
- this.linhas.push(' setle al');
250
- this.linhas.push(` movzx ${ESCRATCH_A}, al`);
251
- break;
252
- case '>=':
253
- this.linhas.push(` cmp ${ESCRATCH_A}, ${ESCRATCH_B}`);
254
- this.linhas.push(' setge al');
255
- this.linhas.push(` movzx ${ESCRATCH_A}, al`);
256
- break;
257
- case '==':
258
- this.linhas.push(` cmp ${ESCRATCH_A}, ${ESCRATCH_B}`);
259
- this.linhas.push(' sete al');
260
- this.linhas.push(` movzx ${ESCRATCH_A}, al`);
261
- break;
262
- case '!=':
263
- this.linhas.push(` cmp ${ESCRATCH_A}, ${ESCRATCH_B}`);
264
- this.linhas.push(' setne al');
265
- this.linhas.push(` movzx ${ESCRATCH_A}, al`);
266
- break;
267
- }
268
- this.armazenar(instrucao.dst, alocacao, ESCRATCH_A);
269
- }
270
- gerarEnderecoIndice(nomeArranjo, indice, alocacao, offsetsArranjosLocais) {
271
- const base = this.enderecoBaseArranjo(nomeArranjo, offsetsArranjosLocais);
272
- this.linhas.push(` mov ${ESCRATCH_A}, ${this.resolverOperando(indice, alocacao)}`);
273
- this.linhas.push(` mov ${ESCRATCH_B}, 8`);
274
- this.linhas.push(` imul ${ESCRATCH_A}, ${ESCRATCH_B}`);
275
- this.linhas.push(` lea ${ESCRATCH_ENDERECO}, [${base}]`);
276
- this.linhas.push(` add ${ESCRATCH_ENDERECO}, ${ESCRATCH_A}`);
277
- }
278
- gerarTerminador(bloco, funcao, alocacao, ehPrincipal) {
279
- switch (bloco.terminador.op) {
280
- case 'salto':
281
- this.linhas.push(` jmp ${this.rotuloDoBloco(funcao, bloco.terminador.alvo)}`);
282
- break;
283
- case 'saltoCondicional': {
284
- const condicao = this.resolverOperando(bloco.terminador.condicao, alocacao);
285
- this.linhas.push(` mov ${ESCRATCH_A}, ${condicao}`);
286
- this.linhas.push(` cmp ${ESCRATCH_A}, 0`);
287
- this.linhas.push(` jne ${this.rotuloDoBloco(funcao, bloco.terminador.verdadeiro)}`);
288
- this.linhas.push(` jmp ${this.rotuloDoBloco(funcao, bloco.terminador.falso)}`);
289
- break;
290
- }
291
- case 'retorno':
292
- if (ehPrincipal) {
293
- this.gerarSaidaDoPrograma();
294
- }
295
- else {
296
- if (bloco.terminador.valor) {
297
- this.linhas.push(` mov rax, ${this.resolverOperando(bloco.terminador.valor, alocacao)}`);
298
- }
299
- this.paleta.forEach((registrador, indice) => {
300
- this.linhas.push(` mov ${registrador}, [rbp${textoOffset(-8 * (indice + 1))}]`);
301
- });
302
- this.linhas.push(' mov rsp, rbp');
303
- this.linhas.push(' pop rbp');
304
- this.linhas.push(' ret');
305
- }
306
- break;
307
- }
308
- }
309
- gerarSaidaDoPrograma() {
310
- if (this.alvo === 'linux') {
311
- this.linhas.push(' mov eax, 1');
312
- this.linhas.push(' xor ebx, ebx');
313
- this.linhas.push(' int 0x80');
314
- }
315
- else {
316
- this.linhas.push(' xor eax, eax');
317
- this.linhas.push(' ret');
318
- }
319
- }
320
- /** Offsets (relativos a rbp) dos vetores locais, logo abaixo dos slots de spill (que começam em `deslocamentoBase`). */
321
- calcularOffsetsArranjosLocais(funcao, spillBytes) {
322
- const offsets = new Map();
323
- let offsetAtual = this.deslocamentoBase - spillBytes;
324
- for (const [nome, info] of funcao.arranjosLocais) {
325
- offsetAtual -= 8 * info.tamanho;
326
- offsets.set(nome, offsetAtual);
327
- }
328
- return { offsets, bytes: -offsetAtual };
329
- }
330
- gerarFuncaoPrincipal(processada) {
331
- this.deslocamentoBase = 0;
332
- const spillBytes = this.tamanhoSpillBytes(processada);
333
- const { offsets, bytes } = this.calcularOffsetsArranjosLocais(processada.funcao, spillBytes);
334
- const quadro = arredondarPara16(bytes);
335
- this.linhas.push(`${this.alvo === 'linux' ? '_start' : 'main'}:`);
336
- this.linhas.push(' mov rbp, rsp');
337
- if (quadro > 0)
338
- this.linhas.push(` sub rsp, ${quadro}`);
339
- this.gerarBlocosSemRotuloEntrada(processada, offsets, true);
340
- }
341
- gerarFuncao(processada) {
342
- this.deslocamentoBase = -8 * this.paleta.length;
343
- const spillBytes = this.tamanhoSpillBytes(processada);
344
- const { offsets, bytes } = this.calcularOffsetsArranjosLocais(processada.funcao, spillBytes);
345
- const quadro = arredondarPara16(bytes);
346
- this.linhas.push(`${processada.funcao.nome}:`);
347
- this.linhas.push(' push rbp');
348
- this.linhas.push(' mov rbp, rsp');
349
- if (quadro > 0)
350
- this.linhas.push(` sub rsp, ${quadro}`);
351
- this.paleta.forEach((registrador, indice) => {
352
- this.linhas.push(` mov [rbp${textoOffset(-8 * (indice + 1))}], ${registrador}`);
353
- });
354
- this.gerarBlocosSemRotuloEntrada(processada, offsets, false);
355
- }
356
- tamanhoSpillBytes(processada) {
357
- let maiorOffset = 0;
358
- for (const alocacao of processada.alocacao.values()) {
359
- if (alocacao.tipo === 'pilha' && -alocacao.offsetBytes > maiorOffset) {
360
- maiorOffset = -alocacao.offsetBytes;
361
- }
362
- }
363
- return maiorOffset;
364
- }
365
- gerarBlocosSemRotuloEntrada(processada, offsetsArranjosLocais, ehPrincipal) {
366
- const { funcao, alocacao } = processada;
367
- const ordem = (0, dominancia_1.ordemPosFixaReversa)(funcao);
368
- ordem.forEach((blocoId, indice) => {
369
- const bloco = funcao.blocos.get(blocoId);
370
- if (indice > 0)
371
- this.linhas.push(`${this.rotuloDoBloco(funcao, blocoId)}:`);
372
- for (const instrucao of bloco.instrucoes) {
373
- this.gerarInstrucao(instrucao, alocacao, offsetsArranjosLocais);
374
- }
375
- this.gerarTerminador(bloco, funcao, alocacao, ehPrincipal);
376
- });
377
- }
378
- gerarHelperImprimirNumero() {
379
- if (this.alvo !== 'linux')
380
- return;
381
- this.linhas.push('__delegua_print_int:');
382
- this.linhas.push(' push rbx');
383
- this.linhas.push(' push rcx');
384
- this.linhas.push(' push rdx');
385
- this.linhas.push(' push rsi');
386
- this.linhas.push(' mov rcx, 10');
387
- this.linhas.push(' lea rsi, [__print_buf + 22]');
388
- this.linhas.push(' mov byte [rsi], 10');
389
- this.linhas.push('.print_digitloop:');
390
- this.linhas.push(' xor rdx, rdx');
391
- this.linhas.push(' div rcx');
392
- this.linhas.push(" add dl, '0'");
393
- this.linhas.push(' dec rsi');
394
- this.linhas.push(' mov [rsi], dl');
395
- this.linhas.push(' test rax, rax');
396
- this.linhas.push(' jnz .print_digitloop');
397
- this.linhas.push(' lea rdx, [__print_buf + 23]');
398
- this.linhas.push(' sub rdx, rsi');
399
- this.linhas.push(' mov ecx, esi');
400
- this.linhas.push(' mov ebx, 1');
401
- this.linhas.push(' mov eax, 4');
402
- this.linhas.push(' int 0x80');
403
- this.linhas.push(' pop rsi');
404
- this.linhas.push(' pop rdx');
405
- this.linhas.push(' pop rcx');
406
- this.linhas.push(' pop rbx');
407
- this.linhas.push(' ret');
408
- }
409
- }
410
- exports.CodegenX64 = CodegenX64;
411
- function arredondarPara16(bytes) {
412
- if (bytes <= 0)
413
- return 0;
414
- return Math.ceil(bytes / 16) * 16;
415
- }
416
- //# sourceMappingURL=codegen.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../../fontes/tradutores/x64/codegen.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import { Alocacao } from './alocador-registradores';
2
- import { IRFuncao } from './ir';
3
- /**
4
- * Elimina phis da função já alocada: divide arestas críticas (predecessor com mais de um
5
- * sucessor apontando para um bloco com phis) e insere, em cada aresta, a sequência de
6
- * cópias equivalente à atribuição paralela dos phis daquele bloco.
7
- */
8
- export declare function destruirSSA(funcao: IRFuncao, alocacao: Map<string, Alocacao>): void;
9
- //# sourceMappingURL=dessa.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dessa.d.ts","sourceRoot":"","sources":["../../../fontes/tradutores/x64/dessa.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAmC,MAAM,MAAM,CAAC;AA8EjE;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,CA8DnF"}
@@ -1,124 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.destruirSSA = destruirSSA;
4
- const dominancia_1 = require("./dominancia");
5
- const ir_1 = require("./ir");
6
- /** Registrador sempre reservado como escrata (fora da paleta geral) — ver alocador-registradores.ts. */
7
- const REGISTRADOR_ESCRATCH_CICLO = 'rax';
8
- function localizacao(nomeVirtual, alocacao) {
9
- const a = alocacao.get(nomeVirtual);
10
- if (!a)
11
- throw new Error(`destruirSSA: '${nomeVirtual}' não tem alocação.`);
12
- return a.tipo === 'registrador' ? `r:${a.fisico}` : `s:${a.offsetBytes}`;
13
- }
14
- /**
15
- * Sequencializa um conjunto de cópias que devem se comportar como uma atribuição paralela
16
- * (todas leem os valores "antes da rodada"), quebrando ciclos (o clássico problema da troca
17
- * a,b = b,a) com um temporário fixo no registrador de escrata reservado. Argumento
18
- * `alocacao` é mutado: cada temporário de quebra de ciclo ganha uma entrada nele.
19
- */
20
- function sequenciarCopiasParalelas(pares, alocacao, gerarNomeTemp) {
21
- const resultado = [];
22
- const pendentes = new Map();
23
- for (const par of pares)
24
- pendentes.set(par.destino, { ...par });
25
- function origemLocalizacao(par) {
26
- return par.origem.classe === 'registrador' ? localizacao(par.origem.nome, alocacao) : null;
27
- }
28
- let guarda = pares.length * pares.length + 100;
29
- while (pendentes.size > 0) {
30
- if (guarda-- <= 0) {
31
- throw new Error('destruirSSA: não foi possível sequenciar cópias de phi (loop inesperado).');
32
- }
33
- let progrediu = false;
34
- for (const [destino, par] of [...pendentes]) {
35
- const locDestino = localizacao(destino, alocacao);
36
- const alguemPrecisaLer = [...pendentes.values()].some((outro) => outro !== par && origemLocalizacao(outro) === locDestino);
37
- if (!alguemPrecisaLer) {
38
- resultado.push({ op: 'copia', dst: destino, src: par.origem });
39
- pendentes.delete(destino);
40
- progrediu = true;
41
- }
42
- }
43
- if (!progrediu && pendentes.size > 0) {
44
- const [destinoCiclo] = [...pendentes][0];
45
- const locDestinoCiclo = localizacao(destinoCiclo, alocacao);
46
- const nomeTemp = gerarNomeTemp();
47
- alocacao.set(nomeTemp, { tipo: 'registrador', fisico: REGISTRADOR_ESCRATCH_CICLO });
48
- resultado.push({
49
- op: 'copia',
50
- dst: nomeTemp,
51
- src: { classe: 'registrador', nome: destinoCiclo },
52
- });
53
- for (const [destino2, par2] of pendentes) {
54
- if (destino2 === destinoCiclo)
55
- continue;
56
- if (origemLocalizacao(par2) === locDestinoCiclo) {
57
- par2.origem = { classe: 'registrador', nome: nomeTemp };
58
- }
59
- }
60
- }
61
- }
62
- return resultado;
63
- }
64
- /**
65
- * Elimina phis da função já alocada: divide arestas críticas (predecessor com mais de um
66
- * sucessor apontando para um bloco com phis) e insere, em cada aresta, a sequência de
67
- * cópias equivalente à atribuição paralela dos phis daquele bloco.
68
- */
69
- function destruirSSA(funcao, alocacao) {
70
- (0, dominancia_1.prepararCFG)(funcao);
71
- let contadorDivisao = 0;
72
- let contadorTemp = 0;
73
- const gerarNomeTemp = () => `__troca_${contadorTemp++}__`;
74
- const blocosComPhi = [...funcao.blocos.values()].filter((bloco) => bloco.phis.length > 0);
75
- for (const blocoAlvo of blocosComPhi) {
76
- for (const predId of [...blocoAlvo.predecessores]) {
77
- const predecessor = funcao.blocos.get(predId);
78
- if (predecessor.sucessores.length <= 1)
79
- continue;
80
- const idDivisao = `__div_${contadorDivisao++}__`;
81
- const blocoDivisao = (0, ir_1.novoBloco)(idDivisao);
82
- blocoDivisao.terminador = { op: 'salto', alvo: blocoAlvo.id };
83
- funcao.blocos.set(idDivisao, blocoDivisao);
84
- funcao.ordemBlocos.push(idDivisao);
85
- if (predecessor.terminador.op === 'salto' && predecessor.terminador.alvo === blocoAlvo.id) {
86
- predecessor.terminador.alvo = idDivisao;
87
- }
88
- else if (predecessor.terminador.op === 'saltoCondicional') {
89
- if (predecessor.terminador.verdadeiro === blocoAlvo.id) {
90
- predecessor.terminador.verdadeiro = idDivisao;
91
- }
92
- if (predecessor.terminador.falso === blocoAlvo.id) {
93
- predecessor.terminador.falso = idDivisao;
94
- }
95
- }
96
- for (const phi of blocoAlvo.phis) {
97
- for (const opcao of phi.opcoes) {
98
- if (opcao.predecessor === predId)
99
- opcao.predecessor = idDivisao;
100
- }
101
- }
102
- }
103
- }
104
- (0, dominancia_1.prepararCFG)(funcao);
105
- for (const blocoAlvo of blocosComPhi) {
106
- const copiasPorPredecessor = new Map();
107
- for (const phi of blocoAlvo.phis) {
108
- for (const opcao of phi.opcoes) {
109
- if (!copiasPorPredecessor.has(opcao.predecessor)) {
110
- copiasPorPredecessor.set(opcao.predecessor, []);
111
- }
112
- copiasPorPredecessor.get(opcao.predecessor).push({ destino: phi.dst, origem: opcao.valor });
113
- }
114
- }
115
- for (const [predId, pares] of copiasPorPredecessor) {
116
- const predecessor = funcao.blocos.get(predId);
117
- const copias = sequenciarCopiasParalelas(pares, alocacao, gerarNomeTemp);
118
- predecessor.instrucoes.push(...copias);
119
- }
120
- blocoAlvo.phis = [];
121
- }
122
- (0, dominancia_1.prepararCFG)(funcao);
123
- }
124
- //# sourceMappingURL=dessa.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dessa.js","sourceRoot":"","sources":["../../../fontes/tradutores/x64/dessa.ts"],"names":[],"mappings":"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"}
@@ -1,25 +0,0 @@
1
- import { IRFuncao } from './ir';
2
- /**
3
- * Recalcula `sucessores`/`predecessores` de cada bloco a partir do terminador.
4
- * Chamado depois de qualquer alteração na CFG (lowering, divisão de arestas críticas em dessa.ts).
5
- */
6
- export declare function prepararCFG(funcao: IRFuncao): void;
7
- /** Ordem pós-fixa reversa a partir do bloco de entrada, alcançando somente blocos vivos. */
8
- export declare function ordemPosFixaReversa(funcao: IRFuncao): string[];
9
- export interface ResultadoDominancia {
10
- /** idom[bloco] = dominador imediato. idom[entrada] = entrada. */
11
- idom: Map<string, string>;
12
- domFrontier: Map<string, Set<string>>;
13
- /** blocos alcançáveis a partir da entrada, em ordem pós-fixa reversa. */
14
- ordem: string[];
15
- }
16
- /**
17
- * Algoritmo iterativo de Cooper/Harvey/Kennedy ("A Simple, Fast Dominance Algorithm").
18
- * Preferido a Lengauer-Tarjan aqui por ser bem mais simples de implementar corretamente,
19
- * e funções Delégua traduzidas para x64 têm poucos blocos — o custo O(n^2) no pior caso
20
- * não é relevante.
21
- */
22
- export declare function computeDominancia(funcao: IRFuncao): ResultadoDominancia;
23
- /** Filhos imediatos de cada bloco na árvore de dominância (para percorrer em pré-ordem na renomeação SSA). */
24
- export declare function arvoreDominancia(resultado: ResultadoDominancia, blocoEntrada: string): Map<string, string[]>;
25
- //# sourceMappingURL=dominancia.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dominancia.d.ts","sourceRoot":"","sources":["../../../fontes/tradutores/x64/dominancia.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhC;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAwBlD;AAED,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,EAAE,CAiB9D;AAED,MAAM,WAAW,mBAAmB;IAChC,iEAAiE;IACjE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACtC,yEAAyE;IACzE,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,GAAG,mBAAmB,CA2DvE;AAED,8GAA8G;AAC9G,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAU5G"}