@@ -247,8 +247,18 @@ var_t *promote_unchecked(block_t *block,
247
247
{
248
248
var_t * rd = require_typed_ptr_var (block , target_type , target_ptr );
249
249
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 );
252
262
return rd ;
253
263
}
254
264
@@ -1598,6 +1608,9 @@ void handle_single_dereference(block_t *parent, basic_block_t **bb)
1598
1608
case TYPE_char :
1599
1609
sz = TY_char -> size ;
1600
1610
break ;
1611
+ case TYPE_short :
1612
+ sz = TY_short -> size ;
1613
+ break ;
1601
1614
case TYPE_int :
1602
1615
sz = TY_int -> size ;
1603
1616
break ;
@@ -1678,6 +1691,9 @@ void handle_multiple_dereference(block_t *parent, basic_block_t **bb)
1678
1691
case TYPE_char :
1679
1692
sz = TY_char -> size ;
1680
1693
break ;
1694
+ case TYPE_short :
1695
+ sz = TY_short -> size ;
1696
+ break ;
1681
1697
case TYPE_int :
1682
1698
sz = TY_int -> size ;
1683
1699
break ;
@@ -1980,6 +1996,7 @@ void read_expr_operand(block_t *parent, basic_block_t **bb)
1980
1996
add_insn (parent , * bb , OP_load_constant , compound_var , NULL ,
1981
1997
NULL , 0 , NULL );
1982
1998
} else if (cast_or_literal_type -> base_type == TYPE_int ||
1999
+ cast_or_literal_type -> base_type == TYPE_short ||
1983
2000
cast_or_literal_type -> base_type == TYPE_char ) {
1984
2001
/* Handle empty compound literals */
1985
2002
if (lex_peek (T_close_curly , NULL )) {
@@ -2266,6 +2283,8 @@ int get_pointer_element_size(var_t *ptr_var)
2266
2283
switch (ptr_var -> type -> base_type ) {
2267
2284
case TYPE_char :
2268
2285
return TY_char -> size ;
2286
+ case TYPE_short :
2287
+ return TY_short -> size ;
2269
2288
case TYPE_int :
2270
2289
return TY_int -> size ;
2271
2290
case TYPE_void :
@@ -2280,6 +2299,8 @@ int get_pointer_element_size(var_t *ptr_var)
2280
2299
switch (ptr_var -> type -> base_type ) {
2281
2300
case TYPE_char :
2282
2301
return TY_char -> size ;
2302
+ case TYPE_short :
2303
+ return TY_short -> size ;
2283
2304
case TYPE_int :
2284
2305
return TY_int -> size ;
2285
2306
case TYPE_void :
@@ -2388,6 +2409,9 @@ void handle_pointer_arithmetic(block_t *parent,
2388
2409
case TYPE_char :
2389
2410
element_size = 1 ;
2390
2411
break ;
2412
+ case TYPE_short :
2413
+ element_size = 2 ;
2414
+ break ;
2391
2415
case TYPE_int :
2392
2416
element_size = 4 ;
2393
2417
break ;
@@ -2406,6 +2430,9 @@ void handle_pointer_arithmetic(block_t *parent,
2406
2430
case TYPE_char :
2407
2431
element_size = 1 ;
2408
2432
break ;
2433
+ case TYPE_short :
2434
+ element_size = 2 ;
2435
+ break ;
2409
2436
case TYPE_int :
2410
2437
element_size = 4 ;
2411
2438
break ;
@@ -2865,6 +2892,9 @@ void read_lvalue(lvalue_t *lvalue,
2865
2892
case TYPE_char :
2866
2893
lvalue -> size = TY_char -> size ;
2867
2894
break ;
2895
+ case TYPE_short :
2896
+ lvalue -> size = TY_short -> size ;
2897
+ break ;
2868
2898
case TYPE_int :
2869
2899
lvalue -> size = TY_int -> size ;
2870
2900
break ;
@@ -3096,6 +3126,9 @@ void read_lvalue(lvalue_t *lvalue,
3096
3126
case TYPE_char :
3097
3127
increment_size = TY_char -> size ;
3098
3128
break ;
3129
+ case TYPE_short :
3130
+ increment_size = TY_short -> size ;
3131
+ break ;
3099
3132
case TYPE_int :
3100
3133
increment_size = TY_int -> size ;
3101
3134
break ;
@@ -3431,6 +3464,9 @@ bool read_body_assignment(char *token,
3431
3464
case TYPE_char :
3432
3465
increment_size = TY_char -> size ;
3433
3466
break ;
3467
+ case TYPE_short :
3468
+ increment_size = TY_short -> size ;
3469
+ break ;
3434
3470
case TYPE_int :
3435
3471
increment_size = TY_int -> size ;
3436
3472
break ;
@@ -4237,7 +4273,8 @@ basic_block_t *read_body_statement(block_t *parent, basic_block_t *bb)
4237
4273
*/
4238
4274
if (expr_result && expr_result -> array_size > 0 &&
4239
4275
!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 ) &&
4241
4278
expr_result -> var_name [0 ] == '.' ) {
4242
4279
var_t * first_elem = require_var (parent );
4243
4280
first_elem -> type = var -> type ;
@@ -4525,7 +4562,8 @@ basic_block_t *read_body_statement(block_t *parent, basic_block_t *bb)
4525
4562
/* Handle array compound literal to scalar assignment */
4526
4563
if (expr_result && expr_result -> array_size > 0 &&
4527
4564
!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 ) &&
4529
4567
expr_result -> var_name [0 ] == '.' ) {
4530
4568
/* Extract first element from compound literal array */
4531
4569
var_t * first_elem = require_var (parent );
@@ -5210,6 +5248,10 @@ void parse_internal(void)
5210
5248
TY_int -> base_type = TYPE_int ;
5211
5249
TY_int -> size = 4 ;
5212
5250
5251
+ TY_short = add_named_type ("short" );
5252
+ TY_short -> base_type = TYPE_short ;
5253
+ TY_short -> size = 2 ;
5254
+
5213
5255
/* builtin type _Bool was introduced in C99 specification, it is more
5214
5256
* well-known as macro type bool, which is defined in <std_bool.h> (in
5215
5257
* shecc, it is defined in 'lib/c.c').
0 commit comments