XIP adaptation for xtensa platform (#1636)
Add macro WASM_ENABLE_WORD_ALING_READ to enable reading 1/2/4 and n bytes data from vram buffer, which requires 4-byte addr alignment reading. Eliminate XIP AOT relocations related to the below ones: i32_div_u, f32_min, f32_max, f32_ceil, f32_floor, f32_trunc, f32_rint
This commit is contained in:
committed by
GitHub
parent
dba9e52f2f
commit
e517dbc7b2
@ -5,6 +5,73 @@
|
||||
|
||||
#include "bh_common.h"
|
||||
|
||||
static char *
|
||||
align_ptr(char *src, unsigned int b)
|
||||
{
|
||||
uintptr_t v = (uintptr_t)src;
|
||||
uintptr_t m = b - 1;
|
||||
return (char *)((v + m) & ~m);
|
||||
}
|
||||
|
||||
/*
|
||||
Memory copy, with word alignment
|
||||
*/
|
||||
int
|
||||
b_memcpy_wa(void *s1, unsigned int s1max, const void *s2, unsigned int n)
|
||||
{
|
||||
char *dest = (char *)s1;
|
||||
char *src = (char *)s2;
|
||||
|
||||
char *pa = align_ptr(src, 4);
|
||||
char *pb = align_ptr((src + n), 4);
|
||||
|
||||
unsigned int buff;
|
||||
const char *p_byte_read;
|
||||
|
||||
unsigned int *p;
|
||||
char *ps;
|
||||
|
||||
if (pa > src) {
|
||||
pa -= 4;
|
||||
}
|
||||
|
||||
for (p = (unsigned int *)pa; p < (unsigned int *)pb; p++) {
|
||||
buff = *(p);
|
||||
p_byte_read = ((char *)&buff);
|
||||
|
||||
/* read leading word */
|
||||
if ((char *)p <= src) {
|
||||
for (ps = src; ps < ((char *)p + 4); ps++) {
|
||||
if (ps >= src + n) {
|
||||
break;
|
||||
}
|
||||
p_byte_read = ((char *)&buff) + (ps - (char *)p);
|
||||
*dest++ = *p_byte_read;
|
||||
}
|
||||
}
|
||||
/* read trailing word */
|
||||
else if ((char *)p >= pb - 4) {
|
||||
for (ps = (char *)p; ps < src + n; ps++) {
|
||||
*dest++ = *p_byte_read++;
|
||||
}
|
||||
}
|
||||
/* read meaning word(s) */
|
||||
else {
|
||||
if ((char *)p + 4 >= src + n) {
|
||||
for (ps = (char *)p; ps < src + n; ps++) {
|
||||
*dest++ = *p_byte_read++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
*(unsigned int *)dest = buff;
|
||||
dest += 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
b_memcpy_s(void *s1, unsigned int s1max, const void *s2, unsigned int n)
|
||||
{
|
||||
|
||||
@ -19,6 +19,13 @@ extern "C" {
|
||||
bh_assert(_ret == 0); \
|
||||
} while (0)
|
||||
|
||||
#define bh_memcpy_wa(dest, dlen, src, slen) \
|
||||
do { \
|
||||
int _ret = slen == 0 ? 0 : b_memcpy_wa(dest, dlen, src, slen); \
|
||||
(void)_ret; \
|
||||
bh_assert(_ret == 0); \
|
||||
} while (0)
|
||||
|
||||
#define bh_memmove_s(dest, dlen, src, slen) \
|
||||
do { \
|
||||
int _ret = slen == 0 ? 0 : b_memmove_s(dest, dlen, src, slen); \
|
||||
@ -43,6 +50,8 @@ extern "C" {
|
||||
int
|
||||
b_memcpy_s(void *s1, unsigned int s1max, const void *s2, unsigned int n);
|
||||
int
|
||||
b_memcpy_wa(void *s1, unsigned int s1max, const void *s2, unsigned int n);
|
||||
int
|
||||
b_memmove_s(void *s1, unsigned int s1max, const void *s2, unsigned int n);
|
||||
int
|
||||
b_strcat_s(char *s1, unsigned int s1max, const char *s2);
|
||||
|
||||
Reference in New Issue
Block a user