@@ -247,8 +247,18 @@ var_t *promote_unchecked(block_t *block,
247247{
248248 var_t * rd = require_typed_ptr_var (block , target_type , target_ptr );
249249 gen_name_to (rd -> var_name );
250- add_insn (block , * bb , OP_sign_ext , rd , var , NULL ,
251- target_ptr ? PTR_SIZE : target_type -> size , NULL );
250+ /* Encode both source and target sizes in src1:
251+ * Lower 16 bits: target size
252+ * Upper 16 bits: source size
253+ * This allows codegen to distinguish between different promotion types
254+ * without changing IR semantics.
255+ */
256+ int encoded_size = ((var -> type -> size ) << 16 );
257+ if (target_ptr )
258+ encoded_size |= PTR_SIZE ;
259+ else
260+ encoded_size |= target_type -> size ;
261+ add_insn (block , * bb , OP_sign_ext , rd , var , NULL , encoded_size , NULL );
252262 return rd ;
253263}
254264
@@ -1598,6 +1608,9 @@ void handle_single_dereference(block_t *parent, basic_block_t **bb)
15981608 case TYPE_char :
15991609 sz = TY_char -> size ;
16001610 break ;
1611+ case TYPE_short :
1612+ sz = TY_short -> size ;
1613+ break ;
16011614 case TYPE_int :
16021615 sz = TY_int -> size ;
16031616 break ;
@@ -1678,6 +1691,9 @@ void handle_multiple_dereference(block_t *parent, basic_block_t **bb)
16781691 case TYPE_char :
16791692 sz = TY_char -> size ;
16801693 break ;
1694+ case TYPE_short :
1695+ sz = TY_short -> size ;
1696+ break ;
16811697 case TYPE_int :
16821698 sz = TY_int -> size ;
16831699 break ;
@@ -1980,6 +1996,7 @@ void read_expr_operand(block_t *parent, basic_block_t **bb)
19801996 add_insn (parent , * bb , OP_load_constant , compound_var , NULL ,
19811997 NULL , 0 , NULL );
19821998 } else if (cast_or_literal_type -> base_type == TYPE_int ||
1999+ cast_or_literal_type -> base_type == TYPE_short ||
19832000 cast_or_literal_type -> base_type == TYPE_char ) {
19842001 /* Handle empty compound literals */
19852002 if (lex_peek (T_close_curly , NULL )) {
@@ -2266,6 +2283,8 @@ int get_pointer_element_size(var_t *ptr_var)
22662283 switch (ptr_var -> type -> base_type ) {
22672284 case TYPE_char :
22682285 return TY_char -> size ;
2286+ case TYPE_short :
2287+ return TY_short -> size ;
22692288 case TYPE_int :
22702289 return TY_int -> size ;
22712290 case TYPE_void :
@@ -2280,6 +2299,8 @@ int get_pointer_element_size(var_t *ptr_var)
22802299 switch (ptr_var -> type -> base_type ) {
22812300 case TYPE_char :
22822301 return TY_char -> size ;
2302+ case TYPE_short :
2303+ return TY_short -> size ;
22832304 case TYPE_int :
22842305 return TY_int -> size ;
22852306 case TYPE_void :
@@ -2388,6 +2409,9 @@ void handle_pointer_arithmetic(block_t *parent,
23882409 case TYPE_char :
23892410 element_size = 1 ;
23902411 break ;
2412+ case TYPE_short :
2413+ element_size = 2 ;
2414+ break ;
23912415 case TYPE_int :
23922416 element_size = 4 ;
23932417 break ;
@@ -2406,6 +2430,9 @@ void handle_pointer_arithmetic(block_t *parent,
24062430 case TYPE_char :
24072431 element_size = 1 ;
24082432 break ;
2433+ case TYPE_short :
2434+ element_size = 2 ;
2435+ break ;
24092436 case TYPE_int :
24102437 element_size = 4 ;
24112438 break ;
@@ -2865,6 +2892,9 @@ void read_lvalue(lvalue_t *lvalue,
28652892 case TYPE_char :
28662893 lvalue -> size = TY_char -> size ;
28672894 break ;
2895+ case TYPE_short :
2896+ lvalue -> size = TY_short -> size ;
2897+ break ;
28682898 case TYPE_int :
28692899 lvalue -> size = TY_int -> size ;
28702900 break ;
@@ -3096,6 +3126,9 @@ void read_lvalue(lvalue_t *lvalue,
30963126 case TYPE_char :
30973127 increment_size = TY_char -> size ;
30983128 break ;
3129+ case TYPE_short :
3130+ increment_size = TY_short -> size ;
3131+ break ;
30993132 case TYPE_int :
31003133 increment_size = TY_int -> size ;
31013134 break ;
@@ -3431,6 +3464,9 @@ bool read_body_assignment(char *token,
34313464 case TYPE_char :
34323465 increment_size = TY_char -> size ;
34333466 break ;
3467+ case TYPE_short :
3468+ increment_size = TY_short -> size ;
3469+ break ;
34343470 case TYPE_int :
34353471 increment_size = TY_int -> size ;
34363472 break ;
@@ -4237,7 +4273,8 @@ basic_block_t *read_body_statement(block_t *parent, basic_block_t *bb)
42374273 */
42384274 if (expr_result && expr_result -> array_size > 0 &&
42394275 !var -> ptr_level && var -> array_size == 0 && var -> type &&
4240- var -> type -> base_type == TYPE_int &&
4276+ (var -> type -> base_type == TYPE_int ||
4277+ var -> type -> base_type == TYPE_short ) &&
42414278 expr_result -> var_name [0 ] == '.' ) {
42424279 var_t * first_elem = require_var (parent );
42434280 first_elem -> type = var -> type ;
@@ -4525,7 +4562,8 @@ basic_block_t *read_body_statement(block_t *parent, basic_block_t *bb)
45254562 /* Handle array compound literal to scalar assignment */
45264563 if (expr_result && expr_result -> array_size > 0 &&
45274564 !var -> ptr_level && var -> array_size == 0 && var -> type &&
4528- var -> type -> base_type == TYPE_int &&
4565+ (var -> type -> base_type == TYPE_int ||
4566+ var -> type -> base_type == TYPE_short ) &&
45294567 expr_result -> var_name [0 ] == '.' ) {
45304568 /* Extract first element from compound literal array */
45314569 var_t * first_elem = require_var (parent );
@@ -5210,6 +5248,10 @@ void parse_internal(void)
52105248 TY_int -> base_type = TYPE_int ;
52115249 TY_int -> size = 4 ;
52125250
5251+ TY_short = add_named_type ("short" );
5252+ TY_short -> base_type = TYPE_short ;
5253+ TY_short -> size = 2 ;
5254+
52135255 /* builtin type _Bool was introduced in C99 specification, it is more
52145256 * well-known as macro type bool, which is defined in <std_bool.h> (in
52155257 * shecc, it is defined in 'lib/c.c').
0 commit comments