Skip to content

Commit bd9579d

Browse files
committed
Add general branching optimization
1 parent 8cfe637 commit bd9579d

6 files changed

Lines changed: 244 additions & 236 deletions

File tree

‎examples/tree/artifacts/dumps/rs.txt‎

Lines changed: 184 additions & 183 deletions
Large diffs are not rendered by default.

‎examples/tree/artifacts/rs-disassembly.s‎

Lines changed: 46 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,53 +3,52 @@
33
entrypoint:
44
add64 r10, -320
55
ldxdw r3, [r1+0]
6-
jne r3, 2, jmp_0070
6+
jne r3, 2, jmp_0068
77
ldxdw r3, [r1+88]
8-
jne r3, 0, jmp_04d0
8+
jne r3, 0, jmp_04c8
99
ldxb r1, [r1+10344]
10-
jne r1, 255, jmp_04e0
11-
mov64 r0, 11
10+
jne r1, 255, jmp_04d8
1211
ldxb r1, [r2+0]
13-
jne r1, 1, jmp_0068
12+
jne r1, 1, jmp_04e8
1413
mov64 r0, 0
1514
ldxdw r1, [r2-8]
16-
jne r1, 5, jmp_04f0
15+
jne r1, 5, jmp_04f8
1716

18-
jmp_0068:
17+
jmp_0060:
1918
exit
2019

21-
jmp_0070:
22-
jne r3, 4, jmp_0500
20+
jmp_0068:
21+
jne r3, 4, jmp_0508
2322
ldxdw r3, [r1+88]
24-
jne r3, 0, jmp_04d0
23+
jne r3, 0, jmp_04c8
2524
ldxb r3, [r1+10344]
26-
jne r3, 255, jmp_04e0
25+
jne r3, 255, jmp_04d8
2726
ldxdw r3, [r1+10424]
28-
jne r3, 0, jmp_0510
27+
jne r3, 0, jmp_0518
2928
ldxb r3, [r1+20680]
30-
jne r3, 255, jmp_0520
29+
jne r3, 255, jmp_0528
3130
ldxdw r3, [r1+20760]
32-
jne r3, 14, jmp_0530
31+
jne r3, 14, jmp_0538
3332
ldxb r3, [r1+31032]
34-
jne r3, 255, jmp_0540
33+
jne r3, 255, jmp_0548
3534
mov64 r0, 8
3635
mov32 r3, 399877894
3736
hor64 r3, 1364995097
3837
ldxdw r4, [r1+31040]
39-
jne r4, r3, jmp_0068
38+
jne r4, r3, jmp_0060
4039
mov32 r3, 1288277025
4140
hor64 r3, 2146519613
4241
ldxdw r4, [r1+31048]
43-
jne r4, r3, jmp_0068
42+
jne r4, r3, jmp_0060
4443
mov32 r3, 149871192
4544
hor64 r3, 1157472667
4645
ldxdw r4, [r1+31056]
47-
jne r4, r3, jmp_0068
46+
jne r4, r3, jmp_0060
4847
ldxdw r3, [r1+31064]
4948
mov32 r4, -1965433885
50-
jne r3, r4, jmp_0068
49+
jne r3, r4, jmp_0060
5150
ldxdw r2, [r2-8]
52-
jne r2, 0, jmp_0550
51+
jne r2, 0, jmp_0558
5352
mov64 r6, r1
5453
add64 r6, 41400
5554
mov64 r4, r10
@@ -63,16 +62,16 @@ jmp_0070:
6362
mov64 r0, 10
6463
ldxdw r1, [r10+104]
6564
ldxdw r2, [r7+10352]
66-
jne r1, r2, jmp_0068
65+
jne r1, r2, jmp_0060
6766
ldxdw r1, [r10+112]
6867
ldxdw r2, [r7+10360]
69-
jne r1, r2, jmp_0068
68+
jne r1, r2, jmp_0060
7069
ldxdw r1, [r10+120]
7170
ldxdw r2, [r7+10368]
72-
jne r1, r2, jmp_0068
71+
jne r1, r2, jmp_0060
7372
ldxdw r1, [r10+128]
7473
ldxdw r2, [r7+10376]
75-
jne r1, r2, jmp_0068
74+
jne r1, r2, jmp_0060
7675
mov64 r1, r7
7776
add64 r1, 10352
7877
ldxdw r2, [r7+31120]
@@ -158,40 +157,44 @@ jmp_0070:
158157
add64 r1, 10456
159158
stxdw [r7+10448], r1
160159
mov64 r0, 0
161-
ja jmp_0068
160+
ja jmp_0060
162161

163-
jmp_04d0:
162+
jmp_04c8:
164163
mov64 r0, 2
165-
ja jmp_0068
164+
ja jmp_0060
166165

167-
jmp_04e0:
166+
jmp_04d8:
168167
mov64 r0, 5
169-
ja jmp_0068
168+
ja jmp_0060
169+
170+
jmp_04e8:
171+
mov64 r0, 11
172+
ja jmp_0060
170173

171-
jmp_04f0:
174+
jmp_04f8:
172175
mov64 r0, 12
173-
ja jmp_0068
176+
ja jmp_0060
174177

175-
jmp_0500:
178+
jmp_0508:
176179
mov64 r0, 1
177-
ja jmp_0068
180+
ja jmp_0060
178181

179-
jmp_0510:
182+
jmp_0518:
180183
mov64 r0, 3
181-
ja jmp_0068
184+
ja jmp_0060
182185

183-
jmp_0520:
186+
jmp_0528:
184187
mov64 r0, 6
185-
ja jmp_0068
188+
ja jmp_0060
186189

187-
jmp_0530:
190+
jmp_0538:
188191
mov64 r0, 4
189-
ja jmp_0068
192+
ja jmp_0060
190193

191-
jmp_0540:
194+
jmp_0548:
192195
mov64 r0, 7
193-
ja jmp_0068
196+
ja jmp_0060
194197

195-
jmp_0550:
198+
jmp_0558:
196199
mov64 r0, 9
197-
ja jmp_0068
200+
ja jmp_0060

‎examples/tree/artifacts/snippets/rs/general-branching.txt‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ unsafe fn general(input_buffer_ptr: *mut u8, instruction_data_ptr: *mut u8) -> u
1010

1111
// Get instruction data length and discriminator, branch to instruction.
1212
let instruction_data_len = ldxdw(instruction_data_ptr, -(size_of::<u64>() as i16));
13-
if ldxb(instruction_data_ptr, instruction::DISCRIMINATOR_OFF) == Instruction::Insert as u8 {
13+
if likely(
14+
ldxb(instruction_data_ptr, instruction::DISCRIMINATOR_OFF) == Instruction::Insert as u8,
15+
) {
1416
insert(input_buffer_ptr, instruction_data_ptr, instruction_data_len)
1517
} else {
1618
error::INSTRUCTION_DISCRIMINATOR.into()

‎examples/tree/artifacts/tests/general_branching/result.txt‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
|-----------|-----------|------------|----------|------------|
33
| User has nonzero data length | 6 | 8 | +2 | +33.3% |
44
| Tree account is duplicate | 8 | 10 | +2 | +25.0% |
5-
| Invalid instruction discriminator | 11 | 11 | +0 | +0.0% |
5+
| Invalid instruction discriminator | 11 | 12 | +1 | +9.1% |
66
test tests::test_general_branching ... ok
77
[ ... DEBUG ... ] Program DASMAC... invoke [1]
88
[ ... DEBUG ... ] Program DASMAC... consumed 6 of 1400000 compute units
@@ -20,5 +20,5 @@ test tests::test_general_branching ... ok
2020
[ ... DEBUG ... ] Program DASMAC... consumed 11 of 1400000 compute units
2121
[ ... DEBUG ... ] Program DASMAC... failed: custom program error: 0xb
2222
[ ... DEBUG ... ] Program DASMAC... invoke [1]
23-
[ ... DEBUG ... ] Program DASMAC... consumed 11 of 1400000 compute units
23+
[ ... DEBUG ... ] Program DASMAC... consumed 12 of 1400000 compute units
2424
[ ... DEBUG ... ] Program DASMAC... failed: custom program error: 0xb
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
| Test case | ASM (CUs) | Rust (CUs) | Overhead | Overhead % |
22
|-----------|-----------|------------|----------|------------|
3-
| Instruction data too short | 12 | 16 | +4 | +33.3% |
4-
| Instruction data too long | 12 | 16 | +4 | +33.3% |
5-
| Insert happy path | 11 | 14 | +3 | +27.3% |
3+
| Instruction data too short | 12 | 15 | +3 | +25.0% |
4+
| Instruction data too long | 12 | 15 | +3 | +25.0% |
5+
| Insert happy path | 11 | 13 | +2 | +18.2% |
66
test tests::test_insert ... ok
77
[ ... DEBUG ... ] Program DASMAC... invoke [1]
88
[ ... DEBUG ... ] Program DASMAC... consumed 12 of 1400000 compute units
99
[ ... DEBUG ... ] Program DASMAC... failed: custom program error: 0xc
1010
[ ... DEBUG ... ] Program DASMAC... invoke [1]
11-
[ ... DEBUG ... ] Program DASMAC... consumed 16 of 1400000 compute units
11+
[ ... DEBUG ... ] Program DASMAC... consumed 15 of 1400000 compute units
1212
[ ... DEBUG ... ] Program DASMAC... failed: custom program error: 0xc
1313
[ ... DEBUG ... ] Program DASMAC... invoke [1]
1414
[ ... DEBUG ... ] Program DASMAC... consumed 12 of 1400000 compute units
1515
[ ... DEBUG ... ] Program DASMAC... failed: custom program error: 0xc
1616
[ ... DEBUG ... ] Program DASMAC... invoke [1]
17-
[ ... DEBUG ... ] Program DASMAC... consumed 16 of 1400000 compute units
17+
[ ... DEBUG ... ] Program DASMAC... consumed 15 of 1400000 compute units
1818
[ ... DEBUG ... ] Program DASMAC... failed: custom program error: 0xc
1919
[ ... DEBUG ... ] Program DASMAC... invoke [1]
2020
[ ... DEBUG ... ] Program DASMAC... consumed 11 of 1400000 compute units
2121
[ ... DEBUG ... ] Program DASMAC... success
2222
[ ... DEBUG ... ] Program DASMAC... invoke [1]
23-
[ ... DEBUG ... ] Program DASMAC... consumed 14 of 1400000 compute units
23+
[ ... DEBUG ... ] Program DASMAC... consumed 13 of 1400000 compute units
2424
[ ... DEBUG ... ] Program DASMAC... success

‎examples/tree/src/program.rs‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,9 @@ unsafe fn general(input_buffer_ptr: *mut u8, instruction_data_ptr: *mut u8) -> u
9090

9191
// Get instruction data length and discriminator, branch to instruction.
9292
let instruction_data_len = ldxdw(instruction_data_ptr, -(size_of::<u64>() as i16));
93-
if ldxb(instruction_data_ptr, instruction::DISCRIMINATOR_OFF) == Instruction::Insert as u8 {
93+
if likely(
94+
ldxb(instruction_data_ptr, instruction::DISCRIMINATOR_OFF) == Instruction::Insert as u8,
95+
) {
9496
insert(input_buffer_ptr, instruction_data_ptr, instruction_data_len)
9597
} else {
9698
error::INSTRUCTION_DISCRIMINATOR.into()

0 commit comments

Comments
 (0)