2
2
#include "interp-internals.h"
3
3
#include "interp-simd.h"
4
4
5
+ #if HOST_BROWSER
6
+ #include <wasm_simd128.h>
7
+ #endif
8
+
5
9
#ifdef INTERP_ENABLE_SIMD
6
10
7
11
typedef gint64 v128_i8 __attribute__ ((vector_size (SIZEOF_V128 )));
@@ -12,6 +16,7 @@ typedef gint16 v128_i2 __attribute__ ((vector_size (SIZEOF_V128)));
12
16
typedef guint16 v128_u2 __attribute__ ((vector_size (SIZEOF_V128 )));
13
17
typedef gint8 v128_i1 __attribute__ ((vector_size (SIZEOF_V128 )));
14
18
typedef guint8 v128_u1 __attribute__ ((vector_size (SIZEOF_V128 )));
19
+ typedef float v128_r4 __attribute__ ((vector_size (SIZEOF_V128 )));
15
20
16
21
// get_AllBitsSet
17
22
static void
@@ -39,6 +44,12 @@ interp_v128_i4_op_addition (gpointer res, gpointer v1, gpointer v2)
39
44
* (v128_i4 * )res = * (v128_i4 * )v1 + * (v128_i4 * )v2 ;
40
45
}
41
46
47
+ static void
48
+ interp_v128_r4_op_addition (gpointer res , gpointer v1 , gpointer v2 )
49
+ {
50
+ * (v128_r4 * )res = * (v128_r4 * )v1 + * (v128_r4 * )v2 ;
51
+ }
52
+
42
53
// op_Subtraction
43
54
static void
44
55
interp_v128_i1_op_subtraction (gpointer res , gpointer v1 , gpointer v2 )
@@ -58,6 +69,12 @@ interp_v128_i4_op_subtraction (gpointer res, gpointer v1, gpointer v2)
58
69
* (v128_i4 * )res = * (v128_i4 * )v1 - * (v128_i4 * )v2 ;
59
70
}
60
71
72
+ static void
73
+ interp_v128_r4_op_subtraction (gpointer res , gpointer v1 , gpointer v2 )
74
+ {
75
+ * (v128_r4 * )res = * (v128_r4 * )v1 - * (v128_r4 * )v2 ;
76
+ }
77
+
61
78
// op_BitwiseAnd
62
79
static void
63
80
interp_v128_op_bitwise_and (gpointer res , gpointer v1 , gpointer v2 )
@@ -124,6 +141,18 @@ interp_v128_i4_op_multiply (gpointer res, gpointer v1, gpointer v2)
124
141
* (v128_i4 * )res = * (v128_i4 * )v1 * * (v128_i4 * )v2 ;
125
142
}
126
143
144
+ static void
145
+ interp_v128_r4_op_multiply (gpointer res , gpointer v1 , gpointer v2 )
146
+ {
147
+ * (v128_r4 * )res = * (v128_r4 * )v1 * * (v128_r4 * )v2 ;
148
+ }
149
+
150
+ static void
151
+ interp_v128_r4_op_division (gpointer res , gpointer v1 , gpointer v2 )
152
+ {
153
+ * (v128_r4 * )res = * (v128_r4 * )v1 / * (v128_r4 * )v2 ;
154
+ }
155
+
127
156
// op_UnaryNegation
128
157
static void
129
158
interp_v128_i1_op_negation (gpointer res , gpointer v1 )
@@ -535,32 +564,122 @@ interp_v128_i8_shuffle (gpointer res, gpointer v1, gpointer v2)
535
564
V128_SHUFFLE (gint64 , guint64 );
536
565
}
537
566
538
- #define INTERP_SIMD_INTRINSIC_P_P (a ,b )
539
- #define INTERP_SIMD_INTRINSIC_P_PP (a ,b )
540
- #define INTERP_SIMD_INTRINSIC_P_PPP (a ,b )
567
+ #define INTERP_SIMD_INTRINSIC_P_P (a ,b ,c )
568
+ #define INTERP_SIMD_INTRINSIC_P_PP (a ,b ,c )
569
+ #define INTERP_SIMD_INTRINSIC_P_PPP (a ,b ,c )
570
+
571
+ // For the wasm packed simd intrinsics we want to automatically generate the C implementations from
572
+ // their corresponding clang intrinsics. See also:
573
+ // https://github.com/llvm/llvm-project/blob/main/clang/lib/Headers/wasm_simd128.h
574
+ // In this context V means Vector128 and P means void* pointer.
575
+ #ifdef HOST_BROWSER
576
+
577
+ static v128_t
578
+ _interp_wasm_simd_assert_not_reached (v128_t lhs , v128_t rhs ) {
579
+ g_assert_not_reached ();
580
+ }
581
+
582
+ #define INTERP_WASM_SIMD_INTRINSIC_V_P (id , c_intrinsic , wasm_opcode ) \
583
+ static void \
584
+ _mono_interp_simd_ ## id (gpointer res, gpointer v1) { \
585
+ *((v128_t *)res) = c_intrinsic (v1); \
586
+ }
587
+
588
+ #define INTERP_WASM_SIMD_INTRINSIC_V_V (id , c_intrinsic , wasm_opcode ) \
589
+ static void \
590
+ _mono_interp_simd_ ## id (gpointer res, gpointer v1) { \
591
+ *((v128_t *)res) = c_intrinsic (*((v128_t *)v1)); \
592
+ }
593
+
594
+ #define INTERP_WASM_SIMD_INTRINSIC_I_V (id , c_intrinsic , wasm_opcode ) \
595
+ static void \
596
+ _mono_interp_simd_ ## id (gpointer res, gpointer v1) { \
597
+ *((int32_t *)res) = c_intrinsic (*((v128_t *)v1)); \
598
+ }
599
+
600
+ #define INTERP_WASM_SIMD_INTRINSIC_V_VV (id , c_intrinsic , wasm_opcode ) \
601
+ static void \
602
+ _mono_interp_simd_ ## id (gpointer res, gpointer v1, gpointer v2) { \
603
+ *((v128_t *)res) = c_intrinsic (*((v128_t *)v1), *((v128_t *)v2)); \
604
+ }
605
+
606
+ #define INTERP_WASM_SIMD_INTRINSIC_V_VI (id , c_intrinsic , wasm_opcode ) \
607
+ static void \
608
+ _mono_interp_simd_ ## id (gpointer res, gpointer v1, gpointer v2) { \
609
+ *((v128_t *)res) = c_intrinsic (*((v128_t *)v1), *((int *)v2)); \
610
+ }
611
+
612
+ #define INTERP_WASM_SIMD_INTRINSIC_V_VVV (id , c_intrinsic , wasm_opcode ) \
613
+ static void \
614
+ _mono_interp_simd_ ## id (gpointer res, gpointer v1, gpointer v2, gpointer v3) { \
615
+ *((v128_t *)res) = c_intrinsic (*((v128_t *)v1), *((v128_t *)v2), *((v128_t *)v3)); \
616
+ }
617
+
618
+ #include "interp-simd-intrins.def"
619
+
620
+ #undef INTERP_WASM_SIMD_INTRINSIC_V_P
621
+ #undef INTERP_WASM_SIMD_INTRINSIC_V_V
622
+ #undef INTERP_WASM_SIMD_INTRINSIC_I_V
623
+ #undef INTERP_WASM_SIMD_INTRINSIC_V_VV
624
+ #undef INTERP_WASM_SIMD_INTRINSIC_V_VI
625
+ #undef INTERP_WASM_SIMD_INTRINSIC_V_VVV
626
+
627
+ // Now generate the wasm opcode tables for the intrinsics
628
+
629
+ #undef INTERP_SIMD_INTRINSIC_P_P
630
+ #define INTERP_SIMD_INTRINSIC_P_P (a ,b ,c ) c,
631
+
632
+ int interp_simd_p_p_wasm_opcode_table [] = {
633
+ #include "interp-simd-intrins.def"
634
+ };
635
+
636
+ #undef INTERP_SIMD_INTRINSIC_P_P
637
+ #define INTERP_SIMD_INTRINSIC_P_P (a ,b ,c )
638
+
639
+ #undef INTERP_SIMD_INTRINSIC_P_PP
640
+ #define INTERP_SIMD_INTRINSIC_P_PP (a ,b ,c ) c,
641
+
642
+ int interp_simd_p_pp_wasm_opcode_table [] = {
643
+ #include "interp-simd-intrins.def"
644
+ };
645
+
646
+ #undef INTERP_SIMD_INTRINSIC_P_PP
647
+ #define INTERP_SIMD_INTRINSIC_P_PP (a ,b ,c )
648
+
649
+ #undef INTERP_SIMD_INTRINSIC_P_PPP
650
+ #define INTERP_SIMD_INTRINSIC_P_PPP (a ,b ,c ) c,
651
+
652
+ int interp_simd_p_ppp_wasm_opcode_table [] = {
653
+ #include "interp-simd-intrins.def"
654
+ };
655
+
656
+ #undef INTERP_SIMD_INTRINSIC_P_PPP
657
+ #define INTERP_SIMD_INTRINSIC_P_PPP (a ,b ,c )
658
+
659
+ #endif // HOST_BROWSER
541
660
542
661
#undef INTERP_SIMD_INTRINSIC_P_P
543
- #define INTERP_SIMD_INTRINSIC_P_P (a ,b ) b,
662
+ #define INTERP_SIMD_INTRINSIC_P_P (a ,b , c ) b,
544
663
PP_SIMD_Method interp_simd_p_p_table [] = {
545
664
#include "interp-simd-intrins.def"
546
665
};
547
666
#undef INTERP_SIMD_INTRINSIC_P_P
548
- #define INTERP_SIMD_INTRINSIC_P_P (a ,b )
667
+ #define INTERP_SIMD_INTRINSIC_P_P (a ,b , c )
549
668
550
669
#undef INTERP_SIMD_INTRINSIC_P_PP
551
- #define INTERP_SIMD_INTRINSIC_P_PP (a ,b ) b,
670
+ #define INTERP_SIMD_INTRINSIC_P_PP (a ,b , c ) b,
552
671
PPP_SIMD_Method interp_simd_p_pp_table [] = {
553
672
#include "interp-simd-intrins.def"
554
673
};
555
674
#undef INTERP_SIMD_INTRINSIC_P_PP
556
- #define INTERP_SIMD_INTRINSIC_P_PP (a ,b )
675
+ #define INTERP_SIMD_INTRINSIC_P_PP (a ,b , c )
557
676
558
677
#undef INTERP_SIMD_INTRINSIC_P_PPP
559
- #define INTERP_SIMD_INTRINSIC_P_PPP (a ,b ) b,
678
+ #define INTERP_SIMD_INTRINSIC_P_PPP (a ,b , c ) b,
560
679
PPPP_SIMD_Method interp_simd_p_ppp_table [] = {
561
680
#include "interp-simd-intrins.def"
562
681
};
563
682
#undef INTERP_SIMD_INTRINSIC_P_PPP
564
- #define INTERP_SIMD_INTRINSIC_P_PPP (a ,b )
683
+ #define INTERP_SIMD_INTRINSIC_P_PPP (a ,b , c )
565
684
566
685
#endif // INTERP_ENABLE_SIMD
0 commit comments