TENSOR .op COMPILER — VISIBLE PIPELINE Input : /mnt/fileserver/prj/dmctp/user/src/tensor/src/kernels/linalg/matrix_mul/matrix_mul.op Parser : /mnt/fileserver/prj/dmctp/user/src/tensor/src/op_parser Output : /mnt/fileserver/prj/dmctp/user/src/tensor/src/op_parser/visible_matrix_mul.txt ================================================================================ STEP 0 — ORIGINAL .op SOURCE ================================================================================ define type T = any; devices none = {}; devices host = {generic, cpu}; devices SIMT = {cuda}; dim M; dim K; dim N; enddefine declare name matrix_mul; id 0x00040001; in a: T [M, K]; in b: T [K, N]; out o: T [M, N]; enddeclare code begin algorithm naive begin for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { o[i * N + j] = (T)0; for (uint64 k = 0; k < K; ++k) o[i * N + j] = (T)(o[i * N + j] + a[i * K + k] * b[k * N + j]); } return false; endalgorithm: naive algorithm reordered begin for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { T acc = (T)0; for (uint64 k = 0; k < K; ++k) acc = (T)(acc + a[i * K + k] * b[k * N + j]); o[i * N + j] = acc; } return false; endalgorithm: reordered algorithm _simt begin parallel for (uint64 idx = 0; idx < M * N; ++idx) { uint64 i = idx / N; uint64 j = idx % N; T acc = (T)0; for (uint64 k = 0; k < K; ++k) { acc = (T)(acc + a[i * K + k] * b[k * N + j]); } o[idx] = acc; } return false; endalgorithm: _simt endcode hints begin pointwise: false; target naive: none; operations naive: 2 * M * N * K; target reordered: host; operations reordered: 2 * M * N * K; target _simt: SIMT; operations _simt: 2 * M * N * K; endhints ================================================================================ STEP 1 — LEXER OUTPUT ================================================================================ lex(/mnt/fileserver/prj/dmctp/user/src/tensor/src/kernels/linalg/matrix_mul/matrix_mul.op) item count: 30 -------------------------------------------------------------------------------- ITEM 0 kind : Line line : 1 text : 'define' -------------------------------------------------------------------------------- ITEM 1 kind : Line line : 2 text : 'type T = any;' -------------------------------------------------------------------------------- ITEM 2 kind : Line line : 3 text : 'devices none = {};' -------------------------------------------------------------------------------- ITEM 3 kind : Line line : 4 text : 'devices host = {generic, cpu};' -------------------------------------------------------------------------------- ITEM 4 kind : Line line : 5 text : 'devices SIMT = {cuda};' -------------------------------------------------------------------------------- ITEM 5 kind : Line line : 6 text : 'dim M;' -------------------------------------------------------------------------------- ITEM 6 kind : Line line : 7 text : 'dim K;' -------------------------------------------------------------------------------- ITEM 7 kind : Line line : 8 text : 'dim N;' -------------------------------------------------------------------------------- ITEM 8 kind : Line line : 9 text : 'enddefine' -------------------------------------------------------------------------------- ITEM 9 kind : Line line : 11 text : 'declare' -------------------------------------------------------------------------------- ITEM 10 kind : Line line : 12 text : 'name matrix_mul;' -------------------------------------------------------------------------------- ITEM 11 kind : Line line : 13 text : 'id 0x00040001;' -------------------------------------------------------------------------------- ITEM 12 kind : Line line : 14 text : 'in a: T [M, K];' -------------------------------------------------------------------------------- ITEM 13 kind : Line line : 15 text : 'in b: T [K, N];' -------------------------------------------------------------------------------- ITEM 14 kind : Line line : 16 text : 'out o: T [M, N];' -------------------------------------------------------------------------------- ITEM 15 kind : Line line : 17 text : 'enddeclare' -------------------------------------------------------------------------------- ITEM 16 kind : Line line : 19 text : 'code begin' -------------------------------------------------------------------------------- ITEM 17 kind : AlgorithmBlock line : 20 name : naive body: for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { o[i * N + j] = (T)0; for (uint64 k = 0; k < K; ++k) o[i * N + j] = (T)(o[i * N + j] + a[i * K + k] * b[k * N + j]); } return false; -------------------------------------------------------------------------------- ITEM 18 kind : AlgorithmBlock line : 30 name : reordered body: for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { T acc = (T)0; for (uint64 k = 0; k < K; ++k) acc = (T)(acc + a[i * K + k] * b[k * N + j]); o[i * N + j] = acc; } return false; -------------------------------------------------------------------------------- ITEM 19 kind : AlgorithmBlock line : 41 name : _simt body: parallel for (uint64 idx = 0; idx < M * N; ++idx) { uint64 i = idx / N; uint64 j = idx % N; T acc = (T)0; for (uint64 k = 0; k < K; ++k) { acc = (T)(acc + a[i * K + k] * b[k * N + j]); } o[idx] = acc; } return false; -------------------------------------------------------------------------------- ITEM 20 kind : Line line : 54 text : 'endcode' -------------------------------------------------------------------------------- ITEM 21 kind : Line line : 56 text : 'hints begin' -------------------------------------------------------------------------------- ITEM 22 kind : Line line : 57 text : 'pointwise: false;' -------------------------------------------------------------------------------- ITEM 23 kind : Line line : 59 text : 'target naive: none;' -------------------------------------------------------------------------------- ITEM 24 kind : Line line : 60 text : 'operations naive: 2 * M * N * K;' -------------------------------------------------------------------------------- ITEM 25 kind : Line line : 62 text : 'target reordered: host;' -------------------------------------------------------------------------------- ITEM 26 kind : Line line : 63 text : 'operations reordered: 2 * M * N * K;' -------------------------------------------------------------------------------- ITEM 27 kind : Line line : 65 text : 'target _simt: SIMT;' -------------------------------------------------------------------------------- ITEM 28 kind : Line line : 66 text : 'operations _simt: 2 * M * N * K;' -------------------------------------------------------------------------------- ITEM 29 kind : Line line : 67 text : 'endhints' ================================================================================ STEP 2 — PARSER OUTPUT / RAW AST ================================================================================ parse(path) -> Operation Operation(source='/mnt/fileserver/prj/dmctp/user/src/tensor/src/kernels/linalg/matrix_mul/matrix_mul.op', types={'T': TypeDef(name='T', dtypes=('int16', 'int32', 'int64', 'int8', 'real32', 'real64', 'uint16', 'uint32', 'uint64', 'uint8'))}, devices={'none': DeviceDef(name='none', devices=()), 'host': DeviceDef(name='host', devices=('generic', 'cpu')), 'SIMT': DeviceDef(name='SIMT', devices=('cuda',))}, dimensions={'M': DimensionDef(name='M', value=None), 'K': DimensionDef(name='K', value=None), 'N': DimensionDef(name='N', value=None)}, shapes={}, name='matrix_mul', id=262145, values=[ValueDecl(kind='in', name='a', type_name='T', shape=('M', 'K'), count=1), ValueDecl(kind='in', name='b', type_name='T', shape=('K', 'N'), count=1), ValueDecl(kind='out', name='o', type_name='T', shape=('M', 'N'), count=1)], algorithms=[Algorithm(name='naive', body=' for (uint64 i = 0; i < M; ++i)\n' ' for (uint64 j = 0; j < N; ++j) {\n' ' o[i * N + j] = (T)0;\n' ' for (uint64 k = 0; k < K; ++k)\n' ' o[i * N + j] = (T)(o[i * N + j] + a[i * K + k] * b[k * N + j]);\n' ' }\n' ' return false;'), Algorithm(name='reordered', body=' for (uint64 i = 0; i < M; ++i)\n' ' for (uint64 j = 0; j < N; ++j) {\n' ' T acc = (T)0;\n' ' for (uint64 k = 0; k < K; ++k)\n' ' acc = (T)(acc + a[i * K + k] * b[k * N + j]);\n' ' o[i * N + j] = acc;\n' ' }\n' ' return false;'), Algorithm(name='_simt', body=' parallel for (uint64 idx = 0; idx < M * N; ++idx) {\n' ' uint64 i = idx / N;\n' ' uint64 j = idx % N;\n' '\n' ' T acc = (T)0;\n' ' for (uint64 k = 0; k < K; ++k) {\n' ' acc = (T)(acc + a[i * K + k] * b[k * N + j]);\n' ' }\n' ' o[idx] = acc;\n' ' }\n' ' return false;')], hints=Hints(pointwise=False, targets={'naive': 'none', 'reordered': 'host', '_simt': 'SIMT'}, operations={'naive': '2 * M * N * K', 'reordered': '2 * M * N * K', '_simt': '2 * M * N * K'}, requirements={}, preferences=[])) ================================================================================ STEP 3 — AST BROKEN DOWN ================================================================================ OPERATION source : /mnt/fileserver/prj/dmctp/user/src/tensor/src/kernels/linalg/matrix_mul/matrix_mul.op name : matrix_mul id : 0x00040001 TYPES T dtypes = ('int16', 'int32', 'int64', 'int8', 'real32', 'real64', 'uint16', 'uint32', 'uint64', 'uint8') DEVICE SET DEFINITIONS none members = () host members = ('generic', 'cpu') SIMT members = ('cuda',) DIMENSIONS M = None K = None N = None SHAPES VALUES in a type=T shape=('M', 'K') count=1 in b type=T shape=('K', 'N') count=1 out o type=T shape=('M', 'N') count=1 ALGORITHMS algorithm naive ---------------------------------------------------------------------- for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { o[i * N + j] = (T)0; for (uint64 k = 0; k < K; ++k) o[i * N + j] = (T)(o[i * N + j] + a[i * K + k] * b[k * N + j]); } return false; algorithm reordered ---------------------------------------------------------------------- for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { T acc = (T)0; for (uint64 k = 0; k < K; ++k) acc = (T)(acc + a[i * K + k] * b[k * N + j]); o[i * N + j] = acc; } return false; algorithm _simt ---------------------------------------------------------------------- parallel for (uint64 idx = 0; idx < M * N; ++idx) { uint64 i = idx / N; uint64 j = idx % N; T acc = (T)0; for (uint64 k = 0; k < K; ++k) { acc = (T)(acc + a[i * K + k] * b[k * N + j]); } o[idx] = acc; } return false; HINTS pointwise = False targets = {'naive': 'none', 'reordered': 'host', '_simt': 'SIMT'} operations = {'naive': '2 * M * N * K', 'reordered': '2 * M * N * K', '_simt': '2 * M * N * K'} requirements = {} preferences = [] ================================================================================ STEP 4 — VALIDATOR OUTPUT / RESOLVED OPERATION ================================================================================ validate(parse(path)) -> ValidatedOperation ValidatedOperation(ast=Operation(source='/mnt/fileserver/prj/dmctp/user/src/tensor/src/kernels/linalg/matrix_mul/matrix_mul.op', types={'T': TypeDef(name='T', dtypes=('int16', 'int32', 'int64', 'int8', 'real32', 'real64', 'uint16', 'uint32', 'uint64', 'uint8'))}, devices={'none': DeviceDef(name='none', devices=()), 'host': DeviceDef(name='host', devices=('generic', 'cpu')), 'SIMT': DeviceDef(name='SIMT', devices=('cuda',))}, dimensions={'M': DimensionDef(name='M', value=None), 'K': DimensionDef(name='K', value=None), 'N': DimensionDef(name='N', value=None)}, shapes={}, name='matrix_mul', id=262145, values=[ValueDecl(kind='in', name='a', type_name='T', shape=('M', 'K'), count=1), ValueDecl(kind='in', name='b', type_name='T', shape=('K', 'N'), count=1), ValueDecl(kind='out', name='o', type_name='T', shape=('M', 'N'), count=1)], algorithms=[Algorithm(name='naive', body=' for (uint64 i = 0; i < M; ++i)\n' ' for (uint64 j = 0; j < N; ++j) {\n' ' o[i * N + j] = (T)0;\n' ' for (uint64 k = 0; k < K; ++k)\n' ' o[i * N + j] = (T)(o[i * N + j] + a[i * K + k] ' '* b[k * N + j]);\n' ' }\n' ' return false;'), Algorithm(name='reordered', body=' for (uint64 i = 0; i < M; ++i)\n' ' for (uint64 j = 0; j < N; ++j) {\n' ' T acc = (T)0;\n' ' for (uint64 k = 0; k < K; ++k)\n' ' acc = (T)(acc + a[i * K + k] * b[k * N + j]);\n' ' o[i * N + j] = acc;\n' ' }\n' ' return false;'), Algorithm(name='_simt', body=' parallel for (uint64 idx = 0; idx < M * N; ++idx) {\n' ' uint64 i = idx / N;\n' ' uint64 j = idx % N;\n' '\n' ' T acc = (T)0;\n' ' for (uint64 k = 0; k < K; ++k) {\n' ' acc = (T)(acc + a[i * K + k] * b[k * N + j]);\n' ' }\n' ' o[idx] = acc;\n' ' }\n' ' return false;')], hints=Hints(pointwise=False, targets={'naive': 'none', 'reordered': 'host', '_simt': 'SIMT'}, operations={'naive': '2 * M * N * K', 'reordered': '2 * M * N * K', '_simt': '2 * M * N * K'}, requirements={}, preferences=[])), values=[Value(kind='in', name='a', type_key='T', dtypes=('int16', 'int32', 'int64', 'int8', 'real32', 'real64', 'uint16', 'uint32', 'uint64', 'uint8'), shape=('M', 'K'), count=1), Value(kind='in', name='b', type_key='T', dtypes=('int16', 'int32', 'int64', 'int8', 'real32', 'real64', 'uint16', 'uint32', 'uint64', 'uint8'), shape=('K', 'N'), count=1), Value(kind='out', name='o', type_key='T', dtypes=('int16', 'int32', 'int64', 'int8', 'real32', 'real64', 'uint16', 'uint32', 'uint64', 'uint8'), shape=('M', 'N'), count=1)], targets={'naive': (), 'reordered': ('generic', 'cpu'), '_simt': ('cuda',)}) ================================================================================ RESOLVED VALUES ================================================================================ name : a kind : in type_key : T dtypes : ('int16', 'int32', 'int64', 'int8', 'real32', 'real64', 'uint16', 'uint32', 'uint64', 'uint8') shape : ('M', 'K') count : 1 name : b kind : in type_key : T dtypes : ('int16', 'int32', 'int64', 'int8', 'real32', 'real64', 'uint16', 'uint32', 'uint64', 'uint8') shape : ('K', 'N') count : 1 name : o kind : out type_key : T dtypes : ('int16', 'int32', 'int64', 'int8', 'real32', 'real64', 'uint16', 'uint32', 'uint64', 'uint8') shape : ('M', 'N') count : 1 ================================================================================ RESOLVED TARGET SETS ================================================================================ naive: () reordered: ('generic', 'cpu') _simt: ('cuda',) ================================================================================ STEP 5 — DTYPE SPECIALIZATION ASSIGNMENTS ================================================================================ specialization count: 10 SPECIALIZATION 0 T -> int16 SPECIALIZATION 1 T -> int32 SPECIALIZATION 2 T -> int64 SPECIALIZATION 3 T -> int8 SPECIALIZATION 4 T -> real32 SPECIALIZATION 5 T -> real64 SPECIALIZATION 6 T -> uint16 SPECIALIZATION 7 T -> uint32 SPECIALIZATION 8 T -> uint64 SPECIALIZATION 9 T -> uint8 ================================================================================ STEP 6 — LOWERED BINDINGS FOR EACH DTYPE SPECIALIZATION ================================================================================ ================================================================================ SPECIALIZATION 0 ================================================================================ assignment: {'T': 'int16'} GENERATED C BINDINGS typedef int16 T; const int16 *restrict a = (const int16 *)inputs[0]; const real64 a_min = (real64)(DTYPE_INT16_MIN); const real64 a_max = (real64)(DTYPE_INT16_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const int16 *restrict b = (const int16 *)inputs[1]; const real64 b_min = (real64)(DTYPE_INT16_MIN); const real64 b_max = (real64)(DTYPE_INT16_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; int16 *restrict o = (int16 *)outputs[0]; const real64 o_min = (real64)(DTYPE_INT16_MIN); const real64 o_max = (real64)(DTYPE_INT16_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; DIMENSION ARRAY VALUES dimensions[0] = ((const extent *)input_tensors[0]->shape)[0] dimensions[1] = ((const extent *)input_tensors[0]->shape)[1] dimensions[2] = ((const extent *)input_tensors[1]->shape)[1] ================================================================================ SPECIALIZATION 1 ================================================================================ assignment: {'T': 'int32'} GENERATED C BINDINGS typedef int32 T; const int32 *restrict a = (const int32 *)inputs[0]; const real64 a_min = (real64)(DTYPE_INT32_MIN); const real64 a_max = (real64)(DTYPE_INT32_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const int32 *restrict b = (const int32 *)inputs[1]; const real64 b_min = (real64)(DTYPE_INT32_MIN); const real64 b_max = (real64)(DTYPE_INT32_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; int32 *restrict o = (int32 *)outputs[0]; const real64 o_min = (real64)(DTYPE_INT32_MIN); const real64 o_max = (real64)(DTYPE_INT32_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; DIMENSION ARRAY VALUES dimensions[0] = ((const extent *)input_tensors[0]->shape)[0] dimensions[1] = ((const extent *)input_tensors[0]->shape)[1] dimensions[2] = ((const extent *)input_tensors[1]->shape)[1] ================================================================================ SPECIALIZATION 2 ================================================================================ assignment: {'T': 'int64'} GENERATED C BINDINGS typedef int64 T; const int64 *restrict a = (const int64 *)inputs[0]; const real64 a_min = (real64)(DTYPE_INT64_MIN); const real64 a_max = (real64)(DTYPE_INT64_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const int64 *restrict b = (const int64 *)inputs[1]; const real64 b_min = (real64)(DTYPE_INT64_MIN); const real64 b_max = (real64)(DTYPE_INT64_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; int64 *restrict o = (int64 *)outputs[0]; const real64 o_min = (real64)(DTYPE_INT64_MIN); const real64 o_max = (real64)(DTYPE_INT64_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; DIMENSION ARRAY VALUES dimensions[0] = ((const extent *)input_tensors[0]->shape)[0] dimensions[1] = ((const extent *)input_tensors[0]->shape)[1] dimensions[2] = ((const extent *)input_tensors[1]->shape)[1] ================================================================================ SPECIALIZATION 3 ================================================================================ assignment: {'T': 'int8'} GENERATED C BINDINGS typedef int8 T; const int8 *restrict a = (const int8 *)inputs[0]; const real64 a_min = (real64)(DTYPE_INT8_MIN); const real64 a_max = (real64)(DTYPE_INT8_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const int8 *restrict b = (const int8 *)inputs[1]; const real64 b_min = (real64)(DTYPE_INT8_MIN); const real64 b_max = (real64)(DTYPE_INT8_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; int8 *restrict o = (int8 *)outputs[0]; const real64 o_min = (real64)(DTYPE_INT8_MIN); const real64 o_max = (real64)(DTYPE_INT8_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; DIMENSION ARRAY VALUES dimensions[0] = ((const extent *)input_tensors[0]->shape)[0] dimensions[1] = ((const extent *)input_tensors[0]->shape)[1] dimensions[2] = ((const extent *)input_tensors[1]->shape)[1] ================================================================================ SPECIALIZATION 4 ================================================================================ assignment: {'T': 'real32'} GENERATED C BINDINGS typedef real32 T; const real32 *restrict a = (const real32 *)inputs[0]; const real64 a_min = (real64)(DTYPE_REAL32_MIN); const real64 a_max = (real64)(DTYPE_REAL32_MAX); const real64 a_range = a_max - a_min; const boolean a_float = true; const real32 *restrict b = (const real32 *)inputs[1]; const real64 b_min = (real64)(DTYPE_REAL32_MIN); const real64 b_max = (real64)(DTYPE_REAL32_MAX); const real64 b_range = b_max - b_min; const boolean b_float = true; real32 *restrict o = (real32 *)outputs[0]; const real64 o_min = (real64)(DTYPE_REAL32_MIN); const real64 o_max = (real64)(DTYPE_REAL32_MAX); const real64 o_range = o_max - o_min; const boolean o_float = true; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; DIMENSION ARRAY VALUES dimensions[0] = ((const extent *)input_tensors[0]->shape)[0] dimensions[1] = ((const extent *)input_tensors[0]->shape)[1] dimensions[2] = ((const extent *)input_tensors[1]->shape)[1] ================================================================================ SPECIALIZATION 5 ================================================================================ assignment: {'T': 'real64'} GENERATED C BINDINGS typedef real64 T; const real64 *restrict a = (const real64 *)inputs[0]; const real64 a_min = (real64)(DTYPE_REAL64_MIN); const real64 a_max = (real64)(DTYPE_REAL64_MAX); const real64 a_range = a_max - a_min; const boolean a_float = true; const real64 *restrict b = (const real64 *)inputs[1]; const real64 b_min = (real64)(DTYPE_REAL64_MIN); const real64 b_max = (real64)(DTYPE_REAL64_MAX); const real64 b_range = b_max - b_min; const boolean b_float = true; real64 *restrict o = (real64 *)outputs[0]; const real64 o_min = (real64)(DTYPE_REAL64_MIN); const real64 o_max = (real64)(DTYPE_REAL64_MAX); const real64 o_range = o_max - o_min; const boolean o_float = true; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; DIMENSION ARRAY VALUES dimensions[0] = ((const extent *)input_tensors[0]->shape)[0] dimensions[1] = ((const extent *)input_tensors[0]->shape)[1] dimensions[2] = ((const extent *)input_tensors[1]->shape)[1] ================================================================================ SPECIALIZATION 6 ================================================================================ assignment: {'T': 'uint16'} GENERATED C BINDINGS typedef uint16 T; const uint16 *restrict a = (const uint16 *)inputs[0]; const real64 a_min = (real64)(0); const real64 a_max = (real64)(DTYPE_UINT16_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const uint16 *restrict b = (const uint16 *)inputs[1]; const real64 b_min = (real64)(0); const real64 b_max = (real64)(DTYPE_UINT16_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; uint16 *restrict o = (uint16 *)outputs[0]; const real64 o_min = (real64)(0); const real64 o_max = (real64)(DTYPE_UINT16_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; DIMENSION ARRAY VALUES dimensions[0] = ((const extent *)input_tensors[0]->shape)[0] dimensions[1] = ((const extent *)input_tensors[0]->shape)[1] dimensions[2] = ((const extent *)input_tensors[1]->shape)[1] ================================================================================ SPECIALIZATION 7 ================================================================================ assignment: {'T': 'uint32'} GENERATED C BINDINGS typedef uint32 T; const uint32 *restrict a = (const uint32 *)inputs[0]; const real64 a_min = (real64)(0); const real64 a_max = (real64)(DTYPE_UINT32_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const uint32 *restrict b = (const uint32 *)inputs[1]; const real64 b_min = (real64)(0); const real64 b_max = (real64)(DTYPE_UINT32_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; uint32 *restrict o = (uint32 *)outputs[0]; const real64 o_min = (real64)(0); const real64 o_max = (real64)(DTYPE_UINT32_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; DIMENSION ARRAY VALUES dimensions[0] = ((const extent *)input_tensors[0]->shape)[0] dimensions[1] = ((const extent *)input_tensors[0]->shape)[1] dimensions[2] = ((const extent *)input_tensors[1]->shape)[1] ================================================================================ SPECIALIZATION 8 ================================================================================ assignment: {'T': 'uint64'} GENERATED C BINDINGS typedef uint64 T; const uint64 *restrict a = (const uint64 *)inputs[0]; const real64 a_min = (real64)(0); const real64 a_max = (real64)(DTYPE_UINT64_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const uint64 *restrict b = (const uint64 *)inputs[1]; const real64 b_min = (real64)(0); const real64 b_max = (real64)(DTYPE_UINT64_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; uint64 *restrict o = (uint64 *)outputs[0]; const real64 o_min = (real64)(0); const real64 o_max = (real64)(DTYPE_UINT64_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; DIMENSION ARRAY VALUES dimensions[0] = ((const extent *)input_tensors[0]->shape)[0] dimensions[1] = ((const extent *)input_tensors[0]->shape)[1] dimensions[2] = ((const extent *)input_tensors[1]->shape)[1] ================================================================================ SPECIALIZATION 9 ================================================================================ assignment: {'T': 'uint8'} GENERATED C BINDINGS typedef uint8 T; const uint8 *restrict a = (const uint8 *)inputs[0]; const real64 a_min = (real64)(0); const real64 a_max = (real64)(DTYPE_UINT8_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const uint8 *restrict b = (const uint8 *)inputs[1]; const real64 b_min = (real64)(0); const real64 b_max = (real64)(DTYPE_UINT8_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; uint8 *restrict o = (uint8 *)outputs[0]; const real64 o_min = (real64)(0); const real64 o_max = (real64)(DTYPE_UINT8_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; DIMENSION ARRAY VALUES dimensions[0] = ((const extent *)input_tensors[0]->shape)[0] dimensions[1] = ((const extent *)input_tensors[0]->shape)[1] dimensions[2] = ((const extent *)input_tensors[1]->shape)[1] ================================================================================ STEP 7 — ALGORITHM BODIES AS SEEN BY THE LOWERER ================================================================================ ================================================================================ ALGORITHM 0: naive ================================================================================ original body: for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { o[i * N + j] = (T)0; for (uint64 k = 0; k < K; ++k) o[i * N + j] = (T)(o[i * N + j] + a[i * K + k] * b[k * N + j]); } return false; body after DSL execution-marker lowering: for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { o[i * N + j] = (T)0; for (uint64 k = 0; k < K; ++k) o[i * N + j] = (T)(o[i * N + j] + a[i * K + k] * b[k * N + j]); } return false; ================================================================================ ALGORITHM 1: reordered ================================================================================ original body: for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { T acc = (T)0; for (uint64 k = 0; k < K; ++k) acc = (T)(acc + a[i * K + k] * b[k * N + j]); o[i * N + j] = acc; } return false; body after DSL execution-marker lowering: for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { T acc = (T)0; for (uint64 k = 0; k < K; ++k) acc = (T)(acc + a[i * K + k] * b[k * N + j]); o[i * N + j] = acc; } return false; ================================================================================ ALGORITHM 2: _simt ================================================================================ original body: parallel for (uint64 idx = 0; idx < M * N; ++idx) { uint64 i = idx / N; uint64 j = idx % N; T acc = (T)0; for (uint64 k = 0; k < K; ++k) { acc = (T)(acc + a[i * K + k] * b[k * N + j]); } o[idx] = acc; } return false; body after DSL execution-marker lowering: for (uint64 idx = 0; idx < M * N; ++idx) { uint64 i = idx / N; uint64 j = idx % N; T acc = (T)0; for (uint64 k = 0; k < K; ++k) { acc = (T)(acc + a[i * K + k] * b[k * N + j]); } o[idx] = acc; } return false; ================================================================================ STEP 8 — GENERATED SPECIALIZATION SYMBOLS ================================================================================ SPECIALIZATION 0 assignment : {'T': 'int16'} output dtype : int16 input dtype : int16 symbol : tensor_op_00040001_1_1 SPECIALIZATION 1 assignment : {'T': 'int32'} output dtype : int32 input dtype : int32 symbol : tensor_op_00040001_2_2 SPECIALIZATION 2 assignment : {'T': 'int64'} output dtype : int64 input dtype : int64 symbol : tensor_op_00040001_3_3 SPECIALIZATION 3 assignment : {'T': 'int8'} output dtype : int8 input dtype : int8 symbol : tensor_op_00040001_0_0 SPECIALIZATION 4 assignment : {'T': 'real32'} output dtype : real32 input dtype : real32 symbol : tensor_op_00040001_8_8 SPECIALIZATION 5 assignment : {'T': 'real64'} output dtype : real64 input dtype : real64 symbol : tensor_op_00040001_9_9 SPECIALIZATION 6 assignment : {'T': 'uint16'} output dtype : uint16 input dtype : uint16 symbol : tensor_op_00040001_5_5 SPECIALIZATION 7 assignment : {'T': 'uint32'} output dtype : uint32 input dtype : uint32 symbol : tensor_op_00040001_6_6 SPECIALIZATION 8 assignment : {'T': 'uint64'} output dtype : uint64 input dtype : uint64 symbol : tensor_op_00040001_7_7 SPECIALIZATION 9 assignment : {'T': 'uint8'} output dtype : uint8 input dtype : uint8 symbol : tensor_op_00040001_4_4 ================================================================================ STEP 9 — GENERATED C TRANSLATION UNIT ================================================================================ #include "tensor_core.h" #include "dtype.h" #include "device.h" static boolean tensor_op_00040001_1_1_naive( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef int16 T; const int16 *restrict a = (const int16 *)inputs[0]; const real64 a_min = (real64)(DTYPE_INT16_MIN); const real64 a_max = (real64)(DTYPE_INT16_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const int16 *restrict b = (const int16 *)inputs[1]; const real64 b_min = (real64)(DTYPE_INT16_MIN); const real64 b_max = (real64)(DTYPE_INT16_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; int16 *restrict o = (int16 *)outputs[0]; const real64 o_min = (real64)(DTYPE_INT16_MIN); const real64 o_max = (real64)(DTYPE_INT16_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { o[i * N + j] = (T)0; for (uint64 k = 0; k < K; ++k) o[i * N + j] = (T)(o[i * N + j] + a[i * K + k] * b[k * N + j]); } return false; } static boolean tensor_op_00040001_1_1_reordered( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef int16 T; const int16 *restrict a = (const int16 *)inputs[0]; const real64 a_min = (real64)(DTYPE_INT16_MIN); const real64 a_max = (real64)(DTYPE_INT16_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const int16 *restrict b = (const int16 *)inputs[1]; const real64 b_min = (real64)(DTYPE_INT16_MIN); const real64 b_max = (real64)(DTYPE_INT16_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; int16 *restrict o = (int16 *)outputs[0]; const real64 o_min = (real64)(DTYPE_INT16_MIN); const real64 o_max = (real64)(DTYPE_INT16_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { T acc = (T)0; for (uint64 k = 0; k < K; ++k) acc = (T)(acc + a[i * K + k] * b[k * N + j]); o[i * N + j] = acc; } return false; } static boolean tensor_op_00040001_1_1__simt( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef int16 T; const int16 *restrict a = (const int16 *)inputs[0]; const real64 a_min = (real64)(DTYPE_INT16_MIN); const real64 a_max = (real64)(DTYPE_INT16_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const int16 *restrict b = (const int16 *)inputs[1]; const real64 b_min = (real64)(DTYPE_INT16_MIN); const real64 b_max = (real64)(DTYPE_INT16_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; int16 *restrict o = (int16 *)outputs[0]; const real64 o_min = (real64)(DTYPE_INT16_MIN); const real64 o_max = (real64)(DTYPE_INT16_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 idx = 0; idx < M * N; ++idx) { uint64 i = idx / N; uint64 j = idx % N; T acc = (T)0; for (uint64 k = 0; k < K; ++k) { acc = (T)(acc + a[i * K + k] * b[k * N + j]); } o[idx] = acc; } return false; } boolean tensor_op_00040001_1_1( tensor *output, const tensor *const *input_tensors, extent input_count, const void *parameters, extent parameter_bytes) { if (input_count != 2 || parameter_bytes != 0 || (0 && !parameters)) return true; void *outputs[] = { output->data->ptr }; const void *inputs[] = { input_tensors[0]->data->ptr, input_tensors[1]->data->ptr }; extent dimensions[] = { ((const extent *)input_tensors[0]->shape)[0], ((const extent *)input_tensors[0]->shape)[1], ((const extent *)input_tensors[1]->shape)[1] }; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent point_count = output->size; if (true) return tensor_op_00040001_1_1_naive(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_1_1_reordered(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_1_1__simt(output, input_tensors, outputs, inputs, parameters, dimensions, 0); return true; } static boolean tensor_op_00040001_2_2_naive( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef int32 T; const int32 *restrict a = (const int32 *)inputs[0]; const real64 a_min = (real64)(DTYPE_INT32_MIN); const real64 a_max = (real64)(DTYPE_INT32_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const int32 *restrict b = (const int32 *)inputs[1]; const real64 b_min = (real64)(DTYPE_INT32_MIN); const real64 b_max = (real64)(DTYPE_INT32_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; int32 *restrict o = (int32 *)outputs[0]; const real64 o_min = (real64)(DTYPE_INT32_MIN); const real64 o_max = (real64)(DTYPE_INT32_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { o[i * N + j] = (T)0; for (uint64 k = 0; k < K; ++k) o[i * N + j] = (T)(o[i * N + j] + a[i * K + k] * b[k * N + j]); } return false; } static boolean tensor_op_00040001_2_2_reordered( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef int32 T; const int32 *restrict a = (const int32 *)inputs[0]; const real64 a_min = (real64)(DTYPE_INT32_MIN); const real64 a_max = (real64)(DTYPE_INT32_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const int32 *restrict b = (const int32 *)inputs[1]; const real64 b_min = (real64)(DTYPE_INT32_MIN); const real64 b_max = (real64)(DTYPE_INT32_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; int32 *restrict o = (int32 *)outputs[0]; const real64 o_min = (real64)(DTYPE_INT32_MIN); const real64 o_max = (real64)(DTYPE_INT32_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { T acc = (T)0; for (uint64 k = 0; k < K; ++k) acc = (T)(acc + a[i * K + k] * b[k * N + j]); o[i * N + j] = acc; } return false; } static boolean tensor_op_00040001_2_2__simt( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef int32 T; const int32 *restrict a = (const int32 *)inputs[0]; const real64 a_min = (real64)(DTYPE_INT32_MIN); const real64 a_max = (real64)(DTYPE_INT32_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const int32 *restrict b = (const int32 *)inputs[1]; const real64 b_min = (real64)(DTYPE_INT32_MIN); const real64 b_max = (real64)(DTYPE_INT32_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; int32 *restrict o = (int32 *)outputs[0]; const real64 o_min = (real64)(DTYPE_INT32_MIN); const real64 o_max = (real64)(DTYPE_INT32_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 idx = 0; idx < M * N; ++idx) { uint64 i = idx / N; uint64 j = idx % N; T acc = (T)0; for (uint64 k = 0; k < K; ++k) { acc = (T)(acc + a[i * K + k] * b[k * N + j]); } o[idx] = acc; } return false; } boolean tensor_op_00040001_2_2( tensor *output, const tensor *const *input_tensors, extent input_count, const void *parameters, extent parameter_bytes) { if (input_count != 2 || parameter_bytes != 0 || (0 && !parameters)) return true; void *outputs[] = { output->data->ptr }; const void *inputs[] = { input_tensors[0]->data->ptr, input_tensors[1]->data->ptr }; extent dimensions[] = { ((const extent *)input_tensors[0]->shape)[0], ((const extent *)input_tensors[0]->shape)[1], ((const extent *)input_tensors[1]->shape)[1] }; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent point_count = output->size; if (true) return tensor_op_00040001_2_2_naive(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_2_2_reordered(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_2_2__simt(output, input_tensors, outputs, inputs, parameters, dimensions, 0); return true; } static boolean tensor_op_00040001_3_3_naive( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef int64 T; const int64 *restrict a = (const int64 *)inputs[0]; const real64 a_min = (real64)(DTYPE_INT64_MIN); const real64 a_max = (real64)(DTYPE_INT64_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const int64 *restrict b = (const int64 *)inputs[1]; const real64 b_min = (real64)(DTYPE_INT64_MIN); const real64 b_max = (real64)(DTYPE_INT64_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; int64 *restrict o = (int64 *)outputs[0]; const real64 o_min = (real64)(DTYPE_INT64_MIN); const real64 o_max = (real64)(DTYPE_INT64_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { o[i * N + j] = (T)0; for (uint64 k = 0; k < K; ++k) o[i * N + j] = (T)(o[i * N + j] + a[i * K + k] * b[k * N + j]); } return false; } static boolean tensor_op_00040001_3_3_reordered( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef int64 T; const int64 *restrict a = (const int64 *)inputs[0]; const real64 a_min = (real64)(DTYPE_INT64_MIN); const real64 a_max = (real64)(DTYPE_INT64_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const int64 *restrict b = (const int64 *)inputs[1]; const real64 b_min = (real64)(DTYPE_INT64_MIN); const real64 b_max = (real64)(DTYPE_INT64_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; int64 *restrict o = (int64 *)outputs[0]; const real64 o_min = (real64)(DTYPE_INT64_MIN); const real64 o_max = (real64)(DTYPE_INT64_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { T acc = (T)0; for (uint64 k = 0; k < K; ++k) acc = (T)(acc + a[i * K + k] * b[k * N + j]); o[i * N + j] = acc; } return false; } static boolean tensor_op_00040001_3_3__simt( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef int64 T; const int64 *restrict a = (const int64 *)inputs[0]; const real64 a_min = (real64)(DTYPE_INT64_MIN); const real64 a_max = (real64)(DTYPE_INT64_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const int64 *restrict b = (const int64 *)inputs[1]; const real64 b_min = (real64)(DTYPE_INT64_MIN); const real64 b_max = (real64)(DTYPE_INT64_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; int64 *restrict o = (int64 *)outputs[0]; const real64 o_min = (real64)(DTYPE_INT64_MIN); const real64 o_max = (real64)(DTYPE_INT64_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 idx = 0; idx < M * N; ++idx) { uint64 i = idx / N; uint64 j = idx % N; T acc = (T)0; for (uint64 k = 0; k < K; ++k) { acc = (T)(acc + a[i * K + k] * b[k * N + j]); } o[idx] = acc; } return false; } boolean tensor_op_00040001_3_3( tensor *output, const tensor *const *input_tensors, extent input_count, const void *parameters, extent parameter_bytes) { if (input_count != 2 || parameter_bytes != 0 || (0 && !parameters)) return true; void *outputs[] = { output->data->ptr }; const void *inputs[] = { input_tensors[0]->data->ptr, input_tensors[1]->data->ptr }; extent dimensions[] = { ((const extent *)input_tensors[0]->shape)[0], ((const extent *)input_tensors[0]->shape)[1], ((const extent *)input_tensors[1]->shape)[1] }; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent point_count = output->size; if (true) return tensor_op_00040001_3_3_naive(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_3_3_reordered(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_3_3__simt(output, input_tensors, outputs, inputs, parameters, dimensions, 0); return true; } static boolean tensor_op_00040001_0_0_naive( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef int8 T; const int8 *restrict a = (const int8 *)inputs[0]; const real64 a_min = (real64)(DTYPE_INT8_MIN); const real64 a_max = (real64)(DTYPE_INT8_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const int8 *restrict b = (const int8 *)inputs[1]; const real64 b_min = (real64)(DTYPE_INT8_MIN); const real64 b_max = (real64)(DTYPE_INT8_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; int8 *restrict o = (int8 *)outputs[0]; const real64 o_min = (real64)(DTYPE_INT8_MIN); const real64 o_max = (real64)(DTYPE_INT8_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { o[i * N + j] = (T)0; for (uint64 k = 0; k < K; ++k) o[i * N + j] = (T)(o[i * N + j] + a[i * K + k] * b[k * N + j]); } return false; } static boolean tensor_op_00040001_0_0_reordered( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef int8 T; const int8 *restrict a = (const int8 *)inputs[0]; const real64 a_min = (real64)(DTYPE_INT8_MIN); const real64 a_max = (real64)(DTYPE_INT8_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const int8 *restrict b = (const int8 *)inputs[1]; const real64 b_min = (real64)(DTYPE_INT8_MIN); const real64 b_max = (real64)(DTYPE_INT8_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; int8 *restrict o = (int8 *)outputs[0]; const real64 o_min = (real64)(DTYPE_INT8_MIN); const real64 o_max = (real64)(DTYPE_INT8_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { T acc = (T)0; for (uint64 k = 0; k < K; ++k) acc = (T)(acc + a[i * K + k] * b[k * N + j]); o[i * N + j] = acc; } return false; } static boolean tensor_op_00040001_0_0__simt( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef int8 T; const int8 *restrict a = (const int8 *)inputs[0]; const real64 a_min = (real64)(DTYPE_INT8_MIN); const real64 a_max = (real64)(DTYPE_INT8_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const int8 *restrict b = (const int8 *)inputs[1]; const real64 b_min = (real64)(DTYPE_INT8_MIN); const real64 b_max = (real64)(DTYPE_INT8_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; int8 *restrict o = (int8 *)outputs[0]; const real64 o_min = (real64)(DTYPE_INT8_MIN); const real64 o_max = (real64)(DTYPE_INT8_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 idx = 0; idx < M * N; ++idx) { uint64 i = idx / N; uint64 j = idx % N; T acc = (T)0; for (uint64 k = 0; k < K; ++k) { acc = (T)(acc + a[i * K + k] * b[k * N + j]); } o[idx] = acc; } return false; } boolean tensor_op_00040001_0_0( tensor *output, const tensor *const *input_tensors, extent input_count, const void *parameters, extent parameter_bytes) { if (input_count != 2 || parameter_bytes != 0 || (0 && !parameters)) return true; void *outputs[] = { output->data->ptr }; const void *inputs[] = { input_tensors[0]->data->ptr, input_tensors[1]->data->ptr }; extent dimensions[] = { ((const extent *)input_tensors[0]->shape)[0], ((const extent *)input_tensors[0]->shape)[1], ((const extent *)input_tensors[1]->shape)[1] }; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent point_count = output->size; if (true) return tensor_op_00040001_0_0_naive(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_0_0_reordered(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_0_0__simt(output, input_tensors, outputs, inputs, parameters, dimensions, 0); return true; } static boolean tensor_op_00040001_8_8_naive( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef real32 T; const real32 *restrict a = (const real32 *)inputs[0]; const real64 a_min = (real64)(DTYPE_REAL32_MIN); const real64 a_max = (real64)(DTYPE_REAL32_MAX); const real64 a_range = a_max - a_min; const boolean a_float = true; const real32 *restrict b = (const real32 *)inputs[1]; const real64 b_min = (real64)(DTYPE_REAL32_MIN); const real64 b_max = (real64)(DTYPE_REAL32_MAX); const real64 b_range = b_max - b_min; const boolean b_float = true; real32 *restrict o = (real32 *)outputs[0]; const real64 o_min = (real64)(DTYPE_REAL32_MIN); const real64 o_max = (real64)(DTYPE_REAL32_MAX); const real64 o_range = o_max - o_min; const boolean o_float = true; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { o[i * N + j] = (T)0; for (uint64 k = 0; k < K; ++k) o[i * N + j] = (T)(o[i * N + j] + a[i * K + k] * b[k * N + j]); } return false; } static boolean tensor_op_00040001_8_8_reordered( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef real32 T; const real32 *restrict a = (const real32 *)inputs[0]; const real64 a_min = (real64)(DTYPE_REAL32_MIN); const real64 a_max = (real64)(DTYPE_REAL32_MAX); const real64 a_range = a_max - a_min; const boolean a_float = true; const real32 *restrict b = (const real32 *)inputs[1]; const real64 b_min = (real64)(DTYPE_REAL32_MIN); const real64 b_max = (real64)(DTYPE_REAL32_MAX); const real64 b_range = b_max - b_min; const boolean b_float = true; real32 *restrict o = (real32 *)outputs[0]; const real64 o_min = (real64)(DTYPE_REAL32_MIN); const real64 o_max = (real64)(DTYPE_REAL32_MAX); const real64 o_range = o_max - o_min; const boolean o_float = true; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { T acc = (T)0; for (uint64 k = 0; k < K; ++k) acc = (T)(acc + a[i * K + k] * b[k * N + j]); o[i * N + j] = acc; } return false; } static boolean tensor_op_00040001_8_8__simt( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef real32 T; const real32 *restrict a = (const real32 *)inputs[0]; const real64 a_min = (real64)(DTYPE_REAL32_MIN); const real64 a_max = (real64)(DTYPE_REAL32_MAX); const real64 a_range = a_max - a_min; const boolean a_float = true; const real32 *restrict b = (const real32 *)inputs[1]; const real64 b_min = (real64)(DTYPE_REAL32_MIN); const real64 b_max = (real64)(DTYPE_REAL32_MAX); const real64 b_range = b_max - b_min; const boolean b_float = true; real32 *restrict o = (real32 *)outputs[0]; const real64 o_min = (real64)(DTYPE_REAL32_MIN); const real64 o_max = (real64)(DTYPE_REAL32_MAX); const real64 o_range = o_max - o_min; const boolean o_float = true; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 idx = 0; idx < M * N; ++idx) { uint64 i = idx / N; uint64 j = idx % N; T acc = (T)0; for (uint64 k = 0; k < K; ++k) { acc = (T)(acc + a[i * K + k] * b[k * N + j]); } o[idx] = acc; } return false; } boolean tensor_op_00040001_8_8( tensor *output, const tensor *const *input_tensors, extent input_count, const void *parameters, extent parameter_bytes) { if (input_count != 2 || parameter_bytes != 0 || (0 && !parameters)) return true; void *outputs[] = { output->data->ptr }; const void *inputs[] = { input_tensors[0]->data->ptr, input_tensors[1]->data->ptr }; extent dimensions[] = { ((const extent *)input_tensors[0]->shape)[0], ((const extent *)input_tensors[0]->shape)[1], ((const extent *)input_tensors[1]->shape)[1] }; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent point_count = output->size; if (true) return tensor_op_00040001_8_8_naive(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_8_8_reordered(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_8_8__simt(output, input_tensors, outputs, inputs, parameters, dimensions, 0); return true; } static boolean tensor_op_00040001_9_9_naive( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef real64 T; const real64 *restrict a = (const real64 *)inputs[0]; const real64 a_min = (real64)(DTYPE_REAL64_MIN); const real64 a_max = (real64)(DTYPE_REAL64_MAX); const real64 a_range = a_max - a_min; const boolean a_float = true; const real64 *restrict b = (const real64 *)inputs[1]; const real64 b_min = (real64)(DTYPE_REAL64_MIN); const real64 b_max = (real64)(DTYPE_REAL64_MAX); const real64 b_range = b_max - b_min; const boolean b_float = true; real64 *restrict o = (real64 *)outputs[0]; const real64 o_min = (real64)(DTYPE_REAL64_MIN); const real64 o_max = (real64)(DTYPE_REAL64_MAX); const real64 o_range = o_max - o_min; const boolean o_float = true; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { o[i * N + j] = (T)0; for (uint64 k = 0; k < K; ++k) o[i * N + j] = (T)(o[i * N + j] + a[i * K + k] * b[k * N + j]); } return false; } static boolean tensor_op_00040001_9_9_reordered( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef real64 T; const real64 *restrict a = (const real64 *)inputs[0]; const real64 a_min = (real64)(DTYPE_REAL64_MIN); const real64 a_max = (real64)(DTYPE_REAL64_MAX); const real64 a_range = a_max - a_min; const boolean a_float = true; const real64 *restrict b = (const real64 *)inputs[1]; const real64 b_min = (real64)(DTYPE_REAL64_MIN); const real64 b_max = (real64)(DTYPE_REAL64_MAX); const real64 b_range = b_max - b_min; const boolean b_float = true; real64 *restrict o = (real64 *)outputs[0]; const real64 o_min = (real64)(DTYPE_REAL64_MIN); const real64 o_max = (real64)(DTYPE_REAL64_MAX); const real64 o_range = o_max - o_min; const boolean o_float = true; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { T acc = (T)0; for (uint64 k = 0; k < K; ++k) acc = (T)(acc + a[i * K + k] * b[k * N + j]); o[i * N + j] = acc; } return false; } static boolean tensor_op_00040001_9_9__simt( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef real64 T; const real64 *restrict a = (const real64 *)inputs[0]; const real64 a_min = (real64)(DTYPE_REAL64_MIN); const real64 a_max = (real64)(DTYPE_REAL64_MAX); const real64 a_range = a_max - a_min; const boolean a_float = true; const real64 *restrict b = (const real64 *)inputs[1]; const real64 b_min = (real64)(DTYPE_REAL64_MIN); const real64 b_max = (real64)(DTYPE_REAL64_MAX); const real64 b_range = b_max - b_min; const boolean b_float = true; real64 *restrict o = (real64 *)outputs[0]; const real64 o_min = (real64)(DTYPE_REAL64_MIN); const real64 o_max = (real64)(DTYPE_REAL64_MAX); const real64 o_range = o_max - o_min; const boolean o_float = true; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 idx = 0; idx < M * N; ++idx) { uint64 i = idx / N; uint64 j = idx % N; T acc = (T)0; for (uint64 k = 0; k < K; ++k) { acc = (T)(acc + a[i * K + k] * b[k * N + j]); } o[idx] = acc; } return false; } boolean tensor_op_00040001_9_9( tensor *output, const tensor *const *input_tensors, extent input_count, const void *parameters, extent parameter_bytes) { if (input_count != 2 || parameter_bytes != 0 || (0 && !parameters)) return true; void *outputs[] = { output->data->ptr }; const void *inputs[] = { input_tensors[0]->data->ptr, input_tensors[1]->data->ptr }; extent dimensions[] = { ((const extent *)input_tensors[0]->shape)[0], ((const extent *)input_tensors[0]->shape)[1], ((const extent *)input_tensors[1]->shape)[1] }; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent point_count = output->size; if (true) return tensor_op_00040001_9_9_naive(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_9_9_reordered(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_9_9__simt(output, input_tensors, outputs, inputs, parameters, dimensions, 0); return true; } static boolean tensor_op_00040001_5_5_naive( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef uint16 T; const uint16 *restrict a = (const uint16 *)inputs[0]; const real64 a_min = (real64)(0); const real64 a_max = (real64)(DTYPE_UINT16_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const uint16 *restrict b = (const uint16 *)inputs[1]; const real64 b_min = (real64)(0); const real64 b_max = (real64)(DTYPE_UINT16_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; uint16 *restrict o = (uint16 *)outputs[0]; const real64 o_min = (real64)(0); const real64 o_max = (real64)(DTYPE_UINT16_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { o[i * N + j] = (T)0; for (uint64 k = 0; k < K; ++k) o[i * N + j] = (T)(o[i * N + j] + a[i * K + k] * b[k * N + j]); } return false; } static boolean tensor_op_00040001_5_5_reordered( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef uint16 T; const uint16 *restrict a = (const uint16 *)inputs[0]; const real64 a_min = (real64)(0); const real64 a_max = (real64)(DTYPE_UINT16_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const uint16 *restrict b = (const uint16 *)inputs[1]; const real64 b_min = (real64)(0); const real64 b_max = (real64)(DTYPE_UINT16_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; uint16 *restrict o = (uint16 *)outputs[0]; const real64 o_min = (real64)(0); const real64 o_max = (real64)(DTYPE_UINT16_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { T acc = (T)0; for (uint64 k = 0; k < K; ++k) acc = (T)(acc + a[i * K + k] * b[k * N + j]); o[i * N + j] = acc; } return false; } static boolean tensor_op_00040001_5_5__simt( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef uint16 T; const uint16 *restrict a = (const uint16 *)inputs[0]; const real64 a_min = (real64)(0); const real64 a_max = (real64)(DTYPE_UINT16_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const uint16 *restrict b = (const uint16 *)inputs[1]; const real64 b_min = (real64)(0); const real64 b_max = (real64)(DTYPE_UINT16_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; uint16 *restrict o = (uint16 *)outputs[0]; const real64 o_min = (real64)(0); const real64 o_max = (real64)(DTYPE_UINT16_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 idx = 0; idx < M * N; ++idx) { uint64 i = idx / N; uint64 j = idx % N; T acc = (T)0; for (uint64 k = 0; k < K; ++k) { acc = (T)(acc + a[i * K + k] * b[k * N + j]); } o[idx] = acc; } return false; } boolean tensor_op_00040001_5_5( tensor *output, const tensor *const *input_tensors, extent input_count, const void *parameters, extent parameter_bytes) { if (input_count != 2 || parameter_bytes != 0 || (0 && !parameters)) return true; void *outputs[] = { output->data->ptr }; const void *inputs[] = { input_tensors[0]->data->ptr, input_tensors[1]->data->ptr }; extent dimensions[] = { ((const extent *)input_tensors[0]->shape)[0], ((const extent *)input_tensors[0]->shape)[1], ((const extent *)input_tensors[1]->shape)[1] }; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent point_count = output->size; if (true) return tensor_op_00040001_5_5_naive(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_5_5_reordered(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_5_5__simt(output, input_tensors, outputs, inputs, parameters, dimensions, 0); return true; } static boolean tensor_op_00040001_6_6_naive( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef uint32 T; const uint32 *restrict a = (const uint32 *)inputs[0]; const real64 a_min = (real64)(0); const real64 a_max = (real64)(DTYPE_UINT32_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const uint32 *restrict b = (const uint32 *)inputs[1]; const real64 b_min = (real64)(0); const real64 b_max = (real64)(DTYPE_UINT32_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; uint32 *restrict o = (uint32 *)outputs[0]; const real64 o_min = (real64)(0); const real64 o_max = (real64)(DTYPE_UINT32_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { o[i * N + j] = (T)0; for (uint64 k = 0; k < K; ++k) o[i * N + j] = (T)(o[i * N + j] + a[i * K + k] * b[k * N + j]); } return false; } static boolean tensor_op_00040001_6_6_reordered( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef uint32 T; const uint32 *restrict a = (const uint32 *)inputs[0]; const real64 a_min = (real64)(0); const real64 a_max = (real64)(DTYPE_UINT32_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const uint32 *restrict b = (const uint32 *)inputs[1]; const real64 b_min = (real64)(0); const real64 b_max = (real64)(DTYPE_UINT32_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; uint32 *restrict o = (uint32 *)outputs[0]; const real64 o_min = (real64)(0); const real64 o_max = (real64)(DTYPE_UINT32_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { T acc = (T)0; for (uint64 k = 0; k < K; ++k) acc = (T)(acc + a[i * K + k] * b[k * N + j]); o[i * N + j] = acc; } return false; } static boolean tensor_op_00040001_6_6__simt( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef uint32 T; const uint32 *restrict a = (const uint32 *)inputs[0]; const real64 a_min = (real64)(0); const real64 a_max = (real64)(DTYPE_UINT32_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const uint32 *restrict b = (const uint32 *)inputs[1]; const real64 b_min = (real64)(0); const real64 b_max = (real64)(DTYPE_UINT32_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; uint32 *restrict o = (uint32 *)outputs[0]; const real64 o_min = (real64)(0); const real64 o_max = (real64)(DTYPE_UINT32_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 idx = 0; idx < M * N; ++idx) { uint64 i = idx / N; uint64 j = idx % N; T acc = (T)0; for (uint64 k = 0; k < K; ++k) { acc = (T)(acc + a[i * K + k] * b[k * N + j]); } o[idx] = acc; } return false; } boolean tensor_op_00040001_6_6( tensor *output, const tensor *const *input_tensors, extent input_count, const void *parameters, extent parameter_bytes) { if (input_count != 2 || parameter_bytes != 0 || (0 && !parameters)) return true; void *outputs[] = { output->data->ptr }; const void *inputs[] = { input_tensors[0]->data->ptr, input_tensors[1]->data->ptr }; extent dimensions[] = { ((const extent *)input_tensors[0]->shape)[0], ((const extent *)input_tensors[0]->shape)[1], ((const extent *)input_tensors[1]->shape)[1] }; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent point_count = output->size; if (true) return tensor_op_00040001_6_6_naive(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_6_6_reordered(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_6_6__simt(output, input_tensors, outputs, inputs, parameters, dimensions, 0); return true; } static boolean tensor_op_00040001_7_7_naive( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef uint64 T; const uint64 *restrict a = (const uint64 *)inputs[0]; const real64 a_min = (real64)(0); const real64 a_max = (real64)(DTYPE_UINT64_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const uint64 *restrict b = (const uint64 *)inputs[1]; const real64 b_min = (real64)(0); const real64 b_max = (real64)(DTYPE_UINT64_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; uint64 *restrict o = (uint64 *)outputs[0]; const real64 o_min = (real64)(0); const real64 o_max = (real64)(DTYPE_UINT64_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { o[i * N + j] = (T)0; for (uint64 k = 0; k < K; ++k) o[i * N + j] = (T)(o[i * N + j] + a[i * K + k] * b[k * N + j]); } return false; } static boolean tensor_op_00040001_7_7_reordered( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef uint64 T; const uint64 *restrict a = (const uint64 *)inputs[0]; const real64 a_min = (real64)(0); const real64 a_max = (real64)(DTYPE_UINT64_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const uint64 *restrict b = (const uint64 *)inputs[1]; const real64 b_min = (real64)(0); const real64 b_max = (real64)(DTYPE_UINT64_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; uint64 *restrict o = (uint64 *)outputs[0]; const real64 o_min = (real64)(0); const real64 o_max = (real64)(DTYPE_UINT64_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { T acc = (T)0; for (uint64 k = 0; k < K; ++k) acc = (T)(acc + a[i * K + k] * b[k * N + j]); o[i * N + j] = acc; } return false; } static boolean tensor_op_00040001_7_7__simt( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef uint64 T; const uint64 *restrict a = (const uint64 *)inputs[0]; const real64 a_min = (real64)(0); const real64 a_max = (real64)(DTYPE_UINT64_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const uint64 *restrict b = (const uint64 *)inputs[1]; const real64 b_min = (real64)(0); const real64 b_max = (real64)(DTYPE_UINT64_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; uint64 *restrict o = (uint64 *)outputs[0]; const real64 o_min = (real64)(0); const real64 o_max = (real64)(DTYPE_UINT64_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 idx = 0; idx < M * N; ++idx) { uint64 i = idx / N; uint64 j = idx % N; T acc = (T)0; for (uint64 k = 0; k < K; ++k) { acc = (T)(acc + a[i * K + k] * b[k * N + j]); } o[idx] = acc; } return false; } boolean tensor_op_00040001_7_7( tensor *output, const tensor *const *input_tensors, extent input_count, const void *parameters, extent parameter_bytes) { if (input_count != 2 || parameter_bytes != 0 || (0 && !parameters)) return true; void *outputs[] = { output->data->ptr }; const void *inputs[] = { input_tensors[0]->data->ptr, input_tensors[1]->data->ptr }; extent dimensions[] = { ((const extent *)input_tensors[0]->shape)[0], ((const extent *)input_tensors[0]->shape)[1], ((const extent *)input_tensors[1]->shape)[1] }; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent point_count = output->size; if (true) return tensor_op_00040001_7_7_naive(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_7_7_reordered(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_7_7__simt(output, input_tensors, outputs, inputs, parameters, dimensions, 0); return true; } static boolean tensor_op_00040001_4_4_naive( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef uint8 T; const uint8 *restrict a = (const uint8 *)inputs[0]; const real64 a_min = (real64)(0); const real64 a_max = (real64)(DTYPE_UINT8_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const uint8 *restrict b = (const uint8 *)inputs[1]; const real64 b_min = (real64)(0); const real64 b_max = (real64)(DTYPE_UINT8_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; uint8 *restrict o = (uint8 *)outputs[0]; const real64 o_min = (real64)(0); const real64 o_max = (real64)(DTYPE_UINT8_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { o[i * N + j] = (T)0; for (uint64 k = 0; k < K; ++k) o[i * N + j] = (T)(o[i * N + j] + a[i * K + k] * b[k * N + j]); } return false; } static boolean tensor_op_00040001_4_4_reordered( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef uint8 T; const uint8 *restrict a = (const uint8 *)inputs[0]; const real64 a_min = (real64)(0); const real64 a_max = (real64)(DTYPE_UINT8_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const uint8 *restrict b = (const uint8 *)inputs[1]; const real64 b_min = (real64)(0); const real64 b_max = (real64)(DTYPE_UINT8_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; uint8 *restrict o = (uint8 *)outputs[0]; const real64 o_min = (real64)(0); const real64 o_max = (real64)(DTYPE_UINT8_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 i = 0; i < M; ++i) for (uint64 j = 0; j < N; ++j) { T acc = (T)0; for (uint64 k = 0; k < K; ++k) acc = (T)(acc + a[i * K + k] * b[k * N + j]); o[i * N + j] = acc; } return false; } static boolean tensor_op_00040001_4_4__simt( tensor *output, const tensor *const *input_tensors, void *const *outputs, const void *const *inputs, const void *parameters, const extent *dimensions, extent point_index) { (void)dimensions; typedef uint8 T; const uint8 *restrict a = (const uint8 *)inputs[0]; const real64 a_min = (real64)(0); const real64 a_max = (real64)(DTYPE_UINT8_MAX); const real64 a_range = a_max - a_min; const boolean a_float = false; const uint8 *restrict b = (const uint8 *)inputs[1]; const real64 b_min = (real64)(0); const real64 b_max = (real64)(DTYPE_UINT8_MAX); const real64 b_range = b_max - b_min; const boolean b_float = false; uint8 *restrict o = (uint8 *)outputs[0]; const real64 o_min = (real64)(0); const real64 o_max = (real64)(DTYPE_UINT8_MAX); const real64 o_range = o_max - o_min; const boolean o_float = false; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent a_size = input_tensors[0]->size; extent a_rank = input_tensors[0]->rank; const extent *a_shape = (const extent *)input_tensors[0]->shape; extent b_size = input_tensors[1]->size; extent b_rank = input_tensors[1]->rank; const extent *b_shape = (const extent *)input_tensors[1]->shape; extent o_size = output->size; extent o_rank = output->rank; const extent *o_shape = (const extent *)output->shape; extent point_count = output->size; for (uint64 idx = 0; idx < M * N; ++idx) { uint64 i = idx / N; uint64 j = idx % N; T acc = (T)0; for (uint64 k = 0; k < K; ++k) { acc = (T)(acc + a[i * K + k] * b[k * N + j]); } o[idx] = acc; } return false; } boolean tensor_op_00040001_4_4( tensor *output, const tensor *const *input_tensors, extent input_count, const void *parameters, extent parameter_bytes) { if (input_count != 2 || parameter_bytes != 0 || (0 && !parameters)) return true; void *outputs[] = { output->data->ptr }; const void *inputs[] = { input_tensors[0]->data->ptr, input_tensors[1]->data->ptr }; extent dimensions[] = { ((const extent *)input_tensors[0]->shape)[0], ((const extent *)input_tensors[0]->shape)[1], ((const extent *)input_tensors[1]->shape)[1] }; extent M = ((const extent *)input_tensors[0]->shape)[0]; extent K = ((const extent *)input_tensors[0]->shape)[1]; extent N = ((const extent *)input_tensors[1]->shape)[1]; extent point_count = output->size; if (true) return tensor_op_00040001_4_4_naive(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_4_4_reordered(output, input_tensors, outputs, inputs, parameters, dimensions, 0); if (true) return tensor_op_00040001_4_4__simt(output, input_tensors, outputs, inputs, parameters, dimensions, 0); return true; } ================================================================================ STEP 10 — CLANG COMMAND ================================================================================ clang-18 \ -std=c11 \ -O1 \ -emit-llvm \ -c \ -I "/mnt/fileserver/prj/dmctp/user/src/tensor/include" \ "/tmp/tensor-op-visible-DVoSp4/operations.c" \ -o "/tmp/tensor-op-visible-DVoSp4/operations.bc" running... clang completed successfully -rw-r--r-- 1 geeth geeth 7.9K Aug 8 17:40 /tmp/tensor-op-visible-DVoSp4/operations.bc ================================================================================ STEP 11 — LLVM BITCODE INFORMATION ================================================================================ /tmp/tensor-op-visible-DVoSp4/operations.bc: LLVM IR bitcode first 64 bytes: 00000000: 4243 c0de 3514 0000 0500 0000 620c 3024 BC..5.......b.0$ 00000010: 4a59 be66 cdfb b57f 0b51 804c 0100 0000 JY.f.....Q.L.... 00000020: 210c 0000 1b07 0000 0b02 2100 0200 0000 !.........!..... 00000030: 1700 0000 0781 2391 41c8 0449 0610 3239 ......#.A..I..29 ================================================================================ STEP 12 — TEXTUAL LLVM IR ================================================================================ ; ModuleID = '/tmp/tensor-op-visible-DVoSp4/operations.bc' source_filename = "/tmp/tensor-op-visible-DVoSp4/operations.c" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" target triple = "x86_64-pc-linux-gnu" %struct.tensor = type { ptr, ptr, ptr, i64, i32, i64, i8, i8 } ; Function Attrs: nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) uwtable define dso_local noundef zeroext i1 @tensor_op_00040001_1_1(ptr nocapture noundef readonly %0, ptr nocapture noundef readonly %1, i64 noundef %2, ptr nocapture noundef readnone %3, i64 noundef %4) local_unnamed_addr #0 { %6 = icmp ne i64 %2, 2 %7 = icmp ne i64 %4, 0 %8 = or i1 %6, %7 br i1 %8, label %61, label %9 9: ; preds = %5 %10 = load ptr, ptr %0, align 8, !tbaa !5 %11 = load ptr, ptr %10, align 8, !tbaa !13 %12 = load ptr, ptr %1, align 8, !tbaa !15 %13 = load ptr, ptr %12, align 8, !tbaa !5 %14 = load ptr, ptr %13, align 8, !tbaa !13 %15 = getelementptr inbounds ptr, ptr %1, i64 1 %16 = load ptr, ptr %15, align 8, !tbaa !15 %17 = load ptr, ptr %16, align 8, !tbaa !5 %18 = load ptr, ptr %17, align 8, !tbaa !13 %19 = getelementptr inbounds %struct.tensor, ptr %12, i64 0, i32 1 %20 = load ptr, ptr %19, align 8, !tbaa !16 %21 = getelementptr inbounds i64, ptr %20, i64 1 %22 = getelementptr inbounds %struct.tensor, ptr %16, i64 0, i32 1 %23 = load ptr, ptr %22, align 8, !tbaa !16 %24 = getelementptr inbounds i64, ptr %23, i64 1 %25 = load i64, ptr %20, align 8, !tbaa !17 %26 = load i64, ptr %21, align 8, !tbaa !17 %27 = load i64, ptr %24, align 8, !tbaa !17 %28 = icmp eq i64 %25, 0 br i1 %28, label %61, label %29 29: ; preds = %9 %30 = icmp eq i64 %27, 0 %31 = icmp eq i64 %26, 0 br label %32 32: ; preds = %39, %29 %33 = phi i64 [ 0, %29 ], [ %40, %39 ] br i1 %30, label %39, label %34 34: ; preds = %32 %35 = mul i64 %33, %27 %36 = getelementptr i16, ptr %11, i64 %35 %37 = mul i64 %33, %26 %38 = getelementptr i16, ptr %14, i64 %37 br label %42 39: ; preds = %46, %32 %40 = add nuw i64 %33, 1 %41 = icmp eq i64 %40, %25 br i1 %41, label %61, label %32, !llvm.loop !18 42: ; preds = %46, %34 %43 = phi i64 [ 0, %34 ], [ %47, %46 ] %44 = getelementptr i16, ptr %36, i64 %43 store i16 0, ptr %44, align 2, !tbaa !21 %45 = getelementptr i16, ptr %18, i64 %43 br i1 %31, label %46, label %49 46: ; preds = %49, %42 %47 = add nuw i64 %43, 1 %48 = icmp eq i64 %47, %27 br i1 %48, label %39, label %42, !llvm.loop !23 49: ; preds = %42, %49 %50 = phi i16 [ %58, %49 ], [ 0, %42 ] %51 = phi i64 [ %59, %49 ], [ 0, %42 ] %52 = getelementptr i16, ptr %38, i64 %51 %53 = load i16, ptr %52, align 2, !tbaa !21 %54 = mul i64 %51, %27 %55 = getelementptr i16, ptr %45, i64 %54 %56 = load i16, ptr %55, align 2, !tbaa !21 %57 = mul i16 %56, %53 %58 = add i16 %57, %50 store i16 %58, ptr %44, align 2, !tbaa !21 %59 = add nuw i64 %51, 1 %60 = icmp eq i64 %59, %26 br i1 %60, label %46, label %49, !llvm.loop !24 61: ; preds = %39, %9, %5 ret i1 %8 } ; Function Attrs: nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) uwtable define dso_local noundef zeroext i1 @tensor_op_00040001_2_2(ptr nocapture noundef readonly %0, ptr nocapture noundef readonly %1, i64 noundef %2, ptr nocapture noundef readnone %3, i64 noundef %4) local_unnamed_addr #0 { %6 = icmp ne i64 %2, 2 %7 = icmp ne i64 %4, 0 %8 = or i1 %6, %7 br i1 %8, label %61, label %9 9: ; preds = %5 %10 = load ptr, ptr %0, align 8, !tbaa !5 %11 = load ptr, ptr %10, align 8, !tbaa !13 %12 = load ptr, ptr %1, align 8, !tbaa !15 %13 = load ptr, ptr %12, align 8, !tbaa !5 %14 = load ptr, ptr %13, align 8, !tbaa !13 %15 = getelementptr inbounds ptr, ptr %1, i64 1 %16 = load ptr, ptr %15, align 8, !tbaa !15 %17 = load ptr, ptr %16, align 8, !tbaa !5 %18 = load ptr, ptr %17, align 8, !tbaa !13 %19 = getelementptr inbounds %struct.tensor, ptr %12, i64 0, i32 1 %20 = load ptr, ptr %19, align 8, !tbaa !16 %21 = getelementptr inbounds i64, ptr %20, i64 1 %22 = getelementptr inbounds %struct.tensor, ptr %16, i64 0, i32 1 %23 = load ptr, ptr %22, align 8, !tbaa !16 %24 = getelementptr inbounds i64, ptr %23, i64 1 %25 = load i64, ptr %20, align 8, !tbaa !17 %26 = load i64, ptr %21, align 8, !tbaa !17 %27 = load i64, ptr %24, align 8, !tbaa !17 %28 = icmp eq i64 %25, 0 br i1 %28, label %61, label %29 29: ; preds = %9 %30 = icmp eq i64 %27, 0 %31 = icmp eq i64 %26, 0 br label %32 32: ; preds = %39, %29 %33 = phi i64 [ 0, %29 ], [ %40, %39 ] br i1 %30, label %39, label %34 34: ; preds = %32 %35 = mul i64 %33, %27 %36 = getelementptr i32, ptr %11, i64 %35 %37 = mul i64 %33, %26 %38 = getelementptr i32, ptr %14, i64 %37 br label %42 39: ; preds = %46, %32 %40 = add nuw i64 %33, 1 %41 = icmp eq i64 %40, %25 br i1 %41, label %61, label %32, !llvm.loop !25 42: ; preds = %46, %34 %43 = phi i64 [ 0, %34 ], [ %47, %46 ] %44 = getelementptr i32, ptr %36, i64 %43 store i32 0, ptr %44, align 4, !tbaa !26 %45 = getelementptr i32, ptr %18, i64 %43 br i1 %31, label %46, label %49 46: ; preds = %49, %42 %47 = add nuw i64 %43, 1 %48 = icmp eq i64 %47, %27 br i1 %48, label %39, label %42, !llvm.loop !27 49: ; preds = %42, %49 %50 = phi i32 [ %58, %49 ], [ 0, %42 ] %51 = phi i64 [ %59, %49 ], [ 0, %42 ] %52 = getelementptr i32, ptr %38, i64 %51 %53 = load i32, ptr %52, align 4, !tbaa !26 %54 = mul i64 %51, %27 %55 = getelementptr i32, ptr %45, i64 %54 %56 = load i32, ptr %55, align 4, !tbaa !26 %57 = mul nsw i32 %56, %53 %58 = add nsw i32 %57, %50 store i32 %58, ptr %44, align 4, !tbaa !26 %59 = add nuw i64 %51, 1 %60 = icmp eq i64 %59, %26 br i1 %60, label %46, label %49, !llvm.loop !28 61: ; preds = %39, %9, %5 ret i1 %8 } ; Function Attrs: nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) uwtable define dso_local noundef zeroext i1 @tensor_op_00040001_3_3(ptr nocapture noundef readonly %0, ptr nocapture noundef readonly %1, i64 noundef %2, ptr nocapture noundef readnone %3, i64 noundef %4) local_unnamed_addr #0 { %6 = icmp ne i64 %2, 2 %7 = icmp ne i64 %4, 0 %8 = or i1 %6, %7 br i1 %8, label %61, label %9 9: ; preds = %5 %10 = load ptr, ptr %0, align 8, !tbaa !5 %11 = load ptr, ptr %10, align 8, !tbaa !13 %12 = load ptr, ptr %1, align 8, !tbaa !15 %13 = load ptr, ptr %12, align 8, !tbaa !5 %14 = load ptr, ptr %13, align 8, !tbaa !13 %15 = getelementptr inbounds ptr, ptr %1, i64 1 %16 = load ptr, ptr %15, align 8, !tbaa !15 %17 = load ptr, ptr %16, align 8, !tbaa !5 %18 = load ptr, ptr %17, align 8, !tbaa !13 %19 = getelementptr inbounds %struct.tensor, ptr %12, i64 0, i32 1 %20 = load ptr, ptr %19, align 8, !tbaa !16 %21 = getelementptr inbounds i64, ptr %20, i64 1 %22 = getelementptr inbounds %struct.tensor, ptr %16, i64 0, i32 1 %23 = load ptr, ptr %22, align 8, !tbaa !16 %24 = getelementptr inbounds i64, ptr %23, i64 1 %25 = load i64, ptr %20, align 8, !tbaa !17 %26 = load i64, ptr %21, align 8, !tbaa !17 %27 = load i64, ptr %24, align 8, !tbaa !17 %28 = icmp eq i64 %25, 0 br i1 %28, label %61, label %29 29: ; preds = %9 %30 = icmp eq i64 %27, 0 %31 = icmp eq i64 %26, 0 br label %32 32: ; preds = %39, %29 %33 = phi i64 [ 0, %29 ], [ %40, %39 ] br i1 %30, label %39, label %34 34: ; preds = %32 %35 = mul i64 %33, %27 %36 = getelementptr i64, ptr %11, i64 %35 %37 = mul i64 %33, %26 %38 = getelementptr i64, ptr %14, i64 %37 br label %42 39: ; preds = %46, %32 %40 = add nuw i64 %33, 1 %41 = icmp eq i64 %40, %25 br i1 %41, label %61, label %32, !llvm.loop !29 42: ; preds = %46, %34 %43 = phi i64 [ 0, %34 ], [ %47, %46 ] %44 = getelementptr i64, ptr %36, i64 %43 store i64 0, ptr %44, align 8, !tbaa !17 %45 = getelementptr i64, ptr %18, i64 %43 br i1 %31, label %46, label %49 46: ; preds = %49, %42 %47 = add nuw i64 %43, 1 %48 = icmp eq i64 %47, %27 br i1 %48, label %39, label %42, !llvm.loop !30 49: ; preds = %42, %49 %50 = phi i64 [ %58, %49 ], [ 0, %42 ] %51 = phi i64 [ %59, %49 ], [ 0, %42 ] %52 = getelementptr i64, ptr %38, i64 %51 %53 = load i64, ptr %52, align 8, !tbaa !17 %54 = mul i64 %51, %27 %55 = getelementptr i64, ptr %45, i64 %54 %56 = load i64, ptr %55, align 8, !tbaa !17 %57 = mul nsw i64 %56, %53 %58 = add nsw i64 %57, %50 store i64 %58, ptr %44, align 8, !tbaa !17 %59 = add nuw i64 %51, 1 %60 = icmp eq i64 %59, %26 br i1 %60, label %46, label %49, !llvm.loop !31 61: ; preds = %39, %9, %5 ret i1 %8 } ; Function Attrs: nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) uwtable define dso_local noundef zeroext i1 @tensor_op_00040001_0_0(ptr nocapture noundef readonly %0, ptr nocapture noundef readonly %1, i64 noundef %2, ptr nocapture noundef readnone %3, i64 noundef %4) local_unnamed_addr #0 { %6 = icmp ne i64 %2, 2 %7 = icmp ne i64 %4, 0 %8 = or i1 %6, %7 br i1 %8, label %61, label %9 9: ; preds = %5 %10 = load ptr, ptr %0, align 8, !tbaa !5 %11 = load ptr, ptr %10, align 8, !tbaa !13 %12 = load ptr, ptr %1, align 8, !tbaa !15 %13 = load ptr, ptr %12, align 8, !tbaa !5 %14 = load ptr, ptr %13, align 8, !tbaa !13 %15 = getelementptr inbounds ptr, ptr %1, i64 1 %16 = load ptr, ptr %15, align 8, !tbaa !15 %17 = load ptr, ptr %16, align 8, !tbaa !5 %18 = load ptr, ptr %17, align 8, !tbaa !13 %19 = getelementptr inbounds %struct.tensor, ptr %12, i64 0, i32 1 %20 = load ptr, ptr %19, align 8, !tbaa !16 %21 = getelementptr inbounds i64, ptr %20, i64 1 %22 = getelementptr inbounds %struct.tensor, ptr %16, i64 0, i32 1 %23 = load ptr, ptr %22, align 8, !tbaa !16 %24 = getelementptr inbounds i64, ptr %23, i64 1 %25 = load i64, ptr %20, align 8, !tbaa !17 %26 = load i64, ptr %21, align 8, !tbaa !17 %27 = load i64, ptr %24, align 8, !tbaa !17 %28 = icmp eq i64 %25, 0 br i1 %28, label %61, label %29 29: ; preds = %9 %30 = icmp eq i64 %27, 0 %31 = icmp eq i64 %26, 0 br label %32 32: ; preds = %39, %29 %33 = phi i64 [ 0, %29 ], [ %40, %39 ] br i1 %30, label %39, label %34 34: ; preds = %32 %35 = mul i64 %33, %27 %36 = getelementptr i8, ptr %11, i64 %35 %37 = mul i64 %33, %26 %38 = getelementptr i8, ptr %14, i64 %37 br label %42 39: ; preds = %46, %32 %40 = add nuw i64 %33, 1 %41 = icmp eq i64 %40, %25 br i1 %41, label %61, label %32, !llvm.loop !32 42: ; preds = %46, %34 %43 = phi i64 [ 0, %34 ], [ %47, %46 ] %44 = getelementptr i8, ptr %36, i64 %43 store i8 0, ptr %44, align 1, !tbaa !33 %45 = getelementptr i8, ptr %18, i64 %43 br i1 %31, label %46, label %49 46: ; preds = %49, %42 %47 = add nuw i64 %43, 1 %48 = icmp eq i64 %47, %27 br i1 %48, label %39, label %42, !llvm.loop !34 49: ; preds = %42, %49 %50 = phi i8 [ %58, %49 ], [ 0, %42 ] %51 = phi i64 [ %59, %49 ], [ 0, %42 ] %52 = getelementptr i8, ptr %38, i64 %51 %53 = load i8, ptr %52, align 1, !tbaa !33 %54 = mul i64 %51, %27 %55 = getelementptr i8, ptr %45, i64 %54 %56 = load i8, ptr %55, align 1, !tbaa !33 %57 = mul i8 %56, %53 %58 = add i8 %57, %50 store i8 %58, ptr %44, align 1, !tbaa !33 %59 = add nuw i64 %51, 1 %60 = icmp eq i64 %59, %26 br i1 %60, label %46, label %49, !llvm.loop !35 61: ; preds = %39, %9, %5 ret i1 %8 } ; Function Attrs: nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) uwtable define dso_local noundef zeroext i1 @tensor_op_00040001_8_8(ptr nocapture noundef readonly %0, ptr nocapture noundef readonly %1, i64 noundef %2, ptr nocapture noundef readnone %3, i64 noundef %4) local_unnamed_addr #0 { %6 = icmp ne i64 %2, 2 %7 = icmp ne i64 %4, 0 %8 = or i1 %6, %7 br i1 %8, label %60, label %9 9: ; preds = %5 %10 = load ptr, ptr %0, align 8, !tbaa !5 %11 = load ptr, ptr %10, align 8, !tbaa !13 %12 = load ptr, ptr %1, align 8, !tbaa !15 %13 = load ptr, ptr %12, align 8, !tbaa !5 %14 = load ptr, ptr %13, align 8, !tbaa !13 %15 = getelementptr inbounds ptr, ptr %1, i64 1 %16 = load ptr, ptr %15, align 8, !tbaa !15 %17 = load ptr, ptr %16, align 8, !tbaa !5 %18 = load ptr, ptr %17, align 8, !tbaa !13 %19 = getelementptr inbounds %struct.tensor, ptr %12, i64 0, i32 1 %20 = load ptr, ptr %19, align 8, !tbaa !16 %21 = getelementptr inbounds i64, ptr %20, i64 1 %22 = getelementptr inbounds %struct.tensor, ptr %16, i64 0, i32 1 %23 = load ptr, ptr %22, align 8, !tbaa !16 %24 = getelementptr inbounds i64, ptr %23, i64 1 %25 = load i64, ptr %20, align 8, !tbaa !17 %26 = load i64, ptr %21, align 8, !tbaa !17 %27 = load i64, ptr %24, align 8, !tbaa !17 %28 = icmp eq i64 %25, 0 br i1 %28, label %60, label %29 29: ; preds = %9 %30 = icmp eq i64 %27, 0 %31 = icmp eq i64 %26, 0 br label %32 32: ; preds = %39, %29 %33 = phi i64 [ 0, %29 ], [ %40, %39 ] br i1 %30, label %39, label %34 34: ; preds = %32 %35 = mul i64 %33, %27 %36 = getelementptr float, ptr %11, i64 %35 %37 = mul i64 %33, %26 %38 = getelementptr float, ptr %14, i64 %37 br label %42 39: ; preds = %46, %32 %40 = add nuw i64 %33, 1 %41 = icmp eq i64 %40, %25 br i1 %41, label %60, label %32, !llvm.loop !36 42: ; preds = %46, %34 %43 = phi i64 [ 0, %34 ], [ %47, %46 ] %44 = getelementptr float, ptr %36, i64 %43 store float 0.000000e+00, ptr %44, align 4, !tbaa !37 %45 = getelementptr float, ptr %18, i64 %43 br i1 %31, label %46, label %49 46: ; preds = %49, %42 %47 = add nuw i64 %43, 1 %48 = icmp eq i64 %47, %27 br i1 %48, label %39, label %42, !llvm.loop !39 49: ; preds = %42, %49 %50 = phi float [ %57, %49 ], [ 0.000000e+00, %42 ] %51 = phi i64 [ %58, %49 ], [ 0, %42 ] %52 = getelementptr float, ptr %38, i64 %51 %53 = load float, ptr %52, align 4, !tbaa !37 %54 = mul i64 %51, %27 %55 = getelementptr float, ptr %45, i64 %54 %56 = load float, ptr %55, align 4, !tbaa !37 %57 = tail call float @llvm.fmuladd.f32(float %53, float %56, float %50) store float %57, ptr %44, align 4, !tbaa !37 %58 = add nuw i64 %51, 1 %59 = icmp eq i64 %58, %26 br i1 %59, label %46, label %49, !llvm.loop !40 60: ; preds = %39, %9, %5 ret i1 %8 } ; Function Attrs: nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) uwtable define dso_local noundef zeroext i1 @tensor_op_00040001_9_9(ptr nocapture noundef readonly %0, ptr nocapture noundef readonly %1, i64 noundef %2, ptr nocapture noundef readnone %3, i64 noundef %4) local_unnamed_addr #0 { %6 = icmp ne i64 %2, 2 %7 = icmp ne i64 %4, 0 %8 = or i1 %6, %7 br i1 %8, label %60, label %9 9: ; preds = %5 %10 = load ptr, ptr %0, align 8, !tbaa !5 %11 = load ptr, ptr %10, align 8, !tbaa !13 %12 = load ptr, ptr %1, align 8, !tbaa !15 %13 = load ptr, ptr %12, align 8, !tbaa !5 %14 = load ptr, ptr %13, align 8, !tbaa !13 %15 = getelementptr inbounds ptr, ptr %1, i64 1 %16 = load ptr, ptr %15, align 8, !tbaa !15 %17 = load ptr, ptr %16, align 8, !tbaa !5 %18 = load ptr, ptr %17, align 8, !tbaa !13 %19 = getelementptr inbounds %struct.tensor, ptr %12, i64 0, i32 1 %20 = load ptr, ptr %19, align 8, !tbaa !16 %21 = getelementptr inbounds i64, ptr %20, i64 1 %22 = getelementptr inbounds %struct.tensor, ptr %16, i64 0, i32 1 %23 = load ptr, ptr %22, align 8, !tbaa !16 %24 = getelementptr inbounds i64, ptr %23, i64 1 %25 = load i64, ptr %20, align 8, !tbaa !17 %26 = load i64, ptr %21, align 8, !tbaa !17 %27 = load i64, ptr %24, align 8, !tbaa !17 %28 = icmp eq i64 %25, 0 br i1 %28, label %60, label %29 29: ; preds = %9 %30 = icmp eq i64 %27, 0 %31 = icmp eq i64 %26, 0 br label %32 32: ; preds = %39, %29 %33 = phi i64 [ 0, %29 ], [ %40, %39 ] br i1 %30, label %39, label %34 34: ; preds = %32 %35 = mul i64 %33, %27 %36 = getelementptr double, ptr %11, i64 %35 %37 = mul i64 %33, %26 %38 = getelementptr double, ptr %14, i64 %37 br label %42 39: ; preds = %46, %32 %40 = add nuw i64 %33, 1 %41 = icmp eq i64 %40, %25 br i1 %41, label %60, label %32, !llvm.loop !41 42: ; preds = %46, %34 %43 = phi i64 [ 0, %34 ], [ %47, %46 ] %44 = getelementptr double, ptr %36, i64 %43 store double 0.000000e+00, ptr %44, align 8, !tbaa !42 %45 = getelementptr double, ptr %18, i64 %43 br i1 %31, label %46, label %49 46: ; preds = %49, %42 %47 = add nuw i64 %43, 1 %48 = icmp eq i64 %47, %27 br i1 %48, label %39, label %42, !llvm.loop !44 49: ; preds = %42, %49 %50 = phi double [ %57, %49 ], [ 0.000000e+00, %42 ] %51 = phi i64 [ %58, %49 ], [ 0, %42 ] %52 = getelementptr double, ptr %38, i64 %51 %53 = load double, ptr %52, align 8, !tbaa !42 %54 = mul i64 %51, %27 %55 = getelementptr double, ptr %45, i64 %54 %56 = load double, ptr %55, align 8, !tbaa !42 %57 = tail call double @llvm.fmuladd.f64(double %53, double %56, double %50) store double %57, ptr %44, align 8, !tbaa !42 %58 = add nuw i64 %51, 1 %59 = icmp eq i64 %58, %26 br i1 %59, label %46, label %49, !llvm.loop !45 60: ; preds = %39, %9, %5 ret i1 %8 } ; Function Attrs: nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) uwtable define dso_local noundef zeroext i1 @tensor_op_00040001_5_5(ptr nocapture noundef readonly %0, ptr nocapture noundef readonly %1, i64 noundef %2, ptr nocapture noundef readnone %3, i64 noundef %4) local_unnamed_addr #0 { %6 = icmp ne i64 %2, 2 %7 = icmp ne i64 %4, 0 %8 = or i1 %6, %7 br i1 %8, label %61, label %9 9: ; preds = %5 %10 = load ptr, ptr %0, align 8, !tbaa !5 %11 = load ptr, ptr %10, align 8, !tbaa !13 %12 = load ptr, ptr %1, align 8, !tbaa !15 %13 = load ptr, ptr %12, align 8, !tbaa !5 %14 = load ptr, ptr %13, align 8, !tbaa !13 %15 = getelementptr inbounds ptr, ptr %1, i64 1 %16 = load ptr, ptr %15, align 8, !tbaa !15 %17 = load ptr, ptr %16, align 8, !tbaa !5 %18 = load ptr, ptr %17, align 8, !tbaa !13 %19 = getelementptr inbounds %struct.tensor, ptr %12, i64 0, i32 1 %20 = load ptr, ptr %19, align 8, !tbaa !16 %21 = getelementptr inbounds i64, ptr %20, i64 1 %22 = getelementptr inbounds %struct.tensor, ptr %16, i64 0, i32 1 %23 = load ptr, ptr %22, align 8, !tbaa !16 %24 = getelementptr inbounds i64, ptr %23, i64 1 %25 = load i64, ptr %20, align 8, !tbaa !17 %26 = load i64, ptr %21, align 8, !tbaa !17 %27 = load i64, ptr %24, align 8, !tbaa !17 %28 = icmp eq i64 %25, 0 br i1 %28, label %61, label %29 29: ; preds = %9 %30 = icmp eq i64 %27, 0 %31 = icmp eq i64 %26, 0 br label %32 32: ; preds = %39, %29 %33 = phi i64 [ 0, %29 ], [ %40, %39 ] br i1 %30, label %39, label %34 34: ; preds = %32 %35 = mul i64 %33, %27 %36 = getelementptr i16, ptr %11, i64 %35 %37 = mul i64 %33, %26 %38 = getelementptr i16, ptr %14, i64 %37 br label %42 39: ; preds = %46, %32 %40 = add nuw i64 %33, 1 %41 = icmp eq i64 %40, %25 br i1 %41, label %61, label %32, !llvm.loop !46 42: ; preds = %46, %34 %43 = phi i64 [ 0, %34 ], [ %47, %46 ] %44 = getelementptr i16, ptr %36, i64 %43 store i16 0, ptr %44, align 2, !tbaa !21 %45 = getelementptr i16, ptr %18, i64 %43 br i1 %31, label %46, label %49 46: ; preds = %49, %42 %47 = add nuw i64 %43, 1 %48 = icmp eq i64 %47, %27 br i1 %48, label %39, label %42, !llvm.loop !47 49: ; preds = %42, %49 %50 = phi i16 [ %58, %49 ], [ 0, %42 ] %51 = phi i64 [ %59, %49 ], [ 0, %42 ] %52 = getelementptr i16, ptr %38, i64 %51 %53 = load i16, ptr %52, align 2, !tbaa !21 %54 = mul i64 %51, %27 %55 = getelementptr i16, ptr %45, i64 %54 %56 = load i16, ptr %55, align 2, !tbaa !21 %57 = mul i16 %56, %53 %58 = add i16 %57, %50 store i16 %58, ptr %44, align 2, !tbaa !21 %59 = add nuw i64 %51, 1 %60 = icmp eq i64 %59, %26 br i1 %60, label %46, label %49, !llvm.loop !48 61: ; preds = %39, %9, %5 ret i1 %8 } ; Function Attrs: nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) uwtable define dso_local noundef zeroext i1 @tensor_op_00040001_6_6(ptr nocapture noundef readonly %0, ptr nocapture noundef readonly %1, i64 noundef %2, ptr nocapture noundef readnone %3, i64 noundef %4) local_unnamed_addr #0 { %6 = icmp ne i64 %2, 2 %7 = icmp ne i64 %4, 0 %8 = or i1 %6, %7 br i1 %8, label %61, label %9 9: ; preds = %5 %10 = load ptr, ptr %0, align 8, !tbaa !5 %11 = load ptr, ptr %10, align 8, !tbaa !13 %12 = load ptr, ptr %1, align 8, !tbaa !15 %13 = load ptr, ptr %12, align 8, !tbaa !5 %14 = load ptr, ptr %13, align 8, !tbaa !13 %15 = getelementptr inbounds ptr, ptr %1, i64 1 %16 = load ptr, ptr %15, align 8, !tbaa !15 %17 = load ptr, ptr %16, align 8, !tbaa !5 %18 = load ptr, ptr %17, align 8, !tbaa !13 %19 = getelementptr inbounds %struct.tensor, ptr %12, i64 0, i32 1 %20 = load ptr, ptr %19, align 8, !tbaa !16 %21 = getelementptr inbounds i64, ptr %20, i64 1 %22 = getelementptr inbounds %struct.tensor, ptr %16, i64 0, i32 1 %23 = load ptr, ptr %22, align 8, !tbaa !16 %24 = getelementptr inbounds i64, ptr %23, i64 1 %25 = load i64, ptr %20, align 8, !tbaa !17 %26 = load i64, ptr %21, align 8, !tbaa !17 %27 = load i64, ptr %24, align 8, !tbaa !17 %28 = icmp eq i64 %25, 0 br i1 %28, label %61, label %29 29: ; preds = %9 %30 = icmp eq i64 %27, 0 %31 = icmp eq i64 %26, 0 br label %32 32: ; preds = %39, %29 %33 = phi i64 [ 0, %29 ], [ %40, %39 ] br i1 %30, label %39, label %34 34: ; preds = %32 %35 = mul i64 %33, %27 %36 = getelementptr i32, ptr %11, i64 %35 %37 = mul i64 %33, %26 %38 = getelementptr i32, ptr %14, i64 %37 br label %42 39: ; preds = %46, %32 %40 = add nuw i64 %33, 1 %41 = icmp eq i64 %40, %25 br i1 %41, label %61, label %32, !llvm.loop !49 42: ; preds = %46, %34 %43 = phi i64 [ 0, %34 ], [ %47, %46 ] %44 = getelementptr i32, ptr %36, i64 %43 store i32 0, ptr %44, align 4, !tbaa !26 %45 = getelementptr i32, ptr %18, i64 %43 br i1 %31, label %46, label %49 46: ; preds = %49, %42 %47 = add nuw i64 %43, 1 %48 = icmp eq i64 %47, %27 br i1 %48, label %39, label %42, !llvm.loop !50 49: ; preds = %42, %49 %50 = phi i32 [ %58, %49 ], [ 0, %42 ] %51 = phi i64 [ %59, %49 ], [ 0, %42 ] %52 = getelementptr i32, ptr %38, i64 %51 %53 = load i32, ptr %52, align 4, !tbaa !26 %54 = mul i64 %51, %27 %55 = getelementptr i32, ptr %45, i64 %54 %56 = load i32, ptr %55, align 4, !tbaa !26 %57 = mul i32 %56, %53 %58 = add i32 %57, %50 store i32 %58, ptr %44, align 4, !tbaa !26 %59 = add nuw i64 %51, 1 %60 = icmp eq i64 %59, %26 br i1 %60, label %46, label %49, !llvm.loop !51 61: ; preds = %39, %9, %5 ret i1 %8 } ; Function Attrs: nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) uwtable define dso_local noundef zeroext i1 @tensor_op_00040001_7_7(ptr nocapture noundef readonly %0, ptr nocapture noundef readonly %1, i64 noundef %2, ptr nocapture noundef readnone %3, i64 noundef %4) local_unnamed_addr #0 { %6 = icmp ne i64 %2, 2 %7 = icmp ne i64 %4, 0 %8 = or i1 %6, %7 br i1 %8, label %61, label %9 9: ; preds = %5 %10 = load ptr, ptr %0, align 8, !tbaa !5 %11 = load ptr, ptr %10, align 8, !tbaa !13 %12 = load ptr, ptr %1, align 8, !tbaa !15 %13 = load ptr, ptr %12, align 8, !tbaa !5 %14 = load ptr, ptr %13, align 8, !tbaa !13 %15 = getelementptr inbounds ptr, ptr %1, i64 1 %16 = load ptr, ptr %15, align 8, !tbaa !15 %17 = load ptr, ptr %16, align 8, !tbaa !5 %18 = load ptr, ptr %17, align 8, !tbaa !13 %19 = getelementptr inbounds %struct.tensor, ptr %12, i64 0, i32 1 %20 = load ptr, ptr %19, align 8, !tbaa !16 %21 = getelementptr inbounds i64, ptr %20, i64 1 %22 = getelementptr inbounds %struct.tensor, ptr %16, i64 0, i32 1 %23 = load ptr, ptr %22, align 8, !tbaa !16 %24 = getelementptr inbounds i64, ptr %23, i64 1 %25 = load i64, ptr %20, align 8, !tbaa !17 %26 = load i64, ptr %21, align 8, !tbaa !17 %27 = load i64, ptr %24, align 8, !tbaa !17 %28 = icmp eq i64 %25, 0 br i1 %28, label %61, label %29 29: ; preds = %9 %30 = icmp eq i64 %27, 0 %31 = icmp eq i64 %26, 0 br label %32 32: ; preds = %39, %29 %33 = phi i64 [ 0, %29 ], [ %40, %39 ] br i1 %30, label %39, label %34 34: ; preds = %32 %35 = mul i64 %33, %27 %36 = getelementptr i64, ptr %11, i64 %35 %37 = mul i64 %33, %26 %38 = getelementptr i64, ptr %14, i64 %37 br label %42 39: ; preds = %46, %32 %40 = add nuw i64 %33, 1 %41 = icmp eq i64 %40, %25 br i1 %41, label %61, label %32, !llvm.loop !52 42: ; preds = %46, %34 %43 = phi i64 [ 0, %34 ], [ %47, %46 ] %44 = getelementptr i64, ptr %36, i64 %43 store i64 0, ptr %44, align 8, !tbaa !17 %45 = getelementptr i64, ptr %18, i64 %43 br i1 %31, label %46, label %49 46: ; preds = %49, %42 %47 = add nuw i64 %43, 1 %48 = icmp eq i64 %47, %27 br i1 %48, label %39, label %42, !llvm.loop !53 49: ; preds = %42, %49 %50 = phi i64 [ %58, %49 ], [ 0, %42 ] %51 = phi i64 [ %59, %49 ], [ 0, %42 ] %52 = getelementptr i64, ptr %38, i64 %51 %53 = load i64, ptr %52, align 8, !tbaa !17 %54 = mul i64 %51, %27 %55 = getelementptr i64, ptr %45, i64 %54 %56 = load i64, ptr %55, align 8, !tbaa !17 %57 = mul i64 %56, %53 %58 = add i64 %57, %50 store i64 %58, ptr %44, align 8, !tbaa !17 %59 = add nuw i64 %51, 1 %60 = icmp eq i64 %59, %26 br i1 %60, label %46, label %49, !llvm.loop !54 61: ; preds = %39, %9, %5 ret i1 %8 } ; Function Attrs: nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) uwtable define dso_local noundef zeroext i1 @tensor_op_00040001_4_4(ptr nocapture noundef readonly %0, ptr nocapture noundef readonly %1, i64 noundef %2, ptr nocapture noundef readnone %3, i64 noundef %4) local_unnamed_addr #0 { %6 = icmp ne i64 %2, 2 %7 = icmp ne i64 %4, 0 %8 = or i1 %6, %7 br i1 %8, label %61, label %9 9: ; preds = %5 %10 = load ptr, ptr %0, align 8, !tbaa !5 %11 = load ptr, ptr %10, align 8, !tbaa !13 %12 = load ptr, ptr %1, align 8, !tbaa !15 %13 = load ptr, ptr %12, align 8, !tbaa !5 %14 = load ptr, ptr %13, align 8, !tbaa !13 %15 = getelementptr inbounds ptr, ptr %1, i64 1 %16 = load ptr, ptr %15, align 8, !tbaa !15 %17 = load ptr, ptr %16, align 8, !tbaa !5 %18 = load ptr, ptr %17, align 8, !tbaa !13 %19 = getelementptr inbounds %struct.tensor, ptr %12, i64 0, i32 1 %20 = load ptr, ptr %19, align 8, !tbaa !16 %21 = getelementptr inbounds i64, ptr %20, i64 1 %22 = getelementptr inbounds %struct.tensor, ptr %16, i64 0, i32 1 %23 = load ptr, ptr %22, align 8, !tbaa !16 %24 = getelementptr inbounds i64, ptr %23, i64 1 %25 = load i64, ptr %20, align 8, !tbaa !17 %26 = load i64, ptr %21, align 8, !tbaa !17 %27 = load i64, ptr %24, align 8, !tbaa !17 %28 = icmp eq i64 %25, 0 br i1 %28, label %61, label %29 29: ; preds = %9 %30 = icmp eq i64 %27, 0 %31 = icmp eq i64 %26, 0 br label %32 32: ; preds = %39, %29 %33 = phi i64 [ 0, %29 ], [ %40, %39 ] br i1 %30, label %39, label %34 34: ; preds = %32 %35 = mul i64 %33, %27 %36 = getelementptr i8, ptr %11, i64 %35 %37 = mul i64 %33, %26 %38 = getelementptr i8, ptr %14, i64 %37 br label %42 39: ; preds = %46, %32 %40 = add nuw i64 %33, 1 %41 = icmp eq i64 %40, %25 br i1 %41, label %61, label %32, !llvm.loop !55 42: ; preds = %46, %34 %43 = phi i64 [ 0, %34 ], [ %47, %46 ] %44 = getelementptr i8, ptr %36, i64 %43 store i8 0, ptr %44, align 1, !tbaa !33 %45 = getelementptr i8, ptr %18, i64 %43 br i1 %31, label %46, label %49 46: ; preds = %49, %42 %47 = add nuw i64 %43, 1 %48 = icmp eq i64 %47, %27 br i1 %48, label %39, label %42, !llvm.loop !56 49: ; preds = %42, %49 %50 = phi i8 [ %58, %49 ], [ 0, %42 ] %51 = phi i64 [ %59, %49 ], [ 0, %42 ] %52 = getelementptr i8, ptr %38, i64 %51 %53 = load i8, ptr %52, align 1, !tbaa !33 %54 = mul i64 %51, %27 %55 = getelementptr i8, ptr %45, i64 %54 %56 = load i8, ptr %55, align 1, !tbaa !33 %57 = mul i8 %56, %53 %58 = add i8 %57, %50 store i8 %58, ptr %44, align 1, !tbaa !33 %59 = add nuw i64 %51, 1 %60 = icmp eq i64 %59, %26 br i1 %60, label %46, label %49, !llvm.loop !57 61: ; preds = %39, %9, %5 ret i1 %8 } ; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none) declare float @llvm.fmuladd.f32(float, float, float) #1 ; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none) declare double @llvm.fmuladd.f64(double, double, double) #1 attributes #0 = { nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" } attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } !llvm.module.flags = !{!0, !1, !2, !3} !llvm.ident = !{!4} !0 = !{i32 1, !"wchar_size", i32 4} !1 = !{i32 8, !"PIC Level", i32 2} !2 = !{i32 7, !"PIE Level", i32 2} !3 = !{i32 7, !"uwtable", i32 2} !4 = !{!"Ubuntu clang version 18.1.3 (1ubuntu1)"} !5 = !{!6, !7, i64 0} !6 = !{!"tensor", !7, i64 0, !7, i64 8, !7, i64 16, !10, i64 24, !11, i64 32, !10, i64 40, !12, i64 48, !12, i64 49} !7 = !{!"any pointer", !8, i64 0} !8 = !{!"omnipotent char", !9, i64 0} !9 = !{!"Simple C/C++ TBAA"} !10 = !{!"long", !8, i64 0} !11 = !{!"int", !8, i64 0} !12 = !{!"_Bool", !8, i64 0} !13 = !{!14, !7, i64 0} !14 = !{!"", !7, i64 0, !10, i64 8, !12, i64 16, !12, i64 17} !15 = !{!7, !7, i64 0} !16 = !{!6, !7, i64 8} !17 = !{!10, !10, i64 0} !18 = distinct !{!18, !19, !20} !19 = !{!"llvm.loop.mustprogress"} !20 = !{!"llvm.loop.unroll.disable"} !21 = !{!22, !22, i64 0} !22 = !{!"short", !8, i64 0} !23 = distinct !{!23, !19, !20} !24 = distinct !{!24, !19, !20} !25 = distinct !{!25, !19, !20} !26 = !{!11, !11, i64 0} !27 = distinct !{!27, !19, !20} !28 = distinct !{!28, !19, !20} !29 = distinct !{!29, !19, !20} !30 = distinct !{!30, !19, !20} !31 = distinct !{!31, !19, !20} !32 = distinct !{!32, !19, !20} !33 = !{!8, !8, i64 0} !34 = distinct !{!34, !19, !20} !35 = distinct !{!35, !19, !20} !36 = distinct !{!36, !19, !20} !37 = !{!38, !38, i64 0} !38 = !{!"float", !8, i64 0} !39 = distinct !{!39, !19, !20} !40 = distinct !{!40, !19, !20} !41 = distinct !{!41, !19, !20} !42 = !{!43, !43, i64 0} !43 = !{!"double", !8, i64 0} !44 = distinct !{!44, !19, !20} !45 = distinct !{!45, !19, !20} !46 = distinct !{!46, !19, !20} !47 = distinct !{!47, !19, !20} !48 = distinct !{!48, !19, !20} !49 = distinct !{!49, !19, !20} !50 = distinct !{!50, !19, !20} !51 = distinct !{!51, !19, !20} !52 = distinct !{!52, !19, !20} !53 = distinct !{!53, !19, !20} !54 = distinct !{!54, !19, !20} !55 = distinct !{!55, !19, !20} !56 = distinct !{!56, !19, !20} !57 = distinct !{!57, !19, !20} ================================================================================ STEP 13 — LLVM SYMBOL TABLE ================================================================================ ---------------- T tensor_op_00040001_0_0 ---------------- T tensor_op_00040001_1_1 ---------------- T tensor_op_00040001_2_2 ---------------- T tensor_op_00040001_3_3 ---------------- T tensor_op_00040001_4_4 ---------------- T tensor_op_00040001_5_5 ---------------- T tensor_op_00040001_6_6 ---------------- T tensor_op_00040001_7_7 ---------------- T tensor_op_00040001_8_8 ---------------- T tensor_op_00040001_9_9 ================================================================================ STEP 14 — REGISTRY RECORDS ================================================================================ record count: 10 RECORD 0 operation name : matrix_mul operation id : 0x00040001 output enum : 1 input enum : 1 LLVM symbol : tensor_op_00040001_1_1 RECORD 1 operation name : matrix_mul operation id : 0x00040001 output enum : 2 input enum : 2 LLVM symbol : tensor_op_00040001_2_2 RECORD 2 operation name : matrix_mul operation id : 0x00040001 output enum : 3 input enum : 3 LLVM symbol : tensor_op_00040001_3_3 RECORD 3 operation name : matrix_mul operation id : 0x00040001 output enum : 0 input enum : 0 LLVM symbol : tensor_op_00040001_0_0 RECORD 4 operation name : matrix_mul operation id : 0x00040001 output enum : 8 input enum : 8 LLVM symbol : tensor_op_00040001_8_8 RECORD 5 operation name : matrix_mul operation id : 0x00040001 output enum : 9 input enum : 9 LLVM symbol : tensor_op_00040001_9_9 RECORD 6 operation name : matrix_mul operation id : 0x00040001 output enum : 5 input enum : 5 LLVM symbol : tensor_op_00040001_5_5 RECORD 7 operation name : matrix_mul operation id : 0x00040001 output enum : 6 input enum : 6 LLVM symbol : tensor_op_00040001_6_6 RECORD 8 operation name : matrix_mul operation id : 0x00040001 output enum : 7 input enum : 7 LLVM symbol : tensor_op_00040001_7_7 RECORD 9 operation name : matrix_mul operation id : 0x00040001 output enum : 4 input enum : 4 LLVM symbol : tensor_op_00040001_4_4 ================================================================================ STEP 15 — GENERATED registry.c ================================================================================ /* Generated operation module registry; do not edit. */ #include "tensor_core.h" static const uint8 tensor_operations_bc[] = { 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x4a, 0x59, 0xbe, 0x66, 0xcd, 0xfb, 0xb5, 0x7f, 0x0b, 0x51, 0x80, 0x4c, 0x01, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x1b, 0x07, 0x00, 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0x84, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x42, 0x88, 0x48, 0x70, 0xc4, 0x21, 0x23, 0x44, 0x12, 0x87, 0x8c, 0x10, 0x41, 0x92, 0x02, 0x64, 0xc8, 0x08, 0xb1, 0x14, 0x20, 0x43, 0x46, 0x88, 0x20, 0xc9, 0x01, 0x32, 0x42, 0x84, 0x58, 0x0e, 0x90, 0x11, 0x22, 0x44, 0x90, 0xa1, 0x82, 0xa2, 0x02, 0x19, 0xc3, 0x07, 0xcb, 0x15, 0x09, 0x42, 0x8c, 0x0c, 0x89, 0x20, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x22, 0x66, 0x04, 0x10, 0xb2, 0x42, 0x82, 0x09, 0x11, 0x52, 0x42, 0x82, 0x09, 0x91, 0x71, 0xc2, 0x50, 0x48, 0x0a, 0x09, 0x26, 0x44, 0xc6, 0x05, 0x42, 0x42, 0x26, 0x08, 0x1e, 0x9a, 0x23, 0x08, 0xe6, 0x08, 0x40, 0xa1, 0x18, 0x01, 0x20, 0x20, 0x33, 0x00, 0x85, 0x20, 0x22, 0x1a, 0x02, 0x28, 0x84, 0x99, 0xd9, 0x40, 0xc0, 0x1c, 0x01, 0x18, 0x4c, 0x01, 0x8c, 0x00, 0xcc, 0x11, 0x20, 0xd7, 0x48, 0x53, 0x44, 0x09, 0x93, 0x3f, 0x11, 0x8d, 0xe4, 0x44, 0x08, 0x01, 0x00, 0x49, 0x61, 0x9e, 0x23, 0x80, 0x00, 0x00, 0x51, 0x18, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x1b, 0xf8, 0x22, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0x03, 0x00, 0x0e, 0x80, 0x3f, 0x00, 0xa4, 0xc0, 0x16, 0xe6, 0x20, 0x08, 0x03, 0x81, 0x68, 0x87, 0x74, 0x70, 0x87, 0x36, 0x60, 0x87, 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, 0x07, 0x72, 0xa0, 0x07, 0x74, 0x00, 0xe0, 0x00, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f, 0x00, 0x82, 0x1e, 0xc2, 0x41, 0x1e, 0xce, 0xa1, 0x1c, 0xe8, 0xa1, 0x0d, 0xc6, 0x01, 0x1e, 0xea, 0x01, 0xc0, 0x07, 0x3c, 0xb0, 0x83, 0x36, 0xb0, 0x03, 0x3a, 0x00, 0x08, 0x7a, 0x08, 0x07, 0x79, 0x38, 0x87, 0x72, 0xa0, 0x87, 0x36, 0x30, 0x87, 0x72, 0x08, 0x07, 0x7a, 0xa8, 0x07, 0x79, 0x28, 0x87, 0x79, 0x00, 0xd6, 0x60, 0x1c, 0xda, 0xe1, 0x1d, 0xec, 0x81, 0x0d, 0xd6, 0x60, 0x1c, 0xf0, 0x01, 0x0f, 0xd8, 0x60, 0x0d, 0xcc, 0x01, 0x1f, 0xe6, 0x41, 0x1e, 0xd8, 0x60, 0x0d, 0xda, 0xa1, 0x1d, 0xf0, 0x81, 0x0d, 0xd6, 0x60, 0x1e, 0xe6, 0xa1, 0x1c, 0xd8, 0x60, 0x0d, 0xe6, 0x61, 0x1e, 0xca, 0x41, 0x0e, 0xd8, 0x60, 0x0d, 0xf0, 0x01, 0x0f, 0xee, 0x00, 0x20, 0xe8, 0xa1, 0x1e, 0xdc, 0xa1, 0x1c, 0xda, 0x60, 0x1c, 0xe0, 0xa1, 0x1e, 0x80, 0x73, 0x28, 0x07, 0x77, 0x28, 0x07, 0x79, 0x48, 0x87, 0x71, 0x00, 0x36, 0x18, 0x02, 0x00, 0x90, 0x02, 0x20, 0x06, 0x1b, 0x90, 0x21, 0x00, 0x16, 0x80, 0x14, 0x80, 0x6a, 0x03, 0x42, 0x08, 0xc0, 0x02, 0x90, 0x02, 0x50, 0x6d, 0x20, 0x8a, 0x01, 0x20, 0x85, 0x0d, 0x88, 0x41, 0x00, 0x0b, 0x40, 0x0a, 0x00, 0xb5, 0x81, 0x38, 0x0a, 0x80, 0x14, 0x36, 0x4c, 0xc8, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x29, 0x00, 0xa7, 0x00, 0xf8, 0x01, 0xf0, 0x07, 0x80, 0x04, 0xd4, 0x01, 0xd0, 0x07, 0x81, 0x2d, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, 0x8e, 0x40, 0x18, 0x88, 0xc2, 0x38, 0x26, 0x04, 0x08, 0x00, 0x00, 0x13, 0x26, 0x7c, 0xc0, 0x03, 0x3b, 0xf8, 0x05, 0x3b, 0xa0, 0x83, 0x36, 0x80, 0x87, 0x71, 0x68, 0x03, 0x76, 0x48, 0x07, 0x77, 0xa8, 0x07, 0x7c, 0x68, 0x83, 0x73, 0x70, 0x87, 0x7a, 0xd8, 0xf0, 0x0a, 0xe5, 0xd0, 0x06, 0xed, 0xa0, 0x07, 0xe5, 0xd0, 0x06, 0xf0, 0x20, 0x07, 0x77, 0x00, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x00, 0x0f, 0x72, 0x70, 0x07, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf0, 0x20, 0x07, 0x77, 0x20, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0e, 0x78, 0x00, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x30, 0x0b, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x11, 0xc2, 0xe4, 0x50, 0x0d, 0x5e, 0xf4, 0x36, 0xfc, 0x45, 0x2f, 0xbb, 0xe7, 0x6f, 0x79, 0xeb, 0x0d, 0x6f, 0xd9, 0xd3, 0xf3, 0xb4, 0x98, 0x5d, 0x6e, 0x11, 0xad, 0xef, 0x29, 0x9c, 0xf6, 0x7a, 0xc3, 0xcb, 0xf2, 0x30, 0x3d, 0xfd, 0x76, 0xcf, 0x5d, 0xe3, 0x21, 0x15, 0x60, 0x0d, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x16, 0x30, 0xa4, 0xb2, 0xac, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x02, 0xc0, 0x02, 0x86, 0x54, 0x6c, 0x60, 0x0d, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x16, 0x30, 0xa4, 0x12, 0x05, 0x6b, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x00, 0xb0, 0x80, 0x21, 0x15, 0x2e, 0x58, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x05, 0x0c, 0xa9, 0xdc, 0xc1, 0x1a, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x2c, 0x60, 0x48, 0x45, 0x12, 0xd6, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x60, 0x01, 0x43, 0x2a, 0x9d, 0xb0, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0b, 0x18, 0x52, 0xc1, 0x85, 0x35, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x58, 0xc0, 0x90, 0xca, 0x34, 0xac, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x02, 0xc0, 0x02, 0x86, 0x54, 0xbc, 0x01, 0x15, 0x40, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x30, 0xa4, 0x62, 0x0f, 0xe8, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x89, 0x0d, 0x02, 0x45, 0x31, 0x0e, 0x00, 0x00, 0xb2, 0x40, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xca, 0x12, 0x28, 0x84, 0x82, 0x28, 0x82, 0x72, 0x20, 0x19, 0x01, 0x28, 0x88, 0x02, 0x29, 0x98, 0x02, 0x2a, 0xa8, 0x02, 0x2b, 0xb1, 0x12, 0x01, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xcb, 0xe7, 0x0e, 0xef, 0x30, 0x0f, 0xe1, 0xe0, 0x0e, 0xe9, 0x40, 0x0f, 0xe9, 0xa0, 0x0f, 0xe5, 0x30, 0xc3, 0x01, 0x03, 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x5f, 0x98, 0x87, 0x70, 0x70, 0x87, 0x74, 0xa0, 0x87, 0x74, 0xd0, 0x87, 0x72, 0x98, 0x81, 0x84, 0x41, 0x39, 0xe0, 0xc3, 0x38, 0xb0, 0x43, 0x3d, 0x90, 0x43, 0x39, 0xcc, 0x40, 0xc4, 0xa0, 0x1d, 0xca, 0xa1, 0x1d, 0xe0, 0x41, 0x1e, 0xde, 0xc1, 0x1c, 0x66, 0x24, 0x63, 0x30, 0x0e, 0xe1, 0xc0, 0x0e, 0xec, 0x30, 0x0f, 0xe9, 0x40, 0x0f, 0xe5, 0x30, 0x43, 0x21, 0x83, 0x75, 0x18, 0x07, 0x73, 0x48, 0x87, 0x5f, 0xa0, 0x87, 0x7c, 0x80, 0x87, 0x72, 0x98, 0xb1, 0x94, 0x01, 0x3c, 0x8c, 0xc3, 0x3c, 0x94, 0xc3, 0x38, 0xd0, 0x43, 0x3a, 0xbc, 0x83, 0x3b, 0xcc, 0xc3, 0x8c, 0xc5, 0x0c, 0x48, 0x21, 0x15, 0x42, 0x61, 0x1e, 0xe6, 0x21, 0x1d, 0xce, 0xc1, 0x1d, 0x52, 0x81, 0x14, 0x66, 0x4c, 0x67, 0x30, 0x0e, 0xef, 0x20, 0x0f, 0xef, 0xe0, 0x06, 0xef, 0x50, 0x0f, 0xf4, 0x30, 0x0f, 0xe9, 0x40, 0x0e, 0xe5, 0xe0, 0x06, 0xe6, 0x20, 0x0f, 0xe1, 0xd0, 0x0e, 0xe5, 0x00, 0x00, 0x00, 0x79, 0x20, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x72, 0x1e, 0x48, 0x20, 0x43, 0x88, 0x0c, 0x19, 0x09, 0x72, 0x32, 0x48, 0x20, 0x23, 0x81, 0x8c, 0x91, 0x91, 0xd1, 0x44, 0xa0, 0x10, 0x28, 0x64, 0x3c, 0x31, 0x32, 0x42, 0x8e, 0x90, 0x21, 0xa3, 0x08, 0x41, 0xa9, 0x01, 0x4a, 0x92, 0x1c, 0x66, 0x60, 0x2c, 0x4f, 0x44, 0x0c, 0x05, 0x60, 0x61, 0x05, 0x00, 0x00, 0x00, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x50, 0x49, 0x43, 0x20, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x50, 0x49, 0x45, 0x20, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x75, 0x77, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x20, 0x63, 0x6c, 0x61, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x38, 0x2e, 0x31, 0x2e, 0x33, 0x20, 0x28, 0x31, 0x75, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x31, 0x29, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2f, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x6e, 0x74, 0x5f, 0x42, 0x6f, 0x6f, 0x6c, 0x6c, 0x6c, 0x76, 0x6d, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x2e, 0x6d, 0x75, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x6c, 0x6c, 0x76, 0x6d, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x2e, 0x75, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x00, 0x00, 0x00, 0xc6, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x82, 0x90, 0x30, 0x23, 0x08, 0x49, 0x33, 0x82, 0x90, 0x38, 0x23, 0x08, 0xc9, 0x33, 0x82, 0x90, 0x40, 0x23, 0x08, 0x42, 0x34, 0x82, 0x20, 0x48, 0x23, 0x08, 0xc2, 0x34, 0x82, 0x20, 0x50, 0x23, 0x08, 0x42, 0x35, 0x82, 0x20, 0x58, 0x23, 0x08, 0xc2, 0x35, 0x82, 0x20, 0x60, 0x23, 0x08, 0x42, 0x36, 0xc3, 0x10, 0x05, 0xd2, 0x0c, 0xc3, 0x24, 0x50, 0x33, 0x0c, 0xd5, 0x40, 0xcd, 0x30, 0x54, 0x04, 0x35, 0x43, 0x50, 0xcc, 0x10, 0x24, 0x33, 0x0c, 0x08, 0x19, 0x58, 0x33, 0x0c, 0x47, 0x19, 0x58, 0x33, 0x0c, 0x4a, 0x19, 0x58, 0x33, 0x0c, 0x4b, 0x19, 0x58, 0x33, 0x0c, 0x4c, 0x19, 0x58, 0x33, 0x44, 0x86, 0x19, 0x58, 0x66, 0x70, 0x99, 0x01, 0x76, 0x06, 0x19, 0x1a, 0x68, 0x67, 0xb0, 0xa5, 0x01, 0x97, 0x06, 0xdd, 0x0c, 0x83, 0x1a, 0x98, 0x81, 0x35, 0x43, 0xd2, 0x98, 0x81, 0x75, 0x06, 0x57, 0x1a, 0x60, 0x69, 0xe0, 0xcd, 0x30, 0xb0, 0x81, 0x19, 0x58, 0x33, 0x0c, 0x66, 0x60, 0x06, 0xd6, 0x0c, 0x83, 0x1a, 0x98, 0xc1, 0x35, 0xc3, 0x70, 0x06, 0x67, 0x60, 0xcd, 0x10, 0x38, 0x33, 0x04, 0xcf, 0x0c, 0x03, 0x54, 0x06, 0xd6, 0x0c, 0xc3, 0x1c, 0xcc, 0x81, 0x35, 0xc3, 0x80, 0x06, 0x68, 0x60, 0xcd, 0x30, 0x94, 0x41, 0x19, 0x58, 0x67, 0x06, 0x00, 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x89, 0x81, 0x18, 0x88, 0x81, 0x18, 0x58, 0x16, 0x1a, 0xa0, 0x01, 0x1a, 0xa0, 0x01, 0x1a, 0x98, 0x85, 0x1b, 0xf8, 0x82, 0x1b, 0xb8, 0x81, 0x1b, 0xb8, 0x81, 0x65, 0xa1, 0x81, 0x1b, 0xb8, 0x81, 0x8c, 0x04, 0x26, 0x28, 0x23, 0x36, 0x36, 0xbb, 0x36, 0x97, 0xb6, 0x37, 0xb2, 0x3a, 0xb6, 0x32, 0x17, 0x33, 0xb6, 0xb0, 0xb3, 0xb9, 0x51, 0x08, 0xef, 0x03, 0x83, 0x30, 0x48, 0x85, 0x8d, 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x94, 0x40, 0x0c, 0x00, 0x00, 0xa9, 0x18, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4, 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81, 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01, 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c, 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c, 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1, 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x0b, 0x88, 0x75, 0x18, 0x07, 0x73, 0x48, 0x87, 0x05, 0xcf, 0x38, 0xbc, 0x83, 0x3b, 0xd8, 0x43, 0x39, 0xc8, 0xc3, 0x39, 0x94, 0x83, 0x3b, 0x8c, 0x43, 0x39, 0x8c, 0x03, 0x3d, 0xc8, 0x03, 0x3b, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x24, 0x45, 0x50, 0x02, 0xe4, 0x23, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x2b, 0x86, 0x3b, 0x88, 0x03, 0x39, 0x58, 0x31, 0xe0, 0x41, 0x1c, 0xc8, 0xc1, 0x8a, 0x21, 0x0f, 0xe2, 0x40, 0x0e, 0x00, 0xc3, 0x0d, 0xc6, 0x10, 0x06, 0xc3, 0x0d, 0x85, 0x14, 0x06, 0x27, 0x04, 0x3b, 0xcb, 0x90, 0x04, 0x01, 0x2d, 0x40, 0x28, 0x00, 0x42, 0x0c, 0x10, 0x0a, 0x80, 0x50, 0x00, 0xc4, 0x83, 0xf0, 0x28, 0x14, 0x00, 0xa1, 0x00, 0x08, 0x05, 0x40, 0x7c, 0x0f, 0x47, 0x27, 0x06, 0x14, 0x00, 0xf1, 0x22, 0x04, 0x90, 0xef, 0xc1, 0x00, 0x83, 0x32, 0xa0, 0x00, 0x88, 0x17, 0x21, 0x98, 0xa8, 0x10, 0x42, 0x85, 0x10, 0x1a, 0x84, 0x0c, 0x37, 0x0c, 0x66, 0x00, 0x06, 0xb3, 0x0c, 0x89, 0x10, 0x0c, 0x37, 0x08, 0x67, 0x00, 0x06, 0xc3, 0x0d, 0x04, 0x1a, 0x80, 0xc1, 0x2c, 0xc1, 0x30, 0x50, 0x21, 0xc8, 0x82, 0xb0, 0x14, 0xb3, 0x0c, 0x05, 0x31, 0x5c, 0x50, 0x88, 0x73, 0xc1, 0x0a, 0x6e, 0x40, 0xc4, 0xb9, 0x50, 0x05, 0xb3, 0x04, 0x06, 0x16, 0x1f, 0x04, 0x0c, 0x37, 0x04, 0x0c, 0x18, 0xcc, 0x32, 0x24, 0x43, 0x30, 0x50, 0x21, 0x80, 0x03, 0x71, 0x1c, 0xce, 0x05, 0x23, 0x18, 0x36, 0x20, 0x02, 0x31, 0x10, 0x00, 0xe7, 0x82, 0x25, 0xcc, 0x32, 0x1c, 0xc8, 0x82, 0x03, 0x19, 0x40, 0xc0, 0x70, 0x43, 0xf0, 0x80, 0xc1, 0x2c, 0x43, 0x61, 0x04, 0x03, 0x15, 0x4e, 0x84, 0xa8, 0x82, 0x31, 0x50, 0x21, 0x44, 0x08, 0x3b, 0x18, 0xce, 0x05, 0x25, 0xa0, 0xc0, 0xc5, 0x0d, 0x94, 0x38, 0x17, 0x90, 0x80, 0x02, 0x17, 0x17, 0x10, 0x72, 0x01, 0x02, 0xc3, 0x06, 0x44, 0x13, 0x08, 0x00, 0x22, 0x6f, 0x00, 0x01, 0xc3, 0x0d, 0xc1, 0x06, 0x06, 0xb3, 0x0c, 0x07, 0x12, 0x70, 0x1b, 0x04, 0xc4, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x5b, 0x06, 0x22, 0x50, 0x83, 0x2d, 0x43, 0x11, 0xb0, 0xc1, 0x96, 0xc1, 0x08, 0xda, 0x60, 0xcb, 0x70, 0x04, 0x6a, 0xb0, 0x65, 0x40, 0x02, 0x36, 0xd8, 0x32, 0x28, 0x41, 0x1b, 0x6c, 0x19, 0x96, 0x40, 0x0d, 0xb6, 0x0c, 0x4c, 0xc0, 0x06, 0x5b, 0x06, 0x27, 0x70, 0x83, 0x2d, 0x43, 0x14, 0xb8, 0xc1, 0x96, 0x61, 0x0a, 0xde, 0x60, 0xcb, 0x40, 0x05, 0x6f, 0xb0, 0x65, 0xa8, 0x82, 0x37, 0xd8, 0x32, 0x90, 0x81, 0x64, 0x07, 0x5b, 0x86, 0x33, 0x08, 0xe6, 0x60, 0xcb, 0xc0, 0x06, 0xd2, 0x1d, 0x6c, 0x19, 0xe0, 0x20, 0x98, 0x83, 0x2d, 0xc3, 0x1c, 0x04, 0x73, 0xb0, 0x65, 0xb0, 0x83, 0x60, 0x0e, 0xb6, 0x0c, 0x79, 0x20, 0xe1, 0x01, 0x00, 0x21, 0x31, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0b, 0x86, 0x00, 0x78, 0x85, 0x05, 0x43, 0x00, 0xb8, 0xc2, 0x82, 0x21, 0x00, 0x48, 0x61, 0xc1, 0x10, 0x00, 0x7f, 0xb0, 0xa0, 0x08, 0x00, 0x61, 0xb0, 0x83, 0x05, 0x43, 0x00, 0x6c, 0x13, 0x86, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x24, 0x45, 0x50, 0x02, 0x94, 0x23, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x2b, 0x86, 0x3b, 0x88, 0x03, 0x39, 0x58, 0x31, 0xe0, 0x41, 0x1c, 0xc8, 0xc1, 0x8a, 0x21, 0x0f, 0xe2, 0x40, 0x0e, 0x00, 0xc3, 0x0d, 0xc6, 0x10, 0x06, 0xc3, 0x0d, 0x85, 0x14, 0x06, 0x27, 0x04, 0x3b, 0xcb, 0x90, 0x04, 0x01, 0x2d, 0x40, 0x28, 0x00, 0x42, 0x0c, 0x10, 0x0a, 0x80, 0x50, 0x00, 0xc4, 0x83, 0xf0, 0x28, 0x14, 0x00, 0xa1, 0x00, 0x08, 0x05, 0x40, 0x7c, 0x0f, 0x47, 0x27, 0x06, 0x14, 0x00, 0xf1, 0x22, 0x04, 0x90, 0xef, 0xc1, 0x00, 0x83, 0x32, 0xa0, 0x00, 0x88, 0x17, 0x21, 0x98, 0xa8, 0x10, 0x42, 0x85, 0x10, 0x1a, 0x84, 0x0c, 0x37, 0x0c, 0x66, 0x00, 0x06, 0xb3, 0x0c, 0x89, 0x10, 0x0c, 0x37, 0x08, 0x67, 0x00, 0x06, 0xc3, 0x0d, 0x04, 0x1a, 0x80, 0xc1, 0x2c, 0xc1, 0x30, 0x50, 0x21, 0xc8, 0x82, 0xb0, 0x14, 0xb3, 0x0c, 0x05, 0x31, 0x5c, 0x50, 0x88, 0x4b, 0xc1, 0x0a, 0x6e, 0x40, 0xc4, 0xa5, 0x50, 0x05, 0xb3, 0x04, 0x06, 0x16, 0x1f, 0x04, 0x0c, 0x37, 0x04, 0x0c, 0x18, 0xcc, 0x32, 0x24, 0x43, 0x30, 0x50, 0x21, 0x80, 0x03, 0x71, 0x1c, 0x2e, 0x05, 0x23, 0x18, 0x36, 0x20, 0x02, 0x31, 0x18, 0x00, 0x97, 0x82, 0x25, 0xcc, 0x32, 0x1c, 0xc8, 0x82, 0x03, 0x19, 0x40, 0xc0, 0x70, 0x43, 0xf0, 0x80, 0xc1, 0x2c, 0x43, 0x61, 0x04, 0x03, 0x15, 0x49, 0x84, 0xa8, 0x82, 0x31, 0x50, 0x21, 0x44, 0x08, 0x3b, 0x18, 0x2e, 0x05, 0x25, 0xa0, 0x20, 0xc7, 0x0d, 0x94, 0xb8, 0x14, 0x90, 0x80, 0x82, 0x1c, 0x18, 0x10, 0x22, 0x80, 0x01, 0x02, 0x02, 0xc3, 0x06, 0x44, 0x13, 0x0c, 0x00, 0x22, 0x6f, 0x00, 0x01, 0xc3, 0x0d, 0xc1, 0x06, 0x06, 0xb3, 0x0c, 0x07, 0x12, 0x70, 0x1b, 0x04, 0xc4, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x5b, 0x06, 0x22, 0x50, 0x83, 0x2d, 0x43, 0x11, 0xb0, 0xc1, 0x96, 0xc1, 0x08, 0xda, 0x60, 0xcb, 0x70, 0x04, 0x6a, 0xb0, 0x65, 0x40, 0x02, 0x36, 0xd8, 0x32, 0x28, 0x41, 0x1b, 0x6c, 0x19, 0x96, 0x40, 0x0d, 0xb6, 0x0c, 0x4c, 0xc0, 0x06, 0x5b, 0x06, 0x27, 0x70, 0x83, 0x2d, 0x43, 0x14, 0xb8, 0xc1, 0x96, 0x61, 0x0a, 0xde, 0x60, 0xcb, 0x40, 0x05, 0x6f, 0xb0, 0x65, 0xa8, 0x82, 0x37, 0xd8, 0x32, 0x90, 0x81, 0x64, 0x07, 0x5b, 0x86, 0x33, 0x08, 0xe8, 0x60, 0xcb, 0xc0, 0x06, 0xd2, 0x1d, 0x6c, 0x19, 0xe0, 0x20, 0xa0, 0x83, 0x2d, 0xc3, 0x1c, 0x04, 0x74, 0xb0, 0x65, 0xb0, 0x83, 0x80, 0x0e, 0xb6, 0x0c, 0x79, 0x20, 0xe1, 0x01, 0x00, 0x21, 0x31, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0b, 0x86, 0x00, 0x78, 0x85, 0x05, 0x43, 0x00, 0xb8, 0xc2, 0x82, 0x21, 0x00, 0x48, 0x61, 0xc1, 0x10, 0x00, 0x7f, 0xb0, 0xa0, 0x08, 0x00, 0x61, 0xb0, 0x83, 0x05, 0x43, 0x00, 0x6c, 0x13, 0x86, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x24, 0x45, 0x50, 0x02, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x2b, 0x86, 0x3b, 0x88, 0x03, 0x39, 0x58, 0x31, 0xe0, 0x41, 0x1c, 0xc8, 0xc1, 0x8a, 0x21, 0x0f, 0xe2, 0x40, 0x0e, 0x00, 0xc3, 0x0d, 0x85, 0x10, 0x06, 0xc3, 0x0d, 0x44, 0x14, 0x06, 0x27, 0x04, 0x3b, 0xcb, 0x90, 0x04, 0x01, 0x29, 0x40, 0x28, 0x00, 0x42, 0x0b, 0x10, 0x0a, 0x80, 0x50, 0x00, 0xc4, 0x83, 0xe0, 0x24, 0x14, 0x00, 0xa1, 0x00, 0x08, 0x05, 0x40, 0x7c, 0x0f, 0x07, 0x17, 0x06, 0x14, 0x00, 0xf1, 0x22, 0x04, 0x8f, 0xef, 0xc1, 0xf8, 0xc8, 0x80, 0x02, 0x20, 0x5e, 0x84, 0x40, 0xa2, 0x42, 0x08, 0x15, 0x42, 0x68, 0x10, 0x32, 0xdc, 0x30, 0x94, 0x01, 0x18, 0xcc, 0x32, 0x24, 0x42, 0x30, 0xdc, 0x20, 0x98, 0x01, 0x18, 0x0c, 0x37, 0x10, 0x67, 0x00, 0x06, 0xb3, 0x04, 0xc3, 0x40, 0x85, 0x00, 0x0b, 0xc2, 0x52, 0xcc, 0x32, 0x14, 0xc4, 0x70, 0x41, 0x21, 0x4e, 0x04, 0x2b, 0xb8, 0x01, 0x11, 0x27, 0x42, 0x15, 0xcc, 0x12, 0x18, 0x58, 0x78, 0x10, 0x30, 0xdc, 0x10, 0x30, 0x60, 0x30, 0xcb, 0x90, 0x0c, 0xc1, 0x40, 0x85, 0xe0, 0x0b, 0xc4, 0x71, 0x38, 0x11, 0x8c, 0x60, 0xd8, 0x80, 0x08, 0xe2, 0x80, 0x00, 0x9c, 0x08, 0x96, 0x30, 0xcb, 0x70, 0x20, 0x0b, 0x0e, 0x63, 0x00, 0x01, 0xc3, 0x0d, 0xc1, 0x03, 0x06, 0xb3, 0x0c, 0x85, 0x11, 0x0c, 0x54, 0x08, 0x11, 0x82, 0x0e, 0xc6, 0x40, 0x85, 0x10, 0x21, 0xea, 0x60, 0x38, 0x11, 0x94, 0x80, 0x02, 0x21, 0x37, 0x50, 0xe2, 0x44, 0x40, 0x02, 0x0a, 0x84, 0x60, 0x40, 0x88, 0x00, 0x06, 0x08, 0x08, 0x0c, 0x1b, 0x10, 0x4d, 0x40, 0x00, 0x88, 0xb8, 0x01, 0x04, 0x0c, 0x37, 0x04, 0x1b, 0x18, 0xcc, 0x32, 0x1c, 0x48, 0xc0, 0x6d, 0x10, 0x10, 0x03, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x5b, 0x06, 0x22, 0x50, 0x83, 0x2d, 0x43, 0x11, 0xb0, 0xc1, 0x96, 0xc1, 0x08, 0xda, 0x60, 0xcb, 0x70, 0x04, 0x6a, 0xb0, 0x65, 0x40, 0x02, 0x36, 0xd8, 0x32, 0x28, 0x41, 0x1b, 0x6c, 0x19, 0x96, 0x40, 0x0d, 0xb6, 0x0c, 0x4c, 0xc0, 0x06, 0x5b, 0x06, 0x27, 0x70, 0x83, 0x2d, 0x43, 0x14, 0xb8, 0xc1, 0x96, 0x61, 0x0a, 0xde, 0x60, 0xcb, 0x40, 0x05, 0x6f, 0xb0, 0x65, 0xa8, 0x82, 0x37, 0xd8, 0x32, 0x90, 0x81, 0x64, 0x07, 0x5b, 0x86, 0x33, 0x08, 0xde, 0x60, 0xcb, 0xc0, 0x06, 0xd2, 0x1d, 0x6c, 0x19, 0xe0, 0x20, 0x78, 0x83, 0x2d, 0xc3, 0x1c, 0x04, 0x6f, 0xb0, 0x65, 0xb0, 0x83, 0xe0, 0x0d, 0xb6, 0x0c, 0x79, 0x20, 0xe1, 0x01, 0x00, 0x21, 0x31, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0b, 0x86, 0x00, 0x70, 0x85, 0x05, 0x43, 0x00, 0xb4, 0xc2, 0x82, 0x21, 0x00, 0x46, 0x61, 0xc1, 0x10, 0x00, 0x7e, 0xb0, 0xa0, 0x08, 0x00, 0x61, 0xa8, 0x83, 0x05, 0x43, 0x00, 0x6c, 0x13, 0x86, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x24, 0x45, 0x50, 0x02, 0xc4, 0x23, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x2b, 0x86, 0x3b, 0x88, 0x03, 0x39, 0x58, 0x31, 0xe0, 0x41, 0x1c, 0xc8, 0xc1, 0x8a, 0x21, 0x0f, 0xe2, 0x40, 0x0e, 0x00, 0xc3, 0x0d, 0xc6, 0x10, 0x06, 0xc3, 0x0d, 0x85, 0x14, 0x06, 0x27, 0x04, 0x3b, 0xcb, 0x90, 0x04, 0x01, 0x2d, 0x40, 0x28, 0x00, 0x42, 0x0c, 0x10, 0x0a, 0x80, 0x50, 0x00, 0xc4, 0x83, 0xf0, 0x28, 0x14, 0x00, 0xa1, 0x00, 0x08, 0x05, 0x40, 0x7c, 0x0f, 0x47, 0x27, 0x06, 0x14, 0x00, 0xf1, 0x22, 0x04, 0x90, 0xef, 0xc1, 0x00, 0x83, 0x32, 0xa0, 0x00, 0x88, 0x17, 0x21, 0x98, 0xa8, 0x10, 0x42, 0x85, 0x10, 0x1a, 0x84, 0x0c, 0x37, 0x0c, 0x66, 0x00, 0x06, 0xb3, 0x0c, 0x89, 0x10, 0x0c, 0x37, 0x08, 0x67, 0x00, 0x06, 0xc3, 0x0d, 0x04, 0x1a, 0x80, 0xc1, 0x2c, 0xc1, 0x30, 0x50, 0x21, 0xc8, 0x82, 0xb0, 0x14, 0xb3, 0x0c, 0x05, 0x31, 0x5c, 0x50, 0x88, 0x63, 0xc1, 0x0a, 0x6e, 0x40, 0xc4, 0xb1, 0x50, 0x05, 0xb3, 0x04, 0x06, 0x16, 0x1f, 0x04, 0x0c, 0x37, 0x04, 0x0c, 0x18, 0xcc, 0x32, 0x24, 0x43, 0x30, 0x50, 0x21, 0x80, 0x03, 0x71, 0x1c, 0x8e, 0x05, 0x23, 0x18, 0x36, 0x20, 0x02, 0x31, 0x08, 0x00, 0xc7, 0x82, 0x25, 0xcc, 0x32, 0x1c, 0xc8, 0x82, 0x03, 0x19, 0x40, 0xc0, 0x70, 0x43, 0xf0, 0x80, 0xc1, 0x2c, 0x43, 0x61, 0x04, 0x03, 0x15, 0x4c, 0x84, 0xa8, 0x82, 0x31, 0x50, 0x21, 0x44, 0x08, 0x3b, 0x18, 0x8e, 0x05, 0x25, 0xa0, 0x80, 0xc3, 0x0d, 0x94, 0x38, 0x16, 0x90, 0x80, 0x02, 0x0e, 0x17, 0x10, 0x72, 0x01, 0x02, 0xc3, 0x06, 0x44, 0x13, 0x04, 0x00, 0x22, 0x6f, 0x00, 0x01, 0xc3, 0x0d, 0xc1, 0x06, 0x06, 0xb3, 0x0c, 0x07, 0x12, 0x70, 0x1b, 0x04, 0xc4, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x5b, 0x06, 0x22, 0x50, 0x83, 0x2d, 0x43, 0x11, 0xb0, 0xc1, 0x96, 0xc1, 0x08, 0xda, 0x60, 0xcb, 0x70, 0x04, 0x6a, 0xb0, 0x65, 0x40, 0x02, 0x36, 0xd8, 0x32, 0x28, 0x41, 0x1b, 0x6c, 0x19, 0x96, 0x40, 0x0d, 0xb6, 0x0c, 0x4c, 0xc0, 0x06, 0x5b, 0x06, 0x27, 0x70, 0x83, 0x2d, 0x43, 0x14, 0xb8, 0xc1, 0x96, 0x61, 0x0a, 0xde, 0x60, 0xcb, 0x40, 0x05, 0x6f, 0xb0, 0x65, 0xa8, 0x82, 0x37, 0xd8, 0x32, 0x90, 0x81, 0x64, 0x07, 0x5b, 0x86, 0x33, 0x08, 0xea, 0x60, 0xcb, 0xc0, 0x06, 0xd2, 0x1d, 0x6c, 0x19, 0xe0, 0x20, 0xa8, 0x83, 0x2d, 0xc3, 0x1c, 0x04, 0x75, 0xb0, 0x65, 0xb0, 0x83, 0xa0, 0x0e, 0xb6, 0x0c, 0x79, 0x20, 0xe1, 0x01, 0x00, 0x21, 0x31, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0b, 0x86, 0x00, 0x78, 0x85, 0x05, 0x43, 0x00, 0xb8, 0xc2, 0x82, 0x21, 0x00, 0x48, 0x61, 0xc1, 0x10, 0x00, 0x7f, 0xb0, 0xa0, 0x08, 0x00, 0x61, 0xb0, 0x83, 0x05, 0x43, 0x00, 0x6c, 0x13, 0x86, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x24, 0x45, 0x50, 0x02, 0x44, 0x23, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x06, 0x44, 0x02, 0x05, 0x00, 0x00, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x00, 0x00, 0x00, 0x2b, 0x06, 0x3c, 0x88, 0x03, 0x39, 0x58, 0x31, 0xe4, 0x41, 0x1c, 0xc8, 0xc1, 0x8a, 0x41, 0x0f, 0xe2, 0x40, 0x0e, 0x36, 0x0c, 0x77, 0x50, 0x06, 0xd6, 0x86, 0x61, 0x0f, 0xf6, 0xc0, 0x02, 0x00, 0xc3, 0x0d, 0xc6, 0x10, 0x06, 0xc3, 0x0d, 0x85, 0x14, 0x06, 0x27, 0x04, 0x3b, 0xcb, 0x90, 0x04, 0x01, 0x2d, 0x40, 0x28, 0x00, 0x42, 0x0c, 0x10, 0x0a, 0x80, 0x50, 0x00, 0xc4, 0x83, 0xf0, 0x28, 0x14, 0x00, 0xa1, 0x00, 0x08, 0x05, 0x40, 0x7c, 0x0f, 0x47, 0x27, 0x06, 0x14, 0x00, 0xf1, 0x22, 0x04, 0x90, 0xef, 0xc1, 0x00, 0x83, 0x32, 0xa0, 0x00, 0x88, 0x17, 0x21, 0x98, 0xa8, 0x10, 0x42, 0x85, 0x10, 0x1a, 0x84, 0x0c, 0x37, 0x0c, 0x66, 0x00, 0x06, 0xb3, 0x0c, 0x89, 0x10, 0x0c, 0x37, 0x08, 0x67, 0x00, 0x06, 0xc3, 0x0d, 0x04, 0x1a, 0x80, 0xc1, 0x2c, 0xc1, 0x30, 0x50, 0x21, 0xc8, 0x82, 0xb0, 0x14, 0xb3, 0x0c, 0x05, 0x31, 0x5c, 0x50, 0x88, 0x23, 0xc1, 0x0a, 0x6e, 0x40, 0xc4, 0x91, 0x50, 0x05, 0xb3, 0x04, 0x06, 0x16, 0x1f, 0x04, 0x0c, 0x37, 0x04, 0x0c, 0x18, 0xcc, 0x32, 0x24, 0x43, 0x30, 0x50, 0x21, 0x80, 0x03, 0x71, 0x1c, 0x8e, 0x04, 0x23, 0x18, 0x36, 0x20, 0x02, 0x31, 0x18, 0x00, 0x47, 0x82, 0x25, 0xcc, 0x32, 0x1c, 0xc8, 0x82, 0x03, 0x19, 0x40, 0xc0, 0x70, 0x43, 0xf0, 0x80, 0xc1, 0x2c, 0x43, 0x61, 0x04, 0x03, 0x15, 0xc4, 0x83, 0xa8, 0x82, 0x31, 0x50, 0x21, 0x3c, 0x08, 0x3b, 0x18, 0x8e, 0x04, 0x25, 0xa0, 0x80, 0xc6, 0x0d, 0x94, 0x38, 0x12, 0x90, 0x80, 0x02, 0x1a, 0x23, 0x06, 0x07, 0x10, 0x82, 0x60, 0x50, 0x8c, 0x02, 0x11, 0x1c, 0xc3, 0x06, 0x04, 0x13, 0x0c, 0x00, 0x1e, 0x6e, 0x00, 0x01, 0xc3, 0x0d, 0x81, 0x06, 0x06, 0xb3, 0x0c, 0x07, 0x12, 0x30, 0x1b, 0x04, 0xc4, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x5b, 0x06, 0x22, 0x50, 0x83, 0x2d, 0x43, 0x11, 0xb0, 0xc1, 0x96, 0xc1, 0x08, 0xda, 0x60, 0xcb, 0x70, 0x04, 0x6a, 0xb0, 0x65, 0x40, 0x02, 0x36, 0xd8, 0x32, 0x28, 0x41, 0x1b, 0x6c, 0x19, 0x96, 0x40, 0x0d, 0xb6, 0x0c, 0x4c, 0xc0, 0x06, 0x5b, 0x06, 0x27, 0x70, 0x83, 0x2d, 0x43, 0x14, 0xb8, 0xc1, 0x96, 0x61, 0x0a, 0xde, 0x60, 0xcb, 0x40, 0x05, 0x6f, 0xb0, 0x65, 0xa8, 0x82, 0x37, 0xd8, 0x32, 0x90, 0x81, 0x74, 0x07, 0x5b, 0x86, 0x33, 0x08, 0xf6, 0x60, 0xcb, 0xc0, 0x06, 0x12, 0x1e, 0x6c, 0x19, 0xe0, 0x20, 0xd8, 0x83, 0x2d, 0xc3, 0x1c, 0x04, 0x7b, 0xb0, 0x65, 0xa8, 0x83, 0x60, 0x0f, 0xb6, 0x0c, 0x78, 0x20, 0xe5, 0x01, 0x00, 0x21, 0x31, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0b, 0x86, 0x00, 0x70, 0x85, 0x05, 0x43, 0x00, 0xb4, 0xc2, 0x82, 0x21, 0x00, 0x48, 0x61, 0xc1, 0x10, 0x00, 0x7f, 0xb0, 0xa0, 0x08, 0x00, 0x61, 0xb0, 0x83, 0x05, 0x43, 0x00, 0x6c, 0x13, 0x86, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x24, 0x45, 0x50, 0x02, 0x64, 0x23, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x06, 0x84, 0x02, 0x06, 0x00, 0x00, 0x00, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x00, 0x00, 0x2b, 0x06, 0x3c, 0x88, 0x03, 0x39, 0x58, 0x31, 0xe4, 0x41, 0x1c, 0xc8, 0xc1, 0x8a, 0x41, 0x0f, 0xe2, 0x40, 0x0e, 0x36, 0x0c, 0x77, 0x50, 0x06, 0xd6, 0x86, 0x61, 0x0f, 0xf6, 0xc0, 0x02, 0x00, 0xc3, 0x0d, 0xc6, 0x10, 0x06, 0xc3, 0x0d, 0x85, 0x14, 0x06, 0x27, 0x04, 0x3b, 0xcb, 0x90, 0x04, 0x01, 0x2d, 0x40, 0x28, 0x00, 0x42, 0x0c, 0x10, 0x0a, 0x80, 0x50, 0x00, 0xc4, 0x83, 0xf0, 0x28, 0x14, 0x00, 0xa1, 0x00, 0x08, 0x05, 0x40, 0x7c, 0x0f, 0x47, 0x27, 0x06, 0x14, 0x00, 0xf1, 0x22, 0x04, 0x90, 0xef, 0xc1, 0x00, 0x83, 0x32, 0xa0, 0x00, 0x88, 0x17, 0x21, 0x98, 0xa8, 0x10, 0x42, 0x85, 0x10, 0x1a, 0x84, 0x0c, 0x37, 0x0c, 0x66, 0x00, 0x06, 0xb3, 0x0c, 0x89, 0x10, 0x0c, 0x37, 0x08, 0x67, 0x00, 0x06, 0xc3, 0x0d, 0x04, 0x1a, 0x80, 0xc1, 0x2c, 0xc1, 0x30, 0x50, 0x21, 0xc8, 0x82, 0xb0, 0x14, 0xb3, 0x0c, 0x05, 0x31, 0x5c, 0x50, 0x88, 0x33, 0xc1, 0x0a, 0x6e, 0x40, 0xc4, 0x99, 0x50, 0x05, 0xb3, 0x04, 0x06, 0x16, 0x1f, 0x04, 0x0c, 0x37, 0x04, 0x0c, 0x18, 0xcc, 0x32, 0x24, 0x43, 0x30, 0x50, 0x21, 0x80, 0x03, 0x71, 0x1c, 0xce, 0x04, 0x23, 0x18, 0x36, 0x20, 0x02, 0x31, 0x20, 0x00, 0x67, 0x82, 0x25, 0xcc, 0x32, 0x1c, 0xc8, 0x82, 0x03, 0x19, 0x40, 0xc0, 0x70, 0x43, 0xf0, 0x80, 0xc1, 0x2c, 0x43, 0x61, 0x04, 0x03, 0x15, 0xc6, 0x83, 0xa8, 0x82, 0x31, 0x50, 0x21, 0x3c, 0x08, 0x3b, 0x18, 0xce, 0x04, 0x25, 0xa0, 0xc0, 0xc8, 0x0d, 0x94, 0x38, 0x13, 0x90, 0x80, 0x02, 0x23, 0x23, 0x06, 0x07, 0x10, 0x82, 0x60, 0x70, 0x88, 0x02, 0x11, 0x1c, 0xc3, 0x06, 0x04, 0x13, 0x10, 0x00, 0x1e, 0x6e, 0x00, 0x01, 0xc3, 0x0d, 0x81, 0x06, 0x06, 0xb3, 0x0c, 0x07, 0x12, 0x30, 0x1b, 0x04, 0xc4, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x5b, 0x06, 0x22, 0x50, 0x83, 0x2d, 0x43, 0x11, 0xb0, 0xc1, 0x96, 0xc1, 0x08, 0xda, 0x60, 0xcb, 0x70, 0x04, 0x6a, 0xb0, 0x65, 0x40, 0x02, 0x36, 0xd8, 0x32, 0x28, 0x41, 0x1b, 0x6c, 0x19, 0x96, 0x40, 0x0d, 0xb6, 0x0c, 0x4c, 0xc0, 0x06, 0x5b, 0x06, 0x27, 0x70, 0x83, 0x2d, 0x43, 0x14, 0xb8, 0xc1, 0x96, 0x61, 0x0a, 0xde, 0x60, 0xcb, 0x40, 0x05, 0x6f, 0xb0, 0x65, 0xa8, 0x82, 0x37, 0xd8, 0x32, 0x90, 0x81, 0x74, 0x07, 0x5b, 0x86, 0x33, 0x08, 0xf6, 0x60, 0xcb, 0xc0, 0x06, 0x12, 0x1e, 0x6c, 0x19, 0xe0, 0x20, 0xd8, 0x83, 0x2d, 0xc3, 0x1c, 0x04, 0x7b, 0xb0, 0x65, 0xa8, 0x83, 0x60, 0x0f, 0xb6, 0x0c, 0x78, 0x20, 0xe5, 0x01, 0x00, 0x21, 0x31, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0b, 0x86, 0x00, 0x70, 0x85, 0x05, 0x43, 0x00, 0xb4, 0xc2, 0x82, 0x21, 0x00, 0x48, 0x61, 0xc1, 0x10, 0x00, 0x7f, 0xb0, 0xa0, 0x08, 0x00, 0x61, 0xb0, 0x83, 0x05, 0x43, 0x00, 0x6c, 0x13, 0x86, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x24, 0x45, 0x50, 0x02, 0xe4, 0x23, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x2b, 0x86, 0x3b, 0x88, 0x03, 0x39, 0x58, 0x31, 0xe0, 0x41, 0x1c, 0xc8, 0xc1, 0x8a, 0x21, 0x0f, 0xe2, 0x40, 0x0e, 0x00, 0xc3, 0x0d, 0xc6, 0x10, 0x06, 0xc3, 0x0d, 0x85, 0x14, 0x06, 0x27, 0x04, 0x3b, 0xcb, 0x90, 0x04, 0x01, 0x2d, 0x40, 0x28, 0x00, 0x42, 0x0c, 0x10, 0x0a, 0x80, 0x50, 0x00, 0xc4, 0x83, 0xf0, 0x28, 0x14, 0x00, 0xa1, 0x00, 0x08, 0x05, 0x40, 0x7c, 0x0f, 0x47, 0x27, 0x06, 0x14, 0x00, 0xf1, 0x22, 0x04, 0x90, 0xef, 0xc1, 0x00, 0x83, 0x32, 0xa0, 0x00, 0x88, 0x17, 0x21, 0x98, 0xa8, 0x10, 0x42, 0x85, 0x10, 0x1a, 0x84, 0x0c, 0x37, 0x0c, 0x66, 0x00, 0x06, 0xb3, 0x0c, 0x89, 0x10, 0x0c, 0x37, 0x08, 0x67, 0x00, 0x06, 0xc3, 0x0d, 0x04, 0x1a, 0x80, 0xc1, 0x2c, 0xc1, 0x30, 0x50, 0x21, 0xc8, 0x82, 0xb0, 0x14, 0xb3, 0x0c, 0x05, 0x31, 0x5c, 0x50, 0x88, 0x73, 0xc1, 0x0a, 0x6e, 0x40, 0xc4, 0xb9, 0x50, 0x05, 0xb3, 0x04, 0x06, 0x16, 0x1f, 0x04, 0x0c, 0x37, 0x04, 0x0c, 0x18, 0xcc, 0x32, 0x24, 0x43, 0x30, 0x50, 0x21, 0x80, 0x03, 0x71, 0x1c, 0xce, 0x05, 0x23, 0x18, 0x36, 0x20, 0x02, 0x31, 0x10, 0x00, 0xe7, 0x82, 0x25, 0xcc, 0x32, 0x1c, 0xc8, 0x82, 0x03, 0x19, 0x40, 0xc0, 0x70, 0x43, 0xf0, 0x80, 0xc1, 0x2c, 0x43, 0x61, 0x04, 0x03, 0x15, 0x4e, 0x84, 0xa8, 0x82, 0x31, 0x50, 0x21, 0x44, 0x08, 0x3b, 0x18, 0xce, 0x05, 0x25, 0xa0, 0xc0, 0xc5, 0x0d, 0x94, 0x38, 0x17, 0x90, 0x80, 0x02, 0x17, 0x17, 0x10, 0x72, 0x01, 0x02, 0xc3, 0x06, 0x44, 0x13, 0x08, 0x00, 0x22, 0x6f, 0x00, 0x01, 0xc3, 0x0d, 0xc1, 0x06, 0x06, 0xb3, 0x0c, 0x07, 0x12, 0x70, 0x1b, 0x04, 0xc4, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x5b, 0x06, 0x22, 0x50, 0x83, 0x2d, 0x43, 0x11, 0xb0, 0xc1, 0x96, 0xc1, 0x08, 0xda, 0x60, 0xcb, 0x70, 0x04, 0x6a, 0xb0, 0x65, 0x40, 0x02, 0x36, 0xd8, 0x32, 0x28, 0x41, 0x1b, 0x6c, 0x19, 0x96, 0x40, 0x0d, 0xb6, 0x0c, 0x4c, 0xc0, 0x06, 0x5b, 0x06, 0x27, 0x70, 0x83, 0x2d, 0x43, 0x14, 0xb8, 0xc1, 0x96, 0x61, 0x0a, 0xde, 0x60, 0xcb, 0x40, 0x05, 0x6f, 0xb0, 0x65, 0xa8, 0x82, 0x37, 0xd8, 0x32, 0x90, 0x81, 0x64, 0x07, 0x5b, 0x86, 0x33, 0x08, 0xe6, 0x60, 0xcb, 0xc0, 0x06, 0xd2, 0x1d, 0x6c, 0x19, 0xe0, 0x20, 0x98, 0x83, 0x2d, 0xc3, 0x1c, 0x04, 0x73, 0xb0, 0x65, 0xb0, 0x83, 0x60, 0x0e, 0xb6, 0x0c, 0x79, 0x20, 0xe1, 0x01, 0x00, 0x21, 0x31, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x86, 0x00, 0x78, 0x85, 0x05, 0x43, 0x00, 0xb8, 0xc2, 0x82, 0x21, 0x00, 0x48, 0x61, 0x41, 0x01, 0x08, 0xc1, 0x10, 0x06, 0x0b, 0x86, 0x00, 0xf8, 0x83, 0x05, 0x45, 0x00, 0x08, 0x83, 0x1d, 0x2c, 0x18, 0x02, 0x60, 0x9b, 0x30, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x24, 0x45, 0x50, 0x02, 0x94, 0x23, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x2b, 0x86, 0x3b, 0x88, 0x03, 0x39, 0x58, 0x31, 0xe0, 0x41, 0x1c, 0xc8, 0xc1, 0x8a, 0x21, 0x0f, 0xe2, 0x40, 0x0e, 0x00, 0xc3, 0x0d, 0xc6, 0x10, 0x06, 0xc3, 0x0d, 0x85, 0x14, 0x06, 0x27, 0x04, 0x3b, 0xcb, 0x90, 0x04, 0x01, 0x2d, 0x40, 0x28, 0x00, 0x42, 0x0c, 0x10, 0x0a, 0x80, 0x50, 0x00, 0xc4, 0x83, 0xf0, 0x28, 0x14, 0x00, 0xa1, 0x00, 0x08, 0x05, 0x40, 0x7c, 0x0f, 0x47, 0x27, 0x06, 0x14, 0x00, 0xf1, 0x22, 0x04, 0x90, 0xef, 0xc1, 0x00, 0x83, 0x32, 0xa0, 0x00, 0x88, 0x17, 0x21, 0x98, 0xa8, 0x10, 0x42, 0x85, 0x10, 0x1a, 0x84, 0x0c, 0x37, 0x0c, 0x66, 0x00, 0x06, 0xb3, 0x0c, 0x89, 0x10, 0x0c, 0x37, 0x08, 0x67, 0x00, 0x06, 0xc3, 0x0d, 0x04, 0x1a, 0x80, 0xc1, 0x2c, 0xc1, 0x30, 0x50, 0x21, 0xc8, 0x82, 0xb0, 0x14, 0xb3, 0x0c, 0x05, 0x31, 0x5c, 0x50, 0x88, 0x4b, 0xc1, 0x0a, 0x6e, 0x40, 0xc4, 0xa5, 0x50, 0x05, 0xb3, 0x04, 0x06, 0x16, 0x1f, 0x04, 0x0c, 0x37, 0x04, 0x0c, 0x18, 0xcc, 0x32, 0x24, 0x43, 0x30, 0x50, 0x21, 0x80, 0x03, 0x71, 0x1c, 0x2e, 0x05, 0x23, 0x18, 0x36, 0x20, 0x02, 0x31, 0x18, 0x00, 0x97, 0x82, 0x25, 0xcc, 0x32, 0x1c, 0xc8, 0x82, 0x03, 0x19, 0x40, 0xc0, 0x70, 0x43, 0xf0, 0x80, 0xc1, 0x2c, 0x43, 0x61, 0x04, 0x03, 0x15, 0x49, 0x84, 0xa8, 0x82, 0x31, 0x50, 0x21, 0x44, 0x08, 0x3b, 0x18, 0x2e, 0x05, 0x25, 0xa0, 0x20, 0xc7, 0x0d, 0x94, 0xb8, 0x14, 0x90, 0x80, 0x82, 0x1c, 0x17, 0x10, 0x72, 0x01, 0x02, 0xc3, 0x06, 0x44, 0x13, 0x0c, 0x00, 0x22, 0x6f, 0x00, 0x01, 0xc3, 0x0d, 0xc1, 0x06, 0x06, 0xb3, 0x0c, 0x07, 0x12, 0x70, 0x1b, 0x04, 0xc4, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x5b, 0x06, 0x22, 0x50, 0x83, 0x2d, 0x43, 0x11, 0xb0, 0xc1, 0x96, 0xc1, 0x08, 0xda, 0x60, 0xcb, 0x70, 0x04, 0x6a, 0xb0, 0x65, 0x40, 0x02, 0x36, 0xd8, 0x32, 0x28, 0x41, 0x1b, 0x6c, 0x19, 0x96, 0x40, 0x0d, 0xb6, 0x0c, 0x4c, 0xc0, 0x06, 0x5b, 0x06, 0x27, 0x70, 0x83, 0x2d, 0x43, 0x14, 0xb8, 0xc1, 0x96, 0x61, 0x0a, 0xde, 0x60, 0xcb, 0x40, 0x05, 0x6f, 0xb0, 0x65, 0xa8, 0x82, 0x37, 0xd8, 0x32, 0x90, 0x81, 0x64, 0x07, 0x5b, 0x86, 0x33, 0x08, 0xe8, 0x60, 0xcb, 0xc0, 0x06, 0xd2, 0x1d, 0x6c, 0x19, 0xe0, 0x20, 0xa0, 0x83, 0x2d, 0xc3, 0x1c, 0x04, 0x74, 0xb0, 0x65, 0xb0, 0x83, 0x80, 0x0e, 0xb6, 0x0c, 0x79, 0x20, 0xe1, 0x01, 0x00, 0x21, 0x31, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x86, 0x00, 0x78, 0x85, 0x05, 0x43, 0x00, 0xb8, 0xc2, 0x82, 0x21, 0x00, 0x48, 0x61, 0x41, 0x01, 0x08, 0xc1, 0x10, 0x06, 0x0b, 0x86, 0x00, 0xf8, 0x83, 0x05, 0x45, 0x00, 0x08, 0x83, 0x1d, 0x2c, 0x18, 0x02, 0x60, 0x9b, 0x30, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x24, 0x45, 0x50, 0x02, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x2b, 0x86, 0x3b, 0x88, 0x03, 0x39, 0x58, 0x31, 0xe0, 0x41, 0x1c, 0xc8, 0xc1, 0x8a, 0x21, 0x0f, 0xe2, 0x40, 0x0e, 0x00, 0xc3, 0x0d, 0x85, 0x10, 0x06, 0xc3, 0x0d, 0x44, 0x14, 0x06, 0x27, 0x04, 0x3b, 0xcb, 0x90, 0x04, 0x01, 0x29, 0x40, 0x28, 0x00, 0x42, 0x0b, 0x10, 0x0a, 0x80, 0x50, 0x00, 0xc4, 0x83, 0xe0, 0x24, 0x14, 0x00, 0xa1, 0x00, 0x08, 0x05, 0x40, 0x7c, 0x0f, 0x07, 0x17, 0x06, 0x14, 0x00, 0xf1, 0x22, 0x04, 0x8f, 0xef, 0xc1, 0xf8, 0xc8, 0x80, 0x02, 0x20, 0x5e, 0x84, 0x40, 0xa2, 0x42, 0x08, 0x15, 0x42, 0x68, 0x10, 0x32, 0xdc, 0x30, 0x94, 0x01, 0x18, 0xcc, 0x32, 0x24, 0x42, 0x30, 0xdc, 0x20, 0x98, 0x01, 0x18, 0x0c, 0x37, 0x10, 0x67, 0x00, 0x06, 0xb3, 0x04, 0xc3, 0x40, 0x85, 0x00, 0x0b, 0xc2, 0x52, 0xcc, 0x32, 0x14, 0xc4, 0x70, 0x41, 0x21, 0x4e, 0x04, 0x2b, 0xb8, 0x01, 0x11, 0x27, 0x42, 0x15, 0xcc, 0x12, 0x18, 0x58, 0x78, 0x10, 0x30, 0xdc, 0x10, 0x30, 0x60, 0x30, 0xcb, 0x90, 0x0c, 0xc1, 0x40, 0x85, 0xe0, 0x0b, 0xc4, 0x71, 0x38, 0x11, 0x8c, 0x60, 0xd8, 0x80, 0x08, 0xe2, 0x80, 0x00, 0x9c, 0x08, 0x96, 0x30, 0xcb, 0x70, 0x20, 0x0b, 0x0e, 0x63, 0x00, 0x01, 0xc3, 0x0d, 0xc1, 0x03, 0x06, 0xb3, 0x0c, 0x85, 0x11, 0x0c, 0x54, 0x08, 0x11, 0x82, 0x0e, 0xc6, 0x40, 0x85, 0x10, 0x21, 0xea, 0x60, 0x38, 0x11, 0x94, 0x80, 0x02, 0x21, 0x37, 0x50, 0xe2, 0x44, 0x40, 0x02, 0x0a, 0x84, 0x5c, 0x40, 0xc8, 0x05, 0x08, 0x0c, 0x1b, 0x10, 0x4d, 0x40, 0x00, 0x88, 0xb8, 0x01, 0x04, 0x0c, 0x37, 0x04, 0x1b, 0x18, 0xcc, 0x32, 0x1c, 0x48, 0xc0, 0x6d, 0x10, 0x10, 0x03, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x5b, 0x06, 0x22, 0x50, 0x83, 0x2d, 0x43, 0x11, 0xb0, 0xc1, 0x96, 0xc1, 0x08, 0xda, 0x60, 0xcb, 0x70, 0x04, 0x6a, 0xb0, 0x65, 0x40, 0x02, 0x36, 0xd8, 0x32, 0x28, 0x41, 0x1b, 0x6c, 0x19, 0x96, 0x40, 0x0d, 0xb6, 0x0c, 0x4c, 0xc0, 0x06, 0x5b, 0x06, 0x27, 0x70, 0x83, 0x2d, 0x43, 0x14, 0xb8, 0xc1, 0x96, 0x61, 0x0a, 0xde, 0x60, 0xcb, 0x40, 0x05, 0x6f, 0xb0, 0x65, 0xa8, 0x82, 0x37, 0xd8, 0x32, 0x90, 0x81, 0x64, 0x07, 0x5b, 0x86, 0x33, 0x08, 0xde, 0x60, 0xcb, 0xc0, 0x06, 0xd2, 0x1d, 0x6c, 0x19, 0xe0, 0x20, 0x78, 0x83, 0x2d, 0xc3, 0x1c, 0x04, 0x6f, 0xb0, 0x65, 0xb0, 0x83, 0xe0, 0x0d, 0xb6, 0x0c, 0x79, 0x20, 0xe1, 0x01, 0x00, 0x21, 0x31, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0b, 0x86, 0x00, 0x70, 0x85, 0x05, 0x43, 0x00, 0xb4, 0xc2, 0x82, 0x21, 0x00, 0x46, 0x61, 0xc1, 0x10, 0x00, 0x7e, 0xb0, 0xa0, 0x08, 0x00, 0x61, 0xa8, 0x83, 0x05, 0x43, 0x00, 0x6c, 0x13, 0x86, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x24, 0x45, 0x50, 0x02, 0xc4, 0x23, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x2b, 0x86, 0x3b, 0x88, 0x03, 0x39, 0x58, 0x31, 0xe0, 0x41, 0x1c, 0xc8, 0xc1, 0x8a, 0x21, 0x0f, 0xe2, 0x40, 0x0e, 0x00, 0xc3, 0x0d, 0xc6, 0x10, 0x06, 0xc3, 0x0d, 0x85, 0x14, 0x06, 0x27, 0x04, 0x3b, 0xcb, 0x90, 0x04, 0x01, 0x2d, 0x40, 0x28, 0x00, 0x42, 0x0c, 0x10, 0x0a, 0x80, 0x50, 0x00, 0xc4, 0x83, 0xf0, 0x28, 0x14, 0x00, 0xa1, 0x00, 0x08, 0x05, 0x40, 0x7c, 0x0f, 0x47, 0x27, 0x06, 0x14, 0x00, 0xf1, 0x22, 0x04, 0x90, 0xef, 0xc1, 0x00, 0x83, 0x32, 0xa0, 0x00, 0x88, 0x17, 0x21, 0x98, 0xa8, 0x10, 0x42, 0x85, 0x10, 0x1a, 0x84, 0x0c, 0x37, 0x0c, 0x66, 0x00, 0x06, 0xb3, 0x0c, 0x89, 0x10, 0x0c, 0x37, 0x08, 0x67, 0x00, 0x06, 0xc3, 0x0d, 0x04, 0x1a, 0x80, 0xc1, 0x2c, 0xc1, 0x30, 0x50, 0x21, 0xc8, 0x82, 0xb0, 0x14, 0xb3, 0x0c, 0x05, 0x31, 0x5c, 0x50, 0x88, 0x63, 0xc1, 0x0a, 0x6e, 0x40, 0xc4, 0xb1, 0x50, 0x05, 0xb3, 0x04, 0x06, 0x16, 0x1f, 0x04, 0x0c, 0x37, 0x04, 0x0c, 0x18, 0xcc, 0x32, 0x24, 0x43, 0x30, 0x50, 0x21, 0x80, 0x03, 0x71, 0x1c, 0x8e, 0x05, 0x23, 0x18, 0x36, 0x20, 0x02, 0x31, 0x08, 0x00, 0xc7, 0x82, 0x25, 0xcc, 0x32, 0x1c, 0xc8, 0x82, 0x03, 0x19, 0x40, 0xc0, 0x70, 0x43, 0xf0, 0x80, 0xc1, 0x2c, 0x43, 0x61, 0x04, 0x03, 0x15, 0x4c, 0x84, 0xa8, 0x82, 0x31, 0x50, 0x21, 0x44, 0x08, 0x3b, 0x18, 0x8e, 0x05, 0x25, 0xa0, 0x80, 0xc3, 0x0d, 0x94, 0x38, 0x16, 0x90, 0x80, 0x02, 0x0e, 0x17, 0x10, 0x72, 0x01, 0x02, 0xc3, 0x06, 0x44, 0x13, 0x04, 0x00, 0x22, 0x6f, 0x00, 0x01, 0xc3, 0x0d, 0xc1, 0x06, 0x06, 0xb3, 0x0c, 0x07, 0x12, 0x70, 0x1b, 0x04, 0xc4, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x5b, 0x06, 0x22, 0x50, 0x83, 0x2d, 0x43, 0x11, 0xb0, 0xc1, 0x96, 0xc1, 0x08, 0xda, 0x60, 0xcb, 0x70, 0x04, 0x6a, 0xb0, 0x65, 0x40, 0x02, 0x36, 0xd8, 0x32, 0x28, 0x41, 0x1b, 0x6c, 0x19, 0x96, 0x40, 0x0d, 0xb6, 0x0c, 0x4c, 0xc0, 0x06, 0x5b, 0x06, 0x27, 0x70, 0x83, 0x2d, 0x43, 0x14, 0xb8, 0xc1, 0x96, 0x61, 0x0a, 0xde, 0x60, 0xcb, 0x40, 0x05, 0x6f, 0xb0, 0x65, 0xa8, 0x82, 0x37, 0xd8, 0x32, 0x90, 0x81, 0x64, 0x07, 0x5b, 0x86, 0x33, 0x08, 0xea, 0x60, 0xcb, 0xc0, 0x06, 0xd2, 0x1d, 0x6c, 0x19, 0xe0, 0x20, 0xa8, 0x83, 0x2d, 0xc3, 0x1c, 0x04, 0x75, 0xb0, 0x65, 0xb0, 0x83, 0xa0, 0x0e, 0xb6, 0x0c, 0x79, 0x20, 0xe1, 0x01, 0x00, 0x21, 0x31, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x0b, 0x86, 0x00, 0x78, 0x85, 0x05, 0x43, 0x00, 0xb8, 0xc2, 0x82, 0x21, 0x00, 0x48, 0x61, 0x41, 0x01, 0x08, 0xc1, 0x10, 0x06, 0x0b, 0x86, 0x00, 0xf8, 0x83, 0x05, 0x45, 0x00, 0x08, 0x83, 0x1d, 0x2c, 0xe8, 0x03, 0x21, 0x00, 0xbc, 0x0f, 0x0c, 0x0a, 0x62, 0x08, 0x03, 0x31, 0x18, 0x03, 0xe4, 0x30, 0xc8, 0xa0, 0x0c, 0xcc, 0x60, 0x51, 0x92, 0x33, 0x40, 0x83, 0x34, 0x70, 0x1a, 0x46, 0x0d, 0xd6, 0x80, 0x0d, 0x22, 0xe8, 0x69, 0x03, 0x37, 0x78, 0x03, 0x6a, 0x92, 0xe0, 0x20, 0x0e, 0xe4, 0xe0, 0xb2, 0xaa, 0x39, 0xa0, 0x83, 0x3a, 0xd0, 0x32, 0xcc, 0x0e, 0xee, 0x00, 0x0f, 0x3a, 0x6e, 0xcb, 0x03, 0x3d, 0xd8, 0x03, 0x30, 0x58, 0xf0, 0x0b, 0x00, 0xd3, 0x38, 0x0f, 0x04, 0x0a, 0xa1, 0x40, 0x0b, 0x81, 0x30, 0x45, 0x12, 0x55, 0x59, 0xa2, 0x30, 0x0a, 0xb5, 0x30, 0x5c, 0x58, 0xa6, 0x6d, 0xa4, 0x50, 0x0a, 0xb6, 0x40, 0x70, 0x9d, 0xf7, 0x81, 0x81, 0x29, 0x9c, 0xc2, 0x2d, 0x14, 0x61, 0x20, 0x06, 0x63, 0x40, 0x06, 0x65, 0x80, 0x0a, 0xa9, 0x80, 0x0b, 0x86, 0x19, 0x9c, 0x01, 0x1a, 0xa4, 0x81, 0x1a, 0xa8, 0xc2, 0x2a, 0xe4, 0xc2, 0xb1, 0x06, 0x6c, 0xd0, 0x06, 0x6e, 0xf0, 0x06, 0xac, 0xd0, 0x0a, 0xba, 0x80, 0x24, 0x72, 0x00, 0x07, 0x71, 0x30, 0x07, 0x74, 0x50, 0x07, 0xae, 0xf0, 0x0a, 0xbb, 0xa0, 0xd8, 0xc1, 0x1d, 0xe0, 0x41, 0x1e, 0xe8, 0x01, 0x2c, 0xc4, 0x02, 0x2f, 0x2c, 0x7b, 0xc0, 0x07, 0x7d, 0xe0, 0x07, 0x7f, 0x20, 0x0b, 0xb3, 0xd0, 0x0b, 0xd1, 0x82, 0x21, 0x00, 0xb6, 0x09, 0x43, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0x8b, 0x05, 0x18, 0x80, 0x5f, 0x80, 0x02, 0xe6, 0x06, 0x38, 0x40, 0x7d, 0x80, 0x04, 0xc1, 0x08, 0x58, 0x80, 0x9b, 0x80, 0x06, 0xaf, 0x0a, 0x78, 0xe0, 0xb9, 0x80, 0x08, 0x8d, 0x0c, 0x98, 0xa0, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0xf8, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x2c, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0x7f, 0x02, 0x00, 0x00, 0x00, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x6f, 0x70, 0x5f, 0x30, 0x30, 0x30, 0x34, 0x30, 0x30, 0x30, 0x31, 0x5f, 0x31, 0x5f, 0x31, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x6f, 0x70, 0x5f, 0x30, 0x30, 0x30, 0x34, 0x30, 0x30, 0x30, 0x31, 0x5f, 0x32, 0x5f, 0x32, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x6f, 0x70, 0x5f, 0x30, 0x30, 0x30, 0x34, 0x30, 0x30, 0x30, 0x31, 0x5f, 0x33, 0x5f, 0x33, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x6f, 0x70, 0x5f, 0x30, 0x30, 0x30, 0x34, 0x30, 0x30, 0x30, 0x31, 0x5f, 0x30, 0x5f, 0x30, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x6f, 0x70, 0x5f, 0x30, 0x30, 0x30, 0x34, 0x30, 0x30, 0x30, 0x31, 0x5f, 0x38, 0x5f, 0x38, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x6f, 0x70, 0x5f, 0x30, 0x30, 0x30, 0x34, 0x30, 0x30, 0x30, 0x31, 0x5f, 0x39, 0x5f, 0x39, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x6f, 0x70, 0x5f, 0x30, 0x30, 0x30, 0x34, 0x30, 0x30, 0x30, 0x31, 0x5f, 0x35, 0x5f, 0x35, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x6f, 0x70, 0x5f, 0x30, 0x30, 0x30, 0x34, 0x30, 0x30, 0x30, 0x31, 0x5f, 0x36, 0x5f, 0x36, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x6f, 0x70, 0x5f, 0x30, 0x30, 0x30, 0x34, 0x30, 0x30, 0x30, 0x31, 0x5f, 0x37, 0x5f, 0x37, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x6f, 0x70, 0x5f, 0x30, 0x30, 0x30, 0x34, 0x30, 0x30, 0x30, 0x31, 0x5f, 0x34, 0x5f, 0x34, 0x6c, 0x6c, 0x76, 0x6d, 0x2e, 0x66, 0x6d, 0x75, 0x6c, 0x61, 0x64, 0x64, 0x2e, 0x66, 0x33, 0x32, 0x6c, 0x6c, 0x76, 0x6d, 0x2e, 0x66, 0x6d, 0x75, 0x6c, 0x61, 0x64, 0x64, 0x2e, 0x66, 0x36, 0x34, 0x31, 0x38, 0x2e, 0x31, 0x2e, 0x33, 0x78, 0x38, 0x36, 0x5f, 0x36, 0x34, 0x2d, 0x70, 0x63, 0x2d, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2d, 0x67, 0x6e, 0x75, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x2d, 0x6f, 0x70, 0x2d, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x44, 0x56, 0x6f, 0x53, 0x70, 0x34, 0x2f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00 }; boolean tensor_jit_bitcode_find( uint32 id, dtype_t output_dtype, dtype_t input_dtype, const char **name, const uint8 **data, extent *size) { if (!name || !data || !size) return true; *data = tensor_operations_bc; *size = sizeof(tensor_operations_bc); switch (id) { case 0x00040001u: if (output_dtype == 1 && input_dtype == 1) { *name = "tensor_op_00040001_1_1"; return false; } if (output_dtype == 2 && input_dtype == 2) { *name = "tensor_op_00040001_2_2"; return false; } if (output_dtype == 3 && input_dtype == 3) { *name = "tensor_op_00040001_3_3"; return false; } if (output_dtype == 0 && input_dtype == 0) { *name = "tensor_op_00040001_0_0"; return false; } if (output_dtype == 8 && input_dtype == 8) { *name = "tensor_op_00040001_8_8"; return false; } if (output_dtype == 9 && input_dtype == 9) { *name = "tensor_op_00040001_9_9"; return false; } if (output_dtype == 5 && input_dtype == 5) { *name = "tensor_op_00040001_5_5"; return false; } if (output_dtype == 6 && input_dtype == 6) { *name = "tensor_op_00040001_6_6"; return false; } if (output_dtype == 7 && input_dtype == 7) { *name = "tensor_op_00040001_7_7"; return false; } if (output_dtype == 4 && input_dtype == 4) { *name = "tensor_op_00040001_4_4"; return false; } return true; default: return true; } } boolean tensor_jit_is_pointwise(uint32 id) { switch (id) { case 0x00040001u: return false; default: return false; } } boolean tensor_profile_has_operation_count(uint32 id) { switch (id) { case 0x00040001u: return true; default: return false; } } uint64 tensor_profile_operation_count( uint32 id, const tensor *output, const tensor *const *inputs, extent input_count, const void *parameters) { switch (id) { case 0x00040001u: { if (!output || input_count != 2) return 0; (void)parameters; extent M = inputs[0]->shape[0]; extent K = inputs[0]->shape[1]; extent N = inputs[1]->shape[1]; if (true) return (uint64)(2 * M * N * K); if (true) return (uint64)(2 * M * N * K); if (true) return (uint64)(2 * M * N * K); return 0; } default: return 0; } } ================================================================================ STEP 16 — PIPELINE SUMMARY ================================================================================ SOURCE matrix_mul.op | v LEXER lexer.lex() | +--> Line +--> AlgorithmBlock | v PARSER parser.parse() | v Operation AST | +--> TypeDef +--> DeviceDef +--> DimensionDef +--> ShapeDef +--> ValueDecl +--> Algorithm +--> Hints | v VALIDATOR validator.validate() | v ValidatedOperation | +--> resolved dtype sets +--> resolved shapes +--> resolved values +--> validated algorithms | v SPECIALIZATION ir._assignments() | v one concrete function family per dtype assignment | v C LOWERING generated bindings generated helpers generated dispatch generated pointwise loops | v operations.c | v CLANG clang-18 -emit-llvm | v operations.bc | +------------------+ | | v v textual LLVM IR registry.py | v registry.c ================================================================================