Compare commits

...

9 Commits

Author SHA1 Message Date
Ed_
e2aba6db5f adjustments based on superluminal 2025-10-03 23:13:04 -04:00
Ed_
af38cda276 C-- lottes: drafting pass: removed all usages of star "*" dereference operator 2025-10-03 22:46:21 -04:00
Ed_
8df492399f Got lottes c-- version working 2025-10-03 22:09:11 -04:00
Ed_
2c0539e235 finish draft of lottes c-- veersion 2025-10-03 19:59:15 -04:00
Ed_
3223c0a0e1 Lottes C--: key tables... 2025-10-03 17:03:33 -04:00
Ed_
0bd68bccf0 lottes c--: arena impl 2025-10-03 16:18:03 -04:00
Ed_
5f03118a0d got to varenas (lottes c--)
Still not sure how hybrid I'm going to go (away from his more purist stance on typed info embedding).

If I were to codegen this and wanted typeless vs typed for debug it would be easier to malleablly switch between...
If I decide for this sample to go full asm (no C features almost we can still keep the type info for debug...
2025-10-03 15:56:42 -04:00
Ed_
288d661d65 started to work on c-- lottes impl 2025-10-03 03:19:50 -04:00
Ed_
40ee07e3cc finished header port for lottes c-- 2025-10-03 03:04:40 -04:00
5 changed files with 1837 additions and 185 deletions

1
.gitignore vendored
View File

@@ -5,3 +5,4 @@ C/watl.v0.msvc.c.listing.txt
watl_exercise.user watl_exercise.user
watl_exercise.proj watl_exercise.proj
Odin/watl.v0.win32.odin.listing.txt Odin/watl.v0.win32.odin.listing.txt
C/watl.v0.lottes.c.listing.txt

File diff suppressed because it is too large Load Diff

View File

@@ -1367,22 +1367,22 @@ void arena_allocator_proc(AllocatorProc_In in, AllocatorProc_Out* out)
#pragma endregion Arena #pragma endregion Arena
#pragma region Key Table 1-Layer Linear (KT1L) #pragma region Key Table 1-Layer Linear (KT1L)
void kt1l__populate_slice_a2(KT1L_Byte* kt, AllocatorInfo backing, KT1L_Meta m, Slice_Byte values, SSIZE num_values ) { void kt1l__populate_slice_a2(KT1L_Byte*restrict kt, AllocatorInfo backing, KT1L_Meta m, Slice_Byte values, SSIZE num_values ) {
assert(kt != nullptr); assert(kt != nullptr);
if (num_values == 0) { return; } if (num_values == 0) { return; }
* kt = alloc_slice(backing, Byte, m.slot_size * num_values ); * kt = alloc_slice(backing, Byte, m.slot_size * num_values );
slice_assert(* kt); slice_assert(* kt);
for (span_iter(SSIZE, iter, 0, <, num_values)) { for (span_iter(SSIZE, iter, 0, <, num_values)) {
SSIZE slot_offset = iter.cursor * m.slot_size; // slot id SSIZE slot_offset = iter.cursor * m.slot_size; // slot id
Byte* slot_cursor = & kt->ptr[slot_offset]; // slots[id] type: KT1L_<Type> Byte*restrict slot_cursor = & kt->ptr[slot_offset]; // slots[id] type: KT1L_<Type>
U64* slot_key = (U64*)slot_cursor; // slots[id].key type: U64 U64*restrict slot_key = (U64*restrict)slot_cursor; // slots[id].key type: U64
Slice_Byte slot_value = { slot_cursor + m.kt_value_offset, m.type_width }; // slots[id].value type: <Type> Slice_Byte slot_value = { slot_cursor + m.kt_value_offset, m.type_width }; // slots[id].value type: <Type>
SSIZE a2_offset = iter.cursor * m.type_width * 2; // a2 entry id SSIZE a2_offset = iter.cursor * m.type_width * 2; // a2 entry id
Byte* a2_cursor = & values.ptr[a2_offset]; // a2_entries[id] type: A2_<Type> Byte*restrict a2_cursor = & values.ptr[a2_offset]; // a2_entries[id] type: A2_<Type>
Slice_Byte a2_key = * cast(Slice_Byte*, a2_cursor); // a2_entries[id].key type: <Type> Slice_Byte a2_key = * cast(Slice_Byte*restrict, a2_cursor); // a2_entries[id].key type: <Type>
Slice_Byte a2_value = { a2_cursor + m.type_width, m.type_width }; // a2_entries[id].value type: <Type> Slice_Byte a2_value = { a2_cursor + m.type_width, m.type_width }; // a2_entries[id].value type: <Type>
slice_copy(slot_value, a2_value); // slots[id].value = a2_entries[id].value slice_copy(slot_value, a2_value); // slots[id].value = a2_entries[id].value
* slot_key = 0; hash64_djb8(slot_key, a2_key); // slots[id].key = hash64_djb8(a2_entries[id].key) * slot_key = 0; hash64_djb8(slot_key, a2_key); // slots[id].key = hash64_djb8(a2_entries[id].key)
} }
kt->len = num_values; kt->len = num_values;
} }
@@ -1790,14 +1790,14 @@ void str8gen_append_str8(Str8Gen* gen, Str8 str){
} }
void str8gen__append_fmt(Str8Gen* gen, Str8 fmt_template, Slice_A2_Str8* entries){ void str8gen__append_fmt(Str8Gen* gen, Str8 fmt_template, Slice_A2_Str8* entries){
local_persist Byte tbl_mem[kilo(32)]; FArena tbl_arena = farena_make(slice_fmem(tbl_mem)); local_persist Byte tbl_mem[kilo(32)]; FArena tbl_arena = farena_make(slice_fmem(tbl_mem));
KT1L_Str8 kt = {0}; kt1l_populate_slice_a2(Str8, & kt, ainfo_farena(tbl_arena), *entries ); KT1L_Str8 kt = {0}; kt1l_populate_slice_a2(Str8, & kt, ainfo_farena(tbl_arena), *entries );
Slice_Byte buffer = { gen->ptr + gen->len, gen->cap - gen->len }; Slice_Byte buffer = { gen->ptr + gen->len, gen->cap - gen->len };
if (buffer.len < kilo(16)) { if (buffer.len < kilo(16)) {
Slice_Byte result = mem_grow(gen->backing, str8gen_slice_byte(* gen), kilo(16) + gen->cap ); Slice_Byte result = mem_grow(gen->backing, str8gen_slice_byte(* gen), kilo(16) + gen->cap );
slice_assert(result); slice_assert(result);
gen->ptr = result.ptr; gen->ptr = result.ptr;
gen->cap += kilo(16); gen->cap += kilo(16);
buffer = (Slice_Byte){ cast(Byte*, gen->ptr + gen->len), gen->cap - gen->len }; buffer = (Slice_Byte){ cast(Byte*, gen->ptr + gen->len), gen->cap - gen->len };
} }
Str8 result = str8__fmt_kt1l(gen->backing, & buffer, kt, fmt_template); Str8 result = str8__fmt_kt1l(gen->backing, & buffer, kt, fmt_template);
gen->len += result.len; gen->len += result.len;

View File

@@ -115,10 +115,10 @@ $compiler_args += $flag_full_src_path
# $compiler_args += $flag_asm_listing_file # $compiler_args += $flag_asm_listing_file
# $compiler_args += $flag_optimize_speed_max # $compiler_args += $flag_optimize_speed_max
$compiler_args += $flag_optimize_fast # $compiler_args += $flag_optimize_fast
# $compiler_args += $flag_optimize_size # $compiler_args += $flag_optimize_size
# $compiler_args += $flag_optimize_intrinsics # $compiler_args += $flag_optimize_intrinsics
# $compiler_args += $flag_no_optimization $compiler_args += $flag_no_optimization
# Debug setup # Debug setup
$compiler_args += ($flag_define + 'BUILD_DEBUG') $compiler_args += ($flag_define + 'BUILD_DEBUG')

View File

@@ -93,7 +93,7 @@ $compiler_args += $flag_c11
# Constraints on C program code-gen # Constraints on C program code-gen
$compiler_args += $flag_exceptions_disabled $compiler_args += $flag_exceptions_disabled
$compiler_args += $flag_RTTI_disabled $compiler_args += $flag_RTTI_disabled
$compiler_args += $flag_preprocess_conform # $compiler_args += $flag_preprocess_conform
# $compiler_args += $flag_sanitize_address # $compiler_args += $flag_sanitize_address
$compiler_args += $flag_wall $compiler_args += $flag_wall
@@ -103,7 +103,7 @@ $compiler_args += $flag_charset_utf8
# Specifing output pathing # Specifing output pathing
$compiler_args += ( $flag_path_interm + $path_build + '\' ) $compiler_args += ( $flag_path_interm + $path_build + '\' )
$compiler_args += ( $flag_path_output + $path_build + '\' ) # $compiler_args += ( $flag_path_output + $path_build + '\' )
# Dump preprocess file # Dump preprocess file
if ($false) { if ($false) {
@@ -141,7 +141,10 @@ $compiler_args += $flag_compile, $unit
$compiler_args | ForEach-Object { Write-Host $_ } $compiler_args | ForEach-Object { Write-Host $_ }
# Compile the unit # Compile the unit
& $compiler $compiler_args $compilation_time = Measure-Command {
& $compiler $compiler_args
}
write-host "Compilation took $($compilation_time.TotalMilliseconds)ms"
write-host write-host
$binary = join-path $path_build "$unit_name.exe" $binary = join-path $path_build "$unit_name.exe"
@@ -174,8 +177,9 @@ if ($true) {
# Diagnoistc print for the args # Diagnoistc print for the args
$linker_args | ForEach-Object { Write-Host $_ } $linker_args | ForEach-Object { Write-Host $_ }
& $linker $linker_args $linking_time = Measure-Command { & $linker $linker_args }
# & $radlink $linker_args # & $radlink $linker_args
write-host "Linking took $($linking_time.TotalMilliseconds)ms"
write-host write-host
} }