diff options
| author | mrb0nk500 <b0nk@b0nk.xyz> | 2023-02-05 14:29:41 -0400 | 
|---|---|---|
| committer | mrb0nk500 <b0nk@b0nk.xyz> | 2023-02-05 14:29:41 -0400 | 
| commit | bccb280f6daad2b96cc44f393f275f5030c2c1a7 (patch) | |
| tree | c419e4152cb9c7196552bbfc19a7875c4289533a /src | |
| parent | cf8538d2a5cfb3a697015c1bcdea38f645fed2f5 (diff) | |
THeap: Get `heap_alloc()`, and the constructor closer to matching
Mostly regalloc issues.
Diffstat (limited to 'src')
| -rw-r--r-- | src/pso/THeap.cpp | 19 | 
1 files changed, 12 insertions, 7 deletions
diff --git a/src/pso/THeap.cpp b/src/pso/THeap.cpp index 87598b9..2ed961a 100644 --- a/src/pso/THeap.cpp +++ b/src/pso/THeap.cpp @@ -57,10 +57,12 @@ void *THeap::heap_zalloc(size_t size) {  // Getting closer, but register allocation issues.  #ifndef MATCHING  void *THeap::heap_alloc(size_t size) { -	const u32 aligned_size = ((heap_offset - 1) + align + size) & -align;  	THeap *parent = (THeap *)heap;  	THeap *child; +	u32 size_align = (heap_offset - 1) + align + size; +	u32 aligned_size = size_align & -align;  	goto start; +  	cond:  	if (child->alloc_size < aligned_size) {  		goto loop_body; @@ -74,15 +76,14 @@ void *THeap::heap_alloc(size_t size) {  		tmp->heap = child->heap;  		tmp->alloc_size = child->alloc_size - aligned_size;  		child->alloc_size = aligned_size; -		parent->heap = (u8 *)tmp; +		parent->heap = (u8 *)&tmp->heap;  	}  	return (void *)&child->align;  	loop_body:  	parent = child;  	start: -	child = (THeap *)parent->heap; -	if (child == NULL) { +	if (child = (THeap *)parent->heap, child == NULL) {  		return NULL;  	}  	goto cond; @@ -133,7 +134,7 @@ THeap::~THeap() {  	xfree(heap);  } -// Not sure how to get this matching. +// Getting closer, still not sure how to match though.  #ifndef MATCHING  THeap::THeap(size_t size, int alignment) {  	heap_size = 0; @@ -141,11 +142,15 @@ THeap::THeap(size_t size, int alignment) {  	align = alignment;  	heap = (u8 *)xmalloc(heap_size);  	if (heap != NULL) { -		THeap *tmp_heap = (THeap *)memset(heap, 0, size); +		const u32 new_size = size - heap_offset; +		THeap *tmp_heap; +		memset(heap, 0, size); + +		tmp_heap = (THeap *)heap;  		tmp_heap->heap = &heap[heap_offset];  		((THeap *)heap)->alloc_size = 0;  		tmp_heap->align = 0; -		tmp_heap->heap_size = size - heap_offset; +		tmp_heap->heap_size = new_size;  	}  }  #else  | 
