InstCountCI: Support multiple instructions in the tests

There are some cases where we want to test multiple instructions where
we can do optimizations that would overwise be hard to see.

eg:
```asm
; Can be optimized to a single stp
push eax
push ebx

; Can remove half of the copy since we know the direction
cld
rep movsb

; Can remove a redundant insert
addss xmm0, xmm1
addss xmm0, xmm2
```

This lets us have arbitrary sized code in instruction count CI, with the
original json key becoming only a label if the instruction array is
provided.

There are still some major limitations to this, instructions that
generate side-effects might have "garbage" after the end of the block
that isn't correctly accounted for. So care must be taken.

Example in the json
```json
"push ax, bx": {
  "ExpectedInstructionCount": 4,
  "Optimal": "No",
  "Comment": "0x50",
  "x86Insts": [
    "push ax",
    "push bx"
  ],
  "ExpectedArm64ASM": [
    "uxth w20, w4",
    "strh w20, [x8, #-2]!",
    "uxth w20, w7",
    "strh w20, [x8, #-2]!"
  ]
}
```
This commit is contained in:
Ryan Houdek committed 2023-10-09 21:49:53 -07:00
1 parent 462fff2c67
commit cd83d3eb24
8 files changed
+46 -17

No files matched your search

+2 -1
View File
@@ -230,6 +230,7 @@ struct TestInfo {
uint64_t Optimal;
int64_t ExpectedInstructionCount;
uint64_t CodeSize;
uint64_t x86InstCount;
uint32_t Cookie;
uint8_t Code[];
};
@@ -258,7 +259,7 @@ static bool TestInstructions(FEXCore::Context::Context *CTX, FEXCore::Core::Inte
LogMan::Msg::IFmt("Compiling instruction '{}'", CurrentTest->TestInst);
// Compile the INST.
CTX->CompileRIP(Thread, CodeRIP);
CTX->CompileRIPCount(Thread, CodeRIP, CurrentTest->x86InstCount);
// Go to the next test.
CurrentTest = reinterpret_cast<TestInfo const*>(&CurrentTest->Code[CurrentTest->CodeSize]);