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