mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-23 13:00:51 +02:00
Merge pull request #3469 from alyssarosenzweig/opt/df
Optimize DF representation
This commit is contained in:
14 files changed
+383
-418
No files matched your search
@@ -167,6 +167,7 @@ namespace FEXCore::Context {
|
||||
case X86State::RFLAG_ZF_RAW_LOC:
|
||||
case X86State::RFLAG_SF_RAW_LOC:
|
||||
case X86State::RFLAG_OF_RAW_LOC:
|
||||
case X86State::RFLAG_DF_RAW_LOC:
|
||||
// Intentionally do nothing.
|
||||
// These contain multiple bits which can corrupt other members when compacted.
|
||||
break;
|
||||
@@ -215,6 +216,11 @@ namespace FEXCore::Context {
|
||||
uint32_t AF = ((Frame->State.af_raw ^ PFByte) & (1 << 4)) ? 1 : 0;
|
||||
EFLAGS |= AF << X86State::RFLAG_AF_RAW_LOC;
|
||||
|
||||
// DF is pretransformed, undo the transform from 1/-1 back to 0/1
|
||||
uint8_t DFByte = Frame->State.flags[X86State::RFLAG_DF_RAW_LOC];
|
||||
if (DFByte & 0x80)
|
||||
EFLAGS |= 1 << X86State::RFLAG_DF_RAW_LOC;
|
||||
|
||||
return EFLAGS;
|
||||
}
|
||||
|
||||
@@ -238,6 +244,10 @@ namespace FEXCore::Context {
|
||||
// PF is inverted in our internal representation.
|
||||
Frame->State.pf_raw = (EFLAGS & (1U << i)) ? 0 : 1;
|
||||
break;
|
||||
case X86State::RFLAG_DF_RAW_LOC:
|
||||
// DF is encoded as 1/-1
|
||||
Frame->State.flags[i] = (EFLAGS & (1U << i)) ? 0xff : 1;
|
||||
break;
|
||||
default:
|
||||
Frame->State.flags[i] = (EFLAGS & (1U << i)) ? 1 : 0;
|
||||
break;
|
||||
|
||||
@@ -888,6 +888,14 @@ DEF_OP(StoreNZCV) {
|
||||
msr(ARMEmitter::SystemRegister::NZCV, GetReg(Op->Value.ID()));
|
||||
}
|
||||
|
||||
DEF_OP(LoadDF) {
|
||||
auto Dst = GetReg(Node);
|
||||
auto Flag = X86State::RFLAG_DF_RAW_LOC;
|
||||
|
||||
// DF needs sign extension to turn 0x1/0xFF into 1/-1
|
||||
ldrsb(Dst.X(), STATE, offsetof(FEXCore::Core::CPUState, flags[Flag]));
|
||||
}
|
||||
|
||||
DEF_OP(LoadFlag) {
|
||||
auto Op = IROp->C<IR::IROp_LoadFlag>();
|
||||
auto Dst = GetReg(Node);
|
||||
@@ -1708,7 +1716,7 @@ DEF_OP(MemSet) {
|
||||
DirectionReg = GetReg(Op->Direction.ID());
|
||||
}
|
||||
|
||||
// If Direction == 0 then:
|
||||
// If Direction > 0 then:
|
||||
// MemReg is incremented (by size)
|
||||
// else:
|
||||
// MemReg is decremented (by size)
|
||||
@@ -1729,7 +1737,7 @@ DEF_OP(MemSet) {
|
||||
|
||||
if (!DirectionIsInline) {
|
||||
// Backward or forwards implementation depends on flag
|
||||
cbnz(ARMEmitter::Size::i64Bit, DirectionReg, &BackwardImpl);
|
||||
tbnz(DirectionReg, 1, &BackwardImpl);
|
||||
}
|
||||
|
||||
auto MemStore = [this](auto Value, uint32_t OpSize, int32_t Size) {
|
||||
@@ -1847,8 +1855,8 @@ DEF_OP(MemSet) {
|
||||
};
|
||||
|
||||
if (DirectionIsInline) {
|
||||
// If the direction constant is set then the direction is negative.
|
||||
EmitMemset(DirectionConstant ? -1 : 1);
|
||||
LOGMAN_THROW_AA_FMT(DirectionConstant == 1 || DirectionConstant == -1, "unexpected direction");
|
||||
EmitMemset(DirectionConstant);
|
||||
}
|
||||
else {
|
||||
// Emit forward direction memset then backward direction memset.
|
||||
@@ -1886,7 +1894,7 @@ DEF_OP(MemCpy) {
|
||||
}
|
||||
|
||||
auto Dst = GetRegPair(Node);
|
||||
// If Direction == 0 then:
|
||||
// If Direction > 0 then:
|
||||
// MemRegDest is incremented (by size)
|
||||
// MemRegSrc is incremented (by size)
|
||||
// else:
|
||||
@@ -1922,7 +1930,7 @@ DEF_OP(MemCpy) {
|
||||
|
||||
if (!DirectionIsInline) {
|
||||
// Backward or forwards implementation depends on flag
|
||||
cbnz(ARMEmitter::Size::i64Bit, DirectionReg, &BackwardImpl);
|
||||
tbnz(DirectionReg, 1, &BackwardImpl);
|
||||
}
|
||||
|
||||
auto MemCpy = [this](uint32_t OpSize, int32_t Size) {
|
||||
@@ -2121,8 +2129,8 @@ DEF_OP(MemCpy) {
|
||||
};
|
||||
|
||||
if (DirectionIsInline) {
|
||||
// If the direction constant is set then the direction is negative.
|
||||
EmitMemcpy(DirectionConstant ? -1 : 1);
|
||||
LOGMAN_THROW_AA_FMT(DirectionConstant == 1 || DirectionConstant == -1, "unexpected direction");
|
||||
EmitMemcpy(DirectionConstant);
|
||||
}
|
||||
else {
|
||||
// Emit forward direction memset then backward direction memset.
|
||||
|
||||
@@ -1379,10 +1379,10 @@ void OpDispatchBuilder::FLAGControlOp(OpcodeArgs) {
|
||||
SetRFLAG(_Constant(1), FEXCore::X86State::RFLAG_CF_RAW_LOC);
|
||||
break;
|
||||
case 0xFC: // CLD
|
||||
SetRFLAG(_Constant(0), FEXCore::X86State::RFLAG_DF_LOC);
|
||||
SetRFLAG(_Constant(0), FEXCore::X86State::RFLAG_DF_RAW_LOC);
|
||||
break;
|
||||
case 0xFD: // STD
|
||||
SetRFLAG(_Constant(1), FEXCore::X86State::RFLAG_DF_LOC);
|
||||
SetRFLAG(_Constant(1), FEXCore::X86State::RFLAG_DF_RAW_LOC);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -3627,7 +3627,8 @@ void OpDispatchBuilder::STOSOp(OpcodeArgs) {
|
||||
const bool Repeat = (Op->Flags & (FEXCore::X86Tables::DecodeFlags::FLAG_REP_PREFIX | FEXCore::X86Tables::DecodeFlags::FLAG_REPNE_PREFIX)) != 0;
|
||||
|
||||
if (!Repeat) {
|
||||
OrderedNode *Src = LoadSource(GPRClass, Op, Op->Src[0], Op->Flags);
|
||||
// Src is used only for a store of the same size so allow garbage
|
||||
OrderedNode *Src = LoadSource(GPRClass, Op, Op->Src[0], Op->Flags, {.AllowUpperGarbage = true});
|
||||
OrderedNode *Dest = LoadGPRRegister(X86State::REG_RDI);
|
||||
|
||||
// Only ES prefix
|
||||
@@ -3636,16 +3637,9 @@ void OpDispatchBuilder::STOSOp(OpcodeArgs) {
|
||||
// Store to memory where RDI points
|
||||
_StoreMemAutoTSO(GPRClass, Size, Dest, Src, Size);
|
||||
|
||||
// Calculate direction.
|
||||
auto DF = GetRFLAG(FEXCore::X86State::RFLAG_DF_LOC);
|
||||
auto SizeConst = _Constant(Size);
|
||||
auto PtrDir = _SubShift(IR::SizeToOpSize(CTX->GetGPRSize()), SizeConst, DF, ShiftType::LSL, FEXCore::ilog2(Size) + 1);
|
||||
|
||||
// Offset the pointer
|
||||
OrderedNode *TailDest = LoadGPRRegister(X86State::REG_RDI);
|
||||
TailDest = _Add(OpSize::i64Bit, TailDest, PtrDir);
|
||||
|
||||
StoreGPRRegister(X86State::REG_RDI, TailDest);
|
||||
StoreGPRRegister(X86State::REG_RDI, OffsetByDir(TailDest, Size));
|
||||
}
|
||||
else {
|
||||
// FEX doesn't support partial faulting REP instructions.
|
||||
@@ -3658,9 +3652,8 @@ void OpDispatchBuilder::STOSOp(OpcodeArgs) {
|
||||
auto Segment = GetSegment(0, FEXCore::X86Tables::DecodeFlags::FLAG_ES_PREFIX, true);
|
||||
|
||||
OrderedNode *Counter = LoadGPRRegister(X86State::REG_RCX);
|
||||
auto DF = GetRFLAG(FEXCore::X86State::RFLAG_DF_LOC);
|
||||
|
||||
auto Result = _MemSet(CTX->IsAtomicTSOEnabled(), Size, Segment ?: InvalidNode, Dest, Src, Counter, DF);
|
||||
auto Result = _MemSet(CTX->IsAtomicTSOEnabled(), Size, Segment ?: InvalidNode, Dest, Src, Counter, LoadDir(1));
|
||||
StoreGPRRegister(X86State::REG_RCX, _Constant(0));
|
||||
StoreGPRRegister(X86State::REG_RDI, Result);
|
||||
}
|
||||
@@ -3676,9 +3669,6 @@ void OpDispatchBuilder::MOVSOp(OpcodeArgs) {
|
||||
// RA now can handle these to be here, to avoid DF accesses
|
||||
const auto Size = GetSrcSize(Op);
|
||||
|
||||
// Calculate direction.
|
||||
auto DF = GetRFLAG(FEXCore::X86State::RFLAG_DF_LOC);
|
||||
|
||||
if (Op->Flags & (FEXCore::X86Tables::DecodeFlags::FLAG_REP_PREFIX | FEXCore::X86Tables::DecodeFlags::FLAG_REPNE_PREFIX)) {
|
||||
auto SrcAddr = LoadGPRRegister(X86State::REG_RSI);
|
||||
auto DstAddr = LoadGPRRegister(X86State::REG_RDI);
|
||||
@@ -3690,7 +3680,8 @@ void OpDispatchBuilder::MOVSOp(OpcodeArgs) {
|
||||
auto Result = _MemCpy(CTX->IsAtomicTSOEnabled(), Size,
|
||||
DstSegment ?: InvalidNode,
|
||||
SrcSegment ?: InvalidNode,
|
||||
DstAddr, SrcAddr, Counter, DF);
|
||||
DstAddr, SrcAddr, Counter,
|
||||
LoadDir(1));
|
||||
|
||||
OrderedNode *Result_Dst = _ExtractElementPair(OpSize::i64Bit, Result, 0);
|
||||
OrderedNode *Result_Src = _ExtractElementPair(OpSize::i64Bit, Result, 1);
|
||||
@@ -3700,9 +3691,6 @@ void OpDispatchBuilder::MOVSOp(OpcodeArgs) {
|
||||
StoreGPRRegister(X86State::REG_RSI, Result_Src);
|
||||
}
|
||||
else {
|
||||
auto SizeConst = _Constant(Size);
|
||||
auto PtrDir = _SubShift(IR::SizeToOpSize(CTX->GetGPRSize()), SizeConst, DF, ShiftType::LSL, FEXCore::ilog2(Size) + 1);
|
||||
|
||||
OrderedNode *RSI = LoadGPRRegister(X86State::REG_RSI);
|
||||
OrderedNode *RDI = LoadGPRRegister(X86State::REG_RDI);
|
||||
RDI= AppendSegmentOffset(RDI, 0, FEXCore::X86Tables::DecodeFlags::FLAG_ES_PREFIX, true);
|
||||
@@ -3713,6 +3701,7 @@ void OpDispatchBuilder::MOVSOp(OpcodeArgs) {
|
||||
// Store to memory where RDI points
|
||||
_StoreMemAutoTSO(GPRClass, Size, RDI, Src, Size);
|
||||
|
||||
auto PtrDir = LoadDir(Size);
|
||||
RSI = _Add(OpSize::i64Bit, RSI, PtrDir);
|
||||
RDI = _Add(OpSize::i64Bit, RDI, PtrDir);
|
||||
|
||||
@@ -3745,9 +3734,7 @@ void OpDispatchBuilder::CMPSOp(OpcodeArgs) {
|
||||
|
||||
GenerateFlags_SUB(Op, Src2, Src1);
|
||||
|
||||
auto DF = GetRFLAG(FEXCore::X86State::RFLAG_DF_LOC);
|
||||
auto SizeConst = _Constant(Size);
|
||||
auto PtrDir = _SubShift(IR::SizeToOpSize(CTX->GetGPRSize()), SizeConst, DF, ShiftType::LSL, FEXCore::ilog2(Size) + 1);
|
||||
auto PtrDir = LoadDir(Size);
|
||||
|
||||
// Offset the pointer
|
||||
Dest_RDI = _Add(OpSize::i64Bit, Dest_RDI, PtrDir);
|
||||
@@ -3764,9 +3751,7 @@ void OpDispatchBuilder::CMPSOp(OpcodeArgs) {
|
||||
bool REPE = Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_REP_PREFIX;
|
||||
|
||||
// read DF once
|
||||
auto DF = GetRFLAG(FEXCore::X86State::RFLAG_DF_LOC);
|
||||
auto SizeConst = _Constant(Size);
|
||||
auto PtrDir = _SubShift(IR::SizeToOpSize(CTX->GetGPRSize()), SizeConst, DF, ShiftType::LSL, FEXCore::ilog2(Size) + 1);
|
||||
auto PtrDir = LoadDir(Size);
|
||||
|
||||
auto JumpStart = Jump();
|
||||
// Make sure to start a new block after ending this one
|
||||
@@ -3856,15 +3841,9 @@ void OpDispatchBuilder::LODSOp(OpcodeArgs) {
|
||||
|
||||
StoreResult(GPRClass, Op, Src, -1);
|
||||
|
||||
auto DF = GetRFLAG(FEXCore::X86State::RFLAG_DF_LOC);
|
||||
auto SizeConst = _Constant(Size);
|
||||
auto PtrDir = _SubShift(IR::SizeToOpSize(CTX->GetGPRSize()), SizeConst, DF, ShiftType::LSL, FEXCore::ilog2(Size) + 1);
|
||||
|
||||
// Offset the pointer
|
||||
OrderedNode *TailDest_RSI = LoadGPRRegister(X86State::REG_RSI);
|
||||
|
||||
TailDest_RSI = _Add(OpSize::i64Bit, TailDest_RSI, PtrDir);
|
||||
StoreGPRRegister(X86State::REG_RSI, TailDest_RSI);
|
||||
StoreGPRRegister(X86State::REG_RSI, OffsetByDir(TailDest_RSI, Size));
|
||||
}
|
||||
else {
|
||||
// Calculate flags early. because end of block
|
||||
@@ -3877,9 +3856,7 @@ void OpDispatchBuilder::LODSOp(OpcodeArgs) {
|
||||
// May or may not matter
|
||||
|
||||
// Read DF once
|
||||
auto DF = GetRFLAG(FEXCore::X86State::RFLAG_DF_LOC);
|
||||
auto SizeConst = _Constant(Size);
|
||||
auto PtrDir = _SubShift(IR::SizeToOpSize(CTX->GetGPRSize()), SizeConst, DF, ShiftType::LSL, FEXCore::ilog2(Size) + 1);
|
||||
auto PtrDir = LoadDir(Size);
|
||||
|
||||
auto JumpStart = Jump();
|
||||
// Make sure to start a new block after ending this one
|
||||
@@ -3953,15 +3930,9 @@ void OpDispatchBuilder::SCASOp(OpcodeArgs) {
|
||||
|
||||
GenerateFlags_SUB(Op, Src1, Src2);
|
||||
|
||||
auto DF = GetRFLAG(FEXCore::X86State::RFLAG_DF_LOC);
|
||||
auto SizeConst = _Constant(Size);
|
||||
auto PtrDir = _SubShift(IR::SizeToOpSize(CTX->GetGPRSize()), SizeConst, DF, ShiftType::LSL, FEXCore::ilog2(Size) + 1);
|
||||
|
||||
// Offset the pointer
|
||||
OrderedNode *TailDest_RDI = LoadGPRRegister(X86State::REG_RDI);
|
||||
|
||||
TailDest_RDI = _Add(OpSize::i64Bit, TailDest_RDI, PtrDir);
|
||||
StoreGPRRegister(X86State::REG_RDI, TailDest_RDI);
|
||||
StoreGPRRegister(X86State::REG_RDI, OffsetByDir(TailDest_RDI, Size));
|
||||
}
|
||||
else {
|
||||
// Calculate flags early. because end of block
|
||||
@@ -3970,9 +3941,7 @@ void OpDispatchBuilder::SCASOp(OpcodeArgs) {
|
||||
bool REPE = Op->Flags & FEXCore::X86Tables::DecodeFlags::FLAG_REP_PREFIX;
|
||||
|
||||
// read DF once
|
||||
auto DF = GetRFLAG(FEXCore::X86State::RFLAG_DF_LOC);
|
||||
auto SizeConst = _Constant(Size);
|
||||
auto PtrDir = _SubShift(IR::SizeToOpSize(CTX->GetGPRSize()), SizeConst, DF, ShiftType::LSL, FEXCore::ilog2(Size) + 1);
|
||||
auto PtrDir = LoadDir(Size);
|
||||
|
||||
auto JumpStart = Jump();
|
||||
// Make sure to start a new block after ending this one
|
||||
|
||||
@@ -1401,6 +1401,11 @@ private:
|
||||
if (ValueOffset || MustMask)
|
||||
Value = _Bfe(OpSize::i32Bit, 1, ValueOffset, Value);
|
||||
|
||||
// For DF, we need to transform 0/1 into 1/-1
|
||||
if (BitOffset == FEXCore::X86State::RFLAG_DF_RAW_LOC) {
|
||||
Value = _SubShift(OpSize::i64Bit, _Constant(1), Value, ShiftType::LSL, 1);
|
||||
}
|
||||
|
||||
_StoreFlag(Value, BitOffset);
|
||||
}
|
||||
}
|
||||
@@ -1453,11 +1458,32 @@ private:
|
||||
return _LoadRegister(false, offsetof(FEXCore::Core::CPUState, pf_raw), GPRClass, GPRFixedClass, CTX->GetGPRSize());
|
||||
} else if (BitOffset == FEXCore::X86State::RFLAG_AF_RAW_LOC) {
|
||||
return _LoadRegister(false, offsetof(FEXCore::Core::CPUState, af_raw), GPRClass, GPRFixedClass, CTX->GetGPRSize());
|
||||
} else if (BitOffset == FEXCore::X86State::RFLAG_DF_RAW_LOC) {
|
||||
// Recover the sign bit, it is the logical DF value
|
||||
return _Lshr(OpSize::i64Bit, _LoadDF(), _Constant(63));
|
||||
} else {
|
||||
return _LoadFlag(BitOffset);
|
||||
}
|
||||
}
|
||||
|
||||
// Returns (DF ? -Size : Size)
|
||||
OrderedNode *LoadDir(const unsigned Size) {
|
||||
auto Dir = _LoadDF();
|
||||
auto Shift = FEXCore::ilog2(Size);
|
||||
|
||||
if (Shift)
|
||||
return _Lshl(IR::SizeToOpSize(CTX->GetGPRSize()), Dir, _Constant(Shift));
|
||||
else
|
||||
return Dir;
|
||||
}
|
||||
|
||||
// Returns DF ? (X - Size) : (X + Size)
|
||||
OrderedNode *OffsetByDir(OrderedNode *X, const unsigned Size) {
|
||||
auto Shift = FEXCore::ilog2(Size);
|
||||
|
||||
return _AddShift(OpSize::i64Bit, X, _LoadDF(), ShiftType::LSL, Shift);
|
||||
}
|
||||
|
||||
// Set SSE comparison flags based on the result set by Arm FCMP. This converts
|
||||
// NZCV from the Arm representation to an eXternal representation that's
|
||||
// totally not a euphemism for x86 or anything, nuh-uh.
|
||||
|
||||
@@ -27,7 +27,7 @@ constexpr std::array<uint32_t, 17> FlagOffsets = {
|
||||
FEXCore::X86State::RFLAG_SF_RAW_LOC,
|
||||
FEXCore::X86State::RFLAG_TF_LOC,
|
||||
FEXCore::X86State::RFLAG_IF_LOC,
|
||||
FEXCore::X86State::RFLAG_DF_LOC,
|
||||
FEXCore::X86State::RFLAG_DF_RAW_LOC,
|
||||
FEXCore::X86State::RFLAG_OF_RAW_LOC,
|
||||
FEXCore::X86State::RFLAG_IOPL_LOC,
|
||||
FEXCore::X86State::RFLAG_NT_LOC,
|
||||
|
||||
@@ -456,6 +456,13 @@
|
||||
"DestSize": "4"
|
||||
},
|
||||
|
||||
"GPR = LoadDF": {
|
||||
"Desc": ["Loads the decimal flag from the context object in -1/1",
|
||||
"representation for easy consumption"
|
||||
],
|
||||
"DestSize": "8"
|
||||
},
|
||||
|
||||
"GPR = LoadFlag u32:$Flag": {
|
||||
"Desc": ["Loads an x86-64 flag from the context object",
|
||||
"Specialized to allow flexible implementation of flag handling"
|
||||
|
||||
@@ -1330,7 +1330,7 @@ bool ConstProp::ConstantInlining(IREmitter *IREmit, const IRListView& CurrentIR)
|
||||
if (IREmit->IsValueConstant(Op->Direction, &Constant)) {
|
||||
IREmit->SetWriteCursor(CurrentIR.GetNode(Op->Direction));
|
||||
|
||||
IREmit->ReplaceNodeArgument(CodeNode, Op->Direction_Index, CreateInlineConstant(IREmit, Constant & 1));
|
||||
IREmit->ReplaceNodeArgument(CodeNode, Op->Direction_Index, CreateInlineConstant(IREmit, Constant));
|
||||
|
||||
Changed = true;
|
||||
}
|
||||
@@ -1344,7 +1344,7 @@ bool ConstProp::ConstantInlining(IREmitter *IREmit, const IRListView& CurrentIR)
|
||||
if (IREmit->IsValueConstant(Op->Direction, &Constant)) {
|
||||
IREmit->SetWriteCursor(CurrentIR.GetNode(Op->Direction));
|
||||
|
||||
IREmit->ReplaceNodeArgument(CodeNode, Op->Direction_Index, CreateInlineConstant(IREmit, Constant & 1));
|
||||
IREmit->ReplaceNodeArgument(CodeNode, Op->Direction_Index, CreateInlineConstant(IREmit, Constant));
|
||||
|
||||
Changed = true;
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ $end_info$
|
||||
#include "Interface/IR/PassManager.h"
|
||||
|
||||
#include <FEXCore/Core/CoreState.h>
|
||||
#include <FEXCore/Core/X86Enums.h>
|
||||
#include <FEXCore/IR/IR.h>
|
||||
#include <FEXCore/IR/IntrusiveIRList.h>
|
||||
#include <FEXCore/Utils/EnumOperators.h>
|
||||
@@ -483,6 +484,8 @@ private:
|
||||
ContextMemberInfo *RecordAccess(ContextMemberInfo *Info, FEXCore::IR::RegisterClassType RegClass, uint32_t Offset, uint8_t Size, LastAccessType AccessType, FEXCore::IR::OrderedNode *Node, FEXCore::IR::OrderedNode *StoreNode = nullptr);
|
||||
ContextMemberInfo *RecordAccess(ContextInfo *ClassifiedInfo, FEXCore::IR::RegisterClassType RegClass, uint32_t Offset, uint8_t Size, LastAccessType AccessType, FEXCore::IR::OrderedNode *Node, FEXCore::IR::OrderedNode *StoreNode = nullptr);
|
||||
|
||||
bool HandleLoadFlag(FEXCore::IR::IREmitter *IREmit, ContextInfo *LocalInfo, FEXCore::IR::OrderedNode *CodeNode, unsigned Flag);
|
||||
|
||||
// Classify context loads and stores.
|
||||
bool ClassifyContextLoad(FEXCore::IR::IREmitter *IREmit, ContextInfo *LocalInfo, FEXCore::IR::RegisterClassType Class, uint32_t Offset, uint8_t Size, FEXCore::IR::OrderedNode *CodeNode, FEXCore::IR::NodeIterator BlockEnd);
|
||||
bool ClassifyContextStore(FEXCore::IR::IREmitter *IREmit, ContextInfo *LocalInfo, FEXCore::IR::RegisterClassType Class, uint32_t Offset, uint8_t Size, FEXCore::IR::OrderedNode *CodeNode, FEXCore::IR::OrderedNode *ValueNode);
|
||||
@@ -551,6 +554,28 @@ bool RCLSE::ClassifyContextStore(FEXCore::IR::IREmitter *IREmit, ContextInfo *Lo
|
||||
return false;
|
||||
}
|
||||
|
||||
bool RCLSE::HandleLoadFlag(FEXCore::IR::IREmitter *IREmit, ContextInfo *LocalInfo, FEXCore::IR::OrderedNode *CodeNode, unsigned Flag) {
|
||||
const auto FlagOffset = offsetof(FEXCore::Core::CPUState, flags[Flag]);
|
||||
auto Info = FindMemberInfo(LocalInfo, FlagOffset, 1);
|
||||
LastAccessType LastAccess = Info->Accessed;
|
||||
auto LastValueNode = Info->ValueNode;
|
||||
|
||||
if (IsWriteAccess(LastAccess)) { // 1 byte so always a full write
|
||||
// If the last store matches this load value then we can replace the loaded value with the previous valid one
|
||||
IREmit->SetWriteCursor(CodeNode);
|
||||
IREmit->ReplaceAllUsesWith(CodeNode, LastValueNode);
|
||||
RecordAccess(Info, FEXCore::IR::GPRClass, FlagOffset, 1, LastAccessType::READ, LastValueNode);
|
||||
return true;
|
||||
}
|
||||
else if (IsReadAccess(LastAccess)) {
|
||||
IREmit->ReplaceAllUsesWith(CodeNode, LastValueNode);
|
||||
RecordAccess(Info, FEXCore::IR::GPRClass, FlagOffset, 1, LastAccessType::READ, LastValueNode);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This pass removes redundant pairs of storecontext and loadcontext ops
|
||||
*
|
||||
@@ -660,23 +685,11 @@ bool RCLSE::RedundantStoreLoadElimination(FEXCore::IR::IREmitter *IREmit) {
|
||||
}
|
||||
else if (IROp->Op == OP_LOADFLAG) {
|
||||
const auto Op = IROp->CW<IR::IROp_LoadFlag>();
|
||||
const auto FlagOffset = offsetof(FEXCore::Core::CPUState, flags[0]) + Op->Flag;
|
||||
auto Info = FindMemberInfo(&LocalInfo, FlagOffset, 1);
|
||||
LastAccessType LastAccess = Info->Accessed;
|
||||
OrderedNode *LastValueNode = Info->ValueNode;
|
||||
|
||||
if (IsWriteAccess(LastAccess)) { // 1 byte so always a full write
|
||||
// If the last store matches this load value then we can replace the loaded value with the previous valid one
|
||||
IREmit->SetWriteCursor(CodeNode);
|
||||
IREmit->ReplaceAllUsesWith(CodeNode, LastValueNode);
|
||||
RecordAccess(Info, FEXCore::IR::GPRClass, FlagOffset, 1, LastAccessType::READ, LastValueNode);
|
||||
Changed = true;
|
||||
}
|
||||
else if (IsReadAccess(LastAccess)) {
|
||||
IREmit->ReplaceAllUsesWith(CodeNode, LastValueNode);
|
||||
RecordAccess(Info, FEXCore::IR::GPRClass, FlagOffset, 1, LastAccessType::READ, LastValueNode);
|
||||
Changed = true;
|
||||
}
|
||||
Changed |= HandleLoadFlag(IREmit, &LocalInfo, CodeNode, Op->Flag);
|
||||
}
|
||||
else if (IROp->Op == OP_LOADDF) {
|
||||
Changed |= HandleLoadFlag(IREmit, &LocalInfo, CodeNode, X86State::RFLAG_DF_RAW_LOC);
|
||||
}
|
||||
else if (IROp->Op == OP_SYSCALL ||
|
||||
IROp->Op == OP_INLINESYSCALL) {
|
||||
|
||||
@@ -10,6 +10,7 @@ $end_info$
|
||||
#include "Interface/IR/PassManager.h"
|
||||
|
||||
#include <FEXCore/Core/CoreState.h>
|
||||
#include <FEXCore/Core/X86Enums.h>
|
||||
#include <FEXCore/IR/IR.h>
|
||||
#include <FEXCore/IR/IntrusiveIRList.h>
|
||||
#include <FEXCore/Utils/LogManager.h>
|
||||
@@ -211,6 +212,10 @@ bool DeadStoreElimination::Run(IREmitter *IREmit) {
|
||||
auto& BlockInfo = InfoMap[BlockNode];
|
||||
|
||||
BlockInfo.flag.reads |= 1UL << Op->Flag;
|
||||
} else if (IROp->Op == OP_LOADDF) {
|
||||
auto& BlockInfo = InfoMap[BlockNode];
|
||||
|
||||
BlockInfo.flag.reads |= 1UL << X86State::RFLAG_DF_RAW_LOC;
|
||||
} else if (IROp->Op == OP_STOREREGISTER) {
|
||||
auto Op = IROp->C<IR::IROp_StoreRegister>();
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
#pragma once
|
||||
|
||||
#include "FEXCore/Core/X86Enums.h"
|
||||
#include "FEXCore/IR/IR.h"
|
||||
#include <FEXCore/HLE/Linux/ThreadManagement.h>
|
||||
#include <FEXCore/Utils/CompilerDefs.h>
|
||||
@@ -147,8 +148,13 @@ namespace FEXCore::Core {
|
||||
}
|
||||
#endif
|
||||
|
||||
flags[1] = 1; ///< Reserved - Always 1.
|
||||
flags[9] = 1; ///< Interrupt flag - Always 1.
|
||||
flags[X86State::RFLAG_RESERVED_LOC] = 1; ///< Reserved - Always 1.
|
||||
flags[X86State::RFLAG_IF_LOC] = 1; ///< Interrupt flag - Always 1.
|
||||
|
||||
// DF needs to be initialized to 0 to comply with the Linux ABI. However,
|
||||
// we encode DF as 1/-1 within the JIT, so we have to write 0x1 here to
|
||||
// zero DF.
|
||||
flags[X86State::RFLAG_DF_RAW_LOC] = 0x1;
|
||||
}
|
||||
};
|
||||
static_assert(std::is_trivially_copyable_v<CPUState>, "Needs to be trivial");
|
||||
|
||||
@@ -64,7 +64,7 @@ enum X86RegLocation : uint32_t {
|
||||
RFLAG_SF_RAW_LOC = 7, // Not used directly, needs to be reconstructed using `ReconstructCompactedEFLAGS`
|
||||
RFLAG_TF_LOC = 8,
|
||||
RFLAG_IF_LOC = 9,
|
||||
RFLAG_DF_LOC = 10,
|
||||
RFLAG_DF_RAW_LOC = 10, // Contains multiple bits, needs to be reconstructed using `ReconstructCompactedEFLAGS`
|
||||
RFLAG_OF_RAW_LOC = 11, // Not used directly, needs to be reconstructed using `ReconstructCompactedEFLAGS`
|
||||
RFLAG_IOPL_LOC = 12,
|
||||
RFLAG_NT_LOC = 14,
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
"movsb"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x0",
|
||||
"mov w20, #0x1",
|
||||
"strb w20, [x28, #714]",
|
||||
"ldrb w20, [x10]",
|
||||
"strb w20, [x11]",
|
||||
@@ -87,7 +87,7 @@
|
||||
"movsw"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x0",
|
||||
"mov w20, #0x1",
|
||||
"strb w20, [x28, #714]",
|
||||
"ldrh w20, [x10]",
|
||||
"strh w20, [x11]",
|
||||
@@ -106,7 +106,7 @@
|
||||
"movsd"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x0",
|
||||
"mov w20, #0x1",
|
||||
"strb w20, [x28, #714]",
|
||||
"ldr w20, [x10]",
|
||||
"str w20, [x11]",
|
||||
@@ -125,7 +125,7 @@
|
||||
"movsq"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x0",
|
||||
"mov w20, #0x1",
|
||||
"strb w20, [x28, #714]",
|
||||
"ldr x20, [x10]",
|
||||
"str x20, [x11]",
|
||||
@@ -144,7 +144,7 @@
|
||||
"movsb"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x1",
|
||||
"mov x20, #0xffffffffffffffff",
|
||||
"strb w20, [x28, #714]",
|
||||
"ldrb w20, [x10]",
|
||||
"strb w20, [x11]",
|
||||
@@ -163,7 +163,7 @@
|
||||
"movsw"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x1",
|
||||
"mov x20, #0xffffffffffffffff",
|
||||
"strb w20, [x28, #714]",
|
||||
"ldrh w20, [x10]",
|
||||
"strh w20, [x11]",
|
||||
@@ -182,7 +182,7 @@
|
||||
"movsd"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x1",
|
||||
"mov x20, #0xffffffffffffffff",
|
||||
"strb w20, [x28, #714]",
|
||||
"ldr w20, [x10]",
|
||||
"str w20, [x11]",
|
||||
@@ -201,7 +201,7 @@
|
||||
"movsq"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x1",
|
||||
"mov x20, #0xffffffffffffffff",
|
||||
"strb w20, [x28, #714]",
|
||||
"ldr x20, [x10]",
|
||||
"str x20, [x11]",
|
||||
@@ -210,7 +210,7 @@
|
||||
]
|
||||
},
|
||||
"positive rep movsb": {
|
||||
"ExpectedInstructionCount": 18,
|
||||
"ExpectedInstructionCount": 19,
|
||||
"Comment": [
|
||||
"When direction flag is a compile time constant we can optimize",
|
||||
"loads and stores can turn in to post-increment when known"
|
||||
@@ -221,7 +221,8 @@
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x0",
|
||||
"strb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"strb w21, [x28, #714]",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
"mov x2, x10",
|
||||
@@ -241,7 +242,7 @@
|
||||
]
|
||||
},
|
||||
"positive rep movsw": {
|
||||
"ExpectedInstructionCount": 18,
|
||||
"ExpectedInstructionCount": 19,
|
||||
"Comment": [
|
||||
"When direction flag is a compile time constant we can optimize",
|
||||
"loads and stores can turn in to post-increment when known"
|
||||
@@ -252,7 +253,8 @@
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x0",
|
||||
"strb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"strb w21, [x28, #714]",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
"mov x2, x10",
|
||||
@@ -272,7 +274,7 @@
|
||||
]
|
||||
},
|
||||
"positive rep movsd": {
|
||||
"ExpectedInstructionCount": 18,
|
||||
"ExpectedInstructionCount": 19,
|
||||
"Comment": [
|
||||
"When direction flag is a compile time constant we can optimize",
|
||||
"loads and stores can turn in to post-increment when known"
|
||||
@@ -283,7 +285,8 @@
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x0",
|
||||
"strb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"strb w21, [x28, #714]",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
"mov x2, x10",
|
||||
@@ -303,7 +306,7 @@
|
||||
]
|
||||
},
|
||||
"positive rep movsq": {
|
||||
"ExpectedInstructionCount": 18,
|
||||
"ExpectedInstructionCount": 19,
|
||||
"Comment": [
|
||||
"When direction flag is a compile time constant we can optimize",
|
||||
"loads and stores can turn in to post-increment when known"
|
||||
@@ -314,7 +317,8 @@
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x0",
|
||||
"strb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"strb w21, [x28, #714]",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
"mov x2, x10",
|
||||
@@ -344,7 +348,7 @@
|
||||
"rep movsb"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x1",
|
||||
"mov x20, #0xffffffffffffffff",
|
||||
"strb w20, [x28, #714]",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
@@ -375,7 +379,7 @@
|
||||
"rep movsw"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x1",
|
||||
"mov x20, #0xffffffffffffffff",
|
||||
"strb w20, [x28, #714]",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
@@ -406,7 +410,7 @@
|
||||
"rep movsd"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x1",
|
||||
"mov x20, #0xffffffffffffffff",
|
||||
"strb w20, [x28, #714]",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
@@ -437,7 +441,7 @@
|
||||
"rep movsq"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x1",
|
||||
"mov x20, #0xffffffffffffffff",
|
||||
"strb w20, [x28, #714]",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
@@ -458,7 +462,7 @@
|
||||
]
|
||||
},
|
||||
"positive rep stosb": {
|
||||
"ExpectedInstructionCount": 11,
|
||||
"ExpectedInstructionCount": 12,
|
||||
"Comment": [
|
||||
"When direction flag is a compile time constant we can optimize",
|
||||
"loads and stores can turn in to post-increment when known"
|
||||
@@ -469,7 +473,8 @@
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x0",
|
||||
"strb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"strb w21, [x28, #714]",
|
||||
"uxtb w21, w4",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
@@ -482,7 +487,7 @@
|
||||
]
|
||||
},
|
||||
"positive rep stosw": {
|
||||
"ExpectedInstructionCount": 11,
|
||||
"ExpectedInstructionCount": 12,
|
||||
"Comment": [
|
||||
"When direction flag is a compile time constant we can optimize",
|
||||
"loads and stores can turn in to post-increment when known"
|
||||
@@ -493,7 +498,8 @@
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x0",
|
||||
"strb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"strb w21, [x28, #714]",
|
||||
"uxth w21, w4",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
@@ -506,7 +512,7 @@
|
||||
]
|
||||
},
|
||||
"positive rep stosd": {
|
||||
"ExpectedInstructionCount": 11,
|
||||
"ExpectedInstructionCount": 12,
|
||||
"Comment": [
|
||||
"When direction flag is a compile time constant we can optimize",
|
||||
"loads and stores can turn in to post-increment when known"
|
||||
@@ -517,7 +523,8 @@
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x0",
|
||||
"strb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"strb w21, [x28, #714]",
|
||||
"mov w21, w4",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
@@ -530,7 +537,7 @@
|
||||
]
|
||||
},
|
||||
"positive rep stosq": {
|
||||
"ExpectedInstructionCount": 10,
|
||||
"ExpectedInstructionCount": 11,
|
||||
"Comment": [
|
||||
"When direction flag is a compile time constant we can optimize",
|
||||
"loads and stores can turn in to post-increment when known"
|
||||
@@ -541,7 +548,8 @@
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x0",
|
||||
"strb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"strb w21, [x28, #714]",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
"cbz x0, #+0x10",
|
||||
@@ -563,7 +571,7 @@
|
||||
"rep stosb"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x1",
|
||||
"mov x20, #0xffffffffffffffff",
|
||||
"strb w20, [x28, #714]",
|
||||
"uxtb w20, w4",
|
||||
"mov x0, x5",
|
||||
@@ -587,7 +595,7 @@
|
||||
"rep stosw"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x1",
|
||||
"mov x20, #0xffffffffffffffff",
|
||||
"strb w20, [x28, #714]",
|
||||
"uxth w20, w4",
|
||||
"mov x0, x5",
|
||||
@@ -611,7 +619,7 @@
|
||||
"rep stosd"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x1",
|
||||
"mov x20, #0xffffffffffffffff",
|
||||
"strb w20, [x28, #714]",
|
||||
"mov w20, w4",
|
||||
"mov x0, x5",
|
||||
@@ -635,7 +643,7 @@
|
||||
"rep stosq"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x1",
|
||||
"mov x20, #0xffffffffffffffff",
|
||||
"strb w20, [x28, #714]",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
|
||||
@@ -1714,7 +1714,7 @@
|
||||
]
|
||||
},
|
||||
"pushf": {
|
||||
"ExpectedInstructionCount": 38,
|
||||
"ExpectedInstructionCount": 39,
|
||||
"Comment": "0x9c",
|
||||
"ExpectedArm64ASM": [
|
||||
"cset w20, hs",
|
||||
@@ -1725,7 +1725,8 @@
|
||||
"orr x20, x20, x21, lsl #8",
|
||||
"ldrb w21, [x28, #713]",
|
||||
"orr x20, x20, x21, lsl #9",
|
||||
"ldrb w21, [x28, #714]",
|
||||
"ldrsb x21, [x28, #714]",
|
||||
"lsr x21, x21, #63",
|
||||
"orr x20, x20, x21, lsl #10",
|
||||
"cset w21, vs",
|
||||
"orr x20, x20, x21, lsl #11",
|
||||
@@ -1758,7 +1759,7 @@
|
||||
]
|
||||
},
|
||||
"pushfq": {
|
||||
"ExpectedInstructionCount": 38,
|
||||
"ExpectedInstructionCount": 39,
|
||||
"Comment": "0x9c",
|
||||
"ExpectedArm64ASM": [
|
||||
"cset w20, hs",
|
||||
@@ -1769,7 +1770,8 @@
|
||||
"orr x20, x20, x21, lsl #8",
|
||||
"ldrb w21, [x28, #713]",
|
||||
"orr x20, x20, x21, lsl #9",
|
||||
"ldrb w21, [x28, #714]",
|
||||
"ldrsb x21, [x28, #714]",
|
||||
"lsr x21, x21, #63",
|
||||
"orr x20, x20, x21, lsl #10",
|
||||
"cset w21, vs",
|
||||
"orr x20, x20, x21, lsl #11",
|
||||
@@ -1802,7 +1804,7 @@
|
||||
]
|
||||
},
|
||||
"popf": {
|
||||
"ExpectedInstructionCount": 32,
|
||||
"ExpectedInstructionCount": 34,
|
||||
"Comment": "0x9d",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldr x20, [x8]",
|
||||
@@ -1811,6 +1813,7 @@
|
||||
"orr x27, x20, x21",
|
||||
"rmif x27, #63, #nzCv",
|
||||
"ubfx w20, w27, #2, #1",
|
||||
"mov w21, #0x1",
|
||||
"eor w26, w20, #0x1",
|
||||
"rmif x27, #4, #nZcv",
|
||||
"rmif x27, #4, #Nzcv",
|
||||
@@ -1819,6 +1822,7 @@
|
||||
"ubfx w20, w27, #9, #1",
|
||||
"strb w20, [x28, #713]",
|
||||
"ubfx w20, w27, #10, #1",
|
||||
"sub x20, x21, x20, lsl #1",
|
||||
"strb w20, [x28, #714]",
|
||||
"rmif x27, #11, #nzcV",
|
||||
"ubfx w20, w27, #12, #1",
|
||||
@@ -1875,16 +1879,14 @@
|
||||
]
|
||||
},
|
||||
"cmpsb": {
|
||||
"ExpectedInstructionCount": 12,
|
||||
"ExpectedInstructionCount": 10,
|
||||
"Comment": [
|
||||
"0xa6"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x11]",
|
||||
"ldrb w21, [x10]",
|
||||
"ldrb w22, [x28, #714]",
|
||||
"mov w23, #0x1",
|
||||
"sub x22, x23, x22, lsl #1",
|
||||
"ldrsb x22, [x28, #714]",
|
||||
"add x11, x11, x22",
|
||||
"add x10, x10, x22",
|
||||
"eor w27, w21, w20",
|
||||
@@ -1895,16 +1897,15 @@
|
||||
]
|
||||
},
|
||||
"cmpsw": {
|
||||
"ExpectedInstructionCount": 12,
|
||||
"ExpectedInstructionCount": 11,
|
||||
"Comment": [
|
||||
"0xa7"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrh w20, [x11]",
|
||||
"ldrh w21, [x10]",
|
||||
"ldrb w22, [x28, #714]",
|
||||
"mov w23, #0x2",
|
||||
"sub x22, x23, x22, lsl #2",
|
||||
"ldrsb x22, [x28, #714]",
|
||||
"lsl x22, x22, #1",
|
||||
"add x11, x11, x22",
|
||||
"add x10, x10, x22",
|
||||
"eor w27, w21, w20",
|
||||
@@ -1915,16 +1916,15 @@
|
||||
]
|
||||
},
|
||||
"cmpsd": {
|
||||
"ExpectedInstructionCount": 10,
|
||||
"ExpectedInstructionCount": 9,
|
||||
"Comment": [
|
||||
"0xa7"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"ldr w20, [x11]",
|
||||
"ldr w21, [x10]",
|
||||
"ldrb w22, [x28, #714]",
|
||||
"mov w23, #0x4",
|
||||
"sub x22, x23, x22, lsl #3",
|
||||
"ldrsb x22, [x28, #714]",
|
||||
"lsl x22, x22, #2",
|
||||
"add x11, x11, x22",
|
||||
"add x10, x10, x22",
|
||||
"eor w27, w21, w20",
|
||||
@@ -1933,16 +1933,15 @@
|
||||
]
|
||||
},
|
||||
"cmpsq": {
|
||||
"ExpectedInstructionCount": 10,
|
||||
"ExpectedInstructionCount": 9,
|
||||
"Comment": [
|
||||
"0xa7"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"ldr x20, [x11]",
|
||||
"ldr x21, [x10]",
|
||||
"ldrb w22, [x28, #714]",
|
||||
"mov w23, #0x8",
|
||||
"sub x22, x23, x22, lsl #4",
|
||||
"ldrsb x22, [x28, #714]",
|
||||
"lsl x22, x22, #3",
|
||||
"add x11, x11, x22",
|
||||
"add x10, x10, x22",
|
||||
"eor w27, w21, w20",
|
||||
@@ -1951,12 +1950,10 @@
|
||||
]
|
||||
},
|
||||
"repz cmpsb": {
|
||||
"ExpectedInstructionCount": 15,
|
||||
"ExpectedInstructionCount": 13,
|
||||
"Comment": "0xa6",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"sub x20, x21, x20, lsl #1",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"cbz x5, #+0x30",
|
||||
"ldrb w21, [x11]",
|
||||
"ldrb w22, [x10]",
|
||||
@@ -1972,12 +1969,11 @@
|
||||
]
|
||||
},
|
||||
"repz cmpsw": {
|
||||
"ExpectedInstructionCount": 15,
|
||||
"ExpectedInstructionCount": 14,
|
||||
"Comment": "0xa7",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x2",
|
||||
"sub x20, x21, x20, lsl #2",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #1",
|
||||
"cbz x5, #+0x30",
|
||||
"ldrh w21, [x11]",
|
||||
"ldrh w22, [x10]",
|
||||
@@ -1993,12 +1989,11 @@
|
||||
]
|
||||
},
|
||||
"repz cmpsd": {
|
||||
"ExpectedInstructionCount": 13,
|
||||
"ExpectedInstructionCount": 12,
|
||||
"Comment": "0xa7",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x4",
|
||||
"sub x20, x21, x20, lsl #3",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #2",
|
||||
"cbz x5, #+0x28",
|
||||
"ldr w21, [x11]",
|
||||
"ldr w22, [x10]",
|
||||
@@ -2012,12 +2007,11 @@
|
||||
]
|
||||
},
|
||||
"repz cmpsq": {
|
||||
"ExpectedInstructionCount": 13,
|
||||
"ExpectedInstructionCount": 12,
|
||||
"Comment": "0xa7",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x8",
|
||||
"sub x20, x21, x20, lsl #4",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #3",
|
||||
"cbz x5, #+0x28",
|
||||
"ldr x21, [x11]",
|
||||
"ldr x22, [x10]",
|
||||
@@ -2031,12 +2025,10 @@
|
||||
]
|
||||
},
|
||||
"repnz cmpsb": {
|
||||
"ExpectedInstructionCount": 15,
|
||||
"ExpectedInstructionCount": 13,
|
||||
"Comment": "0xa6",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"sub x20, x21, x20, lsl #1",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"cbz x5, #+0x30",
|
||||
"ldrb w21, [x11]",
|
||||
"ldrb w22, [x10]",
|
||||
@@ -2052,12 +2044,11 @@
|
||||
]
|
||||
},
|
||||
"repnz cmpsw": {
|
||||
"ExpectedInstructionCount": 15,
|
||||
"ExpectedInstructionCount": 14,
|
||||
"Comment": "0xa7",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x2",
|
||||
"sub x20, x21, x20, lsl #2",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #1",
|
||||
"cbz x5, #+0x30",
|
||||
"ldrh w21, [x11]",
|
||||
"ldrh w22, [x10]",
|
||||
@@ -2073,12 +2064,11 @@
|
||||
]
|
||||
},
|
||||
"repnz cmpsd": {
|
||||
"ExpectedInstructionCount": 13,
|
||||
"ExpectedInstructionCount": 12,
|
||||
"Comment": "0xa7",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x4",
|
||||
"sub x20, x21, x20, lsl #3",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #2",
|
||||
"cbz x5, #+0x28",
|
||||
"ldr w21, [x11]",
|
||||
"ldr w22, [x10]",
|
||||
@@ -2092,12 +2082,11 @@
|
||||
]
|
||||
},
|
||||
"repnz cmpsq": {
|
||||
"ExpectedInstructionCount": 13,
|
||||
"ExpectedInstructionCount": 12,
|
||||
"Comment": "0xa7",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x8",
|
||||
"sub x20, x21, x20, lsl #4",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #3",
|
||||
"cbz x5, #+0x28",
|
||||
"ldr x21, [x11]",
|
||||
"ldr x22, [x10]",
|
||||
@@ -2171,13 +2160,11 @@
|
||||
]
|
||||
},
|
||||
"scasb": {
|
||||
"ExpectedInstructionCount": 10,
|
||||
"ExpectedInstructionCount": 8,
|
||||
"Comment": "0xae",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x11]",
|
||||
"ldrb w21, [x28, #714]",
|
||||
"mov w22, #0x1",
|
||||
"sub x21, x22, x21, lsl #1",
|
||||
"ldrsb x21, [x28, #714]",
|
||||
"add x11, x11, x21",
|
||||
"eor w27, w4, w20",
|
||||
"lsl w0, w4, #24",
|
||||
@@ -2187,14 +2174,12 @@
|
||||
]
|
||||
},
|
||||
"scasw": {
|
||||
"ExpectedInstructionCount": 10,
|
||||
"ExpectedInstructionCount": 8,
|
||||
"Comment": "0xaf",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrh w20, [x11]",
|
||||
"ldrb w21, [x28, #714]",
|
||||
"mov w22, #0x2",
|
||||
"sub x21, x22, x21, lsl #2",
|
||||
"add x11, x11, x21",
|
||||
"ldrsb x21, [x28, #714]",
|
||||
"add x11, x11, x21, lsl #1",
|
||||
"eor w27, w4, w20",
|
||||
"lsl w0, w4, #16",
|
||||
"cmp w0, w20, lsl #16",
|
||||
@@ -2203,40 +2188,34 @@
|
||||
]
|
||||
},
|
||||
"scasd": {
|
||||
"ExpectedInstructionCount": 8,
|
||||
"ExpectedInstructionCount": 6,
|
||||
"Comment": "0xaf",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldr w20, [x11]",
|
||||
"ldrb w21, [x28, #714]",
|
||||
"mov w22, #0x4",
|
||||
"sub x21, x22, x21, lsl #3",
|
||||
"add x11, x11, x21",
|
||||
"ldrsb x21, [x28, #714]",
|
||||
"add x11, x11, x21, lsl #2",
|
||||
"eor w27, w4, w20",
|
||||
"subs w26, w4, w20",
|
||||
"cfinv"
|
||||
]
|
||||
},
|
||||
"scasq": {
|
||||
"ExpectedInstructionCount": 8,
|
||||
"ExpectedInstructionCount": 6,
|
||||
"Comment": "0xaf",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldr x20, [x11]",
|
||||
"ldrb w21, [x28, #714]",
|
||||
"mov w22, #0x8",
|
||||
"sub x21, x22, x21, lsl #4",
|
||||
"add x11, x11, x21",
|
||||
"ldrsb x21, [x28, #714]",
|
||||
"add x11, x11, x21, lsl #3",
|
||||
"eor w27, w4, w20",
|
||||
"subs x26, x4, x20",
|
||||
"cfinv"
|
||||
]
|
||||
},
|
||||
"repz scasb": {
|
||||
"ExpectedInstructionCount": 13,
|
||||
"ExpectedInstructionCount": 11,
|
||||
"Comment": "0xae",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"sub x20, x21, x20, lsl #1",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"cbz x5, #+0x28",
|
||||
"ldrb w21, [x11]",
|
||||
"eor w27, w4, w21",
|
||||
@@ -2250,12 +2229,11 @@
|
||||
]
|
||||
},
|
||||
"repz scasw": {
|
||||
"ExpectedInstructionCount": 13,
|
||||
"ExpectedInstructionCount": 12,
|
||||
"Comment": "0xaf",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x2",
|
||||
"sub x20, x21, x20, lsl #2",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #1",
|
||||
"cbz x5, #+0x28",
|
||||
"ldrh w21, [x11]",
|
||||
"eor w27, w4, w21",
|
||||
@@ -2269,12 +2247,11 @@
|
||||
]
|
||||
},
|
||||
"repz scasd": {
|
||||
"ExpectedInstructionCount": 11,
|
||||
"ExpectedInstructionCount": 10,
|
||||
"Comment": "0xaf",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x4",
|
||||
"sub x20, x21, x20, lsl #3",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #2",
|
||||
"cbz x5, #+0x20",
|
||||
"ldr w21, [x11]",
|
||||
"eor w27, w4, w21",
|
||||
@@ -2286,12 +2263,11 @@
|
||||
]
|
||||
},
|
||||
"repz scasq": {
|
||||
"ExpectedInstructionCount": 11,
|
||||
"ExpectedInstructionCount": 10,
|
||||
"Comment": "0xaf",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x8",
|
||||
"sub x20, x21, x20, lsl #4",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #3",
|
||||
"cbz x5, #+0x20",
|
||||
"ldr x21, [x11]",
|
||||
"eor w27, w4, w21",
|
||||
@@ -2303,12 +2279,10 @@
|
||||
]
|
||||
},
|
||||
"repnz scasb": {
|
||||
"ExpectedInstructionCount": 13,
|
||||
"ExpectedInstructionCount": 11,
|
||||
"Comment": "0xae",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"sub x20, x21, x20, lsl #1",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"cbz x5, #+0x28",
|
||||
"ldrb w21, [x11]",
|
||||
"eor w27, w4, w21",
|
||||
@@ -2322,12 +2296,11 @@
|
||||
]
|
||||
},
|
||||
"repnz scasw": {
|
||||
"ExpectedInstructionCount": 13,
|
||||
"ExpectedInstructionCount": 12,
|
||||
"Comment": "0xaf",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x2",
|
||||
"sub x20, x21, x20, lsl #2",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #1",
|
||||
"cbz x5, #+0x28",
|
||||
"ldrh w21, [x11]",
|
||||
"eor w27, w4, w21",
|
||||
@@ -2341,12 +2314,11 @@
|
||||
]
|
||||
},
|
||||
"repnz scasd": {
|
||||
"ExpectedInstructionCount": 11,
|
||||
"ExpectedInstructionCount": 10,
|
||||
"Comment": "0xaf",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x4",
|
||||
"sub x20, x21, x20, lsl #3",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #2",
|
||||
"cbz x5, #+0x20",
|
||||
"ldr w21, [x11]",
|
||||
"eor w27, w4, w21",
|
||||
@@ -2358,12 +2330,11 @@
|
||||
]
|
||||
},
|
||||
"repnz scasq": {
|
||||
"ExpectedInstructionCount": 11,
|
||||
"ExpectedInstructionCount": 10,
|
||||
"Comment": "0xaf",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x8",
|
||||
"sub x20, x21, x20, lsl #4",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #3",
|
||||
"cbz x5, #+0x20",
|
||||
"ldr x21, [x11]",
|
||||
"eor w27, w4, w21",
|
||||
|
||||
@@ -2575,7 +2575,7 @@
|
||||
"ExpectedArm64ASM": []
|
||||
},
|
||||
"pushf": {
|
||||
"ExpectedInstructionCount": 38,
|
||||
"ExpectedInstructionCount": 39,
|
||||
"Comment": "0x9c",
|
||||
"ExpectedArm64ASM": [
|
||||
"cset w20, hs",
|
||||
@@ -2586,7 +2586,8 @@
|
||||
"orr x20, x20, x21, lsl #8",
|
||||
"ldrb w21, [x28, #713]",
|
||||
"orr x20, x20, x21, lsl #9",
|
||||
"ldrb w21, [x28, #714]",
|
||||
"ldrsb x21, [x28, #714]",
|
||||
"lsr x21, x21, #63",
|
||||
"orr x20, x20, x21, lsl #10",
|
||||
"cset w21, vs",
|
||||
"orr x20, x20, x21, lsl #11",
|
||||
@@ -2619,7 +2620,7 @@
|
||||
]
|
||||
},
|
||||
"pushfq": {
|
||||
"ExpectedInstructionCount": 38,
|
||||
"ExpectedInstructionCount": 39,
|
||||
"Comment": "0x9c",
|
||||
"ExpectedArm64ASM": [
|
||||
"cset w20, hs",
|
||||
@@ -2630,7 +2631,8 @@
|
||||
"orr x20, x20, x21, lsl #8",
|
||||
"ldrb w21, [x28, #713]",
|
||||
"orr x20, x20, x21, lsl #9",
|
||||
"ldrb w21, [x28, #714]",
|
||||
"ldrsb x21, [x28, #714]",
|
||||
"lsr x21, x21, #63",
|
||||
"orr x20, x20, x21, lsl #10",
|
||||
"cset w21, vs",
|
||||
"orr x20, x20, x21, lsl #11",
|
||||
@@ -2663,7 +2665,7 @@
|
||||
]
|
||||
},
|
||||
"popf": {
|
||||
"ExpectedInstructionCount": 37,
|
||||
"ExpectedInstructionCount": 39,
|
||||
"Comment": "0x9d",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldr x20, [x8]",
|
||||
@@ -2673,6 +2675,7 @@
|
||||
"ubfx x20, x27, #0, #1",
|
||||
"lsl x20, x20, #29",
|
||||
"ubfx w21, w27, #2, #1",
|
||||
"mov w22, #0x1",
|
||||
"eor w26, w21, #0x1",
|
||||
"ubfx x21, x27, #6, #1",
|
||||
"orr w20, w20, w21, lsl #30",
|
||||
@@ -2683,6 +2686,7 @@
|
||||
"ubfx w21, w27, #9, #1",
|
||||
"strb w21, [x28, #713]",
|
||||
"ubfx w21, w27, #10, #1",
|
||||
"sub x21, x22, x21, lsl #1",
|
||||
"strb w21, [x28, #714]",
|
||||
"ubfx x21, x27, #11, #1",
|
||||
"orr w20, w20, w21, lsl #28",
|
||||
@@ -2801,61 +2805,56 @@
|
||||
]
|
||||
},
|
||||
"movsb": {
|
||||
"ExpectedInstructionCount": 7,
|
||||
"ExpectedInstructionCount": 5,
|
||||
"Comment": [
|
||||
"0xa4"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"sub x20, x21, x20, lsl #1",
|
||||
"ldrb w21, [x10]",
|
||||
"strb w21, [x11]",
|
||||
"ldrb w20, [x10]",
|
||||
"strb w20, [x11]",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"add x10, x10, x20",
|
||||
"add x11, x11, x20"
|
||||
]
|
||||
},
|
||||
"movsw": {
|
||||
"ExpectedInstructionCount": 7,
|
||||
"ExpectedInstructionCount": 6,
|
||||
"Comment": [
|
||||
"0xa5"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x2",
|
||||
"sub x20, x21, x20, lsl #2",
|
||||
"ldrh w21, [x10]",
|
||||
"strh w21, [x11]",
|
||||
"ldrh w20, [x10]",
|
||||
"strh w20, [x11]",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #1",
|
||||
"add x10, x10, x20",
|
||||
"add x11, x11, x20"
|
||||
]
|
||||
},
|
||||
"movsd": {
|
||||
"ExpectedInstructionCount": 7,
|
||||
"ExpectedInstructionCount": 6,
|
||||
"Comment": [
|
||||
"0xa5"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x4",
|
||||
"sub x20, x21, x20, lsl #3",
|
||||
"ldr w21, [x10]",
|
||||
"str w21, [x11]",
|
||||
"ldr w20, [x10]",
|
||||
"str w20, [x11]",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #2",
|
||||
"add x10, x10, x20",
|
||||
"add x11, x11, x20"
|
||||
]
|
||||
},
|
||||
"movsq": {
|
||||
"ExpectedInstructionCount": 7,
|
||||
"ExpectedInstructionCount": 6,
|
||||
"Comment": [
|
||||
"0xa5"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x8",
|
||||
"sub x20, x21, x20, lsl #4",
|
||||
"ldr x21, [x10]",
|
||||
"str x21, [x11]",
|
||||
"ldr x20, [x10]",
|
||||
"str x20, [x11]",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #3",
|
||||
"add x10, x10, x20",
|
||||
"add x11, x11, x20"
|
||||
]
|
||||
@@ -2864,11 +2863,11 @@
|
||||
"ExpectedInstructionCount": 29,
|
||||
"Comment": "0xa4",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
"mov x2, x10",
|
||||
"cbnz x20, #+0x30",
|
||||
"tbnz w20, #1, #+0x30",
|
||||
"cbz x0, #+0x14",
|
||||
"ldrb w3, [x2], #1",
|
||||
"strb w3, [x1], #1",
|
||||
@@ -2899,11 +2898,11 @@
|
||||
"ExpectedInstructionCount": 29,
|
||||
"Comment": "0xa5",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
"mov x2, x10",
|
||||
"cbnz x20, #+0x30",
|
||||
"tbnz w20, #1, #+0x30",
|
||||
"cbz x0, #+0x14",
|
||||
"ldrh w3, [x2], #2",
|
||||
"strh w3, [x1], #2",
|
||||
@@ -2934,11 +2933,11 @@
|
||||
"ExpectedInstructionCount": 29,
|
||||
"Comment": "0xa5",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
"mov x2, x10",
|
||||
"cbnz x20, #+0x30",
|
||||
"tbnz w20, #1, #+0x30",
|
||||
"cbz x0, #+0x14",
|
||||
"ldr w3, [x2], #4",
|
||||
"str w3, [x1], #4",
|
||||
@@ -2969,11 +2968,11 @@
|
||||
"ExpectedInstructionCount": 29,
|
||||
"Comment": "0xa5",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
"mov x2, x10",
|
||||
"cbnz x20, #+0x30",
|
||||
"tbnz w20, #1, #+0x30",
|
||||
"cbz x0, #+0x14",
|
||||
"ldr x3, [x2], #8",
|
||||
"str x3, [x1], #8",
|
||||
@@ -3001,16 +3000,14 @@
|
||||
]
|
||||
},
|
||||
"cmpsb": {
|
||||
"ExpectedInstructionCount": 14,
|
||||
"ExpectedInstructionCount": 12,
|
||||
"Comment": [
|
||||
"0xa6"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x11]",
|
||||
"ldrb w21, [x10]",
|
||||
"ldrb w22, [x28, #714]",
|
||||
"mov w23, #0x1",
|
||||
"sub x22, x23, x22, lsl #1",
|
||||
"ldrsb x22, [x28, #714]",
|
||||
"add x11, x11, x22",
|
||||
"add x10, x10, x22",
|
||||
"eor w27, w21, w20",
|
||||
@@ -3023,16 +3020,15 @@
|
||||
]
|
||||
},
|
||||
"cmpsw": {
|
||||
"ExpectedInstructionCount": 14,
|
||||
"ExpectedInstructionCount": 13,
|
||||
"Comment": [
|
||||
"0xa7"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrh w20, [x11]",
|
||||
"ldrh w21, [x10]",
|
||||
"ldrb w22, [x28, #714]",
|
||||
"mov w23, #0x2",
|
||||
"sub x22, x23, x22, lsl #2",
|
||||
"ldrsb x22, [x28, #714]",
|
||||
"lsl x22, x22, #1",
|
||||
"add x11, x11, x22",
|
||||
"add x10, x10, x22",
|
||||
"eor w27, w21, w20",
|
||||
@@ -3045,16 +3041,15 @@
|
||||
]
|
||||
},
|
||||
"cmpsd": {
|
||||
"ExpectedInstructionCount": 12,
|
||||
"ExpectedInstructionCount": 11,
|
||||
"Comment": [
|
||||
"0xa7"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"ldr w20, [x11]",
|
||||
"ldr w21, [x10]",
|
||||
"ldrb w22, [x28, #714]",
|
||||
"mov w23, #0x4",
|
||||
"sub x22, x23, x22, lsl #3",
|
||||
"ldrsb x22, [x28, #714]",
|
||||
"lsl x22, x22, #2",
|
||||
"add x11, x11, x22",
|
||||
"add x10, x10, x22",
|
||||
"eor w27, w21, w20",
|
||||
@@ -3065,16 +3060,15 @@
|
||||
]
|
||||
},
|
||||
"cmpsq": {
|
||||
"ExpectedInstructionCount": 12,
|
||||
"ExpectedInstructionCount": 11,
|
||||
"Comment": [
|
||||
"0xa7"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"ldr x20, [x11]",
|
||||
"ldr x21, [x10]",
|
||||
"ldrb w22, [x28, #714]",
|
||||
"mov w23, #0x8",
|
||||
"sub x22, x23, x22, lsl #4",
|
||||
"ldrsb x22, [x28, #714]",
|
||||
"lsl x22, x22, #3",
|
||||
"add x11, x11, x22",
|
||||
"add x10, x10, x22",
|
||||
"eor w27, w21, w20",
|
||||
@@ -3085,12 +3079,10 @@
|
||||
]
|
||||
},
|
||||
"repz cmpsb": {
|
||||
"ExpectedInstructionCount": 17,
|
||||
"ExpectedInstructionCount": 15,
|
||||
"Comment": "0xa6",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"sub x20, x21, x20, lsl #1",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"cbz x5, #+0x38",
|
||||
"ldrb w21, [x11]",
|
||||
"ldrb w22, [x10]",
|
||||
@@ -3108,12 +3100,11 @@
|
||||
]
|
||||
},
|
||||
"repz cmpsw": {
|
||||
"ExpectedInstructionCount": 17,
|
||||
"ExpectedInstructionCount": 16,
|
||||
"Comment": "0xa7",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x2",
|
||||
"sub x20, x21, x20, lsl #2",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #1",
|
||||
"cbz x5, #+0x38",
|
||||
"ldrh w21, [x11]",
|
||||
"ldrh w22, [x10]",
|
||||
@@ -3131,12 +3122,11 @@
|
||||
]
|
||||
},
|
||||
"repz cmpsd": {
|
||||
"ExpectedInstructionCount": 15,
|
||||
"ExpectedInstructionCount": 14,
|
||||
"Comment": "0xa7",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x4",
|
||||
"sub x20, x21, x20, lsl #3",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #2",
|
||||
"cbz x5, #+0x30",
|
||||
"ldr w21, [x11]",
|
||||
"ldr w22, [x10]",
|
||||
@@ -3152,12 +3142,11 @@
|
||||
]
|
||||
},
|
||||
"repz cmpsq": {
|
||||
"ExpectedInstructionCount": 15,
|
||||
"ExpectedInstructionCount": 14,
|
||||
"Comment": "0xa7",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x8",
|
||||
"sub x20, x21, x20, lsl #4",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #3",
|
||||
"cbz x5, #+0x30",
|
||||
"ldr x21, [x11]",
|
||||
"ldr x22, [x10]",
|
||||
@@ -3173,12 +3162,10 @@
|
||||
]
|
||||
},
|
||||
"repnz cmpsb": {
|
||||
"ExpectedInstructionCount": 17,
|
||||
"ExpectedInstructionCount": 15,
|
||||
"Comment": "0xa6",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"sub x20, x21, x20, lsl #1",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"cbz x5, #+0x38",
|
||||
"ldrb w21, [x11]",
|
||||
"ldrb w22, [x10]",
|
||||
@@ -3196,12 +3183,11 @@
|
||||
]
|
||||
},
|
||||
"repnz cmpsw": {
|
||||
"ExpectedInstructionCount": 17,
|
||||
"ExpectedInstructionCount": 16,
|
||||
"Comment": "0xa7",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x2",
|
||||
"sub x20, x21, x20, lsl #2",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #1",
|
||||
"cbz x5, #+0x38",
|
||||
"ldrh w21, [x11]",
|
||||
"ldrh w22, [x10]",
|
||||
@@ -3219,12 +3205,11 @@
|
||||
]
|
||||
},
|
||||
"repnz cmpsd": {
|
||||
"ExpectedInstructionCount": 15,
|
||||
"ExpectedInstructionCount": 14,
|
||||
"Comment": "0xa7",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x4",
|
||||
"sub x20, x21, x20, lsl #3",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #2",
|
||||
"cbz x5, #+0x30",
|
||||
"ldr w21, [x11]",
|
||||
"ldr w22, [x10]",
|
||||
@@ -3240,12 +3225,11 @@
|
||||
]
|
||||
},
|
||||
"repnz cmpsq": {
|
||||
"ExpectedInstructionCount": 15,
|
||||
"ExpectedInstructionCount": 14,
|
||||
"Comment": "0xa7",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x8",
|
||||
"sub x20, x21, x20, lsl #4",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #3",
|
||||
"cbz x5, #+0x30",
|
||||
"ldr x21, [x11]",
|
||||
"ldr x22, [x10]",
|
||||
@@ -3321,50 +3305,39 @@
|
||||
]
|
||||
},
|
||||
"stosb": {
|
||||
"ExpectedInstructionCount": 6,
|
||||
"ExpectedInstructionCount": 3,
|
||||
"Comment": "0xaa",
|
||||
"ExpectedArm64ASM": [
|
||||
"uxtb w20, w4",
|
||||
"strb w20, [x11]",
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"sub x20, x21, x20, lsl #1",
|
||||
"strb w4, [x11]",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"add x11, x11, x20"
|
||||
]
|
||||
},
|
||||
"stosw": {
|
||||
"ExpectedInstructionCount": 6,
|
||||
"ExpectedInstructionCount": 3,
|
||||
"Comment": "0xab",
|
||||
"ExpectedArm64ASM": [
|
||||
"uxth w20, w4",
|
||||
"strh w20, [x11]",
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x2",
|
||||
"sub x20, x21, x20, lsl #2",
|
||||
"add x11, x11, x20"
|
||||
"strh w4, [x11]",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"add x11, x11, x20, lsl #1"
|
||||
]
|
||||
},
|
||||
"stosd": {
|
||||
"ExpectedInstructionCount": 6,
|
||||
"ExpectedInstructionCount": 3,
|
||||
"Comment": "0xab",
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, w4",
|
||||
"str w20, [x11]",
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x4",
|
||||
"sub x20, x21, x20, lsl #3",
|
||||
"add x11, x11, x20"
|
||||
"str w4, [x11]",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"add x11, x11, x20, lsl #2"
|
||||
]
|
||||
},
|
||||
"stosq": {
|
||||
"ExpectedInstructionCount": 5,
|
||||
"ExpectedInstructionCount": 3,
|
||||
"Comment": "0xab",
|
||||
"ExpectedArm64ASM": [
|
||||
"str x4, [x11]",
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x8",
|
||||
"sub x20, x21, x20, lsl #4",
|
||||
"add x11, x11, x20"
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"add x11, x11, x20, lsl #3"
|
||||
]
|
||||
},
|
||||
"rep stosb": {
|
||||
@@ -3372,10 +3345,10 @@
|
||||
"Comment": "0xaa",
|
||||
"ExpectedArm64ASM": [
|
||||
"uxtb w20, w4",
|
||||
"ldrb w21, [x28, #714]",
|
||||
"ldrsb x21, [x28, #714]",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
"cbnz x21, #+0x1c",
|
||||
"tbnz w21, #1, #+0x1c",
|
||||
"cbz x0, #+0x10",
|
||||
"strb w20, [x1], #1",
|
||||
"sub x0, x0, #0x1 (1)",
|
||||
@@ -3395,10 +3368,10 @@
|
||||
"Comment": "0xab",
|
||||
"ExpectedArm64ASM": [
|
||||
"uxth w20, w4",
|
||||
"ldrb w21, [x28, #714]",
|
||||
"ldrsb x21, [x28, #714]",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
"cbnz x21, #+0x1c",
|
||||
"tbnz w21, #1, #+0x1c",
|
||||
"cbz x0, #+0x10",
|
||||
"strh w20, [x1], #2",
|
||||
"sub x0, x0, #0x1 (1)",
|
||||
@@ -3418,10 +3391,10 @@
|
||||
"Comment": "0xab",
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, w4",
|
||||
"ldrb w21, [x28, #714]",
|
||||
"ldrsb x21, [x28, #714]",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
"cbnz x21, #+0x1c",
|
||||
"tbnz w21, #1, #+0x1c",
|
||||
"cbz x0, #+0x10",
|
||||
"str w20, [x1], #4",
|
||||
"sub x0, x0, #0x1 (1)",
|
||||
@@ -3444,10 +3417,10 @@
|
||||
"0xab"
|
||||
],
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"mov x0, x5",
|
||||
"mov x1, x11",
|
||||
"cbnz x20, #+0x1c",
|
||||
"tbnz w20, #1, #+0x1c",
|
||||
"cbz x0, #+0x10",
|
||||
"str x4, [x1], #8",
|
||||
"sub x0, x0, #0x1 (1)",
|
||||
@@ -3463,58 +3436,48 @@
|
||||
]
|
||||
},
|
||||
"lodsb": {
|
||||
"ExpectedInstructionCount": 6,
|
||||
"ExpectedInstructionCount": 4,
|
||||
"Comment": "0xac",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x10]",
|
||||
"bfxil x4, x20, #0, #8",
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"sub x20, x21, x20, lsl #1",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"add x10, x10, x20"
|
||||
]
|
||||
},
|
||||
"lodsw": {
|
||||
"ExpectedInstructionCount": 6,
|
||||
"ExpectedInstructionCount": 4,
|
||||
"Comment": "0xad",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrh w20, [x10]",
|
||||
"bfxil x4, x20, #0, #16",
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x2",
|
||||
"sub x20, x21, x20, lsl #2",
|
||||
"add x10, x10, x20"
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"add x10, x10, x20, lsl #1"
|
||||
]
|
||||
},
|
||||
"lodsd": {
|
||||
"ExpectedInstructionCount": 5,
|
||||
"ExpectedInstructionCount": 3,
|
||||
"Comment": "0xad",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldr w4, [x10]",
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x4",
|
||||
"sub x20, x21, x20, lsl #3",
|
||||
"add x10, x10, x20"
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"add x10, x10, x20, lsl #2"
|
||||
]
|
||||
},
|
||||
"lodsq": {
|
||||
"ExpectedInstructionCount": 5,
|
||||
"ExpectedInstructionCount": 3,
|
||||
"Comment": "0xad",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldr x4, [x10]",
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x8",
|
||||
"sub x20, x21, x20, lsl #4",
|
||||
"add x10, x10, x20"
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"add x10, x10, x20, lsl #3"
|
||||
]
|
||||
},
|
||||
"rep lodsb": {
|
||||
"ExpectedInstructionCount": 9,
|
||||
"ExpectedInstructionCount": 7,
|
||||
"Comment": "0xac",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"sub x20, x21, x20, lsl #1",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"cbz x5, #+0x18",
|
||||
"ldrb w21, [x10]",
|
||||
"bfxil x4, x21, #0, #8",
|
||||
@@ -3524,12 +3487,11 @@
|
||||
]
|
||||
},
|
||||
"rep lodsw": {
|
||||
"ExpectedInstructionCount": 9,
|
||||
"ExpectedInstructionCount": 8,
|
||||
"Comment": "0xad",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x2",
|
||||
"sub x20, x21, x20, lsl #2",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #1",
|
||||
"cbz x5, #+0x18",
|
||||
"ldrh w21, [x10]",
|
||||
"bfxil x4, x21, #0, #16",
|
||||
@@ -3539,12 +3501,11 @@
|
||||
]
|
||||
},
|
||||
"rep lodsd": {
|
||||
"ExpectedInstructionCount": 8,
|
||||
"ExpectedInstructionCount": 7,
|
||||
"Comment": "0xad",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x4",
|
||||
"sub x20, x21, x20, lsl #3",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #2",
|
||||
"cbz x5, #+0x14",
|
||||
"ldr w4, [x10]",
|
||||
"sub x5, x5, #0x1 (1)",
|
||||
@@ -3553,12 +3514,11 @@
|
||||
]
|
||||
},
|
||||
"rep lodsq": {
|
||||
"ExpectedInstructionCount": 8,
|
||||
"ExpectedInstructionCount": 7,
|
||||
"Comment": "0xad",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x8",
|
||||
"sub x20, x21, x20, lsl #4",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #3",
|
||||
"cbz x5, #+0x14",
|
||||
"ldr x4, [x10]",
|
||||
"sub x5, x5, #0x1 (1)",
|
||||
@@ -3567,13 +3527,11 @@
|
||||
]
|
||||
},
|
||||
"scasb": {
|
||||
"ExpectedInstructionCount": 12,
|
||||
"ExpectedInstructionCount": 10,
|
||||
"Comment": "0xae",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x11]",
|
||||
"ldrb w21, [x28, #714]",
|
||||
"mov w22, #0x1",
|
||||
"sub x21, x22, x21, lsl #1",
|
||||
"ldrsb x21, [x28, #714]",
|
||||
"add x11, x11, x21",
|
||||
"eor w27, w4, w20",
|
||||
"lsl w0, w4, #24",
|
||||
@@ -3585,14 +3543,12 @@
|
||||
]
|
||||
},
|
||||
"scasw": {
|
||||
"ExpectedInstructionCount": 12,
|
||||
"ExpectedInstructionCount": 10,
|
||||
"Comment": "0xaf",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrh w20, [x11]",
|
||||
"ldrb w21, [x28, #714]",
|
||||
"mov w22, #0x2",
|
||||
"sub x21, x22, x21, lsl #2",
|
||||
"add x11, x11, x21",
|
||||
"ldrsb x21, [x28, #714]",
|
||||
"add x11, x11, x21, lsl #1",
|
||||
"eor w27, w4, w20",
|
||||
"lsl w0, w4, #16",
|
||||
"cmp w0, w20, lsl #16",
|
||||
@@ -3603,14 +3559,12 @@
|
||||
]
|
||||
},
|
||||
"scasd": {
|
||||
"ExpectedInstructionCount": 10,
|
||||
"ExpectedInstructionCount": 8,
|
||||
"Comment": "0xaf",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldr w20, [x11]",
|
||||
"ldrb w21, [x28, #714]",
|
||||
"mov w22, #0x4",
|
||||
"sub x21, x22, x21, lsl #3",
|
||||
"add x11, x11, x21",
|
||||
"ldrsb x21, [x28, #714]",
|
||||
"add x11, x11, x21, lsl #2",
|
||||
"eor w27, w4, w20",
|
||||
"subs w26, w4, w20",
|
||||
"mrs x20, nzcv",
|
||||
@@ -3619,14 +3573,12 @@
|
||||
]
|
||||
},
|
||||
"scasq": {
|
||||
"ExpectedInstructionCount": 10,
|
||||
"ExpectedInstructionCount": 8,
|
||||
"Comment": "0xaf",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldr x20, [x11]",
|
||||
"ldrb w21, [x28, #714]",
|
||||
"mov w22, #0x8",
|
||||
"sub x21, x22, x21, lsl #4",
|
||||
"add x11, x11, x21",
|
||||
"ldrsb x21, [x28, #714]",
|
||||
"add x11, x11, x21, lsl #3",
|
||||
"eor w27, w4, w20",
|
||||
"subs x26, x4, x20",
|
||||
"mrs x20, nzcv",
|
||||
@@ -3635,12 +3587,10 @@
|
||||
]
|
||||
},
|
||||
"repz scasb": {
|
||||
"ExpectedInstructionCount": 15,
|
||||
"ExpectedInstructionCount": 13,
|
||||
"Comment": "0xae",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"sub x20, x21, x20, lsl #1",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"cbz x5, #+0x30",
|
||||
"ldrb w21, [x11]",
|
||||
"eor w27, w4, w21",
|
||||
@@ -3656,12 +3606,11 @@
|
||||
]
|
||||
},
|
||||
"repz scasw": {
|
||||
"ExpectedInstructionCount": 15,
|
||||
"ExpectedInstructionCount": 14,
|
||||
"Comment": "0xaf",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x2",
|
||||
"sub x20, x21, x20, lsl #2",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #1",
|
||||
"cbz x5, #+0x30",
|
||||
"ldrh w21, [x11]",
|
||||
"eor w27, w4, w21",
|
||||
@@ -3677,12 +3626,11 @@
|
||||
]
|
||||
},
|
||||
"repz scasd": {
|
||||
"ExpectedInstructionCount": 13,
|
||||
"ExpectedInstructionCount": 12,
|
||||
"Comment": "0xaf",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x4",
|
||||
"sub x20, x21, x20, lsl #3",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #2",
|
||||
"cbz x5, #+0x28",
|
||||
"ldr w21, [x11]",
|
||||
"eor w27, w4, w21",
|
||||
@@ -3696,12 +3644,11 @@
|
||||
]
|
||||
},
|
||||
"repz scasq": {
|
||||
"ExpectedInstructionCount": 13,
|
||||
"ExpectedInstructionCount": 12,
|
||||
"Comment": "0xaf",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x8",
|
||||
"sub x20, x21, x20, lsl #4",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #3",
|
||||
"cbz x5, #+0x28",
|
||||
"ldr x21, [x11]",
|
||||
"eor w27, w4, w21",
|
||||
@@ -3715,12 +3662,10 @@
|
||||
]
|
||||
},
|
||||
"repnz scasb": {
|
||||
"ExpectedInstructionCount": 15,
|
||||
"ExpectedInstructionCount": 13,
|
||||
"Comment": "0xae",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x1",
|
||||
"sub x20, x21, x20, lsl #1",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"cbz x5, #+0x30",
|
||||
"ldrb w21, [x11]",
|
||||
"eor w27, w4, w21",
|
||||
@@ -3736,12 +3681,11 @@
|
||||
]
|
||||
},
|
||||
"repnz scasw": {
|
||||
"ExpectedInstructionCount": 15,
|
||||
"ExpectedInstructionCount": 14,
|
||||
"Comment": "0xaf",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x2",
|
||||
"sub x20, x21, x20, lsl #2",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #1",
|
||||
"cbz x5, #+0x30",
|
||||
"ldrh w21, [x11]",
|
||||
"eor w27, w4, w21",
|
||||
@@ -3757,12 +3701,11 @@
|
||||
]
|
||||
},
|
||||
"repnz scasd": {
|
||||
"ExpectedInstructionCount": 13,
|
||||
"ExpectedInstructionCount": 12,
|
||||
"Comment": "0xaf",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x4",
|
||||
"sub x20, x21, x20, lsl #3",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #2",
|
||||
"cbz x5, #+0x28",
|
||||
"ldr w21, [x11]",
|
||||
"eor w27, w4, w21",
|
||||
@@ -3776,12 +3719,11 @@
|
||||
]
|
||||
},
|
||||
"repnz scasq": {
|
||||
"ExpectedInstructionCount": 13,
|
||||
"ExpectedInstructionCount": 12,
|
||||
"Comment": "0xaf",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldrb w20, [x28, #714]",
|
||||
"mov w21, #0x8",
|
||||
"sub x20, x21, x20, lsl #4",
|
||||
"ldrsb x20, [x28, #714]",
|
||||
"lsl x20, x20, #3",
|
||||
"cbz x5, #+0x28",
|
||||
"ldr x21, [x11]",
|
||||
"eor w27, w4, w21",
|
||||
@@ -3909,7 +3851,7 @@
|
||||
"ExpectedInstructionCount": 2,
|
||||
"Comment": "0xfc",
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x0",
|
||||
"mov w20, #0x1",
|
||||
"strb w20, [x28, #714]"
|
||||
]
|
||||
},
|
||||
@@ -3917,7 +3859,7 @@
|
||||
"ExpectedInstructionCount": 2,
|
||||
"Comment": "0xfd",
|
||||
"ExpectedArm64ASM": [
|
||||
"mov w20, #0x1",
|
||||
"mov x20, #0xffffffffffffffff",
|
||||
"strb w20, [x28, #714]"
|
||||
]
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user