@designliquido/delegua 1.26.1 → 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 (62) hide show
  1. package/bibliotecas/dialetos/pitugues/primitivas-dicionario.js +3 -3
  2. package/bibliotecas/dialetos/pitugues/primitivas-dicionario.js.map +1 -1
  3. package/bibliotecas/dialetos/pitugues/primitivas-numero.js +2 -2
  4. package/bibliotecas/dialetos/pitugues/primitivas-numero.js.map +1 -1
  5. package/bibliotecas/dialetos/pitugues/primitivas-texto.js +17 -17
  6. package/bibliotecas/dialetos/pitugues/primitivas-texto.js.map +1 -1
  7. package/bibliotecas/dialetos/pitugues/primitivas-vetor.js +13 -13
  8. package/bibliotecas/dialetos/pitugues/primitivas-vetor.js.map +1 -1
  9. package/bin/package.json +2 -2
  10. package/package.json +2 -2
  11. package/tradutores/tradutor-assembly-x64.d.ts +11 -96
  12. package/tradutores/tradutor-assembly-x64.d.ts.map +1 -1
  13. package/tradutores/tradutor-assembly-x64.js +25 -761
  14. package/tradutores/tradutor-assembly-x64.js.map +1 -1
  15. package/tradutores/tradutor-javascript.d.ts +1 -1
  16. package/tradutores/tradutor-javascript.d.ts.map +1 -1
  17. package/tradutores/tradutor-javascript.js +7 -0
  18. package/tradutores/tradutor-javascript.js.map +1 -1
  19. package/tradutores/tradutor-python.d.ts +8 -0
  20. package/tradutores/tradutor-python.d.ts.map +1 -1
  21. package/tradutores/tradutor-python.js +35 -4
  22. package/tradutores/tradutor-python.js.map +1 -1
  23. package/tradutores/tradutor-reverso-javascript.d.ts.map +1 -1
  24. package/tradutores/tradutor-reverso-javascript.js +3 -0
  25. package/tradutores/tradutor-reverso-javascript.js.map +1 -1
  26. package/tradutores/x64/alocador-registradores.d.ts +29 -0
  27. package/tradutores/x64/alocador-registradores.d.ts.map +1 -0
  28. package/tradutores/x64/alocador-registradores.js +192 -0
  29. package/tradutores/x64/alocador-registradores.js.map +1 -0
  30. package/tradutores/x64/codegen.d.ts +43 -0
  31. package/tradutores/x64/codegen.d.ts.map +1 -0
  32. package/tradutores/x64/codegen.js +416 -0
  33. package/tradutores/x64/codegen.js.map +1 -0
  34. package/tradutores/x64/dessa.d.ts +9 -0
  35. package/tradutores/x64/dessa.d.ts.map +1 -0
  36. package/tradutores/x64/dessa.js +124 -0
  37. package/tradutores/x64/dessa.js.map +1 -0
  38. package/tradutores/x64/dominancia.d.ts +25 -0
  39. package/tradutores/x64/dominancia.d.ts.map +1 -0
  40. package/tradutores/x64/dominancia.js +129 -0
  41. package/tradutores/x64/dominancia.js.map +1 -0
  42. package/tradutores/x64/ir.d.ts +144 -0
  43. package/tradutores/x64/ir.d.ts.map +1 -0
  44. package/tradutores/x64/ir.js +44 -0
  45. package/tradutores/x64/ir.js.map +1 -0
  46. package/tradutores/x64/liveness.d.ts +12 -0
  47. package/tradutores/x64/liveness.d.ts.map +1 -0
  48. package/tradutores/x64/liveness.js +159 -0
  49. package/tradutores/x64/liveness.js.map +1 -0
  50. package/tradutores/x64/lowering.d.ts +7 -0
  51. package/tradutores/x64/lowering.d.ts.map +1 -0
  52. package/tradutores/x64/lowering.js +904 -0
  53. package/tradutores/x64/lowering.js.map +1 -0
  54. package/tradutores/x64/ssa.d.ts +9 -0
  55. package/tradutores/x64/ssa.d.ts.map +1 -0
  56. package/tradutores/x64/ssa.js +170 -0
  57. package/tradutores/x64/ssa.js.map +1 -0
  58. package/tradutores/x64/tipos-x64.d.ts +12 -0
  59. package/tradutores/x64/tipos-x64.d.ts.map +1 -0
  60. package/tradutores/x64/tipos-x64.js +59 -0
  61. package/tradutores/x64/tipos-x64.js.map +1 -0
  62. package/umd/delegua.js +2512 -1001
@@ -0,0 +1,416 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../../fontes/tradutores/x64/codegen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,124 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dessa.js","sourceRoot":"","sources":["../../../fontes/tradutores/x64/dessa.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
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
@@ -0,0 +1 @@
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"}