|
From: <sv...@va...> - 2007-11-26 23:18:50
|
Author: sewardj
Date: 2007-11-26 23:18:52 +0000 (Mon, 26 Nov 2007)
New Revision: 1802
Log:
Fix stupid bug in x86 isel: when generating code for a 64-bit integer
store, don't generate code to compute the address expression twice.
Spotted by Nick N whilst peering at code generated for new Massif.
Preventative changes in amd64 back end (which doesn't appear to have
the same problem).
Modified:
trunk/priv/host-amd64/isel.c
trunk/priv/host-x86/isel.c
Modified: trunk/priv/host-amd64/isel.c
===================================================================
--- trunk/priv/host-amd64/isel.c 2007-11-25 01:34:03 UTC (rev 1801)
+++ trunk/priv/host-amd64/isel.c 2007-11-26 23:18:52 UTC (rev 1802)
@@ -3537,7 +3537,6 @@
/* --------- STORE --------- */
case Ist_Store: {
- AMD64AMode* am;
IRType tya = typeOfIRExpr(env->type_env, stmt->Ist.Store.addr);
IRType tyd = typeOfIRExpr(env->type_env, stmt->Ist.Store.data);
IREndness end = stmt->Ist.Store.end;
@@ -3545,13 +3544,14 @@
if (tya != Ity_I64 || end != Iend_LE)
goto stmt_fail;
- am = iselIntExpr_AMode(env, stmt->Ist.Store.addr);
if (tyd == Ity_I64) {
+ AMD64AMode* am = iselIntExpr_AMode(env, stmt->Ist.Store.addr);
AMD64RI* ri = iselIntExpr_RI(env, stmt->Ist.Store.data);
addInstr(env, AMD64Instr_Alu64M(Aalu_MOV,ri,am));
return;
}
if (tyd == Ity_I8 || tyd == Ity_I16 || tyd == Ity_I32) {
+ AMD64AMode* am = iselIntExpr_AMode(env, stmt->Ist.Store.addr);
HReg r = iselIntExpr_R(env, stmt->Ist.Store.data);
addInstr(env, AMD64Instr_Store(
toUChar(tyd==Ity_I8 ? 1 : (tyd==Ity_I16 ? 2 : 4)),
@@ -3559,26 +3559,19 @@
return;
}
if (tyd == Ity_F64) {
+ AMD64AMode* am = iselIntExpr_AMode(env, stmt->Ist.Store.addr);
HReg r = iselDblExpr(env, stmt->Ist.Store.data);
addInstr(env, AMD64Instr_SseLdSt(False/*store*/, 8, r, am));
return;
}
if (tyd == Ity_F32) {
+ AMD64AMode* am = iselIntExpr_AMode(env, stmt->Ist.Store.addr);
HReg r = iselFltExpr(env, stmt->Ist.Store.data);
addInstr(env, AMD64Instr_SseLdSt(False/*store*/, 4, r, am));
return;
}
-//.. if (tyd == Ity_I64) {
-//.. HReg vHi, vLo, rA;
-//.. iselInt64Expr(&vHi, &vLo, env, stmt->Ist.Store.data);
-//.. rA = iselIntExpr_R(env, stmt->Ist.Store.addr);
-//.. addInstr(env, X86Instr_Alu32M(
-//.. Xalu_MOV, X86RI_Reg(vLo), X86AMode_IR(0, rA)));
-//.. addInstr(env, X86Instr_Alu32M(
-//.. Xalu_MOV, X86RI_Reg(vHi), X86AMode_IR(4, rA)));
-//.. return;
-//.. }
if (tyd == Ity_V128) {
+ AMD64AMode* am = iselIntExpr_AMode(env, stmt->Ist.Store.addr);
HReg r = iselVecExpr(env, stmt->Ist.Store.data);
addInstr(env, AMD64Instr_SseLdSt(False/*store*/, 16, r, am));
return;
Modified: trunk/priv/host-x86/isel.c
===================================================================
--- trunk/priv/host-x86/isel.c 2007-11-25 01:34:03 UTC (rev 1801)
+++ trunk/priv/host-x86/isel.c 2007-11-26 23:18:52 UTC (rev 1802)
@@ -3555,7 +3555,6 @@
/* --------- STORE --------- */
case Ist_Store: {
- X86AMode* am;
IRType tya = typeOfIRExpr(env->type_env, stmt->Ist.Store.addr);
IRType tyd = typeOfIRExpr(env->type_env, stmt->Ist.Store.data);
IREndness end = stmt->Ist.Store.end;
@@ -3563,24 +3562,27 @@
if (tya != Ity_I32 || end != Iend_LE)
goto stmt_fail;
- am = iselIntExpr_AMode(env, stmt->Ist.Store.addr);
if (tyd == Ity_I32) {
+ X86AMode* am = iselIntExpr_AMode(env, stmt->Ist.Store.addr);
X86RI* ri = iselIntExpr_RI(env, stmt->Ist.Store.data);
addInstr(env, X86Instr_Alu32M(Xalu_MOV,ri,am));
return;
}
if (tyd == Ity_I8 || tyd == Ity_I16) {
+ X86AMode* am = iselIntExpr_AMode(env, stmt->Ist.Store.addr);
HReg r = iselIntExpr_R(env, stmt->Ist.Store.data);
addInstr(env, X86Instr_Store( toUChar(tyd==Ity_I8 ? 1 : 2),
r,am ));
return;
}
if (tyd == Ity_F64) {
+ X86AMode* am = iselIntExpr_AMode(env, stmt->Ist.Store.addr);
HReg r = iselDblExpr(env, stmt->Ist.Store.data);
addInstr(env, X86Instr_FpLdSt(False/*store*/, 8, r, am));
return;
}
if (tyd == Ity_F32) {
+ X86AMode* am = iselIntExpr_AMode(env, stmt->Ist.Store.addr);
HReg r = iselFltExpr(env, stmt->Ist.Store.data);
addInstr(env, X86Instr_FpLdSt(False/*store*/, 4, r, am));
return;
@@ -3596,6 +3598,7 @@
return;
}
if (tyd == Ity_V128) {
+ X86AMode* am = iselIntExpr_AMode(env, stmt->Ist.Store.addr);
HReg r = iselVecExpr(env, stmt->Ist.Store.data);
addInstr(env, X86Instr_SseLdSt(False/*store*/, r, am));
return;
|