mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-06 11:00:19 +02:00
Merge pull request #4820 from bylaws/neg
AtomicOps: Reimplement AtomicNeg using 8.1 CAS atomics
This commit is contained in:
3 files changed
+68
-39
No files matched your search
@@ -322,13 +322,26 @@ DEF_OP(AtomicFetchNeg) {
|
||||
|
||||
auto MemSrc = GetReg(Op->Addr);
|
||||
|
||||
ARMEmitter::BackwardLabel LoopTop;
|
||||
Bind(&LoopTop);
|
||||
ldaxr(SubEmitSize, TMP2, MemSrc);
|
||||
neg(EmitSize, TMP3, TMP2);
|
||||
stlxr(SubEmitSize, TMP4, TMP3, MemSrc);
|
||||
cbnz(EmitSize, TMP4, &LoopTop);
|
||||
mov(EmitSize, GetReg(Node), TMP2.R());
|
||||
if (CTX->HostFeatures.SupportsAtomics) {
|
||||
// Use a CAS loop to avoid needing to emulate unaligned LLSC atomics
|
||||
ldr(SubEmitSize, TMP2, MemSrc);
|
||||
ARMEmitter::BackwardLabel LoopTop;
|
||||
Bind(&LoopTop);
|
||||
mov(EmitSize, TMP4, TMP2);
|
||||
neg(EmitSize, TMP3, TMP2);
|
||||
casal(SubEmitSize, TMP2, TMP3, MemSrc);
|
||||
sub(EmitSize, TMP3, TMP2, TMP4);
|
||||
cbnz(EmitSize, TMP3, &LoopTop);
|
||||
mov(EmitSize, GetReg(Node), TMP2.R());
|
||||
} else {
|
||||
ARMEmitter::BackwardLabel LoopTop;
|
||||
Bind(&LoopTop);
|
||||
ldaxr(SubEmitSize, TMP2, MemSrc);
|
||||
neg(EmitSize, TMP3, TMP2);
|
||||
stlxr(SubEmitSize, TMP4, TMP3, MemSrc);
|
||||
cbnz(EmitSize, TMP4, &LoopTop);
|
||||
mov(EmitSize, GetReg(Node), TMP2.R());
|
||||
}
|
||||
}
|
||||
|
||||
DEF_OP(TelemetrySetValue) {
|
||||
|
||||
@@ -1519,51 +1519,59 @@
|
||||
]
|
||||
},
|
||||
"lock neg byte [rax]": {
|
||||
"ExpectedInstructionCount": 7,
|
||||
"ExpectedInstructionCount": 9,
|
||||
"Comment": "GROUP2 0xf6 /3",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldaxrb w1, [x4]",
|
||||
"ldrb w1, [x4]",
|
||||
"mov w3, w1",
|
||||
"neg w2, w1",
|
||||
"stlxrb w3, w2, [x4]",
|
||||
"cbnz w3, #-0xc",
|
||||
"casalb w1, w2, [x4]",
|
||||
"sub w2, w1, w3",
|
||||
"cbnz w2, #-0x10",
|
||||
"mov w27, w1",
|
||||
"cmp wzr, w27, lsl #24",
|
||||
"neg w26, w27"
|
||||
]
|
||||
},
|
||||
"lock neg word [rax]": {
|
||||
"ExpectedInstructionCount": 7,
|
||||
"ExpectedInstructionCount": 9,
|
||||
"Comment": "GROUP2 0xf7 /3",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldaxrh w1, [x4]",
|
||||
"ldrh w1, [x4]",
|
||||
"mov w3, w1",
|
||||
"neg w2, w1",
|
||||
"stlxrh w3, w2, [x4]",
|
||||
"cbnz w3, #-0xc",
|
||||
"casalh w1, w2, [x4]",
|
||||
"sub w2, w1, w3",
|
||||
"cbnz w2, #-0x10",
|
||||
"mov w27, w1",
|
||||
"cmp wzr, w27, lsl #16",
|
||||
"neg w26, w27"
|
||||
]
|
||||
},
|
||||
"lock neg dword [rax]": {
|
||||
"ExpectedInstructionCount": 6,
|
||||
"ExpectedInstructionCount": 8,
|
||||
"Comment": "GROUP2 0xf7 /3",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldaxr w1, [x4]",
|
||||
"ldr w1, [x4]",
|
||||
"mov w3, w1",
|
||||
"neg w2, w1",
|
||||
"stlxr w3, w2, [x4]",
|
||||
"cbnz w3, #-0xc",
|
||||
"casal w1, w2, [x4]",
|
||||
"sub w2, w1, w3",
|
||||
"cbnz w2, #-0x10",
|
||||
"mov w27, w1",
|
||||
"negs w26, w27"
|
||||
]
|
||||
},
|
||||
"lock neg qword [rax]": {
|
||||
"ExpectedInstructionCount": 6,
|
||||
"ExpectedInstructionCount": 8,
|
||||
"Comment": "GROUP2 0xf7 /3",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldaxr x1, [x4]",
|
||||
"ldr x1, [x4]",
|
||||
"mov x3, x1",
|
||||
"neg x2, x1",
|
||||
"stlxr w3, x2, [x4]",
|
||||
"cbnz x3, #-0xc",
|
||||
"casal x1, x2, [x4]",
|
||||
"sub x2, x1, x3",
|
||||
"cbnz x2, #-0x10",
|
||||
"mov x27, x1",
|
||||
"negs x26, x27"
|
||||
]
|
||||
|
||||
@@ -1322,51 +1322,59 @@
|
||||
]
|
||||
},
|
||||
"lock neg byte [rax]": {
|
||||
"ExpectedInstructionCount": 7,
|
||||
"ExpectedInstructionCount": 9,
|
||||
"Comment": "GROUP2 0xf6 /3",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldaxrb w1, [x4]",
|
||||
"ldrb w1, [x4]",
|
||||
"mov w3, w1",
|
||||
"neg w2, w1",
|
||||
"stlxrb w3, w2, [x4]",
|
||||
"cbnz w3, #-0xc",
|
||||
"casalb w1, w2, [x4]",
|
||||
"sub w2, w1, w3",
|
||||
"cbnz w2, #-0x10",
|
||||
"mov w27, w1",
|
||||
"cmp wzr, w27, lsl #24",
|
||||
"neg w26, w27"
|
||||
]
|
||||
},
|
||||
"lock neg word [rax]": {
|
||||
"ExpectedInstructionCount": 7,
|
||||
"ExpectedInstructionCount": 9,
|
||||
"Comment": "GROUP2 0xf7 /3",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldaxrh w1, [x4]",
|
||||
"ldrh w1, [x4]",
|
||||
"mov w3, w1",
|
||||
"neg w2, w1",
|
||||
"stlxrh w3, w2, [x4]",
|
||||
"cbnz w3, #-0xc",
|
||||
"casalh w1, w2, [x4]",
|
||||
"sub w2, w1, w3",
|
||||
"cbnz w2, #-0x10",
|
||||
"mov w27, w1",
|
||||
"cmp wzr, w27, lsl #16",
|
||||
"neg w26, w27"
|
||||
]
|
||||
},
|
||||
"lock neg dword [rax]": {
|
||||
"ExpectedInstructionCount": 6,
|
||||
"ExpectedInstructionCount": 8,
|
||||
"Comment": "GROUP2 0xf7 /3",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldaxr w1, [x4]",
|
||||
"ldr w1, [x4]",
|
||||
"mov w3, w1",
|
||||
"neg w2, w1",
|
||||
"stlxr w3, w2, [x4]",
|
||||
"cbnz w3, #-0xc",
|
||||
"casal w1, w2, [x4]",
|
||||
"sub w2, w1, w3",
|
||||
"cbnz w2, #-0x10",
|
||||
"mov w27, w1",
|
||||
"negs w26, w27"
|
||||
]
|
||||
},
|
||||
"lock neg qword [rax]": {
|
||||
"ExpectedInstructionCount": 6,
|
||||
"ExpectedInstructionCount": 8,
|
||||
"Comment": "GROUP2 0xf7 /3",
|
||||
"ExpectedArm64ASM": [
|
||||
"ldaxr x1, [x4]",
|
||||
"ldr x1, [x4]",
|
||||
"mov x3, x1",
|
||||
"neg x2, x1",
|
||||
"stlxr w3, x2, [x4]",
|
||||
"cbnz x3, #-0xc",
|
||||
"casal x1, x2, [x4]",
|
||||
"sub x2, x1, x3",
|
||||
"cbnz x2, #-0x10",
|
||||
"mov x27, x1",
|
||||
"negs x26, x27"
|
||||
]
|
||||
|
||||
Reference in new issue
Block a user