X-Git-Url: https://rtime.felk.cvut.cz/gitweb/l4.git/blobdiff_plain/f4122e6e085938b6d216a9ec724b974a603f6992..983fe7c4ac262f56d38a143b1efab1e4afb77a52:/l4/pkg/valgrind/src/valgrind-3.6.0-svn/VEX/priv/host_arm_isel.c diff --git a/l4/pkg/valgrind/src/valgrind-3.6.0-svn/VEX/priv/host_arm_isel.c b/l4/pkg/valgrind/src/valgrind-3.6.0-svn/VEX/priv/host_arm_isel.c index 28dfc684f..a2987eea5 100644 --- a/l4/pkg/valgrind/src/valgrind-3.6.0-svn/VEX/priv/host_arm_isel.c +++ b/l4/pkg/valgrind/src/valgrind-3.6.0-svn/VEX/priv/host_arm_isel.c @@ -9,8 +9,11 @@ Copyright (C) 2004-2010 OpenWorks LLP info@open-works.net - Copyright (C) 2010-2010 Dmitry Zhurikhin - zhur@ispras.ru + + NEON support is + Copyright (C) 2010-2010 Samsung Electronics + contributed by Dmitry Zhurikhin + and Kirill Batuzov This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -38,6 +41,7 @@ #include "main_util.h" #include "main_globals.h" #include "host_generic_regs.h" +#include "host_generic_simd64.h" // for 32-bit SIMD helpers #include "host_arm_defs.h" @@ -1304,6 +1308,62 @@ static HReg iselIntExpr_R_wrk ( ISelEnv* env, IRExpr* e ) return res; } + /* All cases involving host-side helper calls. */ + void* fn = NULL; + switch (e->Iex.Binop.op) { + case Iop_Add16x2: + fn = &h_generic_calc_Add16x2; break; + case Iop_Sub16x2: + fn = &h_generic_calc_Sub16x2; break; + case Iop_HAdd16Ux2: + fn = &h_generic_calc_HAdd16Ux2; break; + case Iop_HAdd16Sx2: + fn = &h_generic_calc_HAdd16Sx2; break; + case Iop_HSub16Ux2: + fn = &h_generic_calc_HSub16Ux2; break; + case Iop_HSub16Sx2: + fn = &h_generic_calc_HSub16Sx2; break; + case Iop_QAdd16Sx2: + fn = &h_generic_calc_QAdd16Sx2; break; + case Iop_QSub16Sx2: + fn = &h_generic_calc_QSub16Sx2; break; + case Iop_Add8x4: + fn = &h_generic_calc_Add8x4; break; + case Iop_Sub8x4: + fn = &h_generic_calc_Sub8x4; break; + case Iop_HAdd8Ux4: + fn = &h_generic_calc_HAdd8Ux4; break; + case Iop_HAdd8Sx4: + fn = &h_generic_calc_HAdd8Sx4; break; + case Iop_HSub8Ux4: + fn = &h_generic_calc_HSub8Ux4; break; + case Iop_HSub8Sx4: + fn = &h_generic_calc_HSub8Sx4; break; + case Iop_QAdd8Sx4: + fn = &h_generic_calc_QAdd8Sx4; break; + case Iop_QAdd8Ux4: + fn = &h_generic_calc_QAdd8Ux4; break; + case Iop_QSub8Sx4: + fn = &h_generic_calc_QSub8Sx4; break; + case Iop_QSub8Ux4: + fn = &h_generic_calc_QSub8Ux4; break; + case Iop_Sad8Ux4: + fn = &h_generic_calc_Sad8Ux4; break; + default: + break; + } + + if (fn) { + HReg regL = iselIntExpr_R(env, e->Iex.Binop.arg1); + HReg regR = iselIntExpr_R(env, e->Iex.Binop.arg2); + HReg res = newVRegI(env); + addInstr(env, mk_iMOVds_RR(hregARM_R0(), regL)); + addInstr(env, mk_iMOVds_RR(hregARM_R1(), regR)); + addInstr(env, ARMInstr_Call( ARMcc_AL, (HWord)Ptr_to_ULong(fn), 2 )); + addInstr(env, mk_iMOVds_RR(res, hregARM_R0())); + return res; + } + break; } @@ -1570,6 +1630,27 @@ static HReg iselIntExpr_R_wrk ( ISelEnv* env, IRExpr* e ) default: break; } + + /* All Unop cases involving host-side helper calls. */ + void* fn = NULL; + switch (e->Iex.Unop.op) { + case Iop_CmpNEZ16x2: + fn = &h_generic_calc_CmpNEZ16x2; break; + case Iop_CmpNEZ8x4: + fn = &h_generic_calc_CmpNEZ8x4; break; + default: + break; + } + + if (fn) { + HReg arg = iselIntExpr_R(env, e->Iex.Unop.arg); + HReg res = newVRegI(env); + addInstr(env, mk_iMOVds_RR(hregARM_R0(), arg)); + addInstr(env, ARMInstr_Call( ARMcc_AL, (HWord)Ptr_to_ULong(fn), 1 )); + addInstr(env, mk_iMOVds_RR(res, hregARM_R0())); + return res; + } + break; } @@ -5862,7 +5943,6 @@ HInstrArray* iselSB_ARM ( IRSB* bb, VexArch arch_host, HReg hreg, hregHI; ISelEnv* env; UInt hwcaps_host = archinfo_host->hwcaps; - Bool neon = False; static UInt counter = 0; /* sanity ... */ @@ -5900,7 +5980,6 @@ HInstrArray* iselSB_ARM ( IRSB* bb, VexArch arch_host, case Ity_I64: if (arm_hwcaps & VEX_HWCAPS_ARM_NEON) { hreg = mkHReg(j++, HRcFlt64, True); - neon = True; } else { hregHI = mkHReg(j++, HRcInt32, True); hreg = mkHReg(j++, HRcInt32, True); @@ -5908,8 +5987,7 @@ HInstrArray* iselSB_ARM ( IRSB* bb, VexArch arch_host, break; case Ity_F32: hreg = mkHReg(j++, HRcFlt32, True); break; case Ity_F64: hreg = mkHReg(j++, HRcFlt64, True); break; - case Ity_V128: hreg = mkHReg(j++, HRcVec128, True); - neon = True; break; + case Ity_V128: hreg = mkHReg(j++, HRcVec128, True); break; default: ppIRType(bb->tyenv->types[i]); vpanic("iselBB: IRTemp type"); }