forked from OSchip/llvm-project
Fixed the encoding of the x86 push instructions. Using a 32-bit immediate value
caused the a pushl instruction to be incorrectly encoding using only two bytes of immediate, causing the following 2 instruction bytes to be part of the 32-bit immediate value. Also fixed the one byte form of push to be used when the immediate would fit in a signed extended byte. Lastly changed the names to not include the 32 of PUSH32 since they actually push the size of the stack pointer. llvm-svn: 102951
This commit is contained in:
parent
88c734e8ae
commit
1a51d4cec9
|
@ -753,11 +753,11 @@ def PUSH32rmm: I<0xFF, MRM6m, (outs), (ins i32mem:$src), "push{l}\t$src",[]>;
|
|||
}
|
||||
|
||||
let Defs = [ESP], Uses = [ESP], neverHasSideEffects = 1, mayStore = 1 in {
|
||||
def PUSH32i8 : Ii8<0x6a, RawFrm, (outs), (ins i8imm:$imm),
|
||||
"push{l}\t$imm", []>;
|
||||
def PUSH32i16 : Ii16<0x68, RawFrm, (outs), (ins i16imm:$imm),
|
||||
def PUSHi8 : Ii8<0x6a, RawFrm, (outs), (ins i32i8imm:$imm),
|
||||
"push{l}\t$imm", []>;
|
||||
def PUSH32i32 : Ii32<0x68, RawFrm, (outs), (ins i32imm:$imm),
|
||||
def PUSHi16 : Ii16<0x68, RawFrm, (outs), (ins i16imm:$imm),
|
||||
"push{w}\t$imm", []>, OpSize;
|
||||
def PUSHi32 : Ii32<0x68, RawFrm, (outs), (ins i32imm:$imm),
|
||||
"push{l}\t$imm", []>;
|
||||
}
|
||||
|
||||
|
|
|
@ -9984,3 +9984,16 @@ pshufb CPI1_0(%rip), %xmm1
|
|||
// CHECK: bsrw 305419896, %bx
|
||||
// CHECK: encoding: [0x66,0x0f,0xbd,0x1d,0x78,0x56,0x34,0x12]
|
||||
bsrw 305419896, %bx
|
||||
|
||||
// radr://7901779
|
||||
// CHECK: pushl $127
|
||||
// CHECK: encoding: [0x6a,0xfe]
|
||||
pushl $127
|
||||
|
||||
// CHECK: pushw $254
|
||||
// CHECK: encoding: [0x66,0x68,0xfe,0x00]
|
||||
pushw $254
|
||||
|
||||
// CHECK: pushl $254
|
||||
// CHECK: encoding: [0x68,0xfe,0x00,0x00,0x00]
|
||||
pushl $254
|
||||
|
|
Loading…
Reference in New Issue