@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.
- package/analisador-semantico/analisador-semantico.d.ts +4 -1
- package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico.js +36 -8
- package/analisador-semantico/analisador-semantico.js.map +1 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts.map +1 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +11 -12
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +14 -12
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.js +5 -3
- package/avaliador-sintatico/dialetos/micro-avaliador-sintatico-pitugues.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/biblioteca-global.js +1 -1
- package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-dicionario.js +3 -3
- package/bibliotecas/dialetos/pitugues/primitivas-dicionario.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-numero.js +8 -8
- package/bibliotecas/dialetos/pitugues/primitivas-numero.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-texto.js +22 -22
- package/bibliotecas/dialetos/pitugues/primitivas-texto.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-vetor.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-vetor.js +16 -16
- package/bibliotecas/dialetos/pitugues/primitivas-vetor.js.map +1 -1
- package/bin/package.json +2 -2
- package/excecoes/index.d.ts +1 -0
- package/excecoes/index.d.ts.map +1 -1
- package/excecoes/index.js +1 -0
- package/excecoes/index.js.map +1 -1
- package/excecoes/mensagem-erro.d.ts +17 -0
- package/excecoes/mensagem-erro.d.ts.map +1 -0
- package/excecoes/mensagem-erro.js +31 -0
- package/excecoes/mensagem-erro.js.map +1 -0
- package/interpretador/depuracao/avaliador-expressao-depuracao.d.ts.map +1 -1
- package/interpretador/depuracao/avaliador-expressao-depuracao.js +2 -1
- package/interpretador/depuracao/avaliador-expressao-depuracao.js.map +1 -1
- package/interpretador/depuracao/comum.d.ts.map +1 -1
- package/interpretador/depuracao/comum.js +6 -1
- package/interpretador/depuracao/comum.js.map +1 -1
- package/interpretador/dialetos/pitugues/comum.d.ts +3 -3
- package/interpretador/dialetos/pitugues/comum.d.ts.map +1 -1
- package/interpretador/dialetos/pitugues/comum.js +18 -4
- package/interpretador/dialetos/pitugues/comum.js.map +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues.js +2 -2
- package/interpretador/dialetos/pitugues/interpretador-pitugues.js.map +1 -1
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +2 -1
- package/interpretador/interpretador-base.js.map +1 -1
- package/interpretador/interpretador.js +3 -3
- package/interpretador/interpretador.js.map +1 -1
- package/lexador/lexador.d.ts.map +1 -1
- package/lexador/lexador.js.map +1 -1
- package/package.json +2 -2
- package/tipos-de-dados/dialetos/pitugues.d.ts +0 -4
- package/tipos-de-dados/dialetos/pitugues.d.ts.map +1 -1
- package/tipos-de-dados/dialetos/pitugues.js +0 -4
- package/tipos-de-dados/dialetos/pitugues.js.map +1 -1
- package/tradutores/tradutor-assembly-x64.d.ts +11 -96
- package/tradutores/tradutor-assembly-x64.d.ts.map +1 -1
- package/tradutores/tradutor-assembly-x64.js +25 -761
- package/tradutores/tradutor-assembly-x64.js.map +1 -1
- package/tradutores/tradutor-javascript.d.ts +1 -1
- package/tradutores/tradutor-javascript.d.ts.map +1 -1
- package/tradutores/tradutor-javascript.js +7 -0
- package/tradutores/tradutor-javascript.js.map +1 -1
- package/tradutores/tradutor-python.d.ts +8 -0
- package/tradutores/tradutor-python.d.ts.map +1 -1
- package/tradutores/tradutor-python.js +35 -4
- package/tradutores/tradutor-python.js.map +1 -1
- package/tradutores/tradutor-reverso-javascript.d.ts.map +1 -1
- package/tradutores/tradutor-reverso-javascript.js +3 -0
- package/tradutores/tradutor-reverso-javascript.js.map +1 -1
- package/tradutores/x64/alocador-registradores.d.ts +29 -0
- package/tradutores/x64/alocador-registradores.d.ts.map +1 -0
- package/tradutores/x64/alocador-registradores.js +192 -0
- package/tradutores/x64/alocador-registradores.js.map +1 -0
- package/tradutores/x64/codegen.d.ts +43 -0
- package/tradutores/x64/codegen.d.ts.map +1 -0
- package/tradutores/x64/codegen.js +416 -0
- package/tradutores/x64/codegen.js.map +1 -0
- package/tradutores/x64/dessa.d.ts +9 -0
- package/tradutores/x64/dessa.d.ts.map +1 -0
- package/tradutores/x64/dessa.js +124 -0
- package/tradutores/x64/dessa.js.map +1 -0
- package/tradutores/x64/dominancia.d.ts +25 -0
- package/tradutores/x64/dominancia.d.ts.map +1 -0
- package/tradutores/x64/dominancia.js +129 -0
- package/tradutores/x64/dominancia.js.map +1 -0
- package/tradutores/x64/ir.d.ts +144 -0
- package/tradutores/x64/ir.d.ts.map +1 -0
- package/tradutores/x64/ir.js +44 -0
- package/tradutores/x64/ir.js.map +1 -0
- package/tradutores/x64/liveness.d.ts +12 -0
- package/tradutores/x64/liveness.d.ts.map +1 -0
- package/tradutores/x64/liveness.js +159 -0
- package/tradutores/x64/liveness.js.map +1 -0
- package/tradutores/x64/lowering.d.ts +7 -0
- package/tradutores/x64/lowering.d.ts.map +1 -0
- package/tradutores/x64/lowering.js +904 -0
- package/tradutores/x64/lowering.js.map +1 -0
- package/tradutores/x64/ssa.d.ts +9 -0
- package/tradutores/x64/ssa.d.ts.map +1 -0
- package/tradutores/x64/ssa.js +170 -0
- package/tradutores/x64/ssa.js.map +1 -0
- package/tradutores/x64/tipos-x64.d.ts +12 -0
- package/tradutores/x64/tipos-x64.d.ts.map +1 -0
- package/tradutores/x64/tipos-x64.js +59 -0
- package/tradutores/x64/tipos-x64.js.map +1 -0
- 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":"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"}
|
|
@@ -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"}
|