Unified · Split
| @@ -61,7 +61,7 @@ · 60 unmodified lines | |||
| 61 | #define RC_IRET RC_R0 /* function return: integer register */ | 61 | #define RC_IRET RC_R0 /* function return: integer register */ |
| 62 | #define RC_LRET RC_R1 /* function return: second integer register */ | 62 | #define RC_LRET RC_R1 /* function return: second integer register */ |
| 63 | #define RC_FRET RC_F0 /* function return: float register */ | 63 | #define RC_FRET RC_F0 /* function return: float register */ |
| 64 | 64 | #define RC_MASK (RC_INT|RC_FLOAT) | |
| 65 | /* pretty names for the registers */ | 65 | /* pretty names for the registers */ |
| 66 | enum { | 66 | enum { |
| 67 | TREG_R0 = 0, | 67 | TREG_R0 = 0, |
| @@ -540,6 +540,14 @@ void load(int r, SValue *sv) · 472 unmodified lines | |||
| 540 | v = fr & VT_VALMASK; | 540 | v = fr & VT_VALMASK; |
| 541 | if (fr & VT_LVAL) { | 541 | if (fr & VT_LVAL) { |
| 542 | uint32_t base = 0xB; // fp | 542 | uint32_t base = 0xB; // fp |
| 543 | if(fr & VT_TMP){ | ||
| 544 | int size, align; | ||
| 545 | if((ft & VT_BTYPE) == VT_FUNC) | ||
| 546 | size = PTR_SIZE; | ||
| 547 | else | ||
| 548 | size = type_size(&sv->type, &align); | ||
| 549 | loc_stack(size, 0); | ||
| 550 | } | ||
| 543 | if(v == VT_LLOCAL) { | 551 | if(v == VT_LLOCAL) { |
| 544 | v1.type.t = VT_PTR; | 552 | v1.type.t = VT_PTR; |
| 545 | v1.r = VT_LOCAL | VT_LVAL; | 553 | v1.r = VT_LOCAL | VT_LVAL; |
| @@ -58,7 +58,7 @@ · 57 unmodified lines | |||
| 58 | #define RC_IRET RC_C67_A4 /* function return: integer register */ | 58 | #define RC_IRET RC_C67_A4 /* function return: integer register */ |
| 59 | #define RC_LRET RC_C67_A5 /* function return: second integer register */ | 59 | #define RC_LRET RC_C67_A5 /* function return: second integer register */ |
| 60 | #define RC_FRET RC_C67_A4 /* function return: float register */ | 60 | #define RC_FRET RC_C67_A4 /* function return: float register */ |
| 61 | 61 | #define RC_MASK (RC_INT|RC_FLOAT) | |
| 62 | /* pretty names for the registers */ | 62 | /* pretty names for the registers */ |
| 63 | enum { | 63 | enum { |
| 64 | TREG_EAX = 0, // really A2 | 64 | TREG_EAX = 0, // really A2 |
| @@ -1571,12 +1571,21 @@ void load(int r, SValue * sv) · 1506 unmodified lines | |||
| 1571 | 1571 | ||
| 1572 | v = fr & VT_VALMASK; | 1572 | v = fr & VT_VALMASK; |
| 1573 | if (fr & VT_LVAL) { | 1573 | if (fr & VT_LVAL) { |
| 1574 | if(fr & VT_TMP){ | ||
| 1575 | int size, align; | ||
| 1576 | if((ft & VT_BTYPE) == VT_FUNC) | ||
| 1577 | size = PTR_SIZE; | ||
| 1578 | else | ||
| 1579 | size = type_size(&sv->type, &align); | ||
| 1580 | loc_stack(size, 0); | ||
| 1581 | } | ||
| 1574 | if (v == VT_LLOCAL) { | 1582 | if (v == VT_LLOCAL) { |
| 1575 | v1.type.t = VT_INT; | 1583 | v1.type.t = VT_INT; |
| 1576 | v1.r = VT_LOCAL | VT_LVAL; | 1584 | v1.r = VT_LOCAL | VT_LVAL; |
| 1577 | v1.c.ul = fc; | 1585 | v1.c.ul = fc; |
| 1578 | load(r, &v1); | 1586 | load(r, &v1); |
| 1579 | fr = r; | 1587 | fr = r; |
| 1588 | fc = 0; | ||
| 1580 | } else if ((ft & VT_BTYPE) == VT_LDOUBLE) { | 1589 | } else if ((ft & VT_BTYPE) == VT_LDOUBLE) { |
| 1581 | tcc_error("long double not supported"); | 1590 | tcc_error("long double not supported"); |
| 1582 | } else if ((ft & VT_TYPE) == VT_BYTE) { | 1591 | } else if ((ft & VT_TYPE) == VT_BYTE) { |
| @@ -21,7 +21,7 @@ · 20 unmodified lines | |||
| 21 | #ifdef TARGET_DEFS_ONLY | 21 | #ifdef TARGET_DEFS_ONLY |
| 22 | 22 | ||
| 23 | /* number of available registers */ | 23 | /* number of available registers */ |
| 24 | #define NB_REGS 4 | 24 | #define NB_REGS 8 |
| 25 | #define NB_ASM_REGS 8 | 25 | #define NB_ASM_REGS 8 |
| 26 | 26 | ||
| 27 | /* a register can belong to several classes. The classes must be | 27 | /* a register can belong to several classes. The classes must be |
| @@ -41,7 +41,6 @@ · 13 unmodified lines | |||
| 41 | #define RC_LRET RC_EDX /* function return: second integer register */ | 41 | #define RC_LRET RC_EDX /* function return: second integer register */ |
| 42 | #define RC_FRET RC_ST0 /* function return: float register */ | 42 | #define RC_FRET RC_ST0 /* function return: float register */ |
| 43 | #define RC_MASK (RC_INT|RC_INT2|RC_FLOAT) | 43 | #define RC_MASK (RC_INT|RC_INT2|RC_FLOAT) |
| 44 | |||
| 45 | /* pretty names for the registers */ | 44 | /* pretty names for the registers */ |
| 46 | enum { | 45 | enum { |
| 47 | TREG_EAX = 0, | 46 | TREG_EAX = 0, |
| @@ -104,8 +103,8 @@ ST_DATA const int reg_classes[NB_REGS] = { · 56 unmodified lines | |||
| 104 | RC_INT|RC_INT2|RC_EBX, | 103 | RC_INT|RC_INT2|RC_EBX, |
| 105 | 0, | 104 | 0, |
| 106 | /* st0 */ RC_FLOAT | RC_ST0, | 105 | /* st0 */ RC_FLOAT | RC_ST0, |
| 107 | RC_RSI|RC_INT2, | 106 | RC_ESI|RC_INT2, |
| 108 | RC_RDI|RC_INT2, | 107 | RC_EDI|RC_INT2, |
| 109 | }; | 108 | }; |
| 110 | 109 | ||
| 111 | static unsigned long func_sub_sp_offset; | 110 | static unsigned long func_sub_sp_offset; |
| @@ -241,7 +240,7 @@ ST_FUNC void load(int r, SValue *sv) · 129 unmodified lines | |||
| 241 | if(fr & VT_TMP){ | 240 | if(fr & VT_TMP){ |
| 242 | int size, align; | 241 | int size, align; |
| 243 | if((ft & VT_BTYPE) == VT_FUNC) | 242 | if((ft & VT_BTYPE) == VT_FUNC) |
| 244 | size = 4; | 243 | size = PTR_SIZE; |
| 245 | else | 244 | else |
| 246 | size = type_size(&sv->type, &align); | 245 | size = type_size(&sv->type, &align); |
| 247 | loc_stack(size, 0); | 246 | loc_stack(size, 0); |
| @@ -254,6 +253,7 @@ ST_FUNC void load(int r, SValue *sv) · 6 unmodified lines | |||
| 254 | if (!(reg_classes[fr] & RC_INT)) | 253 | if (!(reg_classes[fr] & RC_INT)) |
| 255 | fr = get_reg(RC_INT); | 254 | fr = get_reg(RC_INT); |
| 256 | load(fr, &v1); | 255 | load(fr, &v1); |
| 256 | fc = 0; | ||
| 257 | } | 257 | } |
| 258 | if ((ft & VT_BTYPE) == VT_FLOAT) { | 258 | if ((ft & VT_BTYPE) == VT_FLOAT) { |
| 259 | o(0xd9); /* flds */ | 259 | o(0xd9); /* flds */ |
| @@ -1350,8 +1350,6 @@ ST_FUNC void gen_le16(int c); · 1349 unmodified lines | |||
| 1350 | ST_FUNC void gen_le32(int c); | 1350 | ST_FUNC void gen_le32(int c); |
| 1351 | ST_FUNC void gen_addr32(int r, Sym *sym, int c); | 1351 | ST_FUNC void gen_addr32(int r, Sym *sym, int c); |
| 1352 | ST_FUNC void gen_addrpc32(int r, Sym *sym, int c); | 1352 | ST_FUNC void gen_addrpc32(int r, Sym *sym, int c); |
| 1353 | ST_FUNC void struct_copy(SValue *d, SValue *s, SValue *c); | ||
| 1354 | ST_FUNC void gen_putz(SValue *d, int size); | ||
| 1355 | #endif | 1353 | #endif |
| 1356 | 1354 | ||
| 1357 | #ifdef CONFIG_TCC_BCHECK | 1355 | #ifdef CONFIG_TCC_BCHECK |
| @@ -873,7 +873,7 @@ ST_FUNC int gv(int rc) · 872 unmodified lines | |||
| 873 | #endif | 873 | #endif |
| 874 | 874 | ||
| 875 | r = vtop->r & VT_VALMASK; | 875 | r = vtop->r & VT_VALMASK; |
| 876 | if((rc & ~RC_MASK) && (rc != RC_ST0)) | 876 | if(rc & ~RC_MASK) |
| 877 | rc2 = ex_rc; | 877 | rc2 = ex_rc; |
| 878 | else | 878 | else |
| 879 | rc2 = (rc & RC_FLOAT) ? RC_FLOAT : RC_INT; | 879 | rc2 = (rc & RC_FLOAT) ? RC_FLOAT : RC_INT; |
| @@ -2624,20 +2624,19 @@ ST_FUNC void vstore(void) · 1744 unmodified lines | |||
| 2624 | vtop -=2; | 2624 | vtop -=2; |
| 2625 | }else{ | 2625 | }else{ |
| 2626 | size = type_size(&vtop->type, &align); | 2626 | size = type_size(&vtop->type, &align); |
| 2627 | #ifndef TCC_TARGET_X86_64 | ||
| 2628 | /* destination */ | 2627 | /* destination */ |
| 2629 | vswap(); | 2628 | vswap(); |
| 2630 | vtop->type.t = VT_PTR; | 2629 | vtop->type.t = VT_PTR; |
| 2631 | gaddrof(); | 2630 | gaddrof(); |
| 2632 | 2631 | ||
| 2633 | /* address of memcpy() */ | 2632 | /* address of memcpy() */ |
| 2634 | # ifdef TCC_ARM_EABI | 2633 | #ifdef TCC_ARM_EABI |
| 2635 | if(!(align & 7)) | 2634 | if(!(align & 7)) |
| 2636 | vpush_global_sym(&func_old_type, TOK_memcpy8); | 2635 | vpush_global_sym(&func_old_type, TOK_memcpy8); |
| 2637 | else if(!(align & 3)) | 2636 | else if(!(align & 3)) |
| 2638 | vpush_global_sym(&func_old_type, TOK_memcpy4); | 2637 | vpush_global_sym(&func_old_type, TOK_memcpy4); |
| 2639 | else | 2638 | else |
| 2640 | # endif | 2639 | #endif |
| 2641 | vpush_global_sym(&func_old_type, TOK_memcpy); | 2640 | vpush_global_sym(&func_old_type, TOK_memcpy); |
| 2642 | 2641 | ||
| 2643 | vswap(); | 2642 | vswap(); |
| @@ -2646,22 +2645,8 @@ ST_FUNC void vstore(void) · 2 unmodified lines | |||
| 2646 | vtop->type.t = VT_PTR; | 2645 | vtop->type.t = VT_PTR; |
| 2647 | gaddrof(); | 2646 | gaddrof(); |
| 2648 | /* type size */ | 2647 | /* type size */ |
| 2649 | vpushs(size); | 2648 | vpushi(size); |
| 2650 | gfunc_call(3); | 2649 | gfunc_call(3); |
| 2651 | #else | ||
| 2652 | /* destination */ | ||
| 2653 | vswap(); | ||
| 2654 | vtop->type.t = VT_PTR; | ||
| 2655 | gaddrof(); | ||
| 2656 | /* source */ | ||
| 2657 | vpushv(vtop - 1); | ||
| 2658 | vtop->type.t = VT_PTR; | ||
| 2659 | gaddrof(); | ||
| 2660 | /* size */ | ||
| 2661 | vpushs(size); | ||
| 2662 | struct_copy(&vtop[-2], &vtop[-1], &vtop[0]); | ||
| 2663 | vtop -=3; | ||
| 2664 | #endif | ||
| 2665 | } | 2650 | } |
| 2666 | } else { | 2651 | } else { |
| 2667 | vswap(); | 2652 | vswap(); |
| @@ -5354,22 +5339,16 @@ static void init_putz(CType *t, Section *sec, unsigned long c, int size) · 2686 unmodified lines | |||
| 5354 | if (sec) { | 5339 | if (sec) { |
| 5355 | /* nothing to do because globals are already set to zero */ | 5340 | /* nothing to do because globals are already set to zero */ |
| 5356 | } else { | 5341 | } else { |
| 5357 | #ifndef TCC_TARGET_X86_64 | ||
| 5358 | vpush_global_sym(&func_old_type, TOK_memset); | 5342 | vpush_global_sym(&func_old_type, TOK_memset); |
| 5359 | vseti(VT_LOCAL, c); | 5343 | vseti(VT_LOCAL, c); |
| 5360 | # ifdef TCC_TARGET_ARM | 5344 | #ifdef TCC_TARGET_ARM |
| 5361 | vpushs(size); | 5345 | vpushs(size); |
| 5362 | vpushi(0); | 5346 | vpushi(0); |
| 5363 | # else | 5347 | #else |
| 5364 | vpushi(0); | 5348 | vpushi(0); |
| 5365 | vpushs(size); | 5349 | vpushs(size); |
| 5366 | # endif | ||
| 5367 | gfunc_call(3); | ||
| 5368 | #else | ||
| 5369 | vseti(VT_LOCAL, c); | ||
| 5370 | gen_putz(vtop, size); | ||
| 5371 | vtop--; | ||
| 5372 | #endif | 5350 | #endif |
| 5351 | gfunc_call(3); | ||
| 5373 | } | 5352 | } |
| 5374 | } | 5353 | } |
| 5375 | 5354 | ||
| @@ -408,7 +408,7 @@ void load(int r, SValue *sv) · 407 unmodified lines | |||
| 408 | if(fr & VT_TMP){ | 408 | if(fr & VT_TMP){ |
| 409 | int size, align; | 409 | int size, align; |
| 410 | if((ft & VT_BTYPE) == VT_FUNC) | 410 | if((ft & VT_BTYPE) == VT_FUNC) |
| 411 | size = 8; | 411 | size = PTR_SIZE; |
| 412 | else | 412 | else |
| 413 | size = type_size(&sv->type, &align); | 413 | size = type_size(&sv->type, &align); |
| 414 | loc_stack(size, 0); | 414 | loc_stack(size, 0); |