@@ -37,6 +37,10 @@ extern "C" {
3737 do { \
3838 *(int64 *)(addr) = (int64)(value); \
3939 } while (0)
40+ #define PUT_V128_TO_ADDR (addr , value ) \
41+ do { \
42+ *(V128 *)(addr) = (value); \
43+ } while (0)
4044#define PUT_F64_TO_ADDR (addr , value ) \
4145 do { \
4246 *(float64 *)(addr) = (float64)(value); \
@@ -49,6 +53,7 @@ extern "C" {
4953#define GET_I64_FROM_ADDR (addr ) (*(int64 *)(addr))
5054#define GET_F64_FROM_ADDR (addr ) (*(float64 *)(addr))
5155#define GET_REF_FROM_ADDR (addr ) (*(void **)(addr))
56+ #define GET_V128_FROM_ADDR (addr ) (*(V128 *)(addr))
5257
5358/* For STORE opcodes */
5459#define STORE_I64 PUT_I64_TO_ADDR
@@ -68,13 +73,20 @@ STORE_U8(void *addr, uint8_t value)
6873 * (uint8 * )addr = value ;
6974}
7075
76+ static inline void
77+ STORE_V128 (void * addr , V128 value )
78+ {
79+ * (V128 * )addr = value ;
80+ }
81+
7182/* For LOAD opcodes */
7283#define LOAD_I64 (addr ) (*(int64 *)(addr))
7384#define LOAD_F64 (addr ) (*(float64 *)(addr))
7485#define LOAD_I32 (addr ) (*(int32 *)(addr))
7586#define LOAD_U32 (addr ) (*(uint32 *)(addr))
7687#define LOAD_I16 (addr ) (*(int16 *)(addr))
7788#define LOAD_U16 (addr ) (*(uint16 *)(addr))
89+ #define LOAD_V128 (addr ) (*(V128 *)(addr))
7890
7991#define STORE_PTR (addr , ptr ) \
8092 do { \
@@ -83,6 +95,15 @@ STORE_U8(void *addr, uint8_t value)
8395
8496#else /* WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS != 0 */
8597
98+ #define PUT_V128_TO_ADDR (addr , value ) \
99+ do { \
100+ uint32 *addr_u32 = (uint32 *)(addr); \
101+ addr_u32[0] = (value).i32x4[0]; \
102+ addr_u32[1] = (value).i32x4[1]; \
103+ addr_u32[2] = (value).i32x4[2]; \
104+ addr_u32[3] = (value).i32x4[3]; \
105+ } while (0)
106+
86107#define PUT_I64_TO_ADDR (addr , value ) \
87108 do { \
88109 uint32 *addr_u32 = (uint32 *)(addr); \
@@ -124,6 +145,17 @@ STORE_U8(void *addr, uint8_t value)
124145 } while (0)
125146#endif
126147
148+ static inline V128
149+ GET_V128_FROM_ADDR (uint32 * addr )
150+ {
151+ V128 ret ;
152+ ret .i32x4 [0 ] = addr [0 ];
153+ ret .i32x4 [1 ] = addr [1 ];
154+ ret .i32x4 [2 ] = addr [2 ];
155+ ret .i32x4 [3 ] = addr [3 ];
156+ return ret ;
157+ }
158+
127159static inline int64
128160GET_I64_FROM_ADDR (uint32 * addr )
129161{
@@ -239,7 +271,94 @@ STORE_U16(void *addr, uint16_t value)
239271 ((uint8_t * )(addr ))[0 ] = u .u8 [0 ];
240272 ((uint8_t * )(addr ))[1 ] = u .u8 [1 ];
241273}
274+
275+ static inline void
276+ STORE_V128 (void * addr , V128 value )
277+ {
278+ uintptr_t addr_ = (uintptr_t )(addr );
279+ union {
280+ V128 val ;
281+ uint64 u64 [2 ];
282+ uint32 u32 [4 ];
283+ uint16 u16 [8 ];
284+ uint8 u8 [16 ];
285+ } u ;
286+
287+ if ((addr_ & (uintptr_t )15 ) == 0 ) {
288+ * (V128 * )addr = value ;
289+ }
290+ else if ((addr_ & (uintptr_t )7 ) == 0 ) {
291+ u .val = value ;
292+ ((uint64 * )(addr ))[0 ] = u .u64 [0 ];
293+ ((uint64 * )(addr ))[1 ] = u .u64 [1 ];
294+ }
295+ else if ((addr_ & (uintptr_t )3 ) == 0 ) {
296+ u .val = value ;
297+ ((uint32 * )addr )[0 ] = u .u32 [0 ];
298+ ((uint32 * )addr )[1 ] = u .u32 [1 ];
299+ ((uint32 * )addr )[2 ] = u .u32 [2 ];
300+ ((uint32 * )addr )[3 ] = u .u32 [3 ];
301+ }
302+ else if ((addr_ & (uintptr_t )1 ) == 0 ) {
303+ u .val = value ;
304+ ((uint16 * )addr )[0 ] = u .u16 [0 ];
305+ ((uint16 * )addr )[1 ] = u .u16 [1 ];
306+ ((uint16 * )addr )[2 ] = u .u16 [2 ];
307+ ((uint16 * )addr )[3 ] = u .u16 [3 ];
308+ ((uint16 * )addr )[4 ] = u .u16 [4 ];
309+ ((uint16 * )addr )[5 ] = u .u16 [5 ];
310+ ((uint16 * )addr )[6 ] = u .u16 [6 ];
311+ ((uint16 * )addr )[7 ] = u .u16 [7 ];
312+ }
313+ else {
314+ u .val = value ;
315+ for (int i = 0 ; i < 16 ; i ++ )
316+ ((uint8 * )addr )[i ] = u .u8 [i ];
317+ }
318+ }
319+
242320/* For LOAD opcodes */
321+ static inline V128
322+ LOAD_V128 (void * addr )
323+ {
324+ uintptr_t addr1 = (uintptr_t )addr ;
325+ union {
326+ V128 val ;
327+ uint64 u64 [2 ];
328+ uint32 u32 [4 ];
329+ uint16 u16 [8 ];
330+ uint8 u8 [16 ];
331+ } u ;
332+ if ((addr1 & (uintptr_t )15 ) == 0 )
333+ return * (V128 * )addr ;
334+
335+ if ((addr1 & (uintptr_t )7 ) == 0 ) {
336+ u .u64 [0 ] = ((uint64 * )addr )[0 ];
337+ u .u64 [1 ] = ((uint64 * )addr )[1 ];
338+ }
339+ else if ((addr1 & (uintptr_t )3 ) == 0 ) {
340+ u .u32 [0 ] = ((uint32 * )addr )[0 ];
341+ u .u32 [1 ] = ((uint32 * )addr )[1 ];
342+ u .u32 [2 ] = ((uint32 * )addr )[2 ];
343+ u .u32 [3 ] = ((uint32 * )addr )[3 ];
344+ }
345+ else if ((addr1 & (uintptr_t )1 ) == 0 ) {
346+ u .u16 [0 ] = ((uint16 * )addr )[0 ];
347+ u .u16 [1 ] = ((uint16 * )addr )[1 ];
348+ u .u16 [2 ] = ((uint16 * )addr )[2 ];
349+ u .u16 [3 ] = ((uint16 * )addr )[3 ];
350+ u .u16 [4 ] = ((uint16 * )addr )[4 ];
351+ u .u16 [5 ] = ((uint16 * )addr )[5 ];
352+ u .u16 [6 ] = ((uint16 * )addr )[6 ];
353+ u .u16 [7 ] = ((uint16 * )addr )[7 ];
354+ }
355+ else {
356+ for (int i = 0 ; i < 16 ; i ++ )
357+ u .u8 [i ] = ((uint8 * )addr )[i ];
358+ }
359+ return u .val ;
360+ }
361+
243362static inline int64
244363LOAD_I64 (void * addr )
245364{
0 commit comments