mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
fix bugs in push/pop segment support, rdar://8407242
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@113422 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
52664c8efe
commit
373c458850
@ -630,6 +630,7 @@ ParseInstruction(StringRef Name, SMLoc NameLoc,
|
||||
.Case("iret", "iretl")
|
||||
.Case("sysret", "sysretl")
|
||||
.Case("push", Is64Bit ? "pushq" : "pushl")
|
||||
.Case("pop", Is64Bit ? "popq" : "popl")
|
||||
.Case("pushf", Is64Bit ? "pushfq" : "pushfl")
|
||||
.Case("popf", Is64Bit ? "popfq" : "popfl")
|
||||
.Case("retl", Is64Bit ? "retl" : "ret")
|
||||
|
@ -4274,23 +4274,53 @@ def LTRr : I<0x00, MRM3r, (outs), (ins GR16:$src),
|
||||
def LTRm : I<0x00, MRM3m, (outs), (ins i16mem:$src),
|
||||
"ltr{w}\t{$src}", []>, TB;
|
||||
|
||||
def PUSHCS16 : I<0x0E, RawFrm, (outs), (ins),
|
||||
"push{w}\t%cs", []>, Requires<[In32BitMode]>, OpSize;
|
||||
def PUSHCS32 : I<0x0E, RawFrm, (outs), (ins),
|
||||
"push{l}\t%cs", []>, Requires<[In32BitMode]>;
|
||||
def PUSHSS16 : I<0x16, RawFrm, (outs), (ins),
|
||||
"push{w}\t%ss", []>, Requires<[In32BitMode]>, OpSize;
|
||||
def PUSHSS32 : I<0x16, RawFrm, (outs), (ins),
|
||||
"push{l}\t%ss", []>, Requires<[In32BitMode]>;
|
||||
def PUSHDS16 : I<0x1E, RawFrm, (outs), (ins),
|
||||
"push{w}\t%ds", []>, Requires<[In32BitMode]>, OpSize;
|
||||
def PUSHDS32 : I<0x1E, RawFrm, (outs), (ins),
|
||||
"push{l}\t%ds", []>, Requires<[In32BitMode]>;
|
||||
def PUSHES16 : I<0x06, RawFrm, (outs), (ins),
|
||||
"push{w}\t%es", []>, Requires<[In32BitMode]>, OpSize;
|
||||
def PUSHES32 : I<0x06, RawFrm, (outs), (ins),
|
||||
"push{l}\t%es", []>, Requires<[In32BitMode]>;
|
||||
|
||||
def PUSHFS16 : I<0xa0, RawFrm, (outs), (ins),
|
||||
"push{w}\t%fs", []>, OpSize, TB;
|
||||
def PUSHFS32 : I<0xa0, RawFrm, (outs), (ins),
|
||||
"push{l}\t%fs", []>, TB;
|
||||
"push{l}\t%fs", []>, TB, Requires<[In32BitMode]>;
|
||||
def PUSHGS16 : I<0xa8, RawFrm, (outs), (ins),
|
||||
"push{w}\t%gs", []>, OpSize, TB;
|
||||
def PUSHGS32 : I<0xa8, RawFrm, (outs), (ins),
|
||||
"push{l}\t%gs", []>, TB;
|
||||
"push{l}\t%gs", []>, TB, Requires<[In32BitMode]>;
|
||||
|
||||
// No "pop cs" instruction.
|
||||
def POPSS16 : I<0x17, RawFrm, (outs), (ins),
|
||||
"pop{w}\t%ss", []>, OpSize, Requires<[In32BitMode]>;
|
||||
def POPSS32 : I<0x17, RawFrm, (outs), (ins),
|
||||
"pop{l}\t%ss", []> , Requires<[In32BitMode]>;
|
||||
def POPDS16 : I<0x1F, RawFrm, (outs), (ins),
|
||||
"pop{w}\t%ds", []>, OpSize, Requires<[In32BitMode]>;
|
||||
def POPDS32 : I<0x1F, RawFrm, (outs), (ins),
|
||||
"pop{l}\t%ds", []> , Requires<[In32BitMode]>;
|
||||
def POPES16 : I<0x07, RawFrm, (outs), (ins),
|
||||
"pop{w}\t%es", []>, OpSize, Requires<[In32BitMode]>;
|
||||
def POPES32 : I<0x07, RawFrm, (outs), (ins),
|
||||
"pop{l}\t%es", []> , Requires<[In32BitMode]>;
|
||||
def POPFS16 : I<0xa1, RawFrm, (outs), (ins),
|
||||
"pop{w}\t%fs", []>, OpSize, TB;
|
||||
def POPFS32 : I<0xa1, RawFrm, (outs), (ins),
|
||||
"pop{l}\t%fs", []>, TB;
|
||||
"pop{l}\t%fs", []>, TB , Requires<[In32BitMode]>;
|
||||
def POPGS16 : I<0xa9, RawFrm, (outs), (ins),
|
||||
"pop{w}\t%gs", []>, OpSize, TB;
|
||||
def POPGS32 : I<0xa9, RawFrm, (outs), (ins),
|
||||
"pop{l}\t%gs", []>, TB;
|
||||
"pop{l}\t%gs", []>, TB , Requires<[In32BitMode]>;
|
||||
|
||||
def LDS16rm : I<0xc5, MRMSrcMem, (outs GR16:$dst), (ins opaque32mem:$src),
|
||||
"lds{w}\t{$src, $dst|$dst, $src}", []>, OpSize;
|
||||
|
@ -459,3 +459,52 @@ testl %ecx, -24(%ebp)
|
||||
testl -24(%ebp), %ecx
|
||||
// CHECK: testl -24(%ebp), %ecx
|
||||
|
||||
|
||||
// rdar://8407242
|
||||
push %cs
|
||||
// CHECK: pushl %cs
|
||||
// CHECK: encoding: [0x0e]
|
||||
push %ds
|
||||
// CHECK: pushl %ds
|
||||
// CHECK: encoding: [0x1e]
|
||||
push %ss
|
||||
// CHECK: pushl %ss
|
||||
// CHECK: encoding: [0x16]
|
||||
push %es
|
||||
// CHECK: pushl %es
|
||||
// CHECK: encoding: [0x06]
|
||||
push %fs
|
||||
// CHECK: pushl %fs
|
||||
// CHECK: encoding: [0x0f,0xa0]
|
||||
push %gs
|
||||
// CHECK: pushl %gs
|
||||
// CHECK: encoding: [0x0f,0xa8]
|
||||
|
||||
pushw %cs
|
||||
// CHECK: pushw %cs
|
||||
// CHECK: encoding: [0x66,0x0e]
|
||||
pushw %ds
|
||||
// CHECK: pushw %ds
|
||||
// CHECK: encoding: [0x66,0x1e]
|
||||
pushw %ss
|
||||
// CHECK: pushw %ss
|
||||
// CHECK: encoding: [0x66,0x16]
|
||||
pushw %es
|
||||
// CHECK: pushw %es
|
||||
// CHECK: encoding: [0x66,0x06]
|
||||
pushw %fs
|
||||
// CHECK: pushw %fs
|
||||
// CHECK: encoding: [0x66,0x0f,0xa0]
|
||||
pushw %gs
|
||||
// CHECK: pushw %gs
|
||||
// CHECK: encoding: [0x66,0x0f,0xa8]
|
||||
|
||||
pop %ss
|
||||
// CHECK: popl %ss
|
||||
// CHECK: encoding: [0x17]
|
||||
pop %ds
|
||||
// CHECK: popl %ds
|
||||
// CHECK: encoding: [0x1f]
|
||||
pop %es
|
||||
// CHECK: popl %es
|
||||
// CHECK: encoding: [0x07]
|
||||
|
@ -211,3 +211,36 @@ sysretl
|
||||
sysretq
|
||||
// CHECK: sysretq
|
||||
// CHECK: encoding: [0x48,0x0f,0x07]
|
||||
|
||||
// rdar://8407242
|
||||
push %fs
|
||||
// CHECK: pushq %fs
|
||||
// CHECK: encoding: [0x0f,0xa0]
|
||||
push %gs
|
||||
// CHECK: pushq %gs
|
||||
// CHECK: encoding: [0x0f,0xa8]
|
||||
|
||||
pushw %fs
|
||||
// CHECK: pushw %fs
|
||||
// CHECK: encoding: [0x66,0x0f,0xa0]
|
||||
pushw %gs
|
||||
// CHECK: pushw %gs
|
||||
// CHECK: encoding: [0x66,0x0f,0xa8]
|
||||
|
||||
|
||||
pop %fs
|
||||
// CHECK: popq %fs
|
||||
// CHECK: encoding: [0x0f,0xa1]
|
||||
pop %gs
|
||||
// CHECK: popq %gs
|
||||
// CHECK: encoding: [0x0f,0xa9]
|
||||
|
||||
popw %fs
|
||||
// CHECK: popw %fs
|
||||
// CHECK: encoding: [0x66,0x0f,0xa1]
|
||||
popw %gs
|
||||
// CHECK: popw %gs
|
||||
// CHECK: encoding: [0x66,0x0f,0xa9]
|
||||
|
||||
|
||||
|
||||
|
@ -461,8 +461,12 @@ static void X86ExtractSemantics(
|
||||
}
|
||||
|
||||
if (name.find("PUSH") != name.npos) {
|
||||
if (name.find("FS") != name.npos ||
|
||||
name.find("GS") != name.npos) {
|
||||
if (name.find("CS") != name.npos ||
|
||||
name.find("DS") != name.npos ||
|
||||
name.find("ES") != name.npos ||
|
||||
name.find("FS") != name.npos ||
|
||||
name.find("GS") != name.npos ||
|
||||
name.find("SS") != name.npos) {
|
||||
instType.set("kInstructionTypePush");
|
||||
// TODO add support for fixed operands
|
||||
} else if (name.find("F") != name.npos) {
|
||||
@ -481,8 +485,12 @@ static void X86ExtractSemantics(
|
||||
if (name.find("POP") != name.npos) {
|
||||
if (name.find("POPCNT") != name.npos) {
|
||||
// ignore (not a real pop)
|
||||
} else if (name.find("FS") != name.npos ||
|
||||
name.find("GS") != name.npos) {
|
||||
} else if (name.find("CS") != name.npos ||
|
||||
name.find("DS") != name.npos ||
|
||||
name.find("ES") != name.npos ||
|
||||
name.find("FS") != name.npos ||
|
||||
name.find("GS") != name.npos ||
|
||||
name.find("SS") != name.npos) {
|
||||
instType.set("kInstructionTypePop");
|
||||
// TODO add support for fixed operands
|
||||
} else if (name.find("F") != name.npos) {
|
||||
|
Loading…
Reference in New Issue
Block a user