|
From: <sv...@va...> - 2005-05-09 12:16:49
|
Author: sewardj
Date: 2005-05-09 13:16:33 +0100 (Mon, 09 May 2005)
New Revision: 1172
Modified:
trunk/priv/host-x86/isel.c
Log:
Support GetI/PutI of 32-bit integer arrays.
Modified: trunk/priv/host-x86/isel.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/host-x86/isel.c 2005-05-09 02:57:08 UTC (rev 1171)
+++ trunk/priv/host-x86/isel.c 2005-05-09 12:16:33 UTC (rev 1172)
@@ -560,14 +560,22 @@
HReg tmp, roff;
Int elemSz =3D sizeofIRType(descr->elemTy);
Int nElems =3D descr->nElems;
+ Int shift =3D 0;
=20
/* throw out any cases not generated by an x86 front end. In
theory there might be a day where we need to handle them -- if
we ever run non-x86-guest on x86 host. */
=20
- if (nElems !=3D 8 || (elemSz !=3D 1 && elemSz !=3D 8))
- vpanic("genGuestArrayOffset(x86 host)");
+ if (nElems !=3D 8)=20
+ vpanic("genGuestArrayOffset(x86 host)(1)");
=20
+ switch (elemSz) {
+ case 1: shift =3D 0; break;
+ case 4: shift =3D 2; vassert(0); /* awaiting test case */ break;
+ case 8: shift =3D 3; break;
+ default: vpanic("genGuestArrayOffset(x86 host)(2)");
+ }
+
/* Compute off into a reg, %off. Then return:
=20
movl %off, %tmp
@@ -584,10 +592,8 @@
}
addInstr(env,=20
X86Instr_Alu32R(Xalu_AND, X86RMI_Imm(7), tmp));
- vassert(elemSz =3D=3D 1 || elemSz =3D=3D 8);
return
- X86AMode_IRRS( descr->base, hregX86_EBP(), tmp,
- elemSz=3D=3D8 ? 3 : 0);
+ X86AMode_IRRS( descr->base, hregX86_EBP(), tmp, shift );
}
=20
=20
@@ -1159,6 +1165,11 @@
addInstr(env, X86Instr_LoadEX( 1, False, am, dst ));
return dst;
}
+ if (ty =3D=3D Ity_I32) {
+ vassert(0); /* awaiting test case */
+ addInstr(env, X86Instr_Alu32R(Xalu_MOV, X86RMI_Mem(am), dst));
+ return dst;
+ }
break;
}
=20
@@ -3363,6 +3374,12 @@
addInstr(env, X86Instr_Store( 1, r, am ));
return;
}
+ if (ty =3D=3D Ity_I32) {
+ HReg r =3D iselIntExpr_R(env, stmt->Ist.PutI.data);
+ vassert(0); /* awaiting test case */
+ addInstr(env, X86Instr_Alu32M( Xalu_MOV, X86RI_Reg(r), am ));
+ return;
+ }
if (ty =3D=3D Ity_I64) {
HReg rHi, rLo;
X86AMode* am4 =3D advance4(am);
|