diff options
Diffstat (limited to 'VEX/priv/host_amd64_isel.c')
-rw-r--r-- | VEX/priv/host_amd64_isel.c | 53 |
1 files changed, 39 insertions, 14 deletions
diff --git a/VEX/priv/host_amd64_isel.c b/VEX/priv/host_amd64_isel.c index 3403d5456..a08c98046 100644 --- a/VEX/priv/host_amd64_isel.c +++ b/VEX/priv/host_amd64_isel.c @@ -7,7 +7,7 @@ This file is part of Valgrind, a dynamic binary instrumentation framework. - Copyright (C) 2004-2013 OpenWorks LLP + Copyright (C) 2004-2015 OpenWorks LLP info@open-works.net This program is free software; you can redistribute it and/or @@ -4298,21 +4298,35 @@ static void iselStmt ( ISelEnv* env, IRStmt* stmt ) UChar szB = 0; /* invalid */ switch (lg->cvt) { - case ILGop_Ident32: szB = 4; break; - case ILGop_Ident64: szB = 8; break; + case ILGop_Ident32: szB = 4; break; + case ILGop_Ident64: szB = 8; break; + case ILGop_IdentV128: szB = 16; break; default: break; } if (szB == 0) goto stmt_fail; - AMD64AMode* amAddr = iselIntExpr_AMode(env, lg->addr); - HReg rAlt = iselIntExpr_R(env, lg->alt); - HReg rDst = lookupIRTemp(env, lg->dst); + AMD64AMode* amAddr + = iselIntExpr_AMode(env, lg->addr); + HReg rAlt + = szB == 16 ? iselVecExpr(env, lg->alt) + : iselIntExpr_R(env, lg->alt); + HReg rDst + = lookupIRTemp(env, lg->dst); + /* Get the alt value into the dst. We'll do a conditional load which overwrites it -- or not -- with loaded data. */ - addInstr(env, mk_iMOVsd_RR(rAlt, rDst)); + if (szB == 16) { + addInstr(env, mk_vMOVsd_RR(rAlt, rDst)); + } else { + addInstr(env, mk_iMOVsd_RR(rAlt, rDst)); + } AMD64CondCode cc = iselCondCode(env, lg->guard); - addInstr(env, AMD64Instr_CLoad(cc, szB, amAddr, rDst)); + if (szB == 16) { + addInstr(env, AMD64Instr_SseCLoad(cc, amAddr, rDst)); + } else { + addInstr(env, AMD64Instr_CLoad(cc, szB, amAddr, rDst)); + } return; } @@ -4324,17 +4338,26 @@ static void iselStmt ( ISelEnv* env, IRStmt* stmt ) UChar szB = 0; /* invalid */ switch (typeOfIRExpr(env->type_env, sg->data)) { - case Ity_I32: szB = 4; break; - case Ity_I64: szB = 8; break; + case Ity_I32: szB = 4; break; + case Ity_I64: szB = 8; break; + case Ity_V128: szB = 16; break; default: break; } if (szB == 0) goto stmt_fail; - AMD64AMode* amAddr = iselIntExpr_AMode(env, sg->addr); - HReg rSrc = iselIntExpr_R(env, sg->data); - AMD64CondCode cc = iselCondCode(env, sg->guard); - addInstr(env, AMD64Instr_CStore(cc, szB, rSrc, amAddr)); + AMD64AMode* amAddr + = iselIntExpr_AMode(env, sg->addr); + HReg rSrc + = szB == 16 ? iselVecExpr(env, sg->data) + : iselIntExpr_R(env, sg->data); + AMD64CondCode cc + = iselCondCode(env, sg->guard); + if (szB == 16) { + addInstr(env, AMD64Instr_SseCStore(cc, rSrc, amAddr)); + } else { + addInstr(env, AMD64Instr_CStore(cc, szB, rSrc, amAddr)); + } return; } @@ -4774,6 +4797,7 @@ static void iselStmt ( ISelEnv* env, IRStmt* stmt ) case Ijk_SigSEGV: case Ijk_SigTRAP: case Ijk_Sys_syscall: + case Ijk_Sys_int210: case Ijk_InvalICache: case Ijk_Yield: { @@ -4869,6 +4893,7 @@ static void iselNext ( ISelEnv* env, case Ijk_SigSEGV: case Ijk_SigTRAP: case Ijk_Sys_syscall: + case Ijk_Sys_int210: case Ijk_InvalICache: case Ijk_Yield: { HReg r = iselIntExpr_R(env, next); |