11#include "libspu2_internal.h"
13int SpuMalloc(
int size)
17 unsigned int size_adjusted;
22 u32 p_alloc_last_addr;
29 if ( _spu_rev_reserve_wa )
30 rev_size_zero = 0x200000 - _spu_rev_offsetaddr;
33 size_adjusted = 2 * (size >> 1);
34 if ( (_spu_memList->addr_area & 0x40000000) != 0 )
43 for ( cur_idx = 0; cur_idx < _spu_AllocBlockNum; cur_idx += 1 )
46 !((_spu_memList[cur_idx].addr_area & 0x40000000) == 0
47 && ((_spu_memList[cur_idx].addr_area & 0x80000000) == 0 || _spu_memList[cur_idx].size_area < size_adjusted)) )
49 found_block_idx = cur_idx;
54 p_allocated = found_block_idx;
55 if ( found_block_idx == -1 )
59 p_cur_block = &_spu_memList[p_allocated];
60 addr_area = _spu_memList[p_allocated].addr_area;
61 if ( (addr_area & 0x40000000) != 0 )
65 if ( found_block_idx >= _spu_AllocBlockNum )
69 if ( p_cur_block->size_area - rev_size_zero < size_adjusted )
73 p_last_block_1 = &_spu_memList[found_block_idx + 1];
74 p_last_block_1->addr_area = ((p_cur_block->addr_area & 0xFFFFFFF) + size_adjusted) | 0x40000000;
75 p_last_block_1->size_area = p_cur_block->size_area - size_adjusted;
76 addr_area_1 = p_cur_block->addr_area;
77 _spu_AllocLastNum = found_block_idx + 1;
78 p_cur_block->size_area = size_adjusted;
79 p_cur_block->addr_area = addr_area_1 & 0xFFFFFFF;
81 return _spu_memList[p_allocated].addr_area;
85 unsigned int size_area;
87 size_area = p_cur_block->size_area;
88 if ( size_adjusted < size_area )
90 p_alloc_last_addr = addr_area + size_adjusted;
91 if ( _spu_AllocLastNum < _spu_AllocBlockNum )
93 p_last_block_2 = &_spu_memList[_spu_AllocLastNum];
94 addr_area_2 = p_last_block_2->addr_area;
95 size_area_1 = p_last_block_2->size_area;
96 p_last_block_2->addr_area = p_alloc_last_addr | 0x80000000;
97 p_last_block_2->size_area = size_area - size_adjusted;
98 _spu_AllocLastNum += 1;
99 p_last_block_2[1].addr_area = addr_area_2;
100 p_last_block_2[1].size_area = size_area_1;
103 p_last_block_3 = &_spu_memList[found_block_idx];
104 p_last_block_3->size_area = size_adjusted;
105 p_last_block_3->addr_area = p_last_block_3->addr_area & 0xFFFFFFF;
107 return _spu_memList[found_block_idx].addr_area;