Skip to content

Instantly share code, notes, and snippets.

@yuriks
Created October 13, 2022 00:39
Show Gist options
  • Save yuriks/3e70410e45fe1973e4c146866983df15 to your computer and use it in GitHub Desktop.
Save yuriks/3e70410e45fe1973e4c146866983df15 to your computer and use it in GitHub Desktop.
# Search returns false positives if A isn't actually in ptrs
def create_search(f, table, label_prefix='.l'):
search_bits = len(table).bit_length()
def pad_label(s):
return (s + ':').ljust(len(label_prefix) + search_bits + 2)
def emit_search(prefix, sub_table):
f.write(pad_label(prefix))
if len(sub_table) == 1:
f.write('LDX #{} : BRA {}_end_search\n'.format(sub_table[0][1], label_prefix))
else:
midpoint_i = len(sub_table) // 2
f.write('CMP #${:04X} : BCS {}1\n'.format(sub_table[midpoint_i][0], prefix))
emit_search(prefix + '0', sub_table[:midpoint_i])
emit_search(prefix + '1', sub_table[midpoint_i:])
emit_search(label_prefix, table)
# Search can correctly detect if A isn't in ptrs
def create_search_exact(f, table, label_prefix='.l'):
search_bits = len(table).bit_length()
def pad_label(s):
return (s + ': ').ljust(len(label_prefix) + search_bits + 2)
def emit_search(prefix, sub_table):
#print("emit_search", prefix, sub_table)
f.write(pad_label(prefix))
if len(sub_table) == 0:
# This is a failsafe but should never happen
#print("********************")
f.write('BRA {}_not_found\n'.format(label_prefix))
elif len(sub_table) == 1:
f.write('CMP #${:04X} : BNE {}_not_found : LDX #{} : BRA {}_end_search\n'.format(sub_table[0][0], label_prefix, sub_table[0][1], label_prefix))
else:
midpoint_i = len(sub_table) // 2
left = sub_table[:midpoint_i]
mid = sub_table[midpoint_i]
right = sub_table[midpoint_i+1:]
f.write('CMP #${:04X} : BCS {}x\n'.format(mid[0], prefix))
emit_search(prefix + '0', left)
f.write(pad_label(prefix + 'x'))
# Short circuit to not found
target_label = prefix + '1' if right else label_prefix + '_not_found'
f.write('BNE {} : LDX #{} : BRA {}_end_search\n'.format(target_label, mid[1], label_prefix))
if right:
emit_search(prefix + '1', right)
emit_search(label_prefix, table)
def assemble_test(f):
code = []
labels = {}
for line in f:
parts = line.split(':')
label = parts[0]
if label in code:
raise ValueError("duplicate label: " + label)
labels[label] = len(code)
for instr_text in parts[1:]:
instr = instr_text.split()
if instr[0] == 'CMP':
instr.append(instr[1])
instr[1] = int(instr[1].removeprefix('#$'), base=16)
code.append(tuple(instr))
return code, labels
def calc_code_size(code):
size = 0
for i in code:
size += {
'CMP': 2+1,
'BCS': 2,
'LDX': 2+1,
'BRA': 2,
'BNE': 2,
}[i[0]]
return size
def run_test(val, code, labels, trace=False):
pc = 0
x_reg = None
cmp_val = None
labels['.l_end_search'] = -1
labels['.l_not_found'] = -2
instruction_count = 0
cycles = 0
while pc >= 0:
i = code[pc]
pc += 1
if trace:
print(i)
if i[0] == 'CMP':
cycles += 2+1
cmp_val = i[1]
elif i[0] == 'BCS':
cycles += 2
if val >= cmp_val:
cycles += 1
pc = labels[i[1]]
if trace:
print(i[1])
elif i[0] == 'LDX':
cycles += 2+1
x_reg = i[1]
elif i[0] == 'BRA':
cycles += 3
pc = labels[i[1]]
if trace:
print(i[1])
elif i[0] == 'BNE':
cycles += 2
if val != cmp_val:
cycles += 1
pc = labels[i[1]]
if trace:
print(i[1])
instruction_count += 1
return {'pc': pc, 'x': x_reg, 'instrs': instruction_count, 'cycles': cycles}
from io import StringIO
import sys
import random
def test(exact):
ptrs = [0xB2F3, 0xB321, 0xB3EC, 0xB3F8, 0xB441, 0xB455, 0xB493, 0xB4D1, 0xB516, 0xB554, 0xB594, 0xB5E5, 0xB613, 0xB6A7, 0xB6DD, 0xB70E, 0xB7B9, 0xBAB7, 0xBB8F, 0xBBC4, 0xBBF1, 0xBC2E, 0xBC54, 0xBD4E, 0xC538, 0xC588]
dest_labels = ["RidleyAIText_B2F3", "RidleyAIText_B321", "RidleyAIText_B3EC", "RidleyAIText_B3F8", "RidleyAIText_B441", "RidleyAIText_B455", "RidleyAIText_B493", "RidleyAIText_B4D1", "RidleyAIText_B516", "RidleyAIText_B554", "RidleyAIText_B594", "RidleyAIText_B5E5", "RidleyAIText_B613", "RidleyAIText_B6A7", "RidleyAIText_B6DD", "RidleyAIText_B70E", "RidleyAIText_B7B9", "RidleyAIText_BAB7", "RidleyAIText_BB8F", "RidleyAIText_BBC4", "RidleyAIText_BBF1", "RidleyAIText_BC2E", "RidleyAIText_BC54", "RidleyAIText_BD4E", "RidleyAIText_C538", "RidleyAIText_C588"]
table = dict(zip(ptrs, dest_labels, strict=True))
print(table)
print()
s = StringIO()
if exact:
create_search_exact(s, list(table.items()))
else:
create_search(s, list(table.items()))
print(s.getvalue())
s.seek(0)
code, labels = assemble_test(s)
print("Code size: ${:X}".format(calc_code_size(code)))
accum_stats = {}
accum_n = 0
def testcase(v, trace=False, print_stats=False):
stats = run_test(v, code, labels, trace)
if stats['pc'] == -1:
pc = ".l_end_search"
result = table.get(v) == stats['x'].removeprefix('#')
elif stats['pc'] == -2:
pc = ".l_not_found"
result = v not in table
else:
pc = "invalid"
result = False
print('${:04X}'.format(v), pc, stats['x'], "(PASS)" if result else "(FAIL)")
# Statistics
nonlocal accum_n
del stats['pc']
del stats['x']
for k in stats:
accum_stats[k] = accum_stats.get(k, 0) + stats[k]
accum_n += 1
if print_stats:
print(stats)
def print_accum_stats():
nonlocal accum_stats, accum_n
for k in accum_stats:
accum_stats[k] = accum_stats[k] / accum_n
print("Average:", accum_stats)
accum_stats = {}
accum_n = 0
print("--- Found tests:")
for p in ptrs[:]:
testcase(p)
print_accum_stats()
if exact:
print("--- Off-by-one tests:")
for p in ptrs[:]:
testcase(p-1)
testcase(p+1)
print("--- Random tests:")
random.seed(0x12345)
for p in range(50):
testcase(random.randrange(0xA000, 0xD000))
print_accum_stats()
test(exact=False)
test(exact=True)
=================================================================================================== RESTART: C:/Users/yuriks/projects/make_binary_search.py ===================================================================================================
{45811: 'RidleyAIText_B2F3', 45857: 'RidleyAIText_B321', 46060: 'RidleyAIText_B3EC', 46072: 'RidleyAIText_B3F8', 46145: 'RidleyAIText_B441', 46165: 'RidleyAIText_B455', 46227: 'RidleyAIText_B493', 46289: 'RidleyAIText_B4D1', 46358: 'RidleyAIText_B516', 46420: 'RidleyAIText_B554', 46484: 'RidleyAIText_B594', 46565: 'RidleyAIText_B5E5', 46611: 'RidleyAIText_B613', 46759: 'RidleyAIText_B6A7', 46813: 'RidleyAIText_B6DD', 46862: 'RidleyAIText_B70E', 47033: 'RidleyAIText_B7B9', 47799: 'RidleyAIText_BAB7', 48015: 'RidleyAIText_BB8F', 48068: 'RidleyAIText_BBC4', 48113: 'RidleyAIText_BBF1', 48174: 'RidleyAIText_BC2E', 48212: 'RidleyAIText_BC54', 48462: 'RidleyAIText_BD4E', 50488: 'RidleyAIText_C538', 50568: 'RidleyAIText_C588'}
.l: CMP #$B6A7 : BCS .l1
.l0: CMP #$B493 : BCS .l01
.l00: CMP #$B3F8 : BCS .l001
.l000: CMP #$B321 : BCS .l0001
.l0000: LDX #RidleyAIText_B2F3 : BRA .l_end_search
.l0001: CMP #$B3EC : BCS .l00011
.l00010: LDX #RidleyAIText_B321 : BRA .l_end_search
.l00011: LDX #RidleyAIText_B3EC : BRA .l_end_search
.l001: CMP #$B441 : BCS .l0011
.l0010: LDX #RidleyAIText_B3F8 : BRA .l_end_search
.l0011: CMP #$B455 : BCS .l00111
.l00110: LDX #RidleyAIText_B441 : BRA .l_end_search
.l00111: LDX #RidleyAIText_B455 : BRA .l_end_search
.l01: CMP #$B554 : BCS .l011
.l010: CMP #$B4D1 : BCS .l0101
.l0100: LDX #RidleyAIText_B493 : BRA .l_end_search
.l0101: CMP #$B516 : BCS .l01011
.l01010: LDX #RidleyAIText_B4D1 : BRA .l_end_search
.l01011: LDX #RidleyAIText_B516 : BRA .l_end_search
.l011: CMP #$B5E5 : BCS .l0111
.l0110: CMP #$B594 : BCS .l01101
.l01100: LDX #RidleyAIText_B554 : BRA .l_end_search
.l01101: LDX #RidleyAIText_B594 : BRA .l_end_search
.l0111: CMP #$B613 : BCS .l01111
.l01110: LDX #RidleyAIText_B5E5 : BRA .l_end_search
.l01111: LDX #RidleyAIText_B613 : BRA .l_end_search
.l1: CMP #$BBC4 : BCS .l11
.l10: CMP #$B7B9 : BCS .l101
.l100: CMP #$B6DD : BCS .l1001
.l1000: LDX #RidleyAIText_B6A7 : BRA .l_end_search
.l1001: CMP #$B70E : BCS .l10011
.l10010: LDX #RidleyAIText_B6DD : BRA .l_end_search
.l10011: LDX #RidleyAIText_B70E : BRA .l_end_search
.l101: CMP #$BAB7 : BCS .l1011
.l1010: LDX #RidleyAIText_B7B9 : BRA .l_end_search
.l1011: CMP #$BB8F : BCS .l10111
.l10110: LDX #RidleyAIText_BAB7 : BRA .l_end_search
.l10111: LDX #RidleyAIText_BB8F : BRA .l_end_search
.l11: CMP #$BC54 : BCS .l111
.l110: CMP #$BBF1 : BCS .l1101
.l1100: LDX #RidleyAIText_BBC4 : BRA .l_end_search
.l1101: CMP #$BC2E : BCS .l11011
.l11010: LDX #RidleyAIText_BBF1 : BRA .l_end_search
.l11011: LDX #RidleyAIText_BC2E : BRA .l_end_search
.l111: CMP #$C538 : BCS .l1111
.l1110: CMP #$BD4E : BCS .l11101
.l11100: LDX #RidleyAIText_BC54 : BRA .l_end_search
.l11101: LDX #RidleyAIText_BD4E : BRA .l_end_search
.l1111: CMP #$C588 : BCS .l11111
.l11110: LDX #RidleyAIText_C538 : BRA .l_end_search
.l11111: LDX #RidleyAIText_C588 : BRA .l_end_search
Code size: $FF
--- Found tests:
$B2F3 .l_end_search #RidleyAIText_B2F3 (PASS)
$B321 .l_end_search #RidleyAIText_B321 (PASS)
$B3EC .l_end_search #RidleyAIText_B3EC (PASS)
$B3F8 .l_end_search #RidleyAIText_B3F8 (PASS)
$B441 .l_end_search #RidleyAIText_B441 (PASS)
$B455 .l_end_search #RidleyAIText_B455 (PASS)
$B493 .l_end_search #RidleyAIText_B493 (PASS)
$B4D1 .l_end_search #RidleyAIText_B4D1 (PASS)
$B516 .l_end_search #RidleyAIText_B516 (PASS)
$B554 .l_end_search #RidleyAIText_B554 (PASS)
$B594 .l_end_search #RidleyAIText_B594 (PASS)
$B5E5 .l_end_search #RidleyAIText_B5E5 (PASS)
$B613 .l_end_search #RidleyAIText_B613 (PASS)
$B6A7 .l_end_search #RidleyAIText_B6A7 (PASS)
$B6DD .l_end_search #RidleyAIText_B6DD (PASS)
$B70E .l_end_search #RidleyAIText_B70E (PASS)
$B7B9 .l_end_search #RidleyAIText_B7B9 (PASS)
$BAB7 .l_end_search #RidleyAIText_BAB7 (PASS)
$BB8F .l_end_search #RidleyAIText_BB8F (PASS)
$BBC4 .l_end_search #RidleyAIText_BBC4 (PASS)
$BBF1 .l_end_search #RidleyAIText_BBF1 (PASS)
$BC2E .l_end_search #RidleyAIText_BC2E (PASS)
$BC54 .l_end_search #RidleyAIText_BC54 (PASS)
$BD4E .l_end_search #RidleyAIText_BD4E (PASS)
$C538 .l_end_search #RidleyAIText_C538 (PASS)
$C588 .l_end_search #RidleyAIText_C588 (PASS)
Average: {'instrs': 11.538461538461538, 'cycles': 32.42307692307692}
{45811: 'RidleyAIText_B2F3', 45857: 'RidleyAIText_B321', 46060: 'RidleyAIText_B3EC', 46072: 'RidleyAIText_B3F8', 46145: 'RidleyAIText_B441', 46165: 'RidleyAIText_B455', 46227: 'RidleyAIText_B493', 46289: 'RidleyAIText_B4D1', 46358: 'RidleyAIText_B516', 46420: 'RidleyAIText_B554', 46484: 'RidleyAIText_B594', 46565: 'RidleyAIText_B5E5', 46611: 'RidleyAIText_B613', 46759: 'RidleyAIText_B6A7', 46813: 'RidleyAIText_B6DD', 46862: 'RidleyAIText_B70E', 47033: 'RidleyAIText_B7B9', 47799: 'RidleyAIText_BAB7', 48015: 'RidleyAIText_BB8F', 48068: 'RidleyAIText_BBC4', 48113: 'RidleyAIText_BBF1', 48174: 'RidleyAIText_BC2E', 48212: 'RidleyAIText_BC54', 48462: 'RidleyAIText_BD4E', 50488: 'RidleyAIText_C538', 50568: 'RidleyAIText_C588'}
.l: CMP #$B6A7 : BCS .lx
.l0: CMP #$B493 : BCS .l0x
.l00: CMP #$B3F8 : BCS .l00x
.l000: CMP #$B321 : BCS .l000x
.l0000: CMP #$B2F3 : BNE .l_not_found : LDX #RidleyAIText_B2F3 : BRA .l_end_search
.l000x: BNE .l0001 : LDX #RidleyAIText_B321 : BRA .l_end_search
.l0001: CMP #$B3EC : BNE .l_not_found : LDX #RidleyAIText_B3EC : BRA .l_end_search
.l00x: BNE .l001 : LDX #RidleyAIText_B3F8 : BRA .l_end_search
.l001: CMP #$B455 : BCS .l001x
.l0010: CMP #$B441 : BNE .l_not_found : LDX #RidleyAIText_B441 : BRA .l_end_search
.l001x: BNE .l_not_found : LDX #RidleyAIText_B455 : BRA .l_end_search
.l0x: BNE .l01 : LDX #RidleyAIText_B493 : BRA .l_end_search
.l01: CMP #$B594 : BCS .l01x
.l010: CMP #$B516 : BCS .l010x
.l0100: CMP #$B4D1 : BNE .l_not_found : LDX #RidleyAIText_B4D1 : BRA .l_end_search
.l010x: BNE .l0101 : LDX #RidleyAIText_B516 : BRA .l_end_search
.l0101: CMP #$B554 : BNE .l_not_found : LDX #RidleyAIText_B554 : BRA .l_end_search
.l01x: BNE .l011 : LDX #RidleyAIText_B594 : BRA .l_end_search
.l011: CMP #$B613 : BCS .l011x
.l0110: CMP #$B5E5 : BNE .l_not_found : LDX #RidleyAIText_B5E5 : BRA .l_end_search
.l011x: BNE .l_not_found : LDX #RidleyAIText_B613 : BRA .l_end_search
.lx: BNE .l1 : LDX #RidleyAIText_B6A7 : BRA .l_end_search
.l1: CMP #$BBF1 : BCS .l1x
.l10: CMP #$BAB7 : BCS .l10x
.l100: CMP #$B70E : BCS .l100x
.l1000: CMP #$B6DD : BNE .l_not_found : LDX #RidleyAIText_B6DD : BRA .l_end_search
.l100x: BNE .l1001 : LDX #RidleyAIText_B70E : BRA .l_end_search
.l1001: CMP #$B7B9 : BNE .l_not_found : LDX #RidleyAIText_B7B9 : BRA .l_end_search
.l10x: BNE .l101 : LDX #RidleyAIText_BAB7 : BRA .l_end_search
.l101: CMP #$BBC4 : BCS .l101x
.l1010: CMP #$BB8F : BNE .l_not_found : LDX #RidleyAIText_BB8F : BRA .l_end_search
.l101x: BNE .l_not_found : LDX #RidleyAIText_BBC4 : BRA .l_end_search
.l1x: BNE .l11 : LDX #RidleyAIText_BBF1 : BRA .l_end_search
.l11: CMP #$BD4E : BCS .l11x
.l110: CMP #$BC54 : BCS .l110x
.l1100: CMP #$BC2E : BNE .l_not_found : LDX #RidleyAIText_BC2E : BRA .l_end_search
.l110x: BNE .l_not_found : LDX #RidleyAIText_BC54 : BRA .l_end_search
.l11x: BNE .l111 : LDX #RidleyAIText_BD4E : BRA .l_end_search
.l111: CMP #$C588 : BCS .l111x
.l1110: CMP #$C538 : BNE .l_not_found : LDX #RidleyAIText_C538 : BRA .l_end_search
.l111x: BNE .l_not_found : LDX #RidleyAIText_C588 : BRA .l_end_search
Code size: $122
--- Found tests:
$B2F3 .l_end_search #RidleyAIText_B2F3 (PASS)
$B321 .l_end_search #RidleyAIText_B321 (PASS)
$B3EC .l_end_search #RidleyAIText_B3EC (PASS)
$B3F8 .l_end_search #RidleyAIText_B3F8 (PASS)
$B441 .l_end_search #RidleyAIText_B441 (PASS)
$B455 .l_end_search #RidleyAIText_B455 (PASS)
$B493 .l_end_search #RidleyAIText_B493 (PASS)
$B4D1 .l_end_search #RidleyAIText_B4D1 (PASS)
$B516 .l_end_search #RidleyAIText_B516 (PASS)
$B554 .l_end_search #RidleyAIText_B554 (PASS)
$B594 .l_end_search #RidleyAIText_B594 (PASS)
$B5E5 .l_end_search #RidleyAIText_B5E5 (PASS)
$B613 .l_end_search #RidleyAIText_B613 (PASS)
$B6A7 .l_end_search #RidleyAIText_B6A7 (PASS)
$B6DD .l_end_search #RidleyAIText_B6DD (PASS)
$B70E .l_end_search #RidleyAIText_B70E (PASS)
$B7B9 .l_end_search #RidleyAIText_B7B9 (PASS)
$BAB7 .l_end_search #RidleyAIText_BAB7 (PASS)
$BB8F .l_end_search #RidleyAIText_BB8F (PASS)
$BBC4 .l_end_search #RidleyAIText_BBC4 (PASS)
$BBF1 .l_end_search #RidleyAIText_BBF1 (PASS)
$BC2E .l_end_search #RidleyAIText_BC2E (PASS)
$BC54 .l_end_search #RidleyAIText_BC54 (PASS)
$BD4E .l_end_search #RidleyAIText_BD4E (PASS)
$C538 .l_end_search #RidleyAIText_C538 (PASS)
$C588 .l_end_search #RidleyAIText_C588 (PASS)
Average: {'instrs': 11.884615384615385, 'cycles': 32.96153846153846}
--- Off-by-one tests:
$B2F2 .l_not_found None (PASS)
$B2F4 .l_not_found None (PASS)
$B320 .l_not_found None (PASS)
$B322 .l_not_found None (PASS)
$B3EB .l_not_found None (PASS)
$B3ED .l_not_found None (PASS)
$B3F7 .l_not_found None (PASS)
$B3F9 .l_not_found None (PASS)
$B440 .l_not_found None (PASS)
$B442 .l_not_found None (PASS)
$B454 .l_not_found None (PASS)
$B456 .l_not_found None (PASS)
$B492 .l_not_found None (PASS)
$B494 .l_not_found None (PASS)
$B4D0 .l_not_found None (PASS)
$B4D2 .l_not_found None (PASS)
$B515 .l_not_found None (PASS)
$B517 .l_not_found None (PASS)
$B553 .l_not_found None (PASS)
$B555 .l_not_found None (PASS)
$B593 .l_not_found None (PASS)
$B595 .l_not_found None (PASS)
$B5E4 .l_not_found None (PASS)
$B5E6 .l_not_found None (PASS)
$B612 .l_not_found None (PASS)
$B614 .l_not_found None (PASS)
$B6A6 .l_not_found None (PASS)
$B6A8 .l_not_found None (PASS)
$B6DC .l_not_found None (PASS)
$B6DE .l_not_found None (PASS)
$B70D .l_not_found None (PASS)
$B70F .l_not_found None (PASS)
$B7B8 .l_not_found None (PASS)
$B7BA .l_not_found None (PASS)
$BAB6 .l_not_found None (PASS)
$BAB8 .l_not_found None (PASS)
$BB8E .l_not_found None (PASS)
$BB90 .l_not_found None (PASS)
$BBC3 .l_not_found None (PASS)
$BBC5 .l_not_found None (PASS)
$BBF0 .l_not_found None (PASS)
$BBF2 .l_not_found None (PASS)
$BC2D .l_not_found None (PASS)
$BC2F .l_not_found None (PASS)
$BC53 .l_not_found None (PASS)
$BC55 .l_not_found None (PASS)
$BD4D .l_not_found None (PASS)
$BD4F .l_not_found None (PASS)
$C537 .l_not_found None (PASS)
$C539 .l_not_found None (PASS)
$C587 .l_not_found None (PASS)
$C589 .l_not_found None (PASS)
--- Random tests:
$B926 .l_not_found None (PASS)
$BD96 .l_not_found None (PASS)
$BA76 .l_not_found None (PASS)
$B795 .l_not_found None (PASS)
$C078 .l_not_found None (PASS)
$A3DB .l_not_found None (PASS)
$BA10 .l_not_found None (PASS)
$A81F .l_not_found None (PASS)
$BD7E .l_not_found None (PASS)
$BCD9 .l_not_found None (PASS)
$B128 .l_not_found None (PASS)
$A1BB .l_not_found None (PASS)
$A746 .l_not_found None (PASS)
$A4C4 .l_not_found None (PASS)
$B461 .l_not_found None (PASS)
$BA1E .l_not_found None (PASS)
$C14B .l_not_found None (PASS)
$CF20 .l_not_found None (PASS)
$B16F .l_not_found None (PASS)
$AEA0 .l_not_found None (PASS)
$B2B5 .l_not_found None (PASS)
$C864 .l_not_found None (PASS)
$AA24 .l_not_found None (PASS)
$BD76 .l_not_found None (PASS)
$A40E .l_not_found None (PASS)
$CCD5 .l_not_found None (PASS)
$B59D .l_not_found None (PASS)
$CDDC .l_not_found None (PASS)
$BFD5 .l_not_found None (PASS)
$C840 .l_not_found None (PASS)
$C7CA .l_not_found None (PASS)
$AB50 .l_not_found None (PASS)
$AB26 .l_not_found None (PASS)
$A345 .l_not_found None (PASS)
$BB04 .l_not_found None (PASS)
$B298 .l_not_found None (PASS)
$A846 .l_not_found None (PASS)
$CBA1 .l_not_found None (PASS)
$CCDE .l_not_found None (PASS)
$AF67 .l_not_found None (PASS)
$CB59 .l_not_found None (PASS)
$A0F4 .l_not_found None (PASS)
$C7B3 .l_not_found None (PASS)
$B671 .l_not_found None (PASS)
$C569 .l_not_found None (PASS)
$AC9F .l_not_found None (PASS)
$BFA9 .l_not_found None (PASS)
$BA2B .l_not_found None (PASS)
$CE08 .l_not_found None (PASS)
$CC5B .l_not_found None (PASS)
Average: {'instrs': 11.392156862745098, 'cycles': 32.03921568627451}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment