11use num_bigint:: BigUint ;
2+ use static_assertions:: const_assert;
23
34use crate :: brtable:: BrTableEntry ;
45use crate :: brtable:: ElemEntry ;
56use crate :: brtable:: IndirectClass ;
6- use crate :: encode:: COMMON_RANGE_OFFSET ;
7+ use crate :: encode:: instruction_table:: FID_BITS ;
8+ use crate :: encode:: instruction_table:: IID_BITS ;
9+ use crate :: encode:: COMMON_RANGE_BITS ;
710
811use super :: FromBn ;
912
13+ const INDIRECT_CLASS_SHIFT : u32 = 192 ;
1014lazy_static ! {
11- static ref INDIRECT_CLASS_SHIFT : BigUint = BigUint :: from( 1u64 ) << 192 ;
15+ static ref INDIRECT_CLASS_SHIFT_BN : BigUint = BigUint :: from( 1u64 ) << 192 ;
1216}
1317
14- pub ( crate ) const BR_TABLE_ENCODE_BOUNDARY : u32 = 224 ;
18+ pub const BR_TABLE_ENCODE_BOUNDARY : u32 = 224 ;
19+ // Tag only include 1 bit(BrTable or Elem)
20+ const_assert ! ( INDIRECT_CLASS_SHIFT < BR_TABLE_ENCODE_BOUNDARY ) ;
1521
1622pub fn encode_br_table_entry < T : FromBn > (
1723 fid : T ,
@@ -21,16 +27,17 @@ pub fn encode_br_table_entry<T: FromBn>(
2127 keep : T ,
2228 dst_pc : T ,
2329) -> T {
24- const FID_SHIFT : u32 = IID_SHIFT + COMMON_RANGE_OFFSET ;
25- const IID_SHIFT : u32 = INDEX_SHIFT + COMMON_RANGE_OFFSET ;
26- const INDEX_SHIFT : u32 = DROP_SHIFT + COMMON_RANGE_OFFSET ;
27- const DROP_SHIFT : u32 = KEEP_SHIFT + COMMON_RANGE_OFFSET ;
28- const KEEP_SHIFT : u32 = DST_PC_SHIFT + COMMON_RANGE_OFFSET ;
30+ const FID_SHIFT : u32 = IID_SHIFT + IID_BITS ;
31+ const IID_SHIFT : u32 = INDEX_SHIFT + COMMON_RANGE_BITS ;
32+ const INDEX_SHIFT : u32 = DROP_SHIFT + COMMON_RANGE_BITS ;
33+ const DROP_SHIFT : u32 = KEEP_SHIFT + COMMON_RANGE_BITS ;
34+ const KEEP_SHIFT : u32 = DST_PC_SHIFT + COMMON_RANGE_BITS ;
2935 const DST_PC_SHIFT : u32 = 0 ;
3036
31- assert ! ( FID_SHIFT + COMMON_RANGE_OFFSET <= BR_TABLE_ENCODE_BOUNDARY ) ;
37+ assert ! ( FID_SHIFT + FID_BITS <= INDIRECT_CLASS_SHIFT ) ;
3238
33- T :: from_bn ( & ( BigUint :: from ( IndirectClass :: BrTable as u64 ) ) ) * T :: from_bn ( & INDIRECT_CLASS_SHIFT )
39+ T :: from_bn ( & ( BigUint :: from ( IndirectClass :: BrTable as u64 ) ) )
40+ * T :: from_bn ( & INDIRECT_CLASS_SHIFT_BN )
3441 + fid * T :: from_bn ( & ( BigUint :: from ( 1u64 ) << FID_SHIFT ) )
3542 + iid * T :: from_bn ( & ( BigUint :: from ( 1u64 ) << IID_SHIFT ) )
3643 + index * T :: from_bn ( & ( BigUint :: from ( 1u64 ) << INDEX_SHIFT ) )
@@ -40,15 +47,15 @@ pub fn encode_br_table_entry<T: FromBn>(
4047}
4148
4249pub fn encode_elem_entry < T : FromBn > ( table_idx : T , type_idx : T , offset : T , func_idx : T ) -> T {
43- const TABLE_INDEX_SHIFT : u32 = TYPE_INDEX_SHIFT + COMMON_RANGE_OFFSET ;
44- const TYPE_INDEX_SHIFT : u32 = OFFSET_SHIFT + COMMON_RANGE_OFFSET ;
45- const OFFSET_SHIFT : u32 = FUNC_INDEX + COMMON_RANGE_OFFSET ;
50+ const TABLE_INDEX_SHIFT : u32 = TYPE_INDEX_SHIFT + COMMON_RANGE_BITS ;
51+ const TYPE_INDEX_SHIFT : u32 = OFFSET_SHIFT + COMMON_RANGE_BITS ;
52+ const OFFSET_SHIFT : u32 = FUNC_INDEX + FID_BITS ;
4653 const FUNC_INDEX : u32 = 0 ;
4754
48- assert ! ( TABLE_INDEX_SHIFT + COMMON_RANGE_OFFSET <= BR_TABLE_ENCODE_BOUNDARY ) ;
55+ assert ! ( TABLE_INDEX_SHIFT + COMMON_RANGE_BITS <= INDIRECT_CLASS_SHIFT ) ;
4956
5057 T :: from_bn ( & ( BigUint :: from ( IndirectClass :: CallIndirect as u64 ) ) )
51- * T :: from_bn ( & INDIRECT_CLASS_SHIFT )
58+ * T :: from_bn ( & INDIRECT_CLASS_SHIFT_BN )
5259 + table_idx * T :: from_bn ( & ( BigUint :: from ( 1u64 ) << TABLE_INDEX_SHIFT ) )
5360 + type_idx * T :: from_bn ( & ( BigUint :: from ( 1u64 ) << TYPE_INDEX_SHIFT ) )
5461 + offset * T :: from_bn ( & ( BigUint :: from ( 1u64 ) << OFFSET_SHIFT ) )
0 commit comments