diff --git a/src/hashset.asm b/src/hashset.asm index e1f206b..761f105 100644 --- a/src/hashset.asm +++ b/src/hashset.asm @@ -1,16 +1,31 @@ -; struct Allocator { -; alloc: (U32) -> ptr -; realloc: (ptr, U32) -> ptr -; free: (ptr) -> () -; } -; +;struct Allocator { +; alloc: (U32) -> ptr +; realloc: (ptr, U32) -> ptr +; free: (ptr) -> () +;} + +;struct HashSet { +; count: U32 +; capacity: U32 +; alloc_ptr: U32 +; hash_ptr: U32 +; hash_context: U32 +; eq_ptr: U32 +; eq_context: U32 +; data_ptr: U32 +;} - 28 bytes + +;struct HashItem { +; hash: U32 +; value: U32 +;} ; Creates a hashset for the specified allocator, hash function and equality function ; Arguments: ; r1 - The pointer to the allocator ; r2 - The hash function -; r3 - The equality function -; r4 - The hash function context +; r3 - The hash function context +; r4 - The equality function ; r5 - The equality function context ; Result: ; r1 - The pointer to the hashset structure @@ -20,4 +35,68 @@ ; The equality function should follow the stdlib calling convention ; The equality function receives two arguments (the value of the two items) and should return either a zero (when the items are not equal) or any other value (if they are equal). pub new_hashset: - \ No newline at end of file + ; First let's free up all the registers + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 ; We will be calling alloc + + mov r8, r1 + mov r9, r2 + mov r10, r3 + mov r11, r4 + mov r12, r5 + + load_32 r5, [r8] ; Loading the alloc function address + mov r1, 28 + counter r13 + add r13, r13, 12 + jmp r5 ; allocating the space for the hashset struct itself + + ; Now r1 has the pointer to memory, r2-r7 are clobbered + + store_32 [r1], rz ; count is 0 at the start + + add r1, r1, 4 + mov r2, 8 + store_32 [r1], r2 ; initial capacity at 8 item slots + + add r1, r1, 4 + store_32 [r1], r8 ; allocator pointer is in r8 + + add r1, r1, 4 + store_32 [r1], r9 ; hash pointer is in r9 + + add r1, r1, 4 + store_32 [r1], r10 ; hash context is in r10 + + add r1, r1, 4 + store_32 [r1], r11 ; eq pointer is in r11 + + add r1, r1, 4 + store_32 [r1], r12 ; eq context is in r12 + + push r1 + + load_32 r5, [r8] ; Loading the alloc function address + mov r1, 64 + counter r13 + add r13, r13, 12 + jmp r5 ; allocating the space for the data + + load r2, [sp] ; Now r1 is data pointer, r2 is hashset pointer at eq context + + add r2, r2, 4 + store_32 [r2], r1 ; data pointer saved + + pop r1 ; Popping the pointer to start of the hashset + + pop r13 ; Everything's set up, return + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + jmp r13 \ No newline at end of file