mirror of
https://github.com/libretro/RetroArch
synced 2025-04-01 04:20:27 +00:00
Update libretro-common
This commit is contained in:
parent
1d0c75a3d0
commit
3fdf93a273
@ -66,11 +66,16 @@
|
|||||||
*-------------------------------------------------
|
*-------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* Huge alignment values for possible SIMD optimization by compiler (NEON, SSE, AVX) */
|
||||||
|
#define LZMA_MIN_ALIGNMENT_BITS 512
|
||||||
|
#define LZMA_MIN_ALIGNMENT_BYTES (LZMA_MIN_ALIGNMENT_BITS / 8)
|
||||||
|
|
||||||
static void *lzma_fast_alloc(void *p, size_t size)
|
static void *lzma_fast_alloc(void *p, size_t size)
|
||||||
{
|
{
|
||||||
int scan;
|
int scan;
|
||||||
uint32_t *addr = NULL;
|
uint32_t *addr = NULL;
|
||||||
lzma_allocator *codec = (lzma_allocator *)(p);
|
lzma_allocator *codec = (lzma_allocator *)(p);
|
||||||
|
uintptr_t vaddr = 0;
|
||||||
|
|
||||||
/* compute the size, rounding to the nearest 1k */
|
/* compute the size, rounding to the nearest 1k */
|
||||||
size = (size + 0x3ff) & ~0x3ff;
|
size = (size + 0x3ff) & ~0x3ff;
|
||||||
@ -83,27 +88,36 @@ static void *lzma_fast_alloc(void *p, size_t size)
|
|||||||
{
|
{
|
||||||
/* set the low bit of the size so we don't match next time */
|
/* set the low bit of the size so we don't match next time */
|
||||||
*ptr |= 1;
|
*ptr |= 1;
|
||||||
return ptr + 1;
|
|
||||||
|
/* return aligned address of the block */
|
||||||
|
return codec->allocptr2[scan];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* alloc a new one and put it into the list */
|
/* alloc a new one and put it into the list */
|
||||||
addr = (uint32_t *)malloc(sizeof(uint32_t) * size + sizeof(uintptr_t));
|
addr = (uint32_t *)malloc(size + sizeof(uint32_t) + LZMA_MIN_ALIGNMENT_BYTES);
|
||||||
if (!addr)
|
if (addr==NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
for (scan = 0; scan < MAX_LZMA_ALLOCS; scan++)
|
for (scan = 0; scan < MAX_LZMA_ALLOCS; scan++)
|
||||||
{
|
{
|
||||||
if (codec->allocptr[scan] == NULL)
|
if (codec->allocptr[scan] == NULL)
|
||||||
{
|
{
|
||||||
|
/* store block address */
|
||||||
codec->allocptr[scan] = addr;
|
codec->allocptr[scan] = addr;
|
||||||
|
|
||||||
|
/* compute aligned address, store it */
|
||||||
|
vaddr = (uintptr_t)addr;
|
||||||
|
vaddr = (vaddr + sizeof(uint32_t) + (LZMA_MIN_ALIGNMENT_BYTES-1)) & (~(LZMA_MIN_ALIGNMENT_BYTES-1));
|
||||||
|
codec->allocptr2[scan] = (uint32_t*)vaddr;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set the low bit of the size so we don't match next time */
|
/* set the low bit of the size so we don't match next time */
|
||||||
*addr = (uint32_t)(size | 1);
|
*addr = size | 1;
|
||||||
return addr + (sizeof(uint32_t) == sizeof(uintptr_t) ? 1 : 2);
|
|
||||||
|
/* return aligned address */
|
||||||
|
return (void*)vaddr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------
|
/*-------------------------------------------------
|
||||||
@ -114,21 +128,22 @@ static void *lzma_fast_alloc(void *p, size_t size)
|
|||||||
static void lzma_fast_free(void *p, void *address)
|
static void lzma_fast_free(void *p, void *address)
|
||||||
{
|
{
|
||||||
int scan;
|
int scan;
|
||||||
uint32_t *ptr;
|
uint32_t *ptr = NULL;
|
||||||
lzma_allocator *codec;
|
lzma_allocator *codec = NULL;
|
||||||
|
|
||||||
if (address == NULL)
|
if (address == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
codec = (lzma_allocator *)(p);
|
codec = (lzma_allocator *)(p);
|
||||||
|
|
||||||
/* find the hunk */
|
/* find the hunk */
|
||||||
ptr = (uint32_t *)(address) - 1;
|
ptr = (uint32_t *)address;
|
||||||
for (scan = 0; scan < MAX_LZMA_ALLOCS; scan++)
|
for (scan = 0; scan < MAX_LZMA_ALLOCS; scan++)
|
||||||
{
|
{
|
||||||
if (ptr == codec->allocptr[scan])
|
if (ptr == codec->allocptr2[scan])
|
||||||
{
|
{
|
||||||
/* clear the low bit of the size to allow matches */
|
/* clear the low bit of the size to allow matches */
|
||||||
*ptr &= ~1;
|
*codec->allocptr[scan] &= ~1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -241,9 +241,14 @@ chd_error zlib_codec_decompress(void *codec, const uint8_t *src, uint32_t comple
|
|||||||
allocates and frees memory frequently
|
allocates and frees memory frequently
|
||||||
-------------------------------------------------*/
|
-------------------------------------------------*/
|
||||||
|
|
||||||
|
/* Huge alignment values for possible SIMD optimization by compiler (NEON, SSE, AVX) */
|
||||||
|
#define ZLIB_MIN_ALIGNMENT_BITS 512
|
||||||
|
#define ZLIB_MIN_ALIGNMENT_BYTES (ZLIB_MIN_ALIGNMENT_BITS / 8)
|
||||||
|
|
||||||
voidpf zlib_fast_alloc(voidpf opaque, uInt items, uInt size)
|
voidpf zlib_fast_alloc(voidpf opaque, uInt items, uInt size)
|
||||||
{
|
{
|
||||||
zlib_allocator *alloc = (zlib_allocator *)opaque;
|
zlib_allocator *alloc = (zlib_allocator *)opaque;
|
||||||
|
uintptr_t paddr = 0;
|
||||||
UINT32 *ptr;
|
UINT32 *ptr;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -258,12 +263,14 @@ voidpf zlib_fast_alloc(voidpf opaque, uInt items, uInt size)
|
|||||||
{
|
{
|
||||||
/* set the low bit of the size so we don't match next time */
|
/* set the low bit of the size so we don't match next time */
|
||||||
*ptr |= 1;
|
*ptr |= 1;
|
||||||
return ptr + 1;
|
|
||||||
|
/* return aligned block address */
|
||||||
|
return (voidpf)(alloc->allocptr2[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* alloc a new one */
|
/* alloc a new one */
|
||||||
ptr = (UINT32 *)malloc(size + sizeof(uintptr_t));
|
ptr = (UINT32 *)malloc(size + sizeof(UINT32) + ZLIB_MIN_ALIGNMENT_BYTES);
|
||||||
if (!ptr)
|
if (!ptr)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -272,12 +279,16 @@ voidpf zlib_fast_alloc(voidpf opaque, uInt items, uInt size)
|
|||||||
if (!alloc->allocptr[i])
|
if (!alloc->allocptr[i])
|
||||||
{
|
{
|
||||||
alloc->allocptr[i] = ptr;
|
alloc->allocptr[i] = ptr;
|
||||||
|
paddr = (((uintptr_t)ptr) + sizeof(UINT32) + (ZLIB_MIN_ALIGNMENT_BYTES-1)) & (~(ZLIB_MIN_ALIGNMENT_BYTES-1));
|
||||||
|
alloc->allocptr2[i] = (uint32_t*)paddr;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set the low bit of the size so we don't match next time */
|
/* set the low bit of the size so we don't match next time */
|
||||||
*ptr = size | 1;
|
*ptr = size | 1;
|
||||||
return ptr + (sizeof(uint32_t) == sizeof(uintptr_t) ? 1 : 2);
|
|
||||||
|
/* return aligned block address */
|
||||||
|
return (voidpf)paddr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------
|
/*-------------------------------------------------
|
||||||
@ -288,15 +299,15 @@ voidpf zlib_fast_alloc(voidpf opaque, uInt items, uInt size)
|
|||||||
void zlib_fast_free(voidpf opaque, voidpf address)
|
void zlib_fast_free(voidpf opaque, voidpf address)
|
||||||
{
|
{
|
||||||
zlib_allocator *alloc = (zlib_allocator *)opaque;
|
zlib_allocator *alloc = (zlib_allocator *)opaque;
|
||||||
UINT32 *ptr = (UINT32 *)address - (sizeof(uint32_t) == sizeof(uintptr_t) ? 1 : 2);
|
UINT32 *ptr = (UINT32 *)address;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* find the hunk */
|
/* find the hunk */
|
||||||
for (i = 0; i < MAX_ZLIB_ALLOCS; i++)
|
for (i = 0; i < MAX_ZLIB_ALLOCS; i++)
|
||||||
if (ptr == alloc->allocptr[i])
|
if (ptr == alloc->allocptr2[i])
|
||||||
{
|
{
|
||||||
/* clear the low bit of the size to allow matches */
|
/* clear the low bit of the size to allow matches */
|
||||||
*ptr &= ~1;
|
*(alloc->allocptr[i]) &= ~1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@ typedef struct _zlib_allocator zlib_allocator;
|
|||||||
struct _zlib_allocator
|
struct _zlib_allocator
|
||||||
{
|
{
|
||||||
UINT32 * allocptr[MAX_ZLIB_ALLOCS];
|
UINT32 * allocptr[MAX_ZLIB_ALLOCS];
|
||||||
|
UINT32 * allocptr2[MAX_ZLIB_ALLOCS];
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _zlib_codec_data zlib_codec_data;
|
typedef struct _zlib_codec_data zlib_codec_data;
|
||||||
|
@ -30,6 +30,7 @@ struct _lzma_allocator
|
|||||||
void (*Free)(void *p, void *address); /* address can be 0 */
|
void (*Free)(void *p, void *address); /* address can be 0 */
|
||||||
void (*FreeSz)(void *p, void *address, size_t size); /* address can be 0 */
|
void (*FreeSz)(void *p, void *address, size_t size); /* address can be 0 */
|
||||||
uint32_t* allocptr[MAX_LZMA_ALLOCS];
|
uint32_t* allocptr[MAX_LZMA_ALLOCS];
|
||||||
|
uint32_t* allocptr2[MAX_LZMA_ALLOCS];
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _lzma_codec_data lzma_codec_data;
|
typedef struct _lzma_codec_data lzma_codec_data;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user