aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjiang <30155751@qq.com>2014-05-03 23:51:09 +0800
committerjiang <30155751@qq.com>2014-05-03 23:51:09 +0800
commit089dea355a28da44376ce4f5195baa4b4e0b217d (patch)
tree6b06240e0d4f7271d3e165cbf962750e689e566c
parenta0d45c1bcd87d2388817076ac9b62343d8ae04c3 (diff)
downloadtinycc-089dea355a28da44376ce4f5195baa4b4e0b217d.tar.gz
tinycc-089dea355a28da44376ce4f5195baa4b4e0b217d.tar.bz2
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.
-rw-r--r--arm-gen.c10
-rw-r--r--c67-gen.c11
-rw-r--r--i386-gen.c10
-rw-r--r--tcc.h2
-rw-r--r--tccgen.c35
-rw-r--r--x86_64-gen.c2
6 files changed, 32 insertions, 38 deletions
diff --git a/arm-gen.c b/arm-gen.c
index 6da1706..567c868 100644
--- a/arm-gen.c
+++ b/arm-gen.c
@@ -61,7 +61,7 @@
#define RC_IRET RC_R0 /* function return: integer register */
#define RC_LRET RC_R1 /* function return: second integer register */
#define RC_FRET RC_F0 /* function return: float register */
-
+#define RC_MASK (RC_INT|RC_FLOAT)
/* pretty names for the registers */
enum {
TREG_R0 = 0,
@@ -540,6 +540,14 @@ void load(int r, SValue *sv)
v = fr & VT_VALMASK;
if (fr & VT_LVAL) {
uint32_t base = 0xB; // fp
+ if(fr & VT_TMP){
+ int size, align;
+ if((ft & VT_BTYPE) == VT_FUNC)
+ size = PTR_SIZE;
+ else
+ size = type_size(&sv->type, &align);
+ loc_stack(size, 0);
+ }
if(v == VT_LLOCAL) {
v1.type.t = VT_PTR;
v1.r = VT_LOCAL | VT_LVAL;
diff --git a/c67-gen.c b/c67-gen.c
index 209fa7f..07ae259 100644
--- a/c67-gen.c
+++ b/c67-gen.c
@@ -58,7 +58,7 @@
#define RC_IRET RC_C67_A4 /* function return: integer register */
#define RC_LRET RC_C67_A5 /* function return: second integer register */
#define RC_FRET RC_C67_A4 /* function return: float register */
-
+#define RC_MASK (RC_INT|RC_FLOAT)
/* pretty names for the registers */
enum {
TREG_EAX = 0, // really A2
@@ -1571,12 +1571,21 @@ void load(int r, SValue * sv)
v = fr & VT_VALMASK;
if (fr & VT_LVAL) {
+ if(fr & VT_TMP){
+ int size, align;
+ if((ft & VT_BTYPE) == VT_FUNC)
+ size = PTR_SIZE;
+ else
+ size = type_size(&sv->type, &align);
+ loc_stack(size, 0);
+ }
if (v == VT_LLOCAL) {
v1.type.t = VT_INT;
v1.r = VT_LOCAL | VT_LVAL;
v1.c.ul = fc;
load(r, &v1);
fr = r;
+ fc = 0;
} else if ((ft & VT_BTYPE) == VT_LDOUBLE) {
tcc_error("long double not supported");
} else if ((ft & VT_TYPE) == VT_BYTE) {
diff --git a/i386-gen.c b/i386-gen.c
index 018307a..cfa9cc6 100644
--- a/i386-gen.c
+++ b/i386-gen.c
@@ -21,7 +21,7 @@
#ifdef TARGET_DEFS_ONLY
/* number of available registers */
-#define NB_REGS 4
+#define NB_REGS 8
#define NB_ASM_REGS 8
/* a register can belong to several classes. The classes must be
@@ -41,7 +41,6 @@
#define RC_LRET RC_EDX /* function return: second integer register */
#define RC_FRET RC_ST0 /* function return: float register */
#define RC_MASK (RC_INT|RC_INT2|RC_FLOAT)
-
/* pretty names for the registers */
enum {
TREG_EAX = 0,
@@ -104,8 +103,8 @@ ST_DATA const int reg_classes[NB_REGS] = {
RC_INT|RC_INT2|RC_EBX,
0,
/* st0 */ RC_FLOAT | RC_ST0,
- RC_RSI|RC_INT2,
- RC_RDI|RC_INT2,
+ RC_ESI|RC_INT2,
+ RC_EDI|RC_INT2,
};
static unsigned long func_sub_sp_offset;
@@ -241,7 +240,7 @@ ST_FUNC void load(int r, SValue *sv)
if(fr & VT_TMP){
int size, align;
if((ft & VT_BTYPE) == VT_FUNC)
- size = 4;
+ size = PTR_SIZE;
else
size = type_size(&sv->type, &align);
loc_stack(size, 0);
@@ -254,6 +253,7 @@ ST_FUNC void load(int r, SValue *sv)
if (!(reg_classes[fr] & RC_INT))
fr = get_reg(RC_INT);
load(fr, &v1);
+ fc = 0;
}
if ((ft & VT_BTYPE) == VT_FLOAT) {
o(0xd9); /* flds */
diff --git a/tcc.h b/tcc.h
index f56273f..1cead42 100644
--- a/tcc.h
+++ b/tcc.h
@@ -1350,8 +1350,6 @@ ST_FUNC void gen_le16(int c);
ST_FUNC void gen_le32(int c);
ST_FUNC void gen_addr32(int r, Sym *sym, int c);
ST_FUNC void gen_addrpc32(int r, Sym *sym, int c);
-ST_FUNC void struct_copy(SValue *d, SValue *s, SValue *c);
-ST_FUNC void gen_putz(SValue *d, int size);
#endif
#ifdef CONFIG_TCC_BCHECK
diff --git a/tccgen.c b/tccgen.c
index d504572..c2481b0 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -873,7 +873,7 @@ ST_FUNC int gv(int rc)
#endif
r = vtop->r & VT_VALMASK;
- if((rc & ~RC_MASK) && (rc != RC_ST0))
+ if(rc & ~RC_MASK)
rc2 = ex_rc;
else
rc2 = (rc & RC_FLOAT) ? RC_FLOAT : RC_INT;
@@ -2624,20 +2624,19 @@ ST_FUNC void vstore(void)
vtop -=2;
}else{
size = type_size(&vtop->type, &align);
-#ifndef TCC_TARGET_X86_64
/* destination */
vswap();
vtop->type.t = VT_PTR;
gaddrof();
/* address of memcpy() */
-# ifdef TCC_ARM_EABI
+#ifdef TCC_ARM_EABI
if(!(align & 7))
vpush_global_sym(&func_old_type, TOK_memcpy8);
else if(!(align & 3))
vpush_global_sym(&func_old_type, TOK_memcpy4);
else
-# endif
+#endif
vpush_global_sym(&func_old_type, TOK_memcpy);
vswap();
@@ -2646,22 +2645,8 @@ ST_FUNC void vstore(void)
vtop->type.t = VT_PTR;
gaddrof();
/* type size */
- vpushs(size);
+ vpushi(size);
gfunc_call(3);
-#else
- /* destination */
- vswap();
- vtop->type.t = VT_PTR;
- gaddrof();
- /* source */
- vpushv(vtop - 1);
- vtop->type.t = VT_PTR;
- gaddrof();
- /* size */
- vpushs(size);
- struct_copy(&vtop[-2], &vtop[-1], &vtop[0]);
- vtop -=3;
-#endif
}
} else {
vswap();
@@ -5354,22 +5339,16 @@ static void init_putz(CType *t, Section *sec, unsigned long c, int size)
if (sec) {
/* nothing to do because globals are already set to zero */
} else {
-#ifndef TCC_TARGET_X86_64
vpush_global_sym(&func_old_type, TOK_memset);
vseti(VT_LOCAL, c);
-# ifdef TCC_TARGET_ARM
+#ifdef TCC_TARGET_ARM
vpushs(size);
vpushi(0);
-# else
+#else
vpushi(0);
vpushs(size);
-# endif
- gfunc_call(3);
-#else
- vseti(VT_LOCAL, c);
- gen_putz(vtop, size);
- vtop--;
#endif
+ gfunc_call(3);
}
}
diff --git a/x86_64-gen.c b/x86_64-gen.c
index 7a79278..2b52bb1 100644
--- a/x86_64-gen.c
+++ b/x86_64-gen.c
@@ -408,7 +408,7 @@ void load(int r, SValue *sv)
if(fr & VT_TMP){
int size, align;
if((ft & VT_BTYPE) == VT_FUNC)
- size = 8;
+ size = PTR_SIZE;
else
size = type_size(&sv->type, &align);
loc_stack(size, 0);