|
From: <sv...@va...> - 2005-06-23 15:26:39
|
Author: cerion
Date: 2005-06-23 16:25:57 +0100 (Thu, 23 Jun 2005)
New Revision: 1220
Log:
Added isel Ist_Tmp:Ity_I64, iselInt64Expr::Iex_Get
Allowed 64-bit args for doHelperCall()
Modified:
trunk/priv/guest-ppc32/toIR.c
trunk/priv/host-ppc32/isel.c
Modified: trunk/priv/guest-ppc32/toIR.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/guest-ppc32/toIR.c 2005-06-23 12:45:11 UTC (rev 1219)
+++ trunk/priv/guest-ppc32/toIR.c 2005-06-23 15:25:57 UTC (rev 1220)
@@ -4357,17 +4357,13 @@
code[3] =3D=3D 0x54006800 &&
code[4] =3D=3D 0x54009800 &&
code[5] =3D=3D 0x60000000) {
-
- // TODO: possibly r0 =3D client_request(r0)
- DIP("? =3D client_request ( ? )\n");
-
+ DIP("%%r3 =3D client_request ( %%r31 )\n");
*size =3D 24;
delta +=3D 24;
=20
irbb->next =3D mkU32(guest_pc_bbstart+delta);
irbb->jumpkind =3D Ijk_ClientReq;
- =20
- whatNext =3D Dis_StopHere;
+ whatNext =3D Dis_StopHere;
goto decode_success;
}
}
Modified: trunk/priv/host-ppc32/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-ppc32/isel.c 2005-06-23 12:45:11 UTC (rev 1219)
+++ trunk/priv/host-ppc32/isel.c 2005-06-23 15:25:57 UTC (rev 1220)
@@ -621,9 +621,20 @@
=20
for (i =3D 0; i < n_args; i++) {
vassert(argreg < PPC32_N_REGPARMS);
- vassert(typeOfIRExpr(env->type_env, args[i]) =3D=3D Ity_I32);
- addInstr(env, mk_iMOVds_RR( argregs[argreg],
- iselIntExpr_R(env, args[i]) ));
+ vassert(typeOfIRExpr(env->type_env, args[i]) =3D=3D Ity_I32 ||
+ typeOfIRExpr(env->type_env, args[i]) =3D=3D Ity_I64);
+ if (typeOfIRExpr(env->type_env, args[i]) =3D=3D Ity_I32) {=20
+ addInstr(env, mk_iMOVds_RR( argregs[argreg],
+ iselIntExpr_R(env, args[i]) ));
+ } else { // Ity_I64
+ HReg rHi, rLo;
+ if (i%2 =3D=3D 1) // ppc32 abi spec for LONG_LONG
+ argreg++;
+ vassert(argreg < PPC32_N_REGPARMS-1);
+ iselInt64Expr(&rHi,&rLo, env, args[i]);
+ addInstr(env, mk_iMOVds_RR( argregs[argreg++], rHi ));
+ addInstr(env, mk_iMOVds_RR( argregs[argreg], rLo));
+ }
argreg++;
}
=20
@@ -645,8 +656,19 @@
=20
for (i =3D 0; i < n_args; i++) {
vassert(argreg < PPC32_N_REGPARMS);
- vassert(typeOfIRExpr(env->type_env, args[i]) =3D=3D Ity_I32);
- tmpregs[argreg] =3D iselIntExpr_R(env, args[i]);
+ vassert(typeOfIRExpr(env->type_env, args[i]) =3D=3D Ity_I32 ||
+ typeOfIRExpr(env->type_env, args[i]) =3D=3D Ity_I64);
+ if (typeOfIRExpr(env->type_env, args[i]) =3D=3D Ity_I32) {=20
+ tmpregs[argreg] =3D iselIntExpr_R(env, args[i]);
+ } else { // Ity_I64
+ HReg rHi, rLo;
+ if (i%2 =3D=3D 1) // ppc32 abi spec for LONG_LONG
+ argreg++;
+ vassert(argreg < PPC32_N_REGPARMS-1);
+ iselInt64Expr(&rHi,&rLo, env, args[i]);
+ tmpregs[argreg++] =3D rHi;
+ tmpregs[argreg] =3D rLo;
+ }
argreg++;
}
=20
@@ -1837,18 +1859,18 @@
//.. return;
//.. }
=20
-//.. /* 64-bit GET */
-//.. if (e->tag =3D=3D Iex_Get) {
-//.. X86AMode* am =3D X86AMode_IR(e->Iex.Get.offset, hregX86_EBP(=
));
-//.. X86AMode* am4 =3D advance4(am);
-//.. HReg tLo =3D newVRegI(env);
-//.. HReg tHi =3D newVRegI(env);
-//.. addInstr(env, X86Instr_Alu32R( Xalu_MOV, X86RMI_Mem(am), tLo =
));
-//.. addInstr(env, X86Instr_Alu32R( Xalu_MOV, X86RMI_Mem(am4), tHi=
));
-//.. *rHi =3D tHi;
-//.. *rLo =3D tLo;
-//.. return;
-//.. }
+ /* 64-bit GET */
+ if (e->tag =3D=3D Iex_Get) {
+ PPC32AMode* am_addr =3D PPC32AMode_IR(e->Iex.Get.offset, GuestStat=
ePtr );
+ PPC32AMode* am_addr4 =3D advance4(env, am_addr);
+ HReg tLo =3D newVRegI(env);
+ HReg tHi =3D newVRegI(env);
+ addInstr(env, PPC32Instr_Load( 4, False, tHi, am_addr ));
+ addInstr(env, PPC32Instr_Load( 4, False, tLo, am_addr4 ));
+ *rHi =3D tHi;
+ *rLo =3D tLo;
+ return;
+ }
=20
//.. /* 64-bit GETI */
//.. if (e->tag =3D=3D Iex_GetI) {
@@ -3374,14 +3396,14 @@
addInstr(env, mk_iMOVds_RR( r_dst, r_src ));
return;
}
-//.. if (ty =3D=3D Ity_I64) {
-//.. HReg rHi, rLo, dstHi, dstLo;
-//.. iselInt64Expr(&rHi,&rLo, env, stmt->Ist.Tmp.data);
-//.. lookupIRTemp64( &dstHi, &dstLo, env, tmp);
-//.. addInstr(env, mk_iMOVsd_RR(rHi,dstHi) );
-//.. addInstr(env, mk_iMOVsd_RR(rLo,dstLo) );
-//.. return;
-//.. }
+ if (ty =3D=3D Ity_I64) {
+ HReg r_srcHi, r_srcLo, r_dstHi, r_dstLo;
+ iselInt64Expr(&r_srcHi,&r_srcLo, env, stmt->Ist.Tmp.data);
+ lookupIRTemp64( &r_dstHi, &r_dstLo, env, tmp);
+ addInstr(env, mk_iMOVds_RR(r_dstHi, r_srcHi) );
+ addInstr(env, mk_iMOVds_RR(r_dstLo, r_srcLo) );
+ return;
+ }
if (ty =3D=3D Ity_I1) {
PPC32CondCode cond =3D iselCondCode(env, stmt->Ist.Tmp.data);
HReg r_dst =3D lookupIRTemp(env, tmp);
|