psyq-asm 0.0.1

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 (117) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/LICENSE +56 -0
  3. package/README.md +220 -0
  4. package/bin/psyq-asm.mjs +149 -0
  5. package/dist/asm/assemble.d.ts +10 -0
  6. package/dist/asm/assemble.d.ts.map +1 -0
  7. package/dist/asm/assemble.js +42 -0
  8. package/dist/asm/assemble.js.map +1 -0
  9. package/dist/asm/diagnostics.d.ts +22 -0
  10. package/dist/asm/diagnostics.d.ts.map +1 -0
  11. package/dist/asm/diagnostics.js +40 -0
  12. package/dist/asm/diagnostics.js.map +1 -0
  13. package/dist/asm/directives.d.ts +67 -0
  14. package/dist/asm/directives.d.ts.map +1 -0
  15. package/dist/asm/directives.js +254 -0
  16. package/dist/asm/directives.js.map +1 -0
  17. package/dist/asm/expand.d.ts +21 -0
  18. package/dist/asm/expand.d.ts.map +1 -0
  19. package/dist/asm/expand.js +540 -0
  20. package/dist/asm/expand.js.map +1 -0
  21. package/dist/asm/hazards.d.ts +10 -0
  22. package/dist/asm/hazards.d.ts.map +1 -0
  23. package/dist/asm/hazards.js +196 -0
  24. package/dist/asm/hazards.js.map +1 -0
  25. package/dist/asm/layout.d.ts +17 -0
  26. package/dist/asm/layout.d.ts.map +1 -0
  27. package/dist/asm/layout.js +257 -0
  28. package/dist/asm/layout.js.map +1 -0
  29. package/dist/asm/lexer.d.ts +23 -0
  30. package/dist/asm/lexer.d.ts.map +1 -0
  31. package/dist/asm/lexer.js +81 -0
  32. package/dist/asm/lexer.js.map +1 -0
  33. package/dist/asm/object.d.ts +6 -0
  34. package/dist/asm/object.d.ts.map +1 -0
  35. package/dist/asm/object.js +46 -0
  36. package/dist/asm/object.js.map +1 -0
  37. package/dist/asm/operands.d.ts +49 -0
  38. package/dist/asm/operands.d.ts.map +1 -0
  39. package/dist/asm/operands.js +114 -0
  40. package/dist/asm/operands.js.map +1 -0
  41. package/dist/asm/parser.d.ts +28 -0
  42. package/dist/asm/parser.d.ts.map +1 -0
  43. package/dist/asm/parser.js +60 -0
  44. package/dist/asm/parser.js.map +1 -0
  45. package/dist/asm/relocations.d.ts +42 -0
  46. package/dist/asm/relocations.d.ts.map +1 -0
  47. package/dist/asm/relocations.js +214 -0
  48. package/dist/asm/relocations.js.map +1 -0
  49. package/dist/asm/sections.d.ts +23 -0
  50. package/dist/asm/sections.d.ts.map +1 -0
  51. package/dist/asm/sections.js +81 -0
  52. package/dist/asm/sections.js.map +1 -0
  53. package/dist/asm/stream.d.ts +77 -0
  54. package/dist/asm/stream.d.ts.map +1 -0
  55. package/dist/asm/stream.js +2 -0
  56. package/dist/asm/stream.js.map +1 -0
  57. package/dist/asm/symbols.d.ts +42 -0
  58. package/dist/asm/symbols.d.ts.map +1 -0
  59. package/dist/asm/symbols.js +122 -0
  60. package/dist/asm/symbols.js.map +1 -0
  61. package/dist/errors.d.ts +27 -0
  62. package/dist/errors.d.ts.map +1 -0
  63. package/dist/errors.js +34 -0
  64. package/dist/errors.js.map +1 -0
  65. package/dist/index.d.ts +14 -0
  66. package/dist/index.d.ts.map +1 -0
  67. package/dist/index.js +10 -0
  68. package/dist/index.js.map +1 -0
  69. package/dist/isa/decode.d.ts +8 -0
  70. package/dist/isa/decode.d.ts.map +1 -0
  71. package/dist/isa/decode.js +92 -0
  72. package/dist/isa/decode.js.map +1 -0
  73. package/dist/isa/encode.d.ts +9 -0
  74. package/dist/isa/encode.d.ts.map +1 -0
  75. package/dist/isa/encode.js +124 -0
  76. package/dist/isa/encode.js.map +1 -0
  77. package/dist/isa/fields.d.ts +27 -0
  78. package/dist/isa/fields.d.ts.map +1 -0
  79. package/dist/isa/fields.js +49 -0
  80. package/dist/isa/fields.js.map +1 -0
  81. package/dist/isa/format.d.ts +14 -0
  82. package/dist/isa/format.d.ts.map +1 -0
  83. package/dist/isa/format.js +98 -0
  84. package/dist/isa/format.js.map +1 -0
  85. package/dist/isa/instruction.d.ts +15 -0
  86. package/dist/isa/instruction.d.ts.map +1 -0
  87. package/dist/isa/instruction.js +47 -0
  88. package/dist/isa/instruction.js.map +1 -0
  89. package/dist/isa/registers.d.ts +8 -0
  90. package/dist/isa/registers.d.ts.map +1 -0
  91. package/dist/isa/registers.js +55 -0
  92. package/dist/isa/registers.js.map +1 -0
  93. package/dist/isa/table.d.ts +179 -0
  94. package/dist/isa/table.d.ts.map +1 -0
  95. package/dist/isa/table.js +128 -0
  96. package/dist/isa/table.js.map +1 -0
  97. package/dist/options.d.ts +29 -0
  98. package/dist/options.d.ts.map +1 -0
  99. package/dist/options.js +0 -0
  100. package/dist/options.js.map +1 -0
  101. package/dist/program/decode-words.d.ts +9 -0
  102. package/dist/program/decode-words.d.ts.map +1 -0
  103. package/dist/program/decode-words.js +87 -0
  104. package/dist/program/decode-words.js.map +1 -0
  105. package/dist/program/format-program.d.ts +12 -0
  106. package/dist/program/format-program.d.ts.map +1 -0
  107. package/dist/program/format-program.js +37 -0
  108. package/dist/program/format-program.js.map +1 -0
  109. package/dist/public-types.d.ts +253 -0
  110. package/dist/public-types.d.ts.map +1 -0
  111. package/dist/public-types.js +2 -0
  112. package/dist/public-types.js.map +1 -0
  113. package/dist/util.d.ts +3 -0
  114. package/dist/util.d.ts.map +1 -0
  115. package/dist/util.js +11 -0
  116. package/dist/util.js.map +1 -0
  117. package/package.json +82 -0
@@ -0,0 +1,540 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ * The expansion pass: statements to the stream of pending words. Native
4
+ * instructions bind directly to their table row; macros expand into the
5
+ * sequences ASPSX 2.81 emits (docs/ASPSX-2.81.md, "Macro expansion").
6
+ */
7
+ import { COP_SLOTS, hi16, lo16, signExtend16 } from '../isa/fields.js';
8
+ import { ISA_ROWS, rowFor } from '../isa/table.js';
9
+ import { zip } from '../util.js';
10
+ import { sectionKind } from './sections.js';
11
+ import { isTransparentLabel } from './symbols.js';
12
+ const AT = 1;
13
+ const GP = 28;
14
+ const RA = 31;
15
+ const TABLE = Object.fromEntries(ISA_ROWS.map((r) => [r.mnemonic, r]));
16
+ const LOADS = new Set(['lb', 'lbu', 'lh', 'lhu', 'lw', 'lwl', 'lwr', 'lwc2']);
17
+ const STORES = new Set(['sb', 'sh', 'sw', 'swl', 'swr', 'swc2']);
18
+ /** GNU macros cc1psx never emits; rejected by name rather than as unknown. */
19
+ const UNSUPPORTED = new Set([
20
+ 'abs',
21
+ 'bal',
22
+ 'beql',
23
+ 'bge',
24
+ 'bgeu',
25
+ 'bgezl',
26
+ 'bgt',
27
+ 'bgtu',
28
+ 'bgtzl',
29
+ 'ble',
30
+ 'bleu',
31
+ 'blezl',
32
+ 'blt',
33
+ 'bltu',
34
+ 'bltzl',
35
+ 'bnel',
36
+ 'mul',
37
+ 'mulo',
38
+ 'mulou',
39
+ 'neg',
40
+ 'not',
41
+ 'rol',
42
+ 'ror',
43
+ 'seq',
44
+ 'sge',
45
+ 'sgeu',
46
+ 'sgt',
47
+ 'sgtu',
48
+ 'sle',
49
+ 'sleu',
50
+ 'sne',
51
+ 'ulh',
52
+ 'ulw',
53
+ 'ush',
54
+ 'usw',
55
+ ]);
56
+ /** Three-register instructions written with an immediate third operand. */
57
+ const IMMEDIATE_FORMS = {
58
+ addu: { immediate: 'addiu', register: 'addu', unsigned: false, negate: false },
59
+ add: { immediate: 'addi', register: 'add', unsigned: false, negate: false },
60
+ subu: { immediate: 'addiu', register: 'subu', unsigned: false, negate: true },
61
+ sub: { immediate: 'addi', register: 'sub', unsigned: false, negate: true },
62
+ and: { immediate: 'andi', register: 'and', unsigned: true, negate: false },
63
+ or: { immediate: 'ori', register: 'or', unsigned: true, negate: false },
64
+ xor: { immediate: 'xori', register: 'xor', unsigned: true, negate: false },
65
+ slt: { immediate: 'slti', register: 'slt', unsigned: false, negate: false },
66
+ sltu: { immediate: 'sltiu', register: 'sltu', unsigned: false, negate: false },
67
+ };
68
+ // ---- word construction -----------------------------------------------------
69
+ const gpr = (number) => ({ kind: 'gpr', number });
70
+ const constant = (value) => ({ kind: 'number', value });
71
+ const imm = (value) => ({ kind: 'value', expr: constant(value) });
72
+ const value = (expr) => ({ kind: 'value', expr });
73
+ const reloc = (fn, inner) => ({
74
+ kind: 'reloc',
75
+ fn,
76
+ inner,
77
+ });
78
+ /** A branch to `words` instructions past the delay slot. */
79
+ const skip = (words) => ({
80
+ kind: 'branch',
81
+ target: { kind: 'dot', offset: 4 + 4 * words },
82
+ });
83
+ function word(mnemonic, ...values) {
84
+ const row = TABLE[mnemonic];
85
+ const args = zip(row.syntax, values).map(([slot, v]) => ({ slot, value: v }));
86
+ return { row, args, origin: 'macro' };
87
+ }
88
+ const nop = () => word('sll', gpr(0), gpr(0), imm(0));
89
+ const fits16s = (n) => n >= -0x8000 && n <= 0x7fff;
90
+ const fits16u = (n) => n >= 0 && n <= 0xffff;
91
+ function macro(name, words) {
92
+ return { words, macro: name };
93
+ }
94
+ function expects(mnemonic, what) {
95
+ return { code: 'invalid-operand', message: `${mnemonic} expects ${what}.` };
96
+ }
97
+ function unsupported(message) {
98
+ return { code: 'unsupported-syntax', message };
99
+ }
100
+ function isReg(operand) {
101
+ return operand?.kind === 'reg';
102
+ }
103
+ function isExpr(operand) {
104
+ return operand?.kind === 'expr';
105
+ }
106
+ function integerOf(operand) {
107
+ return operand?.kind === 'expr' && operand.expr.kind === 'number'
108
+ ? operand.expr.value
109
+ : undefined;
110
+ }
111
+ // ---- loads of constants and addresses --------------------------------------
112
+ /** `lui rd,upper` then `ori rd,rd,lower` when the lower half is not zero. */
113
+ function upperLower(rd, bits) {
114
+ const lui = word('lui', gpr(rd), imm((bits >>> 16) & 0xffff));
115
+ return (bits & 0xffff) === 0 ? [lui] : [lui, word('ori', gpr(rd), gpr(rd), imm(bits & 0xffff))];
116
+ }
117
+ /** `li rd,value` as ASPSX 2.56 and later expand it. */
118
+ export function loadImmediate(rd, n) {
119
+ if (fits16s(n))
120
+ return [word('addiu', gpr(rd), gpr(0), imm(n))];
121
+ // 0x8000 to 0xFFFF load with a single ori.
122
+ if (fits16u(n))
123
+ return [word('ori', gpr(rd), gpr(0), imm(n))];
124
+ return upperLower(rd, n >>> 0);
125
+ }
126
+ function loadSingle(rd, n) {
127
+ const view = new DataView(new ArrayBuffer(4));
128
+ view.setFloat32(0, n);
129
+ return upperLower(rd, view.getUint32(0));
130
+ }
131
+ function loadDouble(rd, n) {
132
+ const view = new DataView(new ArrayBuffer(8));
133
+ view.setFloat64(0, n);
134
+ const high = view.getUint32(0);
135
+ const low = view.getUint32(4);
136
+ // The low word goes in rd and the high word in rd+1.
137
+ const first = low === 0 ? [word('addiu', gpr(rd), gpr(0), imm(0))] : upperLower(rd, low);
138
+ return [...first, ...upperLower(rd + 1, high)];
139
+ }
140
+ function loadAddress(rd, symbol, ctx) {
141
+ if (ctx.smallData.has(symbol.name)) {
142
+ return [word('addiu', gpr(rd), gpr(GP), value(reloc('gp_rel', symbol)))];
143
+ }
144
+ return [
145
+ word('lui', gpr(rd), value(reloc('hi', symbol))),
146
+ word('addiu', gpr(rd), gpr(rd), value(reloc('lo', symbol))),
147
+ ];
148
+ }
149
+ // ---- macro families -----------------------------------------------------------
150
+ function expandLoadStore(m, ops, ctx) {
151
+ const [first, address] = ops;
152
+ if (ops.length !== 2 || !isReg(first))
153
+ return undefined;
154
+ if (address?.kind === 'mem' &&
155
+ (address.offset.kind === 'reloc' ||
156
+ (address.offset.kind === 'number' && fits16s(address.offset.value)))) {
157
+ return undefined;
158
+ }
159
+ const cop = m === 'lwc2' || m === 'swc2';
160
+ const target = cop
161
+ ? { kind: 'cop', number: first.number, unit: 2, space: 'data' }
162
+ : gpr(first.number);
163
+ const access = (base, offset) => word(m, target, { kind: 'mem', base, offset });
164
+ if (address?.kind === 'mem') {
165
+ const { base, offset } = address;
166
+ if (offset.kind === 'number') {
167
+ return macro(m, [
168
+ word('lui', gpr(AT), imm(hi16(offset.value))),
169
+ word('addu', gpr(AT), gpr(base), gpr(AT)),
170
+ access(AT, constant(signExtend16(lo16(offset.value)))),
171
+ ]);
172
+ }
173
+ if (offset.kind === 'symbol') {
174
+ // A symbol with a base register never uses $gp.
175
+ return macro(m, [
176
+ word('lui', gpr(AT), value(reloc('hi', offset))),
177
+ word('addu', gpr(AT), gpr(AT), gpr(base)),
178
+ access(AT, reloc('lo', offset)),
179
+ ]);
180
+ }
181
+ return unsupported(`${m}: "." cannot be used as an address.`);
182
+ }
183
+ if (!isExpr(address))
184
+ return { code: 'invalid-operand', message: `${m} operand 2 must be offset(base).` };
185
+ const { expr } = address;
186
+ // Loads use their own destination as the temporary; stores need $at.
187
+ const temp = LOADS.has(m) && !cop ? first.number : AT;
188
+ if (expr.kind === 'number') {
189
+ if (fits16s(expr.value))
190
+ return macro(m, [access(0, expr)]);
191
+ // An absolute address out of range.
192
+ return macro(m, [
193
+ word('lui', gpr(temp), imm(hi16(expr.value))),
194
+ access(temp, constant(signExtend16(lo16(expr.value)))),
195
+ ]);
196
+ }
197
+ if (expr.kind === 'symbol') {
198
+ if (cop)
199
+ return unsupported(`${m} with a symbol address is not supported.`);
200
+ if (ctx.smallData.has(expr.name))
201
+ return macro(m, [access(GP, reloc('gp_rel', expr))]);
202
+ return macro(m, [
203
+ word('lui', gpr(temp), value(reloc('hi', expr))),
204
+ access(temp, reloc('lo', expr)),
205
+ ]);
206
+ }
207
+ return unsupported(`${m}: the address must be offset(base), a symbol, or a number.`);
208
+ }
209
+ function expandImmediate(m, ops) {
210
+ const form = IMMEDIATE_FORMS[m];
211
+ const [rd, rs, operand] = ops;
212
+ if (form === undefined || ops.length !== 3 || !isReg(rd) || !isReg(rs) || !isExpr(operand)) {
213
+ return undefined;
214
+ }
215
+ if (operand.expr.kind !== 'number')
216
+ return unsupported(`${m}: the immediate operand must be a number.`);
217
+ const n = operand.expr.value;
218
+ // Negating -0x8000 wraps to itself, and ASPSX 2.81 keeps the one-word form.
219
+ const direct = form.negate && n !== -0x8000 ? -n | 0 : n;
220
+ if (form.unsigned ? fits16u(direct) : fits16s(direct)) {
221
+ return macro(m, [word(form.immediate, gpr(rd.number), gpr(rs.number), imm(direct))]);
222
+ }
223
+ // Out of range, the constant is loaded into $at first.
224
+ return macro(m, [
225
+ ...loadImmediate(AT, n),
226
+ word(form.register, gpr(rd.number), gpr(rs.number), gpr(AT)),
227
+ ]);
228
+ }
229
+ function expandDivide(m, ops, ctx) {
230
+ // Unsigned divides get only the divide-by-zero trap (five words).
231
+ const unsigned = m.endsWith('u');
232
+ const divide = unsigned ? 'divu' : 'div';
233
+ const move = m.startsWith('rem') ? 'mfhi' : 'mflo';
234
+ if (ops.length === 2) {
235
+ if (m === divide)
236
+ return undefined;
237
+ const [rs, rt] = ops;
238
+ return isReg(rs) && isReg(rt)
239
+ ? macro(m, [word(divide, gpr(rs.number), gpr(rt.number))])
240
+ : expects(m, 'two or three registers');
241
+ }
242
+ const [rd, rs, rt] = ops;
243
+ if (ops.length !== 3 || !isReg(rd) || !isReg(rs) || !isReg(rt)) {
244
+ return expects(m, 'two or three registers');
245
+ }
246
+ const operation = word(divide, gpr(rs.number), gpr(rt.number));
247
+ if (rd.number === 0)
248
+ return macro(m, [operation]);
249
+ const traps = ctx.partialDivExpansion
250
+ ? []
251
+ : [
252
+ word('bne', gpr(rt.number), gpr(0), skip(2)),
253
+ nop(),
254
+ word('break', imm(7), imm(0)),
255
+ ...(unsigned
256
+ ? []
257
+ : [
258
+ word('addiu', gpr(AT), gpr(0), imm(-1)),
259
+ word('bne', gpr(rt.number), gpr(AT), skip(4)),
260
+ word('lui', gpr(AT), imm(0x8000)),
261
+ word('bne', gpr(rs.number), gpr(AT), skip(2)),
262
+ nop(),
263
+ word('break', imm(6), imm(0)),
264
+ ]),
265
+ ];
266
+ return { words: [operation, ...traps, word(move, gpr(rd.number))], macro: m, divMove: rd.number };
267
+ }
268
+ function expandRegisterJump(m, ops) {
269
+ if (!ops.some(isReg))
270
+ return undefined;
271
+ const [first, second] = ops;
272
+ if (ops.length === 1 && isReg(first)) {
273
+ return macro(m, [
274
+ m === 'j' ? word('jr', gpr(first.number)) : word('jalr', gpr(RA), gpr(first.number)),
275
+ ]);
276
+ }
277
+ if (m === 'jal' && ops.length === 2 && isReg(first) && isReg(second)) {
278
+ return macro(m, [word('jalr', gpr(first.number), gpr(second.number))]);
279
+ }
280
+ return expects(m, m === 'j' ? 'a target or a register' : 'a target, a register, or two registers');
281
+ }
282
+ /** Expand a macro, or return `undefined` to bind the statement natively. */
283
+ function expandMacro(m, ops, ctx) {
284
+ switch (m) {
285
+ case 'nop':
286
+ return ops.length === 0 ? macro(m, [nop()]) : expects(m, 'no operands');
287
+ case 'move': {
288
+ const [rd, rs] = ops;
289
+ return ops.length === 2 && isReg(rd) && isReg(rs)
290
+ ? macro(m, [word('addu', gpr(rd.number), gpr(rs.number), gpr(0))])
291
+ : expects(m, 'two registers');
292
+ }
293
+ case 'negu': {
294
+ // negu rd alone negates rd in place.
295
+ const [rd, rs = rd] = ops;
296
+ return ops.length <= 2 && isReg(rd) && isReg(rs)
297
+ ? macro(m, [word('subu', gpr(rd.number), gpr(0), gpr(rs.number))])
298
+ : expects(m, 'one or two registers');
299
+ }
300
+ case 'li': {
301
+ const [rd, operand] = ops;
302
+ const n = integerOf(operand);
303
+ return ops.length === 2 && isReg(rd) && n !== undefined
304
+ ? macro(m, loadImmediate(rd.number, n))
305
+ : expects(m, 'a register and an integer');
306
+ }
307
+ case 'la': {
308
+ const [rd, target] = ops;
309
+ if (ops.length === 2 && isReg(rd) && isExpr(target)) {
310
+ if (target.expr.kind === 'number')
311
+ return macro(m, loadImmediate(rd.number, target.expr.value));
312
+ if (target.expr.kind === 'symbol')
313
+ return macro(m, loadAddress(rd.number, target.expr, ctx));
314
+ }
315
+ return expects(m, 'a register and a symbol or an address');
316
+ }
317
+ case 'li.s':
318
+ case 'li.d': {
319
+ const [rd, operand] = ops;
320
+ const n = operand?.kind === 'float' ? operand.value : integerOf(operand);
321
+ if (ops.length !== 2 || !isReg(rd) || n === undefined) {
322
+ return expects(m, 'a register and a floating-point constant');
323
+ }
324
+ if (m === 'li.s')
325
+ return macro(m, loadSingle(rd.number, n));
326
+ return rd.number === 31
327
+ ? expects(m, 'a register other than $31, which has no pair')
328
+ : macro(m, loadDouble(rd.number, n));
329
+ }
330
+ case 'b': {
331
+ const [target] = ops;
332
+ return ops.length === 1 && isExpr(target)
333
+ ? macro(m, [word('bgez', gpr(0), { kind: 'branch', target: target.expr })])
334
+ : expects(m, 'a branch target');
335
+ }
336
+ case 'beqz':
337
+ case 'bnez': {
338
+ const [rs, target] = ops;
339
+ return ops.length === 2 && isReg(rs) && isExpr(target)
340
+ ? macro(m, [
341
+ word(m === 'beqz' ? 'beq' : 'bne', gpr(rs.number), gpr(0), {
342
+ kind: 'branch',
343
+ target: target.expr,
344
+ }),
345
+ ])
346
+ : expects(m, 'a register and a branch target');
347
+ }
348
+ case 'break': {
349
+ const n = integerOf(ops[0]);
350
+ if (ops.length !== 1 || n === undefined)
351
+ return undefined;
352
+ if (n < 0 || n > 0xfffff) {
353
+ return {
354
+ code: 'immediate-out-of-range',
355
+ message: `break: the code ${String(n)} is outside 0 to 1048575.`,
356
+ };
357
+ }
358
+ // A single code is split as maspsx does (test_break): its high
359
+ // bits in [25:16], its low 10 bits in [15:6].
360
+ return {
361
+ words: [{ ...word('break', imm(n >>> 10), imm(n & 0x3ff)), origin: 'instruction' }],
362
+ };
363
+ }
364
+ case 'sll':
365
+ case 'srl':
366
+ case 'sra': {
367
+ // cc1psx writes variable shifts as `sll $2,$4,$5`: the sllv family.
368
+ const [rd, rt, rs] = ops;
369
+ if (ops.length !== 3 || !isReg(rd) || !isReg(rt) || !isReg(rs))
370
+ return undefined;
371
+ return macro(m, [word(`${m}v`, gpr(rd.number), gpr(rt.number), gpr(rs.number))]);
372
+ }
373
+ case 'div':
374
+ case 'divu':
375
+ case 'rem':
376
+ case 'remu':
377
+ return expandDivide(m, ops, ctx);
378
+ case 'j':
379
+ case 'jal':
380
+ return expandRegisterJump(m, ops);
381
+ case 'beq':
382
+ case 'bne':
383
+ return ops[1]?.kind === 'expr'
384
+ ? unsupported(`${m} against an immediate is not supported.`)
385
+ : undefined;
386
+ default:
387
+ break;
388
+ }
389
+ if (UNSUPPORTED.has(m))
390
+ return unsupported(`${m} is not emitted by cc1psx and is not supported.`);
391
+ if (LOADS.has(m) || STORES.has(m))
392
+ return expandLoadStore(m, ops, ctx);
393
+ return expandImmediate(m, ops);
394
+ }
395
+ // ---- native binding ---------------------------------------------------------------
396
+ function bindArg(slot, operand, position) {
397
+ const which = `operand ${String(position)}`;
398
+ if (operand.kind === 'float') {
399
+ return `${which}: a floating-point constant is valid only for li.s and li.d.`;
400
+ }
401
+ switch (slot) {
402
+ case 'rd':
403
+ case 'rs':
404
+ case 'rt':
405
+ return operand.kind === 'reg'
406
+ ? { kind: 'gpr', number: operand.number }
407
+ : `${which} must be a register.`;
408
+ case 'cop0':
409
+ case 'cop2d':
410
+ case 'cop2c':
411
+ case 'cop2dRt': {
412
+ if (operand.kind !== 'reg')
413
+ return `${which} must be a coprocessor register such as $8.`;
414
+ const { unit, space } = COP_SLOTS[slot];
415
+ return { kind: 'cop', number: operand.number, unit, space };
416
+ }
417
+ case 'mem':
418
+ return operand.kind === 'mem'
419
+ ? { kind: 'mem', base: operand.base, offset: operand.offset }
420
+ : `${which} must be offset(base).`;
421
+ case 'branch':
422
+ return operand.kind === 'expr'
423
+ ? { kind: 'branch', target: operand.expr }
424
+ : `${which} must be a branch target.`;
425
+ default:
426
+ return operand.kind === 'expr'
427
+ ? { kind: 'value', expr: operand.expr }
428
+ : `${which} must be ${slot === 'target' ? 'a jump target' : 'an immediate value'}.`;
429
+ }
430
+ }
431
+ /** Match operands to a table row's syntax, or explain why they do not fit. */
432
+ export function bindNative(row, given) {
433
+ let operands = given;
434
+ if (row.optional === 'trailing-zero') {
435
+ const zero = { kind: 'expr', expr: constant(0) };
436
+ operands = [
437
+ ...given,
438
+ ...Array(Math.max(0, row.syntax.length - given.length)).fill(zero),
439
+ ];
440
+ }
441
+ else if (row.optional === 'leading-ra' && given.length === row.syntax.length - 1) {
442
+ operands = [{ kind: 'reg', number: RA }, ...given];
443
+ }
444
+ if (operands.length !== row.syntax.length) {
445
+ const n = row.syntax.length;
446
+ return `takes ${String(n)} operand${n === 1 ? '' : 's'}, not ${String(given.length)}.`;
447
+ }
448
+ const args = [];
449
+ for (const [index, [slot, operand]] of zip(row.syntax, operands).entries()) {
450
+ const bound = bindArg(slot, operand, index + 1);
451
+ if (typeof bound === 'string')
452
+ return bound;
453
+ args.push({ slot, value: bound });
454
+ }
455
+ return args;
456
+ }
457
+ function expandNative(m, ops) {
458
+ const row = rowFor(m);
459
+ if (row === undefined)
460
+ return { code: 'unknown-mnemonic', message: `unknown mnemonic ${m}.` };
461
+ const args = bindNative(row, ops);
462
+ if (typeof args === 'string')
463
+ return { code: 'invalid-operand', message: `${m} ${args}` };
464
+ return { words: [{ row, args, origin: 'instruction' }] };
465
+ }
466
+ function expandInstruction(statement, ctx) {
467
+ const { mnemonic, operands } = statement;
468
+ const outcome = expandMacro(mnemonic, operands, ctx) ?? expandNative(mnemonic, operands);
469
+ if ('code' in outcome) {
470
+ ctx.diagnostics.error(statement, outcome.code, outcome.message);
471
+ return undefined;
472
+ }
473
+ return outcome;
474
+ }
475
+ /** Turn statements into the stream the nop and layout passes work on. */
476
+ export function expand(statements, ctx) {
477
+ const items = [];
478
+ let section = '.text';
479
+ let reorder = true;
480
+ for (const statement of statements) {
481
+ switch (statement.kind) {
482
+ case 'label':
483
+ items.push({
484
+ kind: 'label',
485
+ name: statement.name,
486
+ line: statement.line,
487
+ column: statement.column,
488
+ transparent: isTransparentLabel(statement.name),
489
+ });
490
+ break;
491
+ case 'directive': {
492
+ const d = statement.directive;
493
+ if (d.kind === 'set') {
494
+ if (d.option === 'reorder')
495
+ reorder = true;
496
+ else if (d.option === 'noreorder')
497
+ reorder = false;
498
+ items.push({ kind: 'set', option: d.option, line: statement.line });
499
+ break;
500
+ }
501
+ if (d.kind === 'ignored' && d.transparent)
502
+ break;
503
+ if (d.kind === 'section')
504
+ section = d.name;
505
+ // Every function starts in reorder mode.
506
+ if (d.kind === 'end')
507
+ reorder = true;
508
+ items.push({
509
+ kind: 'directive',
510
+ directive: d,
511
+ line: statement.line,
512
+ column: statement.column,
513
+ });
514
+ break;
515
+ }
516
+ case 'instruction': {
517
+ if (sectionKind(section) !== 'code') {
518
+ ctx.diagnostics.error(statement, 'unsupported-syntax', `instructions belong in a code section, not ${section}.`);
519
+ break;
520
+ }
521
+ const expansion = expandInstruction(statement, ctx);
522
+ if (expansion !== undefined) {
523
+ items.push({
524
+ kind: 'group',
525
+ line: statement.line,
526
+ column: statement.column,
527
+ section,
528
+ reorder,
529
+ words: expansion.words,
530
+ ...(expansion.macro === undefined ? {} : { macro: expansion.macro }),
531
+ ...(expansion.divMove === undefined ? {} : { divMove: expansion.divMove }),
532
+ });
533
+ }
534
+ break;
535
+ }
536
+ }
537
+ }
538
+ return items;
539
+ }
540
+ //# sourceMappingURL=expand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expand.js","sourceRoot":"","sources":["../../src/asm/expand.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;;;GAIG;AACH,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAa,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAmC,MAAM,iBAAiB,CAAC;AAEpF,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAIjC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AA0BlD,MAAM,EAAE,GAAG,CAAC,CAAC;AACb,MAAM,EAAE,GAAG,EAAE,CAAC;AACd,MAAM,EAAE,GAAG,EAAE,CAAC;AAEd,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAGpE,CAAC;AAEF,MAAM,KAAK,GAAwB,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AACnG,MAAM,MAAM,GAAwB,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAEtF,8EAA8E;AAC9E,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC;IAC/C,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,OAAO;IACP,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;CACN,CAAC,CAAC;AAEH,2EAA2E;AAC3E,MAAM,eAAe,GAYjB;IACF,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;IAC9E,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;IAC3E,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;IAC7E,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;IAC1E,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;IAC1E,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;IACvE,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;IAC1E,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;IAC3E,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;CAC/E,CAAC;AAEF,+EAA+E;AAE/E,MAAM,GAAG,GAAG,CAAC,MAAc,EAAW,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AACnE,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AACtE,MAAM,GAAG,GAAG,CAAC,KAAa,EAAW,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACnF,MAAM,KAAK,GAAG,CAAC,IAAU,EAAW,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AACjE,MAAM,KAAK,GAAG,CAAC,EAA0B,EAAE,KAAiB,EAAQ,EAAE,CAAC,CAAC;IACtE,IAAI,EAAE,OAAO;IACb,EAAE;IACF,KAAK;CACN,CAAC,CAAC;AACH,4DAA4D;AAC5D,MAAM,IAAI,GAAG,CAAC,KAAa,EAAW,EAAE,CAAC,CAAC;IACxC,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE;CAC/C,CAAC,CAAC;AAEH,SAAS,IAAI,CAAC,QAAuB,EAAE,GAAG,MAAiB;IACzD,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9E,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,GAAG,GAAG,GAAgB,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnE,MAAM,OAAO,GAAG,CAAC,CAAS,EAAW,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;AACpE,MAAM,OAAO,GAAG,CAAC,CAAS,EAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;AAE9D,SAAS,KAAK,CAAC,IAAY,EAAE,KAA6B;IACxD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,OAAO,CAAC,QAAgB,EAAE,IAAY;IAC7C,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,QAAQ,YAAY,IAAI,GAAG,EAAE,CAAC;AAC9E,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,CAAC;AACjD,CAAC;AAKD,SAAS,KAAK,CAAC,OAAkC;IAC/C,OAAO,OAAO,EAAE,IAAI,KAAK,KAAK,CAAC;AACjC,CAAC;AAED,SAAS,MAAM,CAAC,OAAkC;IAChD,OAAO,OAAO,EAAE,IAAI,KAAK,MAAM,CAAC;AAClC,CAAC;AAED,SAAS,SAAS,CAAC,OAAkC;IACnD,OAAO,OAAO,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ;QAC/D,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK;QACpB,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,+EAA+E;AAE/E,6EAA6E;AAC7E,SAAS,UAAU,CAAC,EAAU,EAAE,IAAY;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAClG,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,aAAa,CAAC,EAAU,EAAE,CAAS;IACjD,IAAI,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,2CAA2C;IAC3C,IAAI,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,UAAU,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,UAAU,CAAC,EAAU,EAAE,CAAS;IACvC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,OAAO,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,UAAU,CAAC,EAAU,EAAE,CAAS;IACvC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC9B,qDAAqD;IACrD,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,UAAU,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,WAAW,CAAC,EAAU,EAAE,MAAkB,EAAE,GAAkB;IACrE,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO;QACL,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED,kFAAkF;AAElF,SAAS,eAAe,CAAC,CAAgB,EAAE,GAAa,EAAE,GAAkB;IAC1E,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC;IAC7B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACxD,IACE,OAAO,EAAE,IAAI,KAAK,KAAK;QACvB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;YAC9B,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EACtE,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,CAAC;IACzC,MAAM,MAAM,GAAY,GAAG;QACzB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;QAC/D,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,MAAY,EAAe,EAAE,CACzD,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAEjD,IAAI,OAAO,EAAE,IAAI,KAAK,KAAK,EAAE,CAAC;QAC5B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QACjC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC,CAAC,EAAE;gBACd,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC7C,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBACzC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACvD,CAAC,CAAC;QACL,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,gDAAgD;YAChD,OAAO,KAAK,CAAC,CAAC,EAAE;gBACd,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;gBAChD,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBACzC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;aAChC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,WAAW,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,CAAC,kCAAkC,EAAE,CAAC;IAEtF,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACzB,qEAAqE;IACrE,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5D,oCAAoC;QACpC,OAAO,KAAK,CAAC,CAAC,EAAE;YACd,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACvD,CAAC,CAAC;IACL,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,IAAI,GAAG;YAAE,OAAO,WAAW,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QAC5E,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACvF,OAAO,KAAK,CAAC,CAAC,EAAE;YACd,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;SAChC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,eAAe,CAAC,CAAS,EAAE,GAAa;IAC/C,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC;IAC9B,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3F,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ;QAChC,OAAO,WAAW,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IACtE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B,4EAA4E;IAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC;IACD,uDAAuD;IACvD,OAAO,KAAK,CAAC,CAAC,EAAE;QACd,GAAG,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;KAC7D,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CACnB,CAAkC,EAClC,GAAa,EACb,GAAkB;IAElB,kEAAkE;IAClE,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,MAAM,GAAkB,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IACxD,MAAM,IAAI,GAAkB,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAClE,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,MAAM;YAAE,OAAO,SAAS,CAAC;QACnC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;QACrB,OAAO,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC3B,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1D,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IACzB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/D,OAAO,OAAO,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,GAAG,CAAC,mBAAmB;QACnC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;YACE,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5C,GAAG,EAAE;YACL,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YAC7B,GAAG,CAAC,QAAQ;gBACV,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBACvC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;oBAC7C,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;oBACjC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;oBAC7C,GAAG,EAAE;oBACL,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;iBAC9B,CAAC;SACP,CAAC;IACN,OAAO,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;AACpG,CAAC;AAED,SAAS,kBAAkB,CAAC,CAAc,EAAE,GAAa;IACvD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC;IAC5B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC,CAAC,EAAE;YACd,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SACrF,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACrE,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,OAAO,CACZ,CAAC,EACD,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,wCAAwC,CAChF,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,SAAS,WAAW,CAAC,CAAS,EAAE,GAAa,EAAE,GAAkB;IAC/D,QAAQ,CAAC,EAAE,CAAC;QACV,KAAK,KAAK;YACR,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QAC1E,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;YACrB,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC/C,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;QAClC,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,qCAAqC;YACrC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;YAC1B,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC9C,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAClE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC;YAC1B,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;YAC7B,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,SAAS;gBACrD,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACvC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,2BAA2B,CAAC,CAAC;QAC9C,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC;YACzB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpD,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ;oBAC/B,OAAO,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC/D,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ;oBAC/B,OAAO,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YAC9D,CAAC;YACD,OAAO,OAAO,CAAC,CAAC,EAAE,uCAAuC,CAAC,CAAC;QAC7D,CAAC;QACD,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC;YAC1B,MAAM,CAAC,GAAG,OAAO,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACzE,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBACtD,OAAO,OAAO,CAAC,CAAC,EAAE,0CAA0C,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,CAAC,KAAK,MAAM;gBAAE,OAAO,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5D,OAAO,EAAE,CAAC,MAAM,KAAK,EAAE;gBACrB,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,8CAA8C,CAAC;gBAC5D,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,GAAG,CAAC,CAAC,CAAC;YACT,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;YACrB,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC;gBACvC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC3E,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACpC,CAAC;QACD,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC;YACzB,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC;gBACpD,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;oBACP,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE;wBACzD,IAAI,EAAE,QAAQ;wBACd,MAAM,EAAE,MAAM,CAAC,IAAI;qBACpB,CAAC;iBACH,CAAC;gBACJ,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,gCAAgC,CAAC,CAAC;QACnD,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC1D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC;gBACzB,OAAO;oBACL,IAAI,EAAE,wBAAwB;oBAC9B,OAAO,EAAE,mBAAmB,MAAM,CAAC,CAAC,CAAC,2BAA2B;iBACjE,CAAC;YACJ,CAAC;YACD,+DAA+D;YAC/D,8CAA8C;YAC9C,OAAO;gBACL,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;aACpF,CAAC;QACJ,CAAC;QACD,KAAK,KAAK,CAAC;QACX,KAAK,KAAK,CAAC;QACX,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,oEAAoE;YACpE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;YACzB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAE,OAAO,SAAS,CAAC;YACjF,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,CAAC;QACD,KAAK,KAAK,CAAC;QACX,KAAK,MAAM,CAAC;QACZ,KAAK,KAAK,CAAC;QACX,KAAK,MAAM;YACT,OAAO,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACnC,KAAK,GAAG,CAAC;QACT,KAAK,KAAK;YACR,OAAO,kBAAkB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACpC,KAAK,KAAK,CAAC;QACX,KAAK,KAAK;YACR,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM;gBAC5B,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,yCAAyC,CAAC;gBAC5D,CAAC,CAAC,SAAS,CAAC;QAChB;YACE,MAAM;IACV,CAAC;IACD,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,WAAW,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAClG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,eAAe,CAAC,CAAkB,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACxF,OAAO,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,sFAAsF;AAEtF,SAAS,OAAO,CAAC,IAAU,EAAE,OAAsB,EAAE,QAAgB;IACnE,MAAM,KAAK,GAAG,WAAW,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC5C,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,GAAG,KAAK,8DAA8D,CAAC;IAChF,CAAC;IACD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,IAAI,CAAC;QACV,KAAK,IAAI,CAAC;QACV,KAAK,IAAI;YACP,OAAO,OAAO,CAAC,IAAI,KAAK,KAAK;gBAC3B,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;gBACzC,CAAC,CAAC,GAAG,KAAK,sBAAsB,CAAC;QACrC,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,OAAO,CAAC;QACb,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK;gBAAE,OAAO,GAAG,KAAK,6CAA6C,CAAC;YACzF,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YACxC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAC9D,CAAC;QACD,KAAK,KAAK;YACR,OAAO,OAAO,CAAC,IAAI,KAAK,KAAK;gBAC3B,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;gBAC7D,CAAC,CAAC,GAAG,KAAK,wBAAwB,CAAC;QACvC,KAAK,QAAQ;YACX,OAAO,OAAO,CAAC,IAAI,KAAK,MAAM;gBAC5B,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE;gBAC1C,CAAC,CAAC,GAAG,KAAK,2BAA2B,CAAC;QAC1C;YACE,OAAO,OAAO,CAAC,IAAI,KAAK,MAAM;gBAC5B,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;gBACvC,CAAC,CAAC,GAAG,KAAK,YAAY,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,oBAAoB,GAAG,CAAC;IAC1F,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,KAAe;IACrD,IAAI,QAAQ,GAAa,KAAK,CAAC;IAC/B,IAAI,GAAG,CAAC,QAAQ,KAAK,eAAe,EAAE,CAAC;QACrC,MAAM,IAAI,GAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,QAAQ,GAAG;YACT,GAAG,KAAK;YACR,GAAG,KAAK,CAAgB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SAClF,CAAC;IACJ,CAAC;SAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnF,QAAQ,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QAC5B,OAAO,SAAS,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;IACzF,CAAC;IACD,MAAM,IAAI,GAAiB,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAChD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,CAAS,EAAE,GAAa;IAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,oBAAoB,CAAC,GAAG,EAAE,CAAC;IAC9F,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAClC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;IAC1F,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,iBAAiB,CACxB,SAA+B,EAC/B,GAAkB;IAElB,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IACzC,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACzF,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;QACtB,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAChE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,MAAM,CAAC,UAAgC,EAAE,GAAkB;IACzE,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,IAAI,OAAO,GAAG,OAAO,CAAC;IACtB,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;YACvB,KAAK,OAAO;gBACV,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,MAAM,EAAE,SAAS,CAAC,MAAM;oBACxB,WAAW,EAAE,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC;iBAChD,CAAC,CAAC;gBACH,MAAM;YACR,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC;gBAC9B,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;oBACrB,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;wBAAE,OAAO,GAAG,IAAI,CAAC;yBACtC,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW;wBAAE,OAAO,GAAG,KAAK,CAAC;oBACnD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;oBACpE,MAAM;gBACR,CAAC;gBACD,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,WAAW;oBAAE,MAAM;gBACjD,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;oBAAE,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC3C,yCAAyC;gBACzC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK;oBAAE,OAAO,GAAG,IAAI,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,WAAW;oBACjB,SAAS,EAAE,CAAC;oBACZ,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,MAAM,EAAE,SAAS,CAAC,MAAM;iBACzB,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;YACD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,IAAI,WAAW,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;oBACpC,GAAG,CAAC,WAAW,CAAC,KAAK,CACnB,SAAS,EACT,oBAAoB,EACpB,8CAA8C,OAAO,GAAG,CACzD,CAAC;oBACF,MAAM;gBACR,CAAC;gBACD,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBACpD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;oBAC5B,KAAK,CAAC,IAAI,CAAC;wBACT,IAAI,EAAE,OAAO;wBACb,IAAI,EAAE,SAAS,CAAC,IAAI;wBACpB,MAAM,EAAE,SAAS,CAAC,MAAM;wBACxB,OAAO;wBACP,OAAO;wBACP,KAAK,EAAE,SAAS,CAAC,KAAK;wBACtB,GAAG,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC;wBACpE,GAAG,CAAC,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC;qBAC3E,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Group, Item, PendingWord } from './stream.js';
2
+ export interface HazardOptions {
3
+ /** Apply the load-delay rule to mfc2/cfc2. */
4
+ readonly copMoveDelayNop: boolean;
5
+ }
6
+ /** A group's first and last words (a nop for the never-produced empty group). */
7
+ export declare function endsOf(group: Group): readonly [PendingWord, PendingWord];
8
+ /** Insert the nops ASPSX 2.81 would, returning a new stream. */
9
+ export declare function insertNops(items: readonly Item[], options: HazardOptions): Item[];
10
+ //# sourceMappingURL=hazards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hazards.d.ts","sourceRoot":"","sources":["../../src/asm/hazards.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC;AAkBD,iFAAiF;AACjF,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC,CAIxE;AA0ID,gEAAgE;AAChE,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,EAAE,CA0CjF"}