|
From: <sv...@va...> - 2006-01-02 15:15:48
|
Author: cerion
Date: 2006-01-02 15:15:45 +0000 (Mon, 02 Jan 2006)
New Revision: 1528
Log:
ppc64 altivec:
- frontend: fix stvehx, stvewx
- backend: fix Iop_32HLto64 (mask off hi32 bits of src regs)
Modified:
trunk/priv/guest-ppc/toIR.c
trunk/priv/host-ppc/isel.c
Modified: trunk/priv/guest-ppc/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-ppc/toIR.c 2006-01-02 14:41:50 UTC (rev 1527)
+++ trunk/priv/guest-ppc/toIR.c 2006-01-02 15:15:45 UTC (rev 1528)
@@ -6475,7 +6475,7 @@
=20
IRType ty =3D mode64 ? Ity_I64 : Ity_I32;
IRTemp EA =3D newTemp(ty);
- IRTemp addr_aligned =3D newTemp(Ity_I32);
+ IRTemp addr_aligned =3D newTemp(ty);
IRTemp vS =3D newTemp(Ity_V128);
IRTemp eb =3D newTemp(Ity_I8);
IRTemp idx =3D newTemp(Ity_I8);
@@ -6504,10 +6504,9 @@
}
case 0x0A7: { // stvehx (Store Vector Half Word Indexed, AV p132)
DIP("stvehx v%d,r%u,r%u\n", vS_addr, rA_addr, rB_addr);
- assign( addr_aligned,
- mkSzNarrow32(ty, addr_align(mkexpr(EA), 2)) );
+ assign( addr_aligned, addr_align(mkexpr(EA), 2) );
assign( eb, binop(Iop_And8, mkU8(0xF),
- unop(Iop_32to8, mkexpr(addr_aligned) )) );
+ mkSzNarrow8(ty, mkexpr(addr_aligned) )) );
assign( idx, binop(Iop_Shl8,
binop(Iop_Sub8, mkU8(14), mkexpr(eb)),
mkU8(3)) );
@@ -6518,10 +6517,9 @@
}
case 0x0C7: { // stvewx (Store Vector Word Indexed, AV p133)
DIP("stvewx v%d,r%u,r%u\n", vS_addr, rA_addr, rB_addr);
- assign( addr_aligned,
- mkSzNarrow32(ty, addr_align(mkexpr(EA), 4)) );
+ assign( addr_aligned, addr_align(mkexpr(EA), 4) );
assign( eb, binop(Iop_And8, mkU8(0xF),
- unop(Iop_32to8, mkexpr(addr_aligned) )) );
+ mkSzNarrow8(ty, mkexpr(addr_aligned) )) );
assign( idx, binop(Iop_Shl8,
binop(Iop_Sub8, mkU8(12), mkexpr(eb)),
mkU8(3)) );
Modified: trunk/priv/host-ppc/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-ppc/isel.c 2006-01-02 14:41:50 UTC (rev 1527)
+++ trunk/priv/host-ppc/isel.c 2006-01-02 15:15:45 UTC (rev 1528)
@@ -1252,13 +1252,17 @@
//zz }
=20
if (e->Iex.Binop.op =3D=3D Iop_32HLto64) {
- HReg r_dst =3D newVRegI(env);
HReg r_Hi =3D iselIntExpr_R(env, e->Iex.Binop.arg1);
HReg r_Lo =3D iselIntExpr_R(env, e->Iex.Binop.arg2);
+ HReg r_dst =3D newVRegI(env);
+ HReg msk =3D newVRegI(env);
vassert(mode64);
/* r_dst =3D OR( r_Hi<<32, r_Lo ) */
addInstr(env, PPCInstr_Shft(Pshft_SHL, False/*64bit shift*/,
r_dst, r_Hi, PPCRH_Imm(False,32)));
+ addInstr(env, PPCInstr_LI(msk, 0xFFFFFFFF, mode64));
+ addInstr(env, PPCInstr_Alu( Palu_AND, r_Lo, r_Lo,
+ PPCRH_Reg(msk) ));
addInstr(env, PPCInstr_Alu( Palu_OR, r_dst, r_dst,
PPCRH_Reg(r_Lo) ));
return r_dst;
|