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:
dongsheng28849455
2022-10-31 17:25:24 +08:00
committed by GitHub
parent dba9e52f2f
commit e517dbc7b2
10 changed files with 244 additions and 11 deletions

View File

@ -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)
{

View File

@ -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);