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.
- package/CHANGELOG.md +65 -0
- package/LICENSE +56 -0
- package/README.md +220 -0
- package/bin/psyq-asm.mjs +149 -0
- package/dist/asm/assemble.d.ts +10 -0
- package/dist/asm/assemble.d.ts.map +1 -0
- package/dist/asm/assemble.js +42 -0
- package/dist/asm/assemble.js.map +1 -0
- package/dist/asm/diagnostics.d.ts +22 -0
- package/dist/asm/diagnostics.d.ts.map +1 -0
- package/dist/asm/diagnostics.js +40 -0
- package/dist/asm/diagnostics.js.map +1 -0
- package/dist/asm/directives.d.ts +67 -0
- package/dist/asm/directives.d.ts.map +1 -0
- package/dist/asm/directives.js +254 -0
- package/dist/asm/directives.js.map +1 -0
- package/dist/asm/expand.d.ts +21 -0
- package/dist/asm/expand.d.ts.map +1 -0
- package/dist/asm/expand.js +540 -0
- package/dist/asm/expand.js.map +1 -0
- package/dist/asm/hazards.d.ts +10 -0
- package/dist/asm/hazards.d.ts.map +1 -0
- package/dist/asm/hazards.js +196 -0
- package/dist/asm/hazards.js.map +1 -0
- package/dist/asm/layout.d.ts +17 -0
- package/dist/asm/layout.d.ts.map +1 -0
- package/dist/asm/layout.js +257 -0
- package/dist/asm/layout.js.map +1 -0
- package/dist/asm/lexer.d.ts +23 -0
- package/dist/asm/lexer.d.ts.map +1 -0
- package/dist/asm/lexer.js +81 -0
- package/dist/asm/lexer.js.map +1 -0
- package/dist/asm/object.d.ts +6 -0
- package/dist/asm/object.d.ts.map +1 -0
- package/dist/asm/object.js +46 -0
- package/dist/asm/object.js.map +1 -0
- package/dist/asm/operands.d.ts +49 -0
- package/dist/asm/operands.d.ts.map +1 -0
- package/dist/asm/operands.js +114 -0
- package/dist/asm/operands.js.map +1 -0
- package/dist/asm/parser.d.ts +28 -0
- package/dist/asm/parser.d.ts.map +1 -0
- package/dist/asm/parser.js +60 -0
- package/dist/asm/parser.js.map +1 -0
- package/dist/asm/relocations.d.ts +42 -0
- package/dist/asm/relocations.d.ts.map +1 -0
- package/dist/asm/relocations.js +214 -0
- package/dist/asm/relocations.js.map +1 -0
- package/dist/asm/sections.d.ts +23 -0
- package/dist/asm/sections.d.ts.map +1 -0
- package/dist/asm/sections.js +81 -0
- package/dist/asm/sections.js.map +1 -0
- package/dist/asm/stream.d.ts +77 -0
- package/dist/asm/stream.d.ts.map +1 -0
- package/dist/asm/stream.js +2 -0
- package/dist/asm/stream.js.map +1 -0
- package/dist/asm/symbols.d.ts +42 -0
- package/dist/asm/symbols.d.ts.map +1 -0
- package/dist/asm/symbols.js +122 -0
- package/dist/asm/symbols.js.map +1 -0
- package/dist/errors.d.ts +27 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +34 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/isa/decode.d.ts +8 -0
- package/dist/isa/decode.d.ts.map +1 -0
- package/dist/isa/decode.js +92 -0
- package/dist/isa/decode.js.map +1 -0
- package/dist/isa/encode.d.ts +9 -0
- package/dist/isa/encode.d.ts.map +1 -0
- package/dist/isa/encode.js +124 -0
- package/dist/isa/encode.js.map +1 -0
- package/dist/isa/fields.d.ts +27 -0
- package/dist/isa/fields.d.ts.map +1 -0
- package/dist/isa/fields.js +49 -0
- package/dist/isa/fields.js.map +1 -0
- package/dist/isa/format.d.ts +14 -0
- package/dist/isa/format.d.ts.map +1 -0
- package/dist/isa/format.js +98 -0
- package/dist/isa/format.js.map +1 -0
- package/dist/isa/instruction.d.ts +15 -0
- package/dist/isa/instruction.d.ts.map +1 -0
- package/dist/isa/instruction.js +47 -0
- package/dist/isa/instruction.js.map +1 -0
- package/dist/isa/registers.d.ts +8 -0
- package/dist/isa/registers.d.ts.map +1 -0
- package/dist/isa/registers.js +55 -0
- package/dist/isa/registers.js.map +1 -0
- package/dist/isa/table.d.ts +179 -0
- package/dist/isa/table.d.ts.map +1 -0
- package/dist/isa/table.js +128 -0
- package/dist/isa/table.js.map +1 -0
- package/dist/options.d.ts +29 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +0 -0
- package/dist/options.js.map +1 -0
- package/dist/program/decode-words.d.ts +9 -0
- package/dist/program/decode-words.d.ts.map +1 -0
- package/dist/program/decode-words.js +87 -0
- package/dist/program/decode-words.js.map +1 -0
- package/dist/program/format-program.d.ts +12 -0
- package/dist/program/format-program.d.ts.map +1 -0
- package/dist/program/format-program.js +37 -0
- package/dist/program/format-program.js.map +1 -0
- package/dist/public-types.d.ts +253 -0
- package/dist/public-types.d.ts.map +1 -0
- package/dist/public-types.js +2 -0
- package/dist/public-types.js.map +1 -0
- package/dist/util.d.ts +3 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +11 -0
- package/dist/util.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE instruction table. One row per mnemonic drives the encoder, the decoder,
|
|
3
|
+
* the formatter, operand validation in the assembler, and the register
|
|
4
|
+
* read/write sets the hazard pass reasons about. Nothing else in the package
|
|
5
|
+
* knows an opcode.
|
|
6
|
+
*/
|
|
7
|
+
import type { HazardClass, InstructionFormat } from '../public-types.js';
|
|
8
|
+
import type { Slot } from './fields.js';
|
|
9
|
+
/** A register named by the field holding it, or the implicit return address. */
|
|
10
|
+
export type RegisterRef = 'rs' | 'rt' | 'rd' | 31;
|
|
11
|
+
export interface IsaRow {
|
|
12
|
+
readonly mnemonic: string;
|
|
13
|
+
readonly format: InstructionFormat;
|
|
14
|
+
/** Bits that select this row, and their required value. */
|
|
15
|
+
readonly mask: number;
|
|
16
|
+
readonly value: number;
|
|
17
|
+
/** Operand slots in assembly order. */
|
|
18
|
+
readonly syntax: readonly Slot[];
|
|
19
|
+
/** General-purpose registers the instruction reads (architecturally). */
|
|
20
|
+
readonly reads: readonly RegisterRef[];
|
|
21
|
+
/** General-purpose registers the instruction writes. */
|
|
22
|
+
readonly writes: readonly RegisterRef[];
|
|
23
|
+
/**
|
|
24
|
+
* Registers that count as read for the load-delay rule, when they differ from
|
|
25
|
+
* `reads`. See the `lwl`/`lwr` rows.
|
|
26
|
+
*/
|
|
27
|
+
readonly hazardReads?: readonly RegisterRef[];
|
|
28
|
+
readonly hazard: HazardClass;
|
|
29
|
+
/**
|
|
30
|
+
* `leading-ra`: the first operand may be omitted and defaults to `$31`
|
|
31
|
+
* (`jalr rs`). `trailing-zero`: the last operand may be omitted and defaults
|
|
32
|
+
* to 0 (`syscall`, `break`, `tge`).
|
|
33
|
+
*/
|
|
34
|
+
readonly optional?: 'leading-ra' | 'trailing-zero';
|
|
35
|
+
}
|
|
36
|
+
export declare const ISA_ROWS: readonly [IsaRow & {
|
|
37
|
+
readonly mnemonic: "sll";
|
|
38
|
+
}, IsaRow & {
|
|
39
|
+
readonly mnemonic: "srl";
|
|
40
|
+
}, IsaRow & {
|
|
41
|
+
readonly mnemonic: "sra";
|
|
42
|
+
}, IsaRow & {
|
|
43
|
+
readonly mnemonic: "sllv";
|
|
44
|
+
}, IsaRow & {
|
|
45
|
+
readonly mnemonic: "srlv";
|
|
46
|
+
}, IsaRow & {
|
|
47
|
+
readonly mnemonic: "srav";
|
|
48
|
+
}, IsaRow & {
|
|
49
|
+
readonly mnemonic: "jr";
|
|
50
|
+
}, IsaRow & {
|
|
51
|
+
readonly mnemonic: "jalr";
|
|
52
|
+
}, IsaRow & {
|
|
53
|
+
readonly mnemonic: "syscall";
|
|
54
|
+
}, IsaRow & {
|
|
55
|
+
readonly mnemonic: "break";
|
|
56
|
+
}, IsaRow & {
|
|
57
|
+
readonly mnemonic: "mfhi";
|
|
58
|
+
}, IsaRow & {
|
|
59
|
+
readonly mnemonic: "mthi";
|
|
60
|
+
}, IsaRow & {
|
|
61
|
+
readonly mnemonic: "mflo";
|
|
62
|
+
}, IsaRow & {
|
|
63
|
+
readonly mnemonic: "mtlo";
|
|
64
|
+
}, IsaRow & {
|
|
65
|
+
readonly mnemonic: "mult";
|
|
66
|
+
}, IsaRow & {
|
|
67
|
+
readonly mnemonic: "multu";
|
|
68
|
+
}, IsaRow & {
|
|
69
|
+
readonly mnemonic: "div";
|
|
70
|
+
}, IsaRow & {
|
|
71
|
+
readonly mnemonic: "divu";
|
|
72
|
+
}, IsaRow & {
|
|
73
|
+
readonly mnemonic: "add";
|
|
74
|
+
}, IsaRow & {
|
|
75
|
+
readonly mnemonic: "addu";
|
|
76
|
+
}, IsaRow & {
|
|
77
|
+
readonly mnemonic: "sub";
|
|
78
|
+
}, IsaRow & {
|
|
79
|
+
readonly mnemonic: "subu";
|
|
80
|
+
}, IsaRow & {
|
|
81
|
+
readonly mnemonic: "and";
|
|
82
|
+
}, IsaRow & {
|
|
83
|
+
readonly mnemonic: "or";
|
|
84
|
+
}, IsaRow & {
|
|
85
|
+
readonly mnemonic: "xor";
|
|
86
|
+
}, IsaRow & {
|
|
87
|
+
readonly mnemonic: "nor";
|
|
88
|
+
}, IsaRow & {
|
|
89
|
+
readonly mnemonic: "slt";
|
|
90
|
+
}, IsaRow & {
|
|
91
|
+
readonly mnemonic: "sltu";
|
|
92
|
+
}, IsaRow & {
|
|
93
|
+
readonly mnemonic: "tge";
|
|
94
|
+
}, IsaRow & {
|
|
95
|
+
readonly mnemonic: "bltz";
|
|
96
|
+
}, IsaRow & {
|
|
97
|
+
readonly mnemonic: "bgez";
|
|
98
|
+
}, IsaRow & {
|
|
99
|
+
readonly mnemonic: "bltzal";
|
|
100
|
+
}, IsaRow & {
|
|
101
|
+
readonly mnemonic: "bgezal";
|
|
102
|
+
}, IsaRow & {
|
|
103
|
+
readonly mnemonic: "j";
|
|
104
|
+
}, IsaRow & {
|
|
105
|
+
readonly mnemonic: "jal";
|
|
106
|
+
}, IsaRow & {
|
|
107
|
+
readonly mnemonic: "beq";
|
|
108
|
+
}, IsaRow & {
|
|
109
|
+
readonly mnemonic: "bne";
|
|
110
|
+
}, IsaRow & {
|
|
111
|
+
readonly mnemonic: "blez";
|
|
112
|
+
}, IsaRow & {
|
|
113
|
+
readonly mnemonic: "bgtz";
|
|
114
|
+
}, IsaRow & {
|
|
115
|
+
readonly mnemonic: "addi";
|
|
116
|
+
}, IsaRow & {
|
|
117
|
+
readonly mnemonic: "addiu";
|
|
118
|
+
}, IsaRow & {
|
|
119
|
+
readonly mnemonic: "slti";
|
|
120
|
+
}, IsaRow & {
|
|
121
|
+
readonly mnemonic: "sltiu";
|
|
122
|
+
}, IsaRow & {
|
|
123
|
+
readonly mnemonic: "andi";
|
|
124
|
+
}, IsaRow & {
|
|
125
|
+
readonly mnemonic: "ori";
|
|
126
|
+
}, IsaRow & {
|
|
127
|
+
readonly mnemonic: "xori";
|
|
128
|
+
}, IsaRow & {
|
|
129
|
+
readonly mnemonic: "lui";
|
|
130
|
+
}, IsaRow & {
|
|
131
|
+
readonly mnemonic: "lb";
|
|
132
|
+
}, IsaRow & {
|
|
133
|
+
readonly mnemonic: "lh";
|
|
134
|
+
}, IsaRow & {
|
|
135
|
+
readonly mnemonic: "lwl";
|
|
136
|
+
}, IsaRow & {
|
|
137
|
+
readonly mnemonic: "lw";
|
|
138
|
+
}, IsaRow & {
|
|
139
|
+
readonly mnemonic: "lbu";
|
|
140
|
+
}, IsaRow & {
|
|
141
|
+
readonly mnemonic: "lhu";
|
|
142
|
+
}, IsaRow & {
|
|
143
|
+
readonly mnemonic: "lwr";
|
|
144
|
+
}, IsaRow & {
|
|
145
|
+
readonly mnemonic: "sb";
|
|
146
|
+
}, IsaRow & {
|
|
147
|
+
readonly mnemonic: "sh";
|
|
148
|
+
}, IsaRow & {
|
|
149
|
+
readonly mnemonic: "swl";
|
|
150
|
+
}, IsaRow & {
|
|
151
|
+
readonly mnemonic: "sw";
|
|
152
|
+
}, IsaRow & {
|
|
153
|
+
readonly mnemonic: "swr";
|
|
154
|
+
}, IsaRow & {
|
|
155
|
+
readonly mnemonic: "lwc2";
|
|
156
|
+
}, IsaRow & {
|
|
157
|
+
readonly mnemonic: "swc2";
|
|
158
|
+
}, IsaRow & {
|
|
159
|
+
readonly mnemonic: "mfc0";
|
|
160
|
+
}, IsaRow & {
|
|
161
|
+
readonly mnemonic: "mtc0";
|
|
162
|
+
}, IsaRow & {
|
|
163
|
+
readonly mnemonic: "rfe";
|
|
164
|
+
}, IsaRow & {
|
|
165
|
+
readonly mnemonic: "mfc2";
|
|
166
|
+
}, IsaRow & {
|
|
167
|
+
readonly mnemonic: "cfc2";
|
|
168
|
+
}, IsaRow & {
|
|
169
|
+
readonly mnemonic: "mtc2";
|
|
170
|
+
}, IsaRow & {
|
|
171
|
+
readonly mnemonic: "ctc2";
|
|
172
|
+
}, IsaRow & {
|
|
173
|
+
readonly mnemonic: "cop2";
|
|
174
|
+
}];
|
|
175
|
+
/** Every mnemonic in the instruction table. */
|
|
176
|
+
export type TableMnemonic = (typeof ISA_ROWS)[number]['mnemonic'];
|
|
177
|
+
/** Look up a table row by mnemonic. */
|
|
178
|
+
export declare function rowFor(mnemonic: string): IsaRow | undefined;
|
|
179
|
+
//# sourceMappingURL=table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/isa/table.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,aAAa,CAAC;AAEjD,gFAAgF;AAChF,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;AAElD,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC;IACjC,yEAAyE;IACzE,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,wDAAwD;IACxD,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,GAAG,eAAe,CAAC;CACpD;AA2GD,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsFX,CAAC;AAEX,+CAA+C;AAC/C,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;AAIlE,uCAAuC;AACvC,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE3D"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
function row(mnemonic, format, mask, value, syntax, reads, writes, options = {}) {
|
|
2
|
+
return Object.freeze({
|
|
3
|
+
mnemonic,
|
|
4
|
+
format,
|
|
5
|
+
mask,
|
|
6
|
+
value,
|
|
7
|
+
syntax,
|
|
8
|
+
reads,
|
|
9
|
+
writes,
|
|
10
|
+
hazard: options.hazard ?? 'none',
|
|
11
|
+
...(options.hazardReads === undefined ? {} : { hazardReads: options.hazardReads }),
|
|
12
|
+
...(options.optional === undefined ? {} : { optional: options.optional }),
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
/** SPECIAL (op 0x00), selected by fn. */
|
|
16
|
+
function special(mnemonic, fn, syntax, reads, writes, options) {
|
|
17
|
+
return row(mnemonic, 'R', 0xfc00003f, fn, syntax, reads, writes, options);
|
|
18
|
+
}
|
|
19
|
+
/** REGIMM (op 0x01), selected by rt. */
|
|
20
|
+
function regimm(mnemonic, rt, writes) {
|
|
21
|
+
return row(mnemonic, 'I', 0xfc1f0000, (0x04000000 | (rt << 16)) >>> 0, ['rs', 'branch'], ['rs'], writes, {
|
|
22
|
+
hazard: 'branch',
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/** A primary opcode. */
|
|
26
|
+
function primary(mnemonic, op, format, syntax, reads, writes, options) {
|
|
27
|
+
return row(mnemonic, format, 0xfc000000, (op << 26) >>> 0, syntax, reads, writes, options);
|
|
28
|
+
}
|
|
29
|
+
/** A coprocessor register move, selected by op and rs. */
|
|
30
|
+
function copMove(mnemonic, unit, rs, slot, direction) {
|
|
31
|
+
const value = (((0x10 | unit) << 26) | (rs << 21)) >>> 0;
|
|
32
|
+
return row(mnemonic, 'COP', 0xffe00000, value, ['rt', slot], direction === 'to' ? ['rt'] : [], direction === 'from' ? ['rt'] : [], { hazard: direction === 'from' ? 'cop-from' : 'cop-to' });
|
|
33
|
+
}
|
|
34
|
+
const R3 = ['rd', 'rs', 'rt'];
|
|
35
|
+
const SHIFT = ['rd', 'rt', 'sa'];
|
|
36
|
+
const SHIFTV = ['rd', 'rt', 'rs'];
|
|
37
|
+
const IMM_S = ['rt', 'rs', 'imm16s'];
|
|
38
|
+
const IMM_U = ['rt', 'rs', 'imm16u'];
|
|
39
|
+
const MEM = ['rt', 'mem'];
|
|
40
|
+
export const ISA_ROWS = [
|
|
41
|
+
// SPECIAL
|
|
42
|
+
special('sll', 0x00, SHIFT, ['rt'], ['rd']),
|
|
43
|
+
special('srl', 0x02, SHIFT, ['rt'], ['rd']),
|
|
44
|
+
special('sra', 0x03, SHIFT, ['rt'], ['rd']),
|
|
45
|
+
special('sllv', 0x04, SHIFTV, ['rt', 'rs'], ['rd']),
|
|
46
|
+
special('srlv', 0x06, SHIFTV, ['rt', 'rs'], ['rd']),
|
|
47
|
+
special('srav', 0x07, SHIFTV, ['rt', 'rs'], ['rd']),
|
|
48
|
+
special('jr', 0x08, ['rs'], ['rs'], [], { hazard: 'jump' }),
|
|
49
|
+
special('jalr', 0x09, ['rd', 'rs'], ['rs'], ['rd'], { hazard: 'jump', optional: 'leading-ra' }),
|
|
50
|
+
special('syscall', 0x0c, ['code20'], [], [], { optional: 'trailing-zero' }),
|
|
51
|
+
// Two 10-bit codes, as GNU as and rabbitizer write them: `break 7,0`.
|
|
52
|
+
special('break', 0x0d, ['code10hi', 'code10'], [], [], { optional: 'trailing-zero' }),
|
|
53
|
+
special('mfhi', 0x10, ['rd'], [], ['rd'], { hazard: 'mflo' }),
|
|
54
|
+
special('mthi', 0x11, ['rs'], ['rs'], [], { hazard: 'mtlo' }),
|
|
55
|
+
special('mflo', 0x12, ['rd'], [], ['rd'], { hazard: 'mflo' }),
|
|
56
|
+
special('mtlo', 0x13, ['rs'], ['rs'], [], { hazard: 'mtlo' }),
|
|
57
|
+
special('mult', 0x18, ['rs', 'rt'], ['rs', 'rt'], [], { hazard: 'mult' }),
|
|
58
|
+
special('multu', 0x19, ['rs', 'rt'], ['rs', 'rt'], [], { hazard: 'mult' }),
|
|
59
|
+
special('div', 0x1a, ['rs', 'rt'], ['rs', 'rt'], [], { hazard: 'div' }),
|
|
60
|
+
special('divu', 0x1b, ['rs', 'rt'], ['rs', 'rt'], [], { hazard: 'div' }),
|
|
61
|
+
special('add', 0x20, R3, ['rs', 'rt'], ['rd']),
|
|
62
|
+
special('addu', 0x21, R3, ['rs', 'rt'], ['rd']),
|
|
63
|
+
special('sub', 0x22, R3, ['rs', 'rt'], ['rd']),
|
|
64
|
+
special('subu', 0x23, R3, ['rs', 'rt'], ['rd']),
|
|
65
|
+
special('and', 0x24, R3, ['rs', 'rt'], ['rd']),
|
|
66
|
+
special('or', 0x25, R3, ['rs', 'rt'], ['rd']),
|
|
67
|
+
special('xor', 0x26, R3, ['rs', 'rt'], ['rd']),
|
|
68
|
+
special('nor', 0x27, R3, ['rs', 'rt'], ['rd']),
|
|
69
|
+
special('slt', 0x2a, R3, ['rs', 'rt'], ['rd']),
|
|
70
|
+
special('sltu', 0x2b, R3, ['rs', 'rt'], ['rd']),
|
|
71
|
+
// Not emitted by the compiler or by ASPSX 2.81; present so older divide
|
|
72
|
+
// expansions (`tge $zero,$zero,93`) decode.
|
|
73
|
+
special('tge', 0x30, ['rs', 'rt', 'code10'], ['rs', 'rt'], [], { optional: 'trailing-zero' }),
|
|
74
|
+
// REGIMM
|
|
75
|
+
regimm('bltz', 0x00, []),
|
|
76
|
+
regimm('bgez', 0x01, []),
|
|
77
|
+
regimm('bltzal', 0x10, [31]),
|
|
78
|
+
regimm('bgezal', 0x11, [31]),
|
|
79
|
+
// Primary opcodes
|
|
80
|
+
primary('j', 0x02, 'J', ['target'], [], [], { hazard: 'jump' }),
|
|
81
|
+
primary('jal', 0x03, 'J', ['target'], [], [31], { hazard: 'jump' }),
|
|
82
|
+
primary('beq', 0x04, 'I', ['rs', 'rt', 'branch'], ['rs', 'rt'], [], { hazard: 'branch' }),
|
|
83
|
+
primary('bne', 0x05, 'I', ['rs', 'rt', 'branch'], ['rs', 'rt'], [], { hazard: 'branch' }),
|
|
84
|
+
primary('blez', 0x06, 'I', ['rs', 'branch'], ['rs'], [], { hazard: 'branch' }),
|
|
85
|
+
primary('bgtz', 0x07, 'I', ['rs', 'branch'], ['rs'], [], { hazard: 'branch' }),
|
|
86
|
+
primary('addi', 0x08, 'I', IMM_S, ['rs'], ['rt']),
|
|
87
|
+
primary('addiu', 0x09, 'I', IMM_S, ['rs'], ['rt']),
|
|
88
|
+
primary('slti', 0x0a, 'I', IMM_S, ['rs'], ['rt']),
|
|
89
|
+
primary('sltiu', 0x0b, 'I', IMM_S, ['rs'], ['rt']),
|
|
90
|
+
primary('andi', 0x0c, 'I', IMM_U, ['rs'], ['rt']),
|
|
91
|
+
primary('ori', 0x0d, 'I', IMM_U, ['rs'], ['rt']),
|
|
92
|
+
primary('xori', 0x0e, 'I', IMM_U, ['rs'], ['rt']),
|
|
93
|
+
primary('lui', 0x0f, 'I', ['rt', 'imm16u'], [], ['rt']),
|
|
94
|
+
primary('lb', 0x20, 'I', MEM, ['rs'], ['rt'], { hazard: 'load' }),
|
|
95
|
+
primary('lh', 0x21, 'I', MEM, ['rs'], ['rt'], { hazard: 'load' }),
|
|
96
|
+
// lwl and lwr merge into the destination, so they read rt architecturally.
|
|
97
|
+
// ASPSX does not count that read for the load-delay nop: `lwl $3,3($8)`
|
|
98
|
+
// followed by `lwr $3,0($8)` gets no nop (maspsx test_lwl_lwr_no_nop).
|
|
99
|
+
primary('lwl', 0x22, 'I', MEM, ['rs', 'rt'], ['rt'], { hazard: 'load', hazardReads: ['rs'] }),
|
|
100
|
+
primary('lw', 0x23, 'I', MEM, ['rs'], ['rt'], { hazard: 'load' }),
|
|
101
|
+
primary('lbu', 0x24, 'I', MEM, ['rs'], ['rt'], { hazard: 'load' }),
|
|
102
|
+
primary('lhu', 0x25, 'I', MEM, ['rs'], ['rt'], { hazard: 'load' }),
|
|
103
|
+
primary('lwr', 0x26, 'I', MEM, ['rs', 'rt'], ['rt'], { hazard: 'load', hazardReads: ['rs'] }),
|
|
104
|
+
primary('sb', 0x28, 'I', MEM, ['rs', 'rt'], []),
|
|
105
|
+
primary('sh', 0x29, 'I', MEM, ['rs', 'rt'], []),
|
|
106
|
+
primary('swl', 0x2a, 'I', MEM, ['rs', 'rt'], []),
|
|
107
|
+
primary('sw', 0x2b, 'I', MEM, ['rs', 'rt'], []),
|
|
108
|
+
primary('swr', 0x2e, 'I', MEM, ['rs', 'rt'], []),
|
|
109
|
+
// lwc2/swc2 move a coprocessor 2 data register; only the base is a GPR.
|
|
110
|
+
primary('lwc2', 0x32, 'I', ['cop2dRt', 'mem'], ['rs'], []),
|
|
111
|
+
primary('swc2', 0x3a, 'I', ['cop2dRt', 'mem'], ['rs'], []),
|
|
112
|
+
// Coprocessor 0
|
|
113
|
+
copMove('mfc0', 0, 0x00, 'cop0', 'from'),
|
|
114
|
+
copMove('mtc0', 0, 0x04, 'cop0', 'to'),
|
|
115
|
+
row('rfe', 'COP', 0xffffffff, 0x42000010, [], [], []),
|
|
116
|
+
// Coprocessor 2 (GTE)
|
|
117
|
+
copMove('mfc2', 2, 0x00, 'cop2d', 'from'),
|
|
118
|
+
copMove('cfc2', 2, 0x02, 'cop2c', 'from'),
|
|
119
|
+
copMove('mtc2', 2, 0x04, 'cop2d', 'to'),
|
|
120
|
+
copMove('ctc2', 2, 0x06, 'cop2c', 'to'),
|
|
121
|
+
row('cop2', 'COP2CMD', 0xfe000000, 0x4a000000, ['imm25'], [], []),
|
|
122
|
+
];
|
|
123
|
+
const BY_MNEMONIC = new Map(ISA_ROWS.map((r) => [r.mnemonic, r]));
|
|
124
|
+
/** Look up a table row by mnemonic. */
|
|
125
|
+
export function rowFor(mnemonic) {
|
|
126
|
+
return BY_MNEMONIC.get(mnemonic);
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/isa/table.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { AspsxVersion, ExperimentalBehaviours } from './public-types.js';
|
|
2
|
+
/** Every ASPSX version `assemble` accepts. */
|
|
3
|
+
export declare const SUPPORTED_ASPSX_VERSIONS: readonly ['2.81'];
|
|
4
|
+
/** The version used when `aspsxVersion` is omitted. */
|
|
5
|
+
export declare const DEFAULT_ASPSX_VERSION: AspsxVersion;
|
|
6
|
+
/** The file name diagnostics use when `filename` is omitted. */
|
|
7
|
+
export declare const DEFAULT_FILENAME = "input.s";
|
|
8
|
+
/** The value of each unsettled behaviour switch when it is not overridden. */
|
|
9
|
+
export declare const DEFAULT_EXPERIMENTAL: ExperimentalBehaviours;
|
|
10
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
11
|
+
export interface NormalizedFormatStyle {
|
|
12
|
+
readonly registers: 'numeric' | 'abi';
|
|
13
|
+
readonly pseudo: boolean;
|
|
14
|
+
readonly hex: boolean;
|
|
15
|
+
}
|
|
16
|
+
/** Validate and normalize a `FormatStyle`. */
|
|
17
|
+
export declare function validateFormatStyle(style: unknown): NormalizedFormatStyle;
|
|
18
|
+
export interface NormalizedAssembleOptions {
|
|
19
|
+
readonly gpSize: number;
|
|
20
|
+
readonly aspsxVersion: AspsxVersion;
|
|
21
|
+
readonly partialDivExpansion: boolean;
|
|
22
|
+
readonly filename: string;
|
|
23
|
+
readonly experimental: ExperimentalBehaviours;
|
|
24
|
+
}
|
|
25
|
+
/** Validate and normalize `AssembleOptions`. */
|
|
26
|
+
export declare function validateAssembleOptions(options: unknown): NormalizedAssembleOptions;
|
|
27
|
+
/** Turn the `source` argument into text; bytes are decoded as UTF-8. */
|
|
28
|
+
export declare function decodeSource(source: unknown): string;
|
|
29
|
+
//# sourceMappingURL=options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE9E,8CAA8C;AAC9C,eAAO,MAAM,wBAAwB,EAAE,SAAS,CAAC,MAAM,CAAoC,CAAC;AAE5F,uDAAuD;AACvD,eAAO,MAAM,qBAAqB,EAAE,YAAqB,CAAC;AAE1D,gEAAgE;AAChE,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAE1C,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,EAAE,sBAGjC,CAAC;AAEH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAgCD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,KAAK,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CACvB;AAQD,8CAA8C;AAC9C,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,CAezE;AAID,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,sBAAsB,CAAC;CAC/C;AAkCD,gDAAgD;AAChD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,yBAAyB,CA0BnF;AAED,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAIpD"}
|
package/dist/options.js
ADDED
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DecodedProgram, DecodeOptions } from '../public-types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Decode a sequence of words as a program. Branches whose targets fall inside
|
|
4
|
+
* the sequence (or at its end) get synthetic labels: `L_12` by word index, or
|
|
5
|
+
* `L_800C56C0` by address when `baseAddress` is given. With a base address,
|
|
6
|
+
* `j`/`jal` targets inside the sequence are labelled too.
|
|
7
|
+
*/
|
|
8
|
+
export declare function decodeWords(words: ArrayLike<number>, options?: DecodeOptions): DecodedProgram;
|
|
9
|
+
//# sourceMappingURL=decode-words.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode-words.d.ts","sourceRoot":"","sources":["../../src/program/decode-words.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EAGd,MAAM,oBAAoB,CAAC;AAkE5B;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,cAAc,CAgC7F"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
/** A whole-program view of decoded words: branch targets resolved to labels. */
|
|
3
|
+
import { InvalidOptionsError } from '../errors.js';
|
|
4
|
+
import { decode } from '../isa/decode.js';
|
|
5
|
+
import { isRecord } from '../options.js';
|
|
6
|
+
const SYMBOL_NAME = /^[A-Za-z_.$][A-Za-z0-9_.$]*$/;
|
|
7
|
+
const KNOWN_OPTIONS = ['baseAddress', 'labelPrefix'];
|
|
8
|
+
function validateDecodeOptions(options) {
|
|
9
|
+
if (options === undefined)
|
|
10
|
+
return { baseAddress: undefined, labelPrefix: 'L' };
|
|
11
|
+
if (!isRecord(options))
|
|
12
|
+
throw new InvalidOptionsError('options must be an object.');
|
|
13
|
+
for (const key of Object.keys(options)) {
|
|
14
|
+
if (!KNOWN_OPTIONS.includes(key))
|
|
15
|
+
throw new InvalidOptionsError(`options.${key} is not a known option.`);
|
|
16
|
+
}
|
|
17
|
+
const { baseAddress, labelPrefix } = options;
|
|
18
|
+
if (baseAddress !== undefined &&
|
|
19
|
+
(typeof baseAddress !== 'number' ||
|
|
20
|
+
!Number.isInteger(baseAddress) ||
|
|
21
|
+
baseAddress < 0 ||
|
|
22
|
+
baseAddress > 0xfffffffc ||
|
|
23
|
+
baseAddress % 4 !== 0)) {
|
|
24
|
+
throw new InvalidOptionsError('baseAddress must be a word-aligned 32-bit address.');
|
|
25
|
+
}
|
|
26
|
+
if (labelPrefix !== undefined &&
|
|
27
|
+
(typeof labelPrefix !== 'string' || !SYMBOL_NAME.test(labelPrefix))) {
|
|
28
|
+
throw new InvalidOptionsError(`labelPrefix ${JSON.stringify(labelPrefix)} must be a symbol name.`);
|
|
29
|
+
}
|
|
30
|
+
return { baseAddress, labelPrefix: labelPrefix ?? 'L' };
|
|
31
|
+
}
|
|
32
|
+
function hex8(value) {
|
|
33
|
+
return value.toString(16).toUpperCase().padStart(8, '0');
|
|
34
|
+
}
|
|
35
|
+
/** The instruction index a branch or (with a base address) a jump reaches, if inside the program. */
|
|
36
|
+
function targetIndex(instruction, index, length, baseAddress) {
|
|
37
|
+
if (instruction.mnemonic === '.word')
|
|
38
|
+
return undefined;
|
|
39
|
+
for (const operand of instruction.operands) {
|
|
40
|
+
if (operand.kind === 'branch') {
|
|
41
|
+
const target = index + 1 + operand.displacement;
|
|
42
|
+
return target >= 0 && target <= length ? target : undefined;
|
|
43
|
+
}
|
|
44
|
+
if (operand.kind === 'target' && baseAddress !== undefined) {
|
|
45
|
+
const pc = (baseAddress + (index + 1) * 4) >>> 0;
|
|
46
|
+
const address = ((pc & 0xf0000000) | (operand.index << 2)) >>> 0;
|
|
47
|
+
const offset = address - baseAddress;
|
|
48
|
+
return offset >= 0 && offset <= length * 4 ? offset / 4 : undefined;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Decode a sequence of words as a program. Branches whose targets fall inside
|
|
55
|
+
* the sequence (or at its end) get synthetic labels: `L_12` by word index, or
|
|
56
|
+
* `L_800C56C0` by address when `baseAddress` is given. With a base address,
|
|
57
|
+
* `j`/`jal` targets inside the sequence are labelled too.
|
|
58
|
+
*/
|
|
59
|
+
export function decodeWords(words, options) {
|
|
60
|
+
const { baseAddress, labelPrefix } = validateDecodeOptions(options);
|
|
61
|
+
const candidate = words;
|
|
62
|
+
if (typeof candidate !== 'object' ||
|
|
63
|
+
candidate === null ||
|
|
64
|
+
typeof candidate.length !== 'number') {
|
|
65
|
+
throw new InvalidOptionsError('words must be an array-like of 32-bit integers.');
|
|
66
|
+
}
|
|
67
|
+
const instructions = Array.from(words, (word) => decode(word));
|
|
68
|
+
const name = (index) => baseAddress === undefined
|
|
69
|
+
? `${labelPrefix}_${String(index)}`
|
|
70
|
+
: `${labelPrefix}_${hex8((baseAddress + index * 4) >>> 0)}`;
|
|
71
|
+
const targets = new Map();
|
|
72
|
+
instructions.forEach((instruction, index) => {
|
|
73
|
+
const target = targetIndex(instruction, index, instructions.length, baseAddress);
|
|
74
|
+
if (target !== undefined)
|
|
75
|
+
targets.set(index, target);
|
|
76
|
+
});
|
|
77
|
+
const labels = new Map([...new Set(targets.values())]
|
|
78
|
+
.sort((a, b) => a - b)
|
|
79
|
+
.map((index) => [index, name(index)]));
|
|
80
|
+
return {
|
|
81
|
+
instructions,
|
|
82
|
+
labels,
|
|
83
|
+
branchTargets: targets,
|
|
84
|
+
...(baseAddress === undefined ? {} : { baseAddress }),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=decode-words.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode-words.js","sourceRoot":"","sources":["../../src/program/decode-words.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DecodedProgram, FormatStyle } from '../public-types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Render a decoded program as assembly `assemble` accepts, one instruction per
|
|
4
|
+
* line, with its labels. The text starts with `.set noreorder`, because the
|
|
5
|
+
* words already contain their delay slots.
|
|
6
|
+
*
|
|
7
|
+
* Re-assembling the text reproduces the words exactly when the program has no
|
|
8
|
+
* instruction ASPSX would add a nop after (loads, mflo/mfhi, mfc2/cfc2) and,
|
|
9
|
+
* if `baseAddress` was given, no labelled jump (which becomes a relocation).
|
|
10
|
+
*/
|
|
11
|
+
export declare function formatProgram(program: DecodedProgram, style?: FormatStyle): string;
|
|
12
|
+
//# sourceMappingURL=format-program.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-program.d.ts","sourceRoot":"","sources":["../../src/program/format-program.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtE;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,MAAM,CAoBlF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
import { format } from '../isa/format.js';
|
|
3
|
+
import { validateFormatStyle } from '../options.js';
|
|
4
|
+
/**
|
|
5
|
+
* Render a decoded program as assembly `assemble` accepts, one instruction per
|
|
6
|
+
* line, with its labels. The text starts with `.set noreorder`, because the
|
|
7
|
+
* words already contain their delay slots.
|
|
8
|
+
*
|
|
9
|
+
* Re-assembling the text reproduces the words exactly when the program has no
|
|
10
|
+
* instruction ASPSX would add a nop after (loads, mflo/mfhi, mfc2/cfc2) and,
|
|
11
|
+
* if `baseAddress` was given, no labelled jump (which becomes a relocation).
|
|
12
|
+
*/
|
|
13
|
+
export function formatProgram(program, style) {
|
|
14
|
+
const normalized = validateFormatStyle(style);
|
|
15
|
+
const lines = ['\t.set\tnoreorder'];
|
|
16
|
+
program.instructions.forEach((instruction, index) => {
|
|
17
|
+
const label = program.labels.get(index);
|
|
18
|
+
if (label !== undefined)
|
|
19
|
+
lines.push(`${label}:`);
|
|
20
|
+
const text = format(instruction, normalized);
|
|
21
|
+
const target = program.branchTargets.get(index);
|
|
22
|
+
const targetLabel = target === undefined ? undefined : program.labels.get(target);
|
|
23
|
+
if (targetLabel === undefined) {
|
|
24
|
+
lines.push(`\t${text}`);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
// The branch or jump target is always the last operand.
|
|
28
|
+
const cut = text.lastIndexOf(',') + 1 || text.indexOf(' ') + 1;
|
|
29
|
+
lines.push(`\t${text.slice(0, cut)}${targetLabel}`);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
const end = program.labels.get(program.instructions.length);
|
|
33
|
+
if (end !== undefined)
|
|
34
|
+
lines.push(`${end}:`);
|
|
35
|
+
return `${lines.join('\n')}\n`;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=format-program.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-program.js","sourceRoot":"","sources":["../../src/program/format-program.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,OAAuB,EAAE,KAAmB;IACxE,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACpC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClF,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,wDAAwD;YACxD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/D,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,WAAW,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5D,IAAI,GAAG,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAC7C,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC"}
|