@@ -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 )) {
@@ -2249,6 +2266,7 @@ bool is_logical(opcode_t op)
2249
2266
return op == OP_log_and || op == OP_log_or ;
2250
2267
}
2251
2268
2269
+
2252
2270
/* Helper function to calculate element size for pointer operations */
2253
2271
int get_pointer_element_size (var_t * ptr_var )
2254
2272
{
@@ -2266,6 +2284,8 @@ int get_pointer_element_size(var_t *ptr_var)
2266
2284
switch (ptr_var -> type -> base_type ) {
2267
2285
case TYPE_char :
2268
2286
return TY_char -> size ;
2287
+ case TYPE_short :
2288
+ return TY_short -> size ;
2269
2289
case TYPE_int :
2270
2290
return TY_int -> size ;
2271
2291
case TYPE_void :
@@ -2280,6 +2300,8 @@ int get_pointer_element_size(var_t *ptr_var)
2280
2300
switch (ptr_var -> type -> base_type ) {
2281
2301
case TYPE_char :
2282
2302
return TY_char -> size ;
2303
+ case TYPE_short :
2304
+ return TY_short -> size ;
2283
2305
case TYPE_int :
2284
2306
return TY_int -> size ;
2285
2307
case TYPE_void :
@@ -2388,6 +2410,9 @@ void handle_pointer_arithmetic(block_t *parent,
2388
2410
case TYPE_char :
2389
2411
element_size = 1 ;
2390
2412
break ;
2413
+ case TYPE_short :
2414
+ element_size = 2 ;
2415
+ break ;
2391
2416
case TYPE_int :
2392
2417
element_size = 4 ;
2393
2418
break ;
@@ -2406,6 +2431,9 @@ void handle_pointer_arithmetic(block_t *parent,
2406
2431
case TYPE_char :
2407
2432
element_size = 1 ;
2408
2433
break ;
2434
+ case TYPE_short :
2435
+ element_size = 2 ;
2436
+ break ;
2409
2437
case TYPE_int :
2410
2438
element_size = 4 ;
2411
2439
break ;
@@ -2865,6 +2893,9 @@ void read_lvalue(lvalue_t *lvalue,
2865
2893
case TYPE_char :
2866
2894
lvalue -> size = TY_char -> size ;
2867
2895
break ;
2896
+ case TYPE_short :
2897
+ lvalue -> size = TY_short -> size ;
2898
+ break ;
2868
2899
case TYPE_int :
2869
2900
lvalue -> size = TY_int -> size ;
2870
2901
break ;
@@ -3096,6 +3127,9 @@ void read_lvalue(lvalue_t *lvalue,
3096
3127
case TYPE_char :
3097
3128
increment_size = TY_char -> size ;
3098
3129
break ;
3130
+ case TYPE_short :
3131
+ increment_size = TY_short -> size ;
3132
+ break ;
3099
3133
case TYPE_int :
3100
3134
increment_size = TY_int -> size ;
3101
3135
break ;
@@ -3431,6 +3465,9 @@ bool read_body_assignment(char *token,
3431
3465
case TYPE_char :
3432
3466
increment_size = TY_char -> size ;
3433
3467
break ;
3468
+ case TYPE_short :
3469
+ increment_size = TY_short -> size ;
3470
+ break ;
3434
3471
case TYPE_int :
3435
3472
increment_size = TY_int -> size ;
3436
3473
break ;
@@ -4237,7 +4274,8 @@ basic_block_t *read_body_statement(block_t *parent, basic_block_t *bb)
4237
4274
*/
4238
4275
if (expr_result && expr_result -> array_size > 0 &&
4239
4276
!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 ) &&
4241
4279
expr_result -> var_name [0 ] == '.' ) {
4242
4280
var_t * first_elem = require_var (parent );
4243
4281
first_elem -> type = var -> type ;
@@ -4525,7 +4563,8 @@ basic_block_t *read_body_statement(block_t *parent, basic_block_t *bb)
4525
4563
/* Handle array compound literal to scalar assignment */
4526
4564
if (expr_result && expr_result -> array_size > 0 &&
4527
4565
!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 ) &&
4529
4568
expr_result -> var_name [0 ] == '.' ) {
4530
4569
/* Extract first element from compound literal array */
4531
4570
var_t * first_elem = require_var (parent );
@@ -5210,6 +5249,10 @@ void parse_internal(void)
5210
5249
TY_int -> base_type = TYPE_int ;
5211
5250
TY_int -> size = 4 ;
5212
5251
5252
+ TY_short = add_named_type ("short" );
5253
+ TY_short -> base_type = TYPE_short ;
5254
+ TY_short -> size = 2 ;
5255
+
5213
5256
/* builtin type _Bool was introduced in C99 specification, it is more
5214
5257
* well-known as macro type bool, which is defined in <std_bool.h> (in
5215
5258
* shecc, it is defined in 'lib/c.c').
0 commit comments