@@ -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 )) {
@@ -2249,6 +2266,7 @@ bool is_logical(opcode_t op)
22492266    return  op  ==  OP_log_and  ||  op  ==  OP_log_or ;
22502267}
22512268
2269+ 
22522270/* Helper function to calculate element size for pointer operations */ 
22532271int  get_pointer_element_size (var_t  * ptr_var )
22542272{
@@ -2266,6 +2284,8 @@ int get_pointer_element_size(var_t *ptr_var)
22662284        switch  (ptr_var -> type -> base_type ) {
22672285        case  TYPE_char :
22682286            return  TY_char -> size ;
2287+         case  TYPE_short :
2288+             return  TY_short -> size ;
22692289        case  TYPE_int :
22702290            return  TY_int -> size ;
22712291        case  TYPE_void :
@@ -2280,6 +2300,8 @@ int get_pointer_element_size(var_t *ptr_var)
22802300        switch  (ptr_var -> type -> base_type ) {
22812301        case  TYPE_char :
22822302            return  TY_char -> size ;
2303+         case  TYPE_short :
2304+             return  TY_short -> size ;
22832305        case  TYPE_int :
22842306            return  TY_int -> size ;
22852307        case  TYPE_void :
@@ -2388,6 +2410,9 @@ void handle_pointer_arithmetic(block_t *parent,
23882410                    case  TYPE_char :
23892411                        element_size  =  1 ;
23902412                        break ;
2413+                     case  TYPE_short :
2414+                         element_size  =  2 ;
2415+                         break ;
23912416                    case  TYPE_int :
23922417                        element_size  =  4 ;
23932418                        break ;
@@ -2406,6 +2431,9 @@ void handle_pointer_arithmetic(block_t *parent,
24062431                    case  TYPE_char :
24072432                        element_size  =  1 ;
24082433                        break ;
2434+                     case  TYPE_short :
2435+                         element_size  =  2 ;
2436+                         break ;
24092437                    case  TYPE_int :
24102438                        element_size  =  4 ;
24112439                        break ;
@@ -2865,6 +2893,9 @@ void read_lvalue(lvalue_t *lvalue,
28652893                    case  TYPE_char :
28662894                        lvalue -> size  =  TY_char -> size ;
28672895                        break ;
2896+                     case  TYPE_short :
2897+                         lvalue -> size  =  TY_short -> size ;
2898+                         break ;
28682899                    case  TYPE_int :
28692900                        lvalue -> size  =  TY_int -> size ;
28702901                        break ;
@@ -3096,6 +3127,9 @@ void read_lvalue(lvalue_t *lvalue,
30963127                case  TYPE_char :
30973128                    increment_size  =  TY_char -> size ;
30983129                    break ;
3130+                 case  TYPE_short :
3131+                     increment_size  =  TY_short -> size ;
3132+                     break ;
30993133                case  TYPE_int :
31003134                    increment_size  =  TY_int -> size ;
31013135                    break ;
@@ -3431,6 +3465,9 @@ bool read_body_assignment(char *token,
34313465                case  TYPE_char :
34323466                    increment_size  =  TY_char -> size ;
34333467                    break ;
3468+                 case  TYPE_short :
3469+                     increment_size  =  TY_short -> size ;
3470+                     break ;
34343471                case  TYPE_int :
34353472                    increment_size  =  TY_int -> size ;
34363473                    break ;
@@ -4237,7 +4274,8 @@ basic_block_t *read_body_statement(block_t *parent, basic_block_t *bb)
42374274                     */ 
42384275                    if  (expr_result  &&  expr_result -> array_size  >  0  && 
42394276                        !var -> ptr_level  &&  var -> array_size  ==  0  &&  var -> type  && 
4240-                         var -> type -> base_type  ==  TYPE_int  && 
4277+                         (var -> type -> base_type  ==  TYPE_int  || 
4278+                          var -> type -> base_type  ==  TYPE_short ) && 
42414279                        expr_result -> var_name [0 ] ==  '.' ) {
42424280                        var_t  * first_elem  =  require_var (parent );
42434281                        first_elem -> type  =  var -> type ;
@@ -4525,7 +4563,8 @@ basic_block_t *read_body_statement(block_t *parent, basic_block_t *bb)
45254563                /* Handle array compound literal to scalar assignment */ 
45264564                if  (expr_result  &&  expr_result -> array_size  >  0  && 
45274565                    !var -> ptr_level  &&  var -> array_size  ==  0  &&  var -> type  && 
4528-                     var -> type -> base_type  ==  TYPE_int  && 
4566+                     (var -> type -> base_type  ==  TYPE_int  || 
4567+                      var -> type -> base_type  ==  TYPE_short ) && 
45294568                    expr_result -> var_name [0 ] ==  '.' ) {
45304569                    /* Extract first element from compound literal array */ 
45314570                    var_t  * first_elem  =  require_var (parent );
@@ -5210,6 +5249,10 @@ void parse_internal(void)
52105249    TY_int -> base_type  =  TYPE_int ;
52115250    TY_int -> size  =  4 ;
52125251
5252+     TY_short  =  add_named_type ("short" );
5253+     TY_short -> base_type  =  TYPE_short ;
5254+     TY_short -> size  =  2 ;
5255+ 
52135256    /* builtin type _Bool was introduced in C99 specification, it is more 
52145257     * well-known as macro type bool, which is defined in <std_bool.h> (in 
52155258     * shecc, it is defined in 'lib/c.c'). 
0 commit comments