|
From: <sv...@va...> - 2013-08-16 08:32:25
|
sewardj 2013-08-16 09:32:15 +0100 (Fri, 16 Aug 2013)
New Revision: 2743
Log:
Add support for 256-bit return values for dirty helpers (amd64 only).
(Patrick J. LoPresti, lop...@gm...). Bug 294285.
Modified files:
trunk/priv/host_amd64_isel.c
Modified: trunk/priv/host_amd64_isel.c (+14 -3)
===================================================================
--- trunk/priv/host_amd64_isel.c 2013-08-15 21:54:52 +01:00 (rev 2742)
+++ trunk/priv/host_amd64_isel.c 2013-08-16 09:32:15 +01:00 (rev 2743)
@@ -603,7 +603,6 @@
addInstr(env, mk_iMOVsd_RR( hregAMD64_RSP(), r_vecRetAddr ));
}
else if (retTy == Ity_V256) {
- vassert(0); //ATC
r_vecRetAddr = newVRegI(env);
sub_from_rsp(env, 32);
addInstr(env, mk_iMOVsd_RR( hregAMD64_RSP(), r_vecRetAddr ));
@@ -680,7 +679,6 @@
*stackAdjustAfterCall = 16;
break;
case Ity_V256:
- vassert(0); // ATC
*retloc = mk_RetLoc_spRel(RLPri_V256SpRel, 0);
*stackAdjustAfterCall = 32;
break;
@@ -4443,7 +4441,7 @@
switch (retty) {
case Ity_INVALID: /* function doesn't return anything */
case Ity_I64: case Ity_I32: case Ity_I16: case Ity_I8:
- case Ity_V128:
+ case Ity_V128: case Ity_V256:
retty_ok = True; break;
default:
break;
@@ -4490,6 +4488,19 @@
add_to_rsp(env, addToSp);
return;
}
+ case Ity_V256: {
+ /* See comments for Ity_V128. */
+ vassert(rloc.pri == RLPri_V256SpRel);
+ vassert(addToSp >= 32);
+ HReg dstLo, dstHi;
+ lookupIRTempPair(&dstHi, &dstLo, env, d->tmp);
+ AMD64AMode* amLo = AMD64AMode_IR(rloc.spOff, hregAMD64_RSP());
+ addInstr(env, AMD64Instr_SseLdSt( True/*load*/, 16, dstLo, amLo ));
+ AMD64AMode* amHi = AMD64AMode_IR(rloc.spOff+16, hregAMD64_RSP());
+ addInstr(env, AMD64Instr_SseLdSt( True/*load*/, 16, dstHi, amHi ));
+ add_to_rsp(env, addToSp);
+ return;
+ }
default:
/*NOTREACHED*/
vassert(0);
|