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:
Kevin Enderby 2010-05-03 20:45:05 +00:00
parent 88c734e8ae
commit 1a51d4cec9
2 changed files with 17 additions and 4 deletions

View File

@ -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 { let Defs = [ESP], Uses = [ESP], neverHasSideEffects = 1, mayStore = 1 in {
def PUSH32i8 : Ii8<0x6a, RawFrm, (outs), (ins i8imm:$imm), def PUSHi8 : Ii8<0x6a, RawFrm, (outs), (ins i32i8imm:$imm),
"push{l}\t$imm", []>; "push{l}\t$imm", []>;
def PUSH32i16 : Ii16<0x68, RawFrm, (outs), (ins i16imm:$imm), def PUSHi16 : Ii16<0x68, RawFrm, (outs), (ins i16imm:$imm),
"push{l}\t$imm", []>; "push{w}\t$imm", []>, OpSize;
def PUSH32i32 : Ii32<0x68, RawFrm, (outs), (ins i32imm:$imm), def PUSHi32 : Ii32<0x68, RawFrm, (outs), (ins i32imm:$imm),
"push{l}\t$imm", []>; "push{l}\t$imm", []>;
} }

View File

@ -9984,3 +9984,16 @@ pshufb CPI1_0(%rip), %xmm1
// CHECK: bsrw 305419896, %bx // CHECK: bsrw 305419896, %bx
// CHECK: encoding: [0x66,0x0f,0xbd,0x1d,0x78,0x56,0x34,0x12] // CHECK: encoding: [0x66,0x0f,0xbd,0x1d,0x78,0x56,0x34,0x12]
bsrw 305419896, %bx 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