Reduce the number of extra bit_and ops caused by SkVM traces.

Previously, the trace opcodes took a single mask argument, which was
computed as `execution mask & trace mask`. This led to extra bit_ands in
the output, as this value would be need to be recalculated every time
the execution mask changed.

To reduce this cost on program size, the trace ops now take two mask
arguments and require that both must be true. We have four register
slots at our disposal in an Op, which is more than we need, so this
doesn't really cost us anything.

(As an extra minor optimization, if one of the masks is "always-on", we
optimize it away. This avoids burning a register just to hold a ~0
immediate value.)

Change-Id: I9eb71292a1983e71b03c7ac842534beb3d6bbf17
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/478456
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
This commit is contained in:
John Stiles 2021-12-01 14:39:10 -05:00 committed by SkCQ
parent 6c32794d2b
commit 2756b0ee02
10 changed files with 1800 additions and 1944 deletions

View File

@ -261,10 +261,10 @@ namespace skvm {
switch (op) {
case Op::assert_true: write(o, op, V{x}, V{y}); break;
case Op::trace_line: write(o, op, V{x}, Line{immA}); break;
case Op::trace_var: write(o, op, V{x}, VarSlot{immA}, "=", V{y}); break;
case Op::trace_enter: write(o, op, V{x}, FnIdx{immA}); break;
case Op::trace_exit: write(o, op, V{x}, FnIdx{immA}); break;
case Op::trace_line: write(o, op, V{x}, V{y}, Line{immA}); break;
case Op::trace_var: write(o, op, V{x}, V{y}, VarSlot{immA}, "=", V{z}); break;
case Op::trace_enter: write(o, op, V{x}, V{y}, FnIdx{immA}); break;
case Op::trace_exit: write(o, op, V{x}, V{y}, FnIdx{immA}); break;
case Op::store8: write(o, op, Ptr{immA}, V{x} ); break;
case Op::store16: write(o, op, Ptr{immA}, V{x} ); break;
@ -381,10 +381,10 @@ namespace skvm {
switch (op) {
case Op::assert_true: write(o, op, R{x}, R{y}); break;
case Op::trace_line: write(o, op, R{x}, Line{immA}); break;
case Op::trace_var: write(o, op, R{x}, VarSlot{immA}, "=", R{y}); break;
case Op::trace_enter: write(o, op, R{x}, FnIdx{immA}); break;
case Op::trace_exit: write(o, op, R{x}, FnIdx{immA}); break;
case Op::trace_line: write(o, op, R{x}, R{y}, Line{immA}); break;
case Op::trace_var: write(o, op, R{x}, R{y}, VarSlot{immA}, "=", R{z}); break;
case Op::trace_enter: write(o, op, R{x}, R{y}, FnIdx{immA}); break;
case Op::trace_exit: write(o, op, R{x}, R{y}, FnIdx{immA}); break;
case Op::store8: write(o, op, Ptr{immA}, R{x} ); break;
case Op::store16: write(o, op, Ptr{immA}, R{x} ); break;
@ -618,21 +618,33 @@ namespace skvm {
#endif
}
void Builder::trace_line(I32 mask, int line) {
if (this->isImm(mask.id, 0)) { return; }
(void)push(Op::trace_line, mask.id,NA,NA,NA, line);
void Builder::trace_line(I32 mask, I32 traceMask, int line) {
if (this->isImm(mask.id, 0)) { return; }
if (this->isImm(traceMask.id, 0)) { return; }
if (this->isImm(mask.id, ~0)) { mask = traceMask; }
if (this->isImm(traceMask.id,~0)) { traceMask = mask; }
(void)push(Op::trace_line, mask.id,traceMask.id,NA,NA, line);
}
void Builder::trace_var(I32 mask, int slot, I32 val) {
if (this->isImm(mask.id, 0)) { return; }
(void)push(Op::trace_var, mask.id,val.id,NA,NA, slot);
void Builder::trace_var(I32 mask, I32 traceMask, int slot, I32 val) {
if (this->isImm(mask.id, 0)) { return; }
if (this->isImm(traceMask.id, 0)) { return; }
if (this->isImm(mask.id, ~0)) { mask = traceMask; }
if (this->isImm(traceMask.id,~0)) { traceMask = mask; }
(void)push(Op::trace_var, mask.id,traceMask.id,val.id,NA, slot);
}
void Builder::trace_enter(I32 mask, int fnIdx) {
if (this->isImm(mask.id, 0)) { return; }
(void)push(Op::trace_enter, mask.id,NA,NA,NA, fnIdx);
void Builder::trace_enter(I32 mask, I32 traceMask, int fnIdx) {
if (this->isImm(mask.id, 0)) { return; }
if (this->isImm(traceMask.id, 0)) { return; }
if (this->isImm(mask.id, ~0)) { mask = traceMask; }
if (this->isImm(traceMask.id,~0)) { traceMask = mask; }
(void)push(Op::trace_enter, mask.id,traceMask.id,NA,NA, fnIdx);
}
void Builder::trace_exit(I32 mask, int fnIdx) {
if (this->isImm(mask.id, 0)) { return; }
(void)push(Op::trace_exit, mask.id,NA,NA,NA, fnIdx);
void Builder::trace_exit(I32 mask, I32 traceMask, int fnIdx) {
if (this->isImm(mask.id, 0)) { return; }
if (this->isImm(traceMask.id, 0)) { return; }
if (this->isImm(mask.id, ~0)) { mask = traceMask; }
if (this->isImm(traceMask.id,~0)) { traceMask = mask; }
(void)push(Op::trace_exit, mask.id,traceMask.id,NA,NA, fnIdx);
}
void Builder::store8 (Ptr ptr, I32 val) { (void)push(Op::store8 , val.id,NA,NA,NA, ptr.ix); }

View File

@ -632,10 +632,10 @@ namespace skvm {
void assert_true(I32 cond) { assert_true(cond, cond); }
// Insert debug traces into the instruction stream
void trace_line(I32 mask, int line);
void trace_var(I32 mask, int slot, I32 val);
void trace_enter(I32 mask, int fnIdx);
void trace_exit(I32 mask, int fnIdx);
void trace_line(I32 mask, I32 traceMask, int line);
void trace_var(I32 mask, I32 traceMask, int slot, I32 val);
void trace_enter(I32 mask, I32 traceMask, int fnIdx);
void trace_exit(I32 mask, I32 traceMask, int fnIdx);
// Store {8,16,32,64,128}-bit varying.
void store8 (Ptr ptr, I32 val);

View File

@ -218,16 +218,16 @@ namespace SkVMInterpreterTypes {
break;
CASE(Op::trace_line):
if (traceHook && any(r[x].i32)) {
if (traceHook && any(r[x].i32 & r[y].i32)) {
traceHook->line(immA);
}
break;
CASE(Op::trace_var):
if (traceHook && any(r[x].i32)) {
if (traceHook && any(r[x].i32 & r[y].i32)) {
for (int i = 0; i < K; ++i) {
if (r[x].i32[i]) {
traceHook->var(immA, r[y].i32[i]);
if (r[x].i32[i] & r[y].i32[i]) {
traceHook->var(immA, r[z].i32[i]);
break;
}
}
@ -235,13 +235,13 @@ namespace SkVMInterpreterTypes {
break;
CASE(Op::trace_enter):
if (traceHook && any(r[x].i32)) {
if (traceHook && any(r[x].i32 & r[y].i32)) {
traceHook->enter(immA);
}
break;
CASE(Op::trace_exit):
if (traceHook && any(r[x].i32)) {
if (traceHook && any(r[x].i32 & r[y].i32)) {
traceHook->exit(immA);
}
break;

View File

@ -220,10 +220,6 @@ private:
return result;
}
skvm::I32 traceMask() {
return this->mask() & fTraceMask;
}
size_t fieldSlotOffset(const FieldAccess& expr);
size_t indexSlotOffset(const IndexExpression& expr);
@ -485,7 +481,7 @@ size_t SkVMGenerator::writeFunction(const FunctionDefinition& function,
int funcIndex = -1;
if (fDebugInfo) {
funcIndex = this->getDebugFunctionInfo(decl);
fBuilder->trace_enter(this->traceMask(), funcIndex);
fBuilder->trace_enter(this->mask(), fTraceMask, funcIndex);
}
size_t returnSlot = this->getSlot(function);
@ -525,7 +521,7 @@ size_t SkVMGenerator::writeFunction(const FunctionDefinition& function,
fFunctionStack.pop_back();
if (fDebugInfo) {
fBuilder->trace_exit(this->traceMask(), funcIndex);
fBuilder->trace_exit(this->mask(), fTraceMask, funcIndex);
}
return returnSlot;
@ -534,7 +530,7 @@ size_t SkVMGenerator::writeFunction(const FunctionDefinition& function,
void SkVMGenerator::writeToSlot(int slot, skvm::Val value) {
if (fDebugInfo && (!fSlots[slot].writtenTo || fSlots[slot].val != value)) {
if (fProgram.fConfig->fSettings.fAllowTraceVarInSkVMDebugTrace) {
fBuilder->trace_var(this->traceMask(), slot, i32(value));
fBuilder->trace_var(this->mask(), fTraceMask, slot, i32(value));
}
fSlots[slot].writtenTo = true;
}
@ -1811,7 +1807,7 @@ void SkVMGenerator::writeVarDeclaration(const VarDeclaration& decl) {
void SkVMGenerator::emitTraceLine(int line) {
if (fDebugInfo && line > 0) {
fBuilder->trace_line(this->traceMask(), line);
fBuilder->trace_line(this->mask(), fTraceMask, line);
}
}

View File

@ -892,9 +892,11 @@ DEF_TEST(SkVM_trace_line, r) {
};
skvm::Builder b;
b.trace_line(b.splat(0xFFFFFFFF), 123);
b.trace_line(b.splat(0x00000000), 456);
b.trace_line(b.splat(0xFFFFFFFF), 789);
b.trace_line(b.splat(0xFFFFFFFF), b.splat(0xFFFFFFFF), 123);
b.trace_line(b.splat(0x00000000), b.splat(0xFFFFFFFF), 456);
b.trace_line(b.splat(0xFFFFFFFF), b.splat(0x00000000), 567);
b.trace_line(b.splat(0x00000000), b.splat(0x00000000), 678);
b.trace_line(b.splat(0xFFFFFFFF), b.splat(0xFFFFFFFF), 789);
skvm::Program p = b.done();
TestTraceHook testTrace;
p.attachTraceHook(&testTrace);
@ -918,10 +920,11 @@ DEF_TEST(SkVM_trace_var, r) {
};
skvm::Builder b;
b.trace_var(b.splat(0x00000000), 2, b.splat(333));
b.trace_var(b.splat(0xFFFFFFFF), 4, b.splat(555));
b.trace_var(b.splat(0xFFFFFFFF), 6, b.splat(777));
b.trace_var(b.splat(0x00000000), 8, b.splat(999));
b.trace_var(b.splat(0x00000000), b.splat(0xFFFFFFFF), 2, b.splat(333));
b.trace_var(b.splat(0xFFFFFFFF), b.splat(0xFFFFFFFF), 4, b.splat(555));
b.trace_var(b.splat(0x00000000), b.splat(0x00000000), 5, b.splat(666));
b.trace_var(b.splat(0xFFFFFFFF), b.splat(0xFFFFFFFF), 6, b.splat(777));
b.trace_var(b.splat(0xFFFFFFFF), b.splat(0x00000000), 8, b.splat(999));
skvm::Program p = b.done();
TestTraceHook testTrace;
p.attachTraceHook(&testTrace);
@ -948,10 +951,12 @@ DEF_TEST(SkVM_trace_enter_exit, r) {
};
skvm::Builder b;
b.trace_enter(b.splat(0xFFFFFFFF), 12);
b.trace_enter(b.splat(0x00000000), 34);
b.trace_exit(b.splat(0xFFFFFFFF), 56);
b.trace_exit(b.splat(0x00000000), 78);
b.trace_enter(b.splat(0x00000000), b.splat(0x00000000), 99);
b.trace_enter(b.splat(0xFFFFFFFF), b.splat(0xFFFFFFFF), 12);
b.trace_enter(b.splat(0x00000000), b.splat(0xFFFFFFFF), 34);
b.trace_exit(b.splat(0xFFFFFFFF), b.splat(0xFFFFFFFF), 56);
b.trace_exit(b.splat(0xFFFFFFFF), b.splat(0x00000000), 78);
b.trace_exit(b.splat(0x00000000), b.splat(0x00000000), 90);
skvm::Program p = b.done();
TestTraceHook testTrace;
p.attachTraceHook(&testTrace);

View File

@ -105,126 +105,126 @@ loop:
52 r52 = index
53 r53 = eq_f32 r52 r30
54 r53 = bit_and r53 r31
55 trace_var r53 $0 = r1
56 trace_var r53 $1 = r2
57 trace_var r53 $2 = r3
58 trace_var r53 $3 = r4
59 trace_var r53 $4 = r5
60 trace_var r53 $5 = r6
61 trace_var r53 $6 = r7
62 trace_var r53 $7 = r8
63 trace_var r53 $8 = r9
64 trace_var r53 $9 = r10
65 trace_var r53 $10 = r11
66 trace_var r53 $11 = r12
67 trace_var r53 $12 = r13
68 trace_var r53 $13 = r14
69 trace_var r53 $14 = r15
70 trace_var r53 $15 = r16
71 trace_var r53 $16 = r17
72 trace_var r53 $17 = r18
73 trace_var r53 $18 = r19
74 trace_var r53 $19 = r20
75 trace_var r53 $20 = r21
76 trace_var r53 $21 = r22
77 trace_var r53 $22 = r23
78 trace_var r53 $23 = r24
79 trace_var r53 $24 = r25
80 trace_var r53 $25 = r26
81 trace_var r53 $26 = r27
82 trace_var r53 $27 = r28
83 trace_enter r53 F0
84 trace_var r53 $32 = r52
85 trace_var r53 $33 = r0
86 trace_line r53 L38
87 trace_enter r53 F1
88 trace_line r53 L5
89 trace_var r53 $34 = r1
90 trace_exit r53 F1
91 trace_enter r53 F2
92 trace_line r53 L10
93 trace_var r53 $36 = r29
94 trace_line r53 L11
95 trace_var r53 $37 = r32
96 trace_line r53 L12
97 trace_var r53 $36 = r8
98 trace_line r53 L11
99 trace_var r53 $37 = r33
100 trace_line r53 L12
101 trace_var r53 $36 = r34
102 trace_line r53 L11
103 trace_var r53 $37 = r35
104 trace_line r53 L12
105 trace_var r53 $36 = r36
106 trace_line r53 L11
107 trace_var r53 $37 = r29
108 trace_line r53 L12
109 trace_var r53 $36 = r37
110 trace_line r53 L11
111 trace_line r53 L14
112 trace_var r53 $35 = r37
113 trace_exit r53 F2
114 trace_enter r53 F3
115 trace_line r53 L19
116 trace_var r53 $39 = r38
117 trace_line r53 L20
118 trace_var r53 $40 = r29
119 trace_line r53 L21
120 trace_var r53 $39 = r9
121 trace_line r53 L20
122 trace_var r53 $40 = r35
123 trace_line r53 L21
124 trace_var r53 $39 = r39
125 trace_line r53 L20
126 trace_var r53 $40 = r33
127 trace_line r53 L21
128 trace_var r53 $39 = r40
129 trace_line r53 L20
130 trace_var r53 $40 = r32
131 trace_line r53 L21
132 trace_var r53 $39 = r41
133 trace_line r53 L20
134 trace_line r53 L23
135 trace_var r53 $38 = r41
136 trace_exit r53 F3
137 trace_enter r53 F4
138 trace_line r53 L28
139 trace_var r53 $42 = r29
140 trace_line r53 L29
141 trace_var r53 $43 = r42
142 trace_line r53 L30
143 trace_line r53 L29
144 trace_var r53 $43 = r43
145 trace_line r53 L30
146 trace_line r53 L31
147 trace_var r53 $42 = r44
148 trace_line r53 L29
149 trace_var r53 $43 = r45
150 trace_line r53 L30
151 trace_line r53 L31
152 trace_var r53 $42 = r46
153 trace_line r53 L29
154 trace_var r53 $43 = r47
155 trace_line r53 L30
156 trace_line r53 L31
157 trace_var r53 $42 = r48
158 trace_line r53 L29
159 trace_var r53 $43 = r49
160 trace_line r53 L30
161 trace_line r53 L31
162 trace_var r53 $42 = r50
163 trace_line r53 L29
164 trace_var r53 $43 = r51
165 trace_line r53 L30
166 trace_line r53 L29
167 trace_line r53 L34
168 trace_var r53 $41 = r50
169 trace_exit r53 F4
170 trace_var r53 $28 = r1
171 trace_var r53 $29 = r37
172 trace_var r53 $30 = r41
173 trace_var r53 $31 = r50
174 trace_exit r53 F0
55 trace_var r53 r53 $0 = r1
56 trace_var r53 r53 $1 = r2
57 trace_var r53 r53 $2 = r3
58 trace_var r53 r53 $3 = r4
59 trace_var r53 r53 $4 = r5
60 trace_var r53 r53 $5 = r6
61 trace_var r53 r53 $6 = r7
62 trace_var r53 r53 $7 = r8
63 trace_var r53 r53 $8 = r9
64 trace_var r53 r53 $9 = r10
65 trace_var r53 r53 $10 = r11
66 trace_var r53 r53 $11 = r12
67 trace_var r53 r53 $12 = r13
68 trace_var r53 r53 $13 = r14
69 trace_var r53 r53 $14 = r15
70 trace_var r53 r53 $15 = r16
71 trace_var r53 r53 $16 = r17
72 trace_var r53 r53 $17 = r18
73 trace_var r53 r53 $18 = r19
74 trace_var r53 r53 $19 = r20
75 trace_var r53 r53 $20 = r21
76 trace_var r53 r53 $21 = r22
77 trace_var r53 r53 $22 = r23
78 trace_var r53 r53 $23 = r24
79 trace_var r53 r53 $24 = r25
80 trace_var r53 r53 $25 = r26
81 trace_var r53 r53 $26 = r27
82 trace_var r53 r53 $27 = r28
83 trace_enter r53 r53 F0
84 trace_var r53 r53 $32 = r52
85 trace_var r53 r53 $33 = r0
86 trace_line r53 r53 L38
87 trace_enter r53 r53 F1
88 trace_line r53 r53 L5
89 trace_var r53 r53 $34 = r1
90 trace_exit r53 r53 F1
91 trace_enter r53 r53 F2
92 trace_line r53 r53 L10
93 trace_var r53 r53 $36 = r29
94 trace_line r53 r53 L11
95 trace_var r53 r53 $37 = r32
96 trace_line r53 r53 L12
97 trace_var r53 r53 $36 = r8
98 trace_line r53 r53 L11
99 trace_var r53 r53 $37 = r33
100 trace_line r53 r53 L12
101 trace_var r53 r53 $36 = r34
102 trace_line r53 r53 L11
103 trace_var r53 r53 $37 = r35
104 trace_line r53 r53 L12
105 trace_var r53 r53 $36 = r36
106 trace_line r53 r53 L11
107 trace_var r53 r53 $37 = r29
108 trace_line r53 r53 L12
109 trace_var r53 r53 $36 = r37
110 trace_line r53 r53 L11
111 trace_line r53 r53 L14
112 trace_var r53 r53 $35 = r37
113 trace_exit r53 r53 F2
114 trace_enter r53 r53 F3
115 trace_line r53 r53 L19
116 trace_var r53 r53 $39 = r38
117 trace_line r53 r53 L20
118 trace_var r53 r53 $40 = r29
119 trace_line r53 r53 L21
120 trace_var r53 r53 $39 = r9
121 trace_line r53 r53 L20
122 trace_var r53 r53 $40 = r35
123 trace_line r53 r53 L21
124 trace_var r53 r53 $39 = r39
125 trace_line r53 r53 L20
126 trace_var r53 r53 $40 = r33
127 trace_line r53 r53 L21
128 trace_var r53 r53 $39 = r40
129 trace_line r53 r53 L20
130 trace_var r53 r53 $40 = r32
131 trace_line r53 r53 L21
132 trace_var r53 r53 $39 = r41
133 trace_line r53 r53 L20
134 trace_line r53 r53 L23
135 trace_var r53 r53 $38 = r41
136 trace_exit r53 r53 F3
137 trace_enter r53 r53 F4
138 trace_line r53 r53 L28
139 trace_var r53 r53 $42 = r29
140 trace_line r53 r53 L29
141 trace_var r53 r53 $43 = r42
142 trace_line r53 r53 L30
143 trace_line r53 r53 L29
144 trace_var r53 r53 $43 = r43
145 trace_line r53 r53 L30
146 trace_line r53 r53 L31
147 trace_var r53 r53 $42 = r44
148 trace_line r53 r53 L29
149 trace_var r53 r53 $43 = r45
150 trace_line r53 r53 L30
151 trace_line r53 r53 L31
152 trace_var r53 r53 $42 = r46
153 trace_line r53 r53 L29
154 trace_var r53 r53 $43 = r47
155 trace_line r53 r53 L30
156 trace_line r53 r53 L31
157 trace_var r53 r53 $42 = r48
158 trace_line r53 r53 L29
159 trace_var r53 r53 $43 = r49
160 trace_line r53 r53 L30
161 trace_line r53 r53 L31
162 trace_var r53 r53 $42 = r50
163 trace_line r53 r53 L29
164 trace_var r53 r53 $43 = r51
165 trace_line r53 r53 L30
166 trace_line r53 r53 L29
167 trace_line r53 r53 L34
168 trace_var r53 r53 $41 = r50
169 trace_exit r53 r53 F4
170 trace_var r53 r53 $28 = r1
171 trace_var r53 r53 $29 = r37
172 trace_var r53 r53 $30 = r41
173 trace_var r53 r53 $31 = r50
174 trace_exit r53 r53 F0
175 store32 ptr1 r1
176 store32 ptr2 r37
177 store32 ptr3 r41

View File

@ -64,37 +64,37 @@ loop:
22 r4 = index
23 r4 = eq_f32 r4 r11
24 r4 = bit_and r4 r0
25 trace_enter r4 F0
26 trace_line r4 L9
27 trace_line r4 L11
28 trace_line r4 L12
29 trace_line r4 L13
30 trace_line r4 L15
31 trace_line r4 L16
32 trace_line r4 L17
33 trace_line r4 L19
34 trace_line r4 L20
35 trace_line r4 L21
36 trace_line r4 L23
37 trace_line r4 L24
38 trace_line r4 L25
39 trace_line r4 L27
40 trace_line r4 L28
41 trace_line r4 L29
42 trace_line r4 L31
43 trace_line r4 L32
44 trace_line r4 L33
45 trace_line r4 L35
46 trace_line r4 L36
47 trace_line r4 L37
48 trace_line r4 L39
49 trace_line r4 L40
50 trace_line r4 L41
51 trace_line r4 L43
52 trace_line r4 L44
53 trace_line r4 L45
54 trace_line r4 L47
55 trace_exit r4 F0
25 trace_enter r4 r4 F0
26 trace_line r4 r4 L9
27 trace_line r4 r4 L11
28 trace_line r4 r4 L12
29 trace_line r4 r4 L13
30 trace_line r4 r4 L15
31 trace_line r4 r4 L16
32 trace_line r4 r4 L17
33 trace_line r4 r4 L19
34 trace_line r4 r4 L20
35 trace_line r4 r4 L21
36 trace_line r4 r4 L23
37 trace_line r4 r4 L24
38 trace_line r4 r4 L25
39 trace_line r4 r4 L27
40 trace_line r4 r4 L28
41 trace_line r4 r4 L29
42 trace_line r4 r4 L31
43 trace_line r4 r4 L32
44 trace_line r4 r4 L33
45 trace_line r4 r4 L35
46 trace_line r4 r4 L36
47 trace_line r4 r4 L37
48 trace_line r4 r4 L39
49 trace_line r4 r4 L40
50 trace_line r4 r4 L41
51 trace_line r4 r4 L43
52 trace_line r4 r4 L44
53 trace_line r4 r4 L45
54 trace_line r4 r4 L47
55 trace_exit r4 r4 F0
56 store32 ptr1 r5
57 store32 ptr2 r6
58 store32 ptr3 r7

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -180,224 +180,224 @@ loop:
20 r20 = index
21 r21 = eq_f32 r20 r11
22 r21 = bit_and r21 r12
23 trace_var r21 $0 = r1
24 trace_var r21 $1 = r2
25 trace_var r21 $2 = r3
26 trace_var r21 $3 = r4
27 trace_var r21 $4 = r5
28 trace_var r21 $5 = r6
29 trace_var r21 $6 = r7
30 trace_var r21 $7 = r8
31 trace_enter r21 F0
32 trace_var r21 $12 = r20
33 trace_var r21 $13 = r0
34 trace_line r21 L58
35 trace_var r21 $14 = r9
36 trace_var r21 $15 = r9
37 trace_var r21 $16 = r9
38 trace_var r21 $17 = r9
39 trace_line r21 L59
40 trace_var r21 $18 = r13
41 trace_var r21 $19 = r13
42 trace_var r21 $20 = r13
43 trace_var r21 $21 = r13
44 trace_line r21 L60
45 trace_var r21 $22 = r1
46 trace_var r21 $23 = r2
47 trace_var r21 $24 = r3
48 trace_var r21 $25 = r4
49 trace_line r21 L61
50 trace_line r21 L63
51 trace_var r21 $26 = r5
52 trace_var r21 $27 = r6
53 trace_var r21 $28 = r7
54 trace_var r21 $29 = r8
55 trace_line r21 L64
56 trace_line r21 L66
57 trace_enter r21 F1
58 trace_line r21 L6
59 trace_var r21 $31 = r11
60 trace_line r21 L7
61 trace_var r21 $32 = r11
62 trace_line r21 L8
63 trace_var r21 $33 = r14
64 trace_line r21 L9
65 trace_var r21 $34 = r14
66 trace_line r21 L11
67 trace_var r21 $30 = r10
68 trace_exit r21 F1
69 trace_enter r21 F2
70 trace_line r21 L15
71 trace_var r21 $36 = r15
72 trace_var r21 $37 = r15
73 trace_line r21 L16
74 trace_var r21 $38 = r15
75 trace_var r21 $39 = r15
76 trace_line r21 L17
77 trace_var r21 $40 = r16
78 trace_var r21 $41 = r16
79 trace_var r21 $42 = r16
80 trace_line r21 L18
81 trace_var r21 $43 = r16
82 trace_var r21 $44 = r16
83 trace_var r21 $45 = r16
84 trace_line r21 L19
85 trace_var r21 $46 = r17
86 trace_var r21 $47 = r17
87 trace_var r21 $48 = r17
88 trace_var r21 $49 = r17
89 trace_line r21 L20
90 trace_var r21 $50 = r17
91 trace_var r21 $51 = r17
92 trace_var r21 $52 = r17
93 trace_var r21 $53 = r17
94 trace_line r21 L22
95 trace_var r21 $54 = r14
96 trace_var r21 $55 = r14
97 trace_line r21 L23
98 trace_var r21 $56 = r14
99 trace_var r21 $57 = r14
100 trace_line r21 L24
101 trace_var r21 $58 = r18
102 trace_var r21 $59 = r18
103 trace_var r21 $60 = r18
104 trace_line r21 L25
105 trace_var r21 $61 = r18
106 trace_var r21 $62 = r18
107 trace_var r21 $63 = r18
108 trace_line r21 L26
109 trace_var r21 $64 = r19
110 trace_var r21 $65 = r19
111 trace_var r21 $66 = r19
112 trace_var r21 $67 = r19
113 trace_line r21 L27
114 trace_var r21 $68 = r19
115 trace_var r21 $69 = r19
116 trace_var r21 $70 = r19
117 trace_var r21 $71 = r19
118 trace_line r21 L29
119 trace_var r21 $35 = r10
120 trace_exit r21 F2
121 trace_enter r21 F3
122 trace_line r21 L34
123 trace_var r21 $73 = r15
124 trace_var r21 $74 = r9
125 trace_var r21 $75 = r9
126 trace_var r21 $76 = r15
127 trace_line r21 L35
128 trace_var r21 $77 = r15
129 trace_var r21 $78 = r9
130 trace_var r21 $79 = r9
131 trace_var r21 $80 = r15
132 trace_line r21 L36
133 trace_var r21 $81 = r16
134 trace_var r21 $82 = r9
135 trace_var r21 $83 = r9
136 trace_var r21 $84 = r9
137 trace_var r21 $85 = r16
138 trace_var r21 $86 = r9
139 trace_var r21 $87 = r9
140 trace_var r21 $88 = r9
141 trace_var r21 $89 = r16
142 trace_line r21 L37
143 trace_var r21 $90 = r16
144 trace_var r21 $91 = r9
145 trace_var r21 $92 = r9
146 trace_var r21 $93 = r9
147 trace_var r21 $94 = r16
148 trace_var r21 $95 = r9
149 trace_var r21 $96 = r9
150 trace_var r21 $97 = r9
151 trace_var r21 $98 = r16
152 trace_line r21 L38
153 trace_var r21 $99 = r17
154 trace_var r21 $100 = r9
155 trace_var r21 $101 = r9
156 trace_var r21 $102 = r9
157 trace_var r21 $103 = r9
158 trace_var r21 $104 = r17
159 trace_var r21 $105 = r9
160 trace_var r21 $106 = r9
161 trace_var r21 $107 = r9
162 trace_var r21 $108 = r9
163 trace_var r21 $109 = r17
164 trace_var r21 $110 = r9
165 trace_var r21 $111 = r9
166 trace_var r21 $112 = r9
167 trace_var r21 $113 = r9
168 trace_var r21 $114 = r17
169 trace_line r21 L39
170 trace_var r21 $115 = r17
171 trace_var r21 $116 = r9
172 trace_var r21 $117 = r9
173 trace_var r21 $118 = r9
174 trace_var r21 $119 = r9
175 trace_var r21 $120 = r17
176 trace_var r21 $121 = r9
177 trace_var r21 $122 = r9
178 trace_var r21 $123 = r9
179 trace_var r21 $124 = r9
180 trace_var r21 $125 = r17
181 trace_var r21 $126 = r9
182 trace_var r21 $127 = r9
183 trace_var r21 $128 = r9
184 trace_var r21 $129 = r9
185 trace_var r21 $130 = r17
186 trace_line r21 L41
187 trace_var r21 $72 = r10
188 trace_exit r21 F3
189 trace_enter r21 F4
190 trace_line r21 L45
191 trace_var r21 $132 = r9
192 trace_line r21 L45
193 trace_var r21 $132 = r13
194 trace_line r21 L46
195 trace_var r21 $133 = r9
196 trace_line r21 L46
197 trace_var r21 $133 = r13
198 trace_line r21 L47
199 trace_var r21 $134 = r9
200 trace_var r21 $135 = r9
201 trace_var r21 $136 = r9
202 trace_var r21 $137 = r9
203 trace_line r21 L47
204 trace_var r21 $135 = r13
205 trace_line r21 L47
206 trace_var r21 $136 = r15
207 trace_var r21 $137 = r16
208 trace_line r21 L48
209 trace_var r21 $138 = r9
210 trace_var r21 $139 = r9
211 trace_var r21 $140 = r9
212 trace_var r21 $141 = r9
213 trace_line r21 L48
214 trace_var r21 $139 = r13
215 trace_line r21 L48
216 trace_var r21 $140 = r15
217 trace_var r21 $141 = r16
218 trace_line r21 L50
219 trace_var r21 $131 = r10
220 trace_exit r21 F4
221 trace_enter r21 F5
222 trace_var r21 $143 = r13
223 trace_line r21 L53
224 trace_var r21 $142 = r10
225 trace_exit r21 F5
226 trace_enter r21 F6
227 trace_var r21 $145 = r15
228 trace_line r21 L54
229 trace_var r21 $144 = r10
230 trace_exit r21 F6
231 trace_enter r21 F7
232 trace_var r21 $147 = r16
233 trace_line r21 L55
234 trace_var r21 $146 = r10
235 trace_exit r21 F7
236 trace_var r21 $8 = r1
237 trace_var r21 $9 = r2
238 trace_var r21 $10 = r3
239 trace_var r21 $11 = r4
240 trace_exit r21 F0
23 trace_var r21 r21 $0 = r1
24 trace_var r21 r21 $1 = r2
25 trace_var r21 r21 $2 = r3
26 trace_var r21 r21 $3 = r4
27 trace_var r21 r21 $4 = r5
28 trace_var r21 r21 $5 = r6
29 trace_var r21 r21 $6 = r7
30 trace_var r21 r21 $7 = r8
31 trace_enter r21 r21 F0
32 trace_var r21 r21 $12 = r20
33 trace_var r21 r21 $13 = r0
34 trace_line r21 r21 L58
35 trace_var r21 r21 $14 = r9
36 trace_var r21 r21 $15 = r9
37 trace_var r21 r21 $16 = r9
38 trace_var r21 r21 $17 = r9
39 trace_line r21 r21 L59
40 trace_var r21 r21 $18 = r13
41 trace_var r21 r21 $19 = r13
42 trace_var r21 r21 $20 = r13
43 trace_var r21 r21 $21 = r13
44 trace_line r21 r21 L60
45 trace_var r21 r21 $22 = r1
46 trace_var r21 r21 $23 = r2
47 trace_var r21 r21 $24 = r3
48 trace_var r21 r21 $25 = r4
49 trace_line r21 r21 L61
50 trace_line r21 r21 L63
51 trace_var r21 r21 $26 = r5
52 trace_var r21 r21 $27 = r6
53 trace_var r21 r21 $28 = r7
54 trace_var r21 r21 $29 = r8
55 trace_line r21 r21 L64
56 trace_line r21 r21 L66
57 trace_enter r21 r21 F1
58 trace_line r21 r21 L6
59 trace_var r21 r21 $31 = r11
60 trace_line r21 r21 L7
61 trace_var r21 r21 $32 = r11
62 trace_line r21 r21 L8
63 trace_var r21 r21 $33 = r14
64 trace_line r21 r21 L9
65 trace_var r21 r21 $34 = r14
66 trace_line r21 r21 L11
67 trace_var r21 r21 $30 = r10
68 trace_exit r21 r21 F1
69 trace_enter r21 r21 F2
70 trace_line r21 r21 L15
71 trace_var r21 r21 $36 = r15
72 trace_var r21 r21 $37 = r15
73 trace_line r21 r21 L16
74 trace_var r21 r21 $38 = r15
75 trace_var r21 r21 $39 = r15
76 trace_line r21 r21 L17
77 trace_var r21 r21 $40 = r16
78 trace_var r21 r21 $41 = r16
79 trace_var r21 r21 $42 = r16
80 trace_line r21 r21 L18
81 trace_var r21 r21 $43 = r16
82 trace_var r21 r21 $44 = r16
83 trace_var r21 r21 $45 = r16
84 trace_line r21 r21 L19
85 trace_var r21 r21 $46 = r17
86 trace_var r21 r21 $47 = r17
87 trace_var r21 r21 $48 = r17
88 trace_var r21 r21 $49 = r17
89 trace_line r21 r21 L20
90 trace_var r21 r21 $50 = r17
91 trace_var r21 r21 $51 = r17
92 trace_var r21 r21 $52 = r17
93 trace_var r21 r21 $53 = r17
94 trace_line r21 r21 L22
95 trace_var r21 r21 $54 = r14
96 trace_var r21 r21 $55 = r14
97 trace_line r21 r21 L23
98 trace_var r21 r21 $56 = r14
99 trace_var r21 r21 $57 = r14
100 trace_line r21 r21 L24
101 trace_var r21 r21 $58 = r18
102 trace_var r21 r21 $59 = r18
103 trace_var r21 r21 $60 = r18
104 trace_line r21 r21 L25
105 trace_var r21 r21 $61 = r18
106 trace_var r21 r21 $62 = r18
107 trace_var r21 r21 $63 = r18
108 trace_line r21 r21 L26
109 trace_var r21 r21 $64 = r19
110 trace_var r21 r21 $65 = r19
111 trace_var r21 r21 $66 = r19
112 trace_var r21 r21 $67 = r19
113 trace_line r21 r21 L27
114 trace_var r21 r21 $68 = r19
115 trace_var r21 r21 $69 = r19
116 trace_var r21 r21 $70 = r19
117 trace_var r21 r21 $71 = r19
118 trace_line r21 r21 L29
119 trace_var r21 r21 $35 = r10
120 trace_exit r21 r21 F2
121 trace_enter r21 r21 F3
122 trace_line r21 r21 L34
123 trace_var r21 r21 $73 = r15
124 trace_var r21 r21 $74 = r9
125 trace_var r21 r21 $75 = r9
126 trace_var r21 r21 $76 = r15
127 trace_line r21 r21 L35
128 trace_var r21 r21 $77 = r15
129 trace_var r21 r21 $78 = r9
130 trace_var r21 r21 $79 = r9
131 trace_var r21 r21 $80 = r15
132 trace_line r21 r21 L36
133 trace_var r21 r21 $81 = r16
134 trace_var r21 r21 $82 = r9
135 trace_var r21 r21 $83 = r9
136 trace_var r21 r21 $84 = r9
137 trace_var r21 r21 $85 = r16
138 trace_var r21 r21 $86 = r9
139 trace_var r21 r21 $87 = r9
140 trace_var r21 r21 $88 = r9
141 trace_var r21 r21 $89 = r16
142 trace_line r21 r21 L37
143 trace_var r21 r21 $90 = r16
144 trace_var r21 r21 $91 = r9
145 trace_var r21 r21 $92 = r9
146 trace_var r21 r21 $93 = r9
147 trace_var r21 r21 $94 = r16
148 trace_var r21 r21 $95 = r9
149 trace_var r21 r21 $96 = r9
150 trace_var r21 r21 $97 = r9
151 trace_var r21 r21 $98 = r16
152 trace_line r21 r21 L38
153 trace_var r21 r21 $99 = r17
154 trace_var r21 r21 $100 = r9
155 trace_var r21 r21 $101 = r9
156 trace_var r21 r21 $102 = r9
157 trace_var r21 r21 $103 = r9
158 trace_var r21 r21 $104 = r17
159 trace_var r21 r21 $105 = r9
160 trace_var r21 r21 $106 = r9
161 trace_var r21 r21 $107 = r9
162 trace_var r21 r21 $108 = r9
163 trace_var r21 r21 $109 = r17
164 trace_var r21 r21 $110 = r9
165 trace_var r21 r21 $111 = r9
166 trace_var r21 r21 $112 = r9
167 trace_var r21 r21 $113 = r9
168 trace_var r21 r21 $114 = r17
169 trace_line r21 r21 L39
170 trace_var r21 r21 $115 = r17
171 trace_var r21 r21 $116 = r9
172 trace_var r21 r21 $117 = r9
173 trace_var r21 r21 $118 = r9
174 trace_var r21 r21 $119 = r9
175 trace_var r21 r21 $120 = r17
176 trace_var r21 r21 $121 = r9
177 trace_var r21 r21 $122 = r9
178 trace_var r21 r21 $123 = r9
179 trace_var r21 r21 $124 = r9
180 trace_var r21 r21 $125 = r17
181 trace_var r21 r21 $126 = r9
182 trace_var r21 r21 $127 = r9
183 trace_var r21 r21 $128 = r9
184 trace_var r21 r21 $129 = r9
185 trace_var r21 r21 $130 = r17
186 trace_line r21 r21 L41
187 trace_var r21 r21 $72 = r10
188 trace_exit r21 r21 F3
189 trace_enter r21 r21 F4
190 trace_line r21 r21 L45
191 trace_var r21 r21 $132 = r9
192 trace_line r21 r21 L45
193 trace_var r21 r21 $132 = r13
194 trace_line r21 r21 L46
195 trace_var r21 r21 $133 = r9
196 trace_line r21 r21 L46
197 trace_var r21 r21 $133 = r13
198 trace_line r21 r21 L47
199 trace_var r21 r21 $134 = r9
200 trace_var r21 r21 $135 = r9
201 trace_var r21 r21 $136 = r9
202 trace_var r21 r21 $137 = r9
203 trace_line r21 r21 L47
204 trace_var r21 r21 $135 = r13
205 trace_line r21 r21 L47
206 trace_var r21 r21 $136 = r15
207 trace_var r21 r21 $137 = r16
208 trace_line r21 r21 L48
209 trace_var r21 r21 $138 = r9
210 trace_var r21 r21 $139 = r9
211 trace_var r21 r21 $140 = r9
212 trace_var r21 r21 $141 = r9
213 trace_line r21 r21 L48
214 trace_var r21 r21 $139 = r13
215 trace_line r21 r21 L48
216 trace_var r21 r21 $140 = r15
217 trace_var r21 r21 $141 = r16
218 trace_line r21 r21 L50
219 trace_var r21 r21 $131 = r10
220 trace_exit r21 r21 F4
221 trace_enter r21 r21 F5
222 trace_var r21 r21 $143 = r13
223 trace_line r21 r21 L53
224 trace_var r21 r21 $142 = r10
225 trace_exit r21 r21 F5
226 trace_enter r21 r21 F6
227 trace_var r21 r21 $145 = r15
228 trace_line r21 r21 L54
229 trace_var r21 r21 $144 = r10
230 trace_exit r21 r21 F6
231 trace_enter r21 r21 F7
232 trace_var r21 r21 $147 = r16
233 trace_line r21 r21 L55
234 trace_var r21 r21 $146 = r10
235 trace_exit r21 r21 F7
236 trace_var r21 r21 $8 = r1
237 trace_var r21 r21 $9 = r2
238 trace_var r21 r21 $10 = r3
239 trace_var r21 r21 $11 = r4
240 trace_exit r21 r21 F0
241 store32 ptr1 r1
242 store32 ptr2 r2
243 store32 ptr3 r3