@@ -23,6 +23,8 @@ pub enum DataValue {
2323 F128 ( Ieee128 ) ,
2424 V128 ( [ u8 ; 16 ] ) ,
2525 V64 ( [ u8 ; 8 ] ) ,
26+ V32 ( [ u8 ; 4 ] ) ,
27+ V16 ( [ u8 ; 2 ] ) ,
2628}
2729
2830impl PartialEq for DataValue {
@@ -51,6 +53,10 @@ impl PartialEq for DataValue {
5153 ( V128 ( _) , _) => false ,
5254 ( V64 ( l) , V64 ( r) ) => l == r,
5355 ( V64 ( _) , _) => false ,
56+ ( V32 ( l) , V32 ( r) ) => l == r,
57+ ( V32 ( _) , _) => false ,
58+ ( V16 ( l) , V16 ( r) ) => l == r,
59+ ( V16 ( _) , _) => false ,
5460 }
5561 }
5662}
@@ -83,13 +89,15 @@ impl DataValue {
8389 DataValue :: F128 ( _) => types:: F128 ,
8490 DataValue :: V128 ( _) => types:: I8X16 , // A default type.
8591 DataValue :: V64 ( _) => types:: I8X8 , // A default type.
92+ DataValue :: V32 ( _) => types:: I8X4 , // A default type.
93+ DataValue :: V16 ( _) => types:: I8X2 , // A default type.
8694 }
8795 }
8896
8997 /// Return true if the value is a vector (i.e. `DataValue::V128`).
9098 pub fn is_vector ( & self ) -> bool {
9199 match self {
92- DataValue :: V128 ( _) | DataValue :: V64 ( _) => true ,
100+ DataValue :: V128 ( _) | DataValue :: V64 ( _) | DataValue :: V32 ( _ ) | DataValue :: V16 ( _ ) => true ,
93101 _ => false ,
94102 }
95103 }
@@ -113,6 +121,14 @@ impl DataValue {
113121 v. reverse ( ) ;
114122 DataValue :: V64 ( v)
115123 }
124+ DataValue :: V32 ( mut v) => {
125+ v. reverse ( ) ;
126+ DataValue :: V32 ( v)
127+ }
128+ DataValue :: V16 ( mut v) => {
129+ v. reverse ( ) ;
130+ DataValue :: V16 ( v)
131+ }
116132 }
117133 }
118134
@@ -152,6 +168,8 @@ impl DataValue {
152168 DataValue :: F128 ( f) => dst[ ..16 ] . copy_from_slice ( & f. bits ( ) . to_ne_bytes ( ) [ ..] ) ,
153169 DataValue :: V128 ( v) => dst[ ..16 ] . copy_from_slice ( & v[ ..] ) ,
154170 DataValue :: V64 ( v) => dst[ ..8 ] . copy_from_slice ( & v[ ..] ) ,
171+ DataValue :: V32 ( v) => dst[ ..4 ] . copy_from_slice ( & v[ ..] ) ,
172+ DataValue :: V16 ( v) => dst[ ..2 ] . copy_from_slice ( & v[ ..] ) ,
155173 } ;
156174 }
157175
@@ -197,15 +215,13 @@ impl DataValue {
197215 types:: F128 => DataValue :: F128 ( Ieee128 :: with_bits ( u128:: from_ne_bytes (
198216 src[ ..16 ] . try_into ( ) . unwrap ( ) ,
199217 ) ) ) ,
200- _ if ty. is_vector ( ) => {
201- if ty. bytes ( ) == 16 {
202- DataValue :: V128 ( src[ ..16 ] . try_into ( ) . unwrap ( ) )
203- } else if ty. bytes ( ) == 8 {
204- DataValue :: V64 ( src[ ..8 ] . try_into ( ) . unwrap ( ) )
205- } else {
206- unimplemented ! ( )
207- }
208- }
218+ _ if ty. is_vector ( ) => match ty. bytes ( ) {
219+ 16 => DataValue :: V128 ( src[ ..16 ] . try_into ( ) . unwrap ( ) ) ,
220+ 8 => DataValue :: V64 ( src[ ..8 ] . try_into ( ) . unwrap ( ) ) ,
221+ 4 => DataValue :: V32 ( src[ ..4 ] . try_into ( ) . unwrap ( ) ) ,
222+ 2 => DataValue :: V16 ( src[ ..2 ] . try_into ( ) . unwrap ( ) ) ,
223+ _ => unimplemented ! ( ) ,
224+ } ,
209225 _ => unimplemented ! ( ) ,
210226 }
211227 }
@@ -324,6 +340,8 @@ build_conversion_impl!(Ieee64, F64, F64);
324340build_conversion_impl ! ( Ieee128 , F128 , F128 ) ;
325341build_conversion_impl ! ( [ u8 ; 16 ] , V128 , I8X16 ) ;
326342build_conversion_impl ! ( [ u8 ; 8 ] , V64 , I8X8 ) ;
343+ build_conversion_impl ! ( [ u8 ; 4 ] , V32 , I8X4 ) ;
344+ build_conversion_impl ! ( [ u8 ; 2 ] , V16 , I8X2 ) ;
327345impl From < Offset32 > for DataValue {
328346 fn from ( o : Offset32 ) -> Self {
329347 DataValue :: from ( Into :: < i32 > :: into ( o) )
@@ -346,6 +364,8 @@ impl Display for DataValue {
346364 // Again, for syntax consistency, use ConstantData, which in this case displays as hex.
347365 DataValue :: V128 ( dv) => write ! ( f, "{}" , ConstantData :: from( & dv[ ..] ) ) ,
348366 DataValue :: V64 ( dv) => write ! ( f, "{}" , ConstantData :: from( & dv[ ..] ) ) ,
367+ DataValue :: V32 ( dv) => write ! ( f, "{}" , ConstantData :: from( & dv[ ..] ) ) ,
368+ DataValue :: V16 ( dv) => write ! ( f, "{}" , ConstantData :: from( & dv[ ..] ) ) ,
349369 }
350370 }
351371}
0 commit comments