@@ -180,11 +180,22 @@ typedef dreg_t dreg_gc_safe_t;
180
180
case COMPACT_EXTENDED : \
181
181
switch (first_byte ) { \
182
182
case COMPACT_EXTENDED_LITERAL : { \
183
- uint8_t ext = ((* (decode_pc )++ ) & 0xF ); \
184
- if (ext == 0x8 ) { \
185
- (decode_pc )++ ; \
186
- } else if (ext != 0 ) { \
187
- AVM_ABORT (); \
183
+ uint8_t first_extended_byte = * (decode_pc )++ ; \
184
+ switch (((first_extended_byte ) >> 3 ) & 0x3 ) { \
185
+ case 0 : \
186
+ case 2 : \
187
+ break ; \
188
+ \
189
+ case 1 : \
190
+ (decode_pc )++ ; \
191
+ break ; \
192
+ \
193
+ case 3 : { \
194
+ uint8_t sz = (first_extended_byte >> 5 ) + 2 ; \
195
+ decode_pc += sz ; \
196
+ break ; \
197
+ } \
198
+ default : UNREACHABLE (); /* help gcc 8.4 */ \
188
199
} \
189
200
break ; \
190
201
} \
@@ -594,14 +605,28 @@ static void destroy_extended_registers(Context *ctx, unsigned int live)
594
605
switch (first_byte ) { \
595
606
case COMPACT_EXTENDED_LITERAL : { \
596
607
uint8_t first_extended_byte = * (decode_pc )++ ; \
597
- if (!(first_extended_byte & 0xF )) { \
598
- dest_term = module_load_literal (mod , first_extended_byte >> 4 , ctx ); \
599
- } else if ((first_extended_byte & 0xF ) == 0x8 ) { \
600
- uint8_t byte_1 = * (decode_pc )++ ; \
601
- uint16_t index = (((uint16_t ) first_extended_byte & 0xE0 ) << 3 ) | byte_1 ; \
602
- dest_term = module_load_literal (mod , index , ctx ); \
603
- } else { \
604
- VM_ABORT (); \
608
+ switch (((first_extended_byte ) >> 3 ) & 0x3 ) { \
609
+ case 0 : \
610
+ case 2 : \
611
+ dest_term = module_load_literal (mod , first_extended_byte >> 4 , ctx ); \
612
+ break ; \
613
+ case 1 : { \
614
+ uint8_t byte_1 = * (decode_pc )++ ; \
615
+ uint16_t index = (((uint16_t ) first_extended_byte & 0xE0 ) << 3 ) | byte_1 ; \
616
+ dest_term = module_load_literal (mod , index , ctx ); \
617
+ break ; \
618
+ } \
619
+ case 3 : { \
620
+ uint8_t sz = (first_extended_byte >> 5 ) + 2 ; \
621
+ avm_int_t val = 0 ; \
622
+ for (uint8_t vi = 0 ; vi < sz ; vi ++ ) { \
623
+ val <<= 8 ; \
624
+ val |= * (decode_pc )++ ; \
625
+ } \
626
+ dest_term = module_load_literal (mod , val , ctx ); \
627
+ break ; \
628
+ } \
629
+ default : UNREACHABLE (); /* help gcc 8.4 */ \
605
630
} \
606
631
if (UNLIKELY (term_is_invalid_term (dest_term ))) { \
607
632
RAISE_ERROR (OUT_OF_MEMORY_ATOM ); \
0 commit comments