History

tcc on i386 are still having problems at work.Thank Roy report again. Struck on several variables can be connected to commit in the register. I am worried whether tcc can run the os. Since my machine is ubuntu 64 bits I can test my machine.

jiang committed 12 years ago

Commit 089dea31 parent a0d45c16 files · +32 −38Browse files

Unified · Split

6 files
  1. arm-gen.c +9 −1
  2. c67-gen.c +10 −1
  3. i386-gen.c +5 −5
  4. tcc.h +0 −2
  5. tccgen.c +7 −28
  6. x86_64-gen.c +1 −1
arm-gen.c+9−1
@@ -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 */
66enum {66enum {
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; // fp542 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;
c67-gen.c+10−1
@@ -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 */
63enum {63enum {
64 TREG_EAX = 0, // really A264 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) {
i386-gen.c+5−5
@@ -21,7 +21,7 @@ · 20 unmodified lines
21#ifdef TARGET_DEFS_ONLY21#ifdef TARGET_DEFS_ONLY
22 22
23/* number of available registers */23/* number of available registers */
24#define NB_REGS 424#define NB_REGS 8
25#define NB_ASM_REGS 825#define NB_ASM_REGS 8
26 26
27/* a register can belong to several classes. The classes must be27/* 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 */
46enum {45enum {
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
111static unsigned long func_sub_sp_offset;110static 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 else244 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 */
tcc.h+0−2
@@ -1350,8 +1350,6 @@ ST_FUNC void gen_le16(int c); · 1349 unmodified lines
1350ST_FUNC void gen_le32(int c);1350ST_FUNC void gen_le32(int c);
1351ST_FUNC void gen_addr32(int r, Sym *sym, int c);1351ST_FUNC void gen_addr32(int r, Sym *sym, int c);
1352ST_FUNC void gen_addrpc32(int r, Sym *sym, int c);1352ST_FUNC void gen_addrpc32(int r, Sym *sym, int c);
1353ST_FUNC void struct_copy(SValue *d, SValue *s, SValue *c);
1354ST_FUNC void gen_putz(SValue *d, int size);
1355#endif1353#endif
1356 1354
1357#ifdef CONFIG_TCC_BCHECK1355#ifdef CONFIG_TCC_BCHECK
tccgen.c+7−28
@@ -873,7 +873,7 @@ ST_FUNC int gv(int rc) · 872 unmodified lines
873#endif873#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 else878 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_EABI2633#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 else2638 else
2640# endif2639#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_ARM5344#ifdef TCC_TARGET_ARM
5361 vpushs(size);5345 vpushs(size);
5362 vpushi(0);5346 vpushi(0);
5363# else5347#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#endif5350#endif
5351 gfunc_call(3);
5373 }5352 }
5374}5353}
5375 5354
x86_64-gen.c+1−1
@@ -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 else412 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);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t