diff --git a/src/frontend/arm_types.h b/src/frontend/arm_types.h index cc128b87..c8aebaf4 100644 --- a/src/frontend/arm_types.h +++ b/src/frontend/arm_types.h @@ -99,6 +99,8 @@ struct LocationDescriptor { u32 FPSCR() const { return fpscr; } bool FPSCR_FTZ() const { return Common::Bit<24>(fpscr); } bool FPSCR_DN() const { return Common::Bit<25>(fpscr); } + u32 FPSCR_Len() const { return Common::Bits<16, 18>(fpscr) + 1; } + u32 FPSCR_Stride() const { return Common::Bits<20, 21>(fpscr) + 1; } bool operator == (const LocationDescriptor& o) const { return std::tie(arm_pc, tflag, eflag, fpscr) == std::tie(o.arm_pc, o.tflag, o.eflag, o.fpscr); diff --git a/src/frontend/translate/translate_arm/vfp2.cpp b/src/frontend/translate/translate_arm/vfp2.cpp index 7704c0d8..ff104e56 100644 --- a/src/frontend/translate/translate_arm/vfp2.cpp +++ b/src/frontend/translate/translate_arm/vfp2.cpp @@ -18,7 +18,9 @@ static ExtReg ToExtReg(bool sz, size_t base, bool bit) { } bool ArmTranslatorVisitor::vfp2_VADD(Cond cond, bool D, size_t Vn, size_t Vd, bool sz, bool N, bool M, size_t Vm) { - // TODO: if (FSPCR.len || FPSCR.stride) return InterpretThisInstruction(); + if (ir.current_location.FPSCR_Len() != 1 || ir.current_location.FPSCR_Stride() != 1) + return InterpretThisInstruction(); // TODO: Vectorised floating point instructions + ExtReg d = ToExtReg(sz, Vd, D); ExtReg n = ToExtReg(sz, Vn, N); ExtReg m = ToExtReg(sz, Vm, M);