From 1a51d4cec9c70d46d4bdb00641e0ae8c6537098d Mon Sep 17 00:00:00 2001 From: Kevin Enderby Date: Mon, 3 May 2010 20:45:05 +0000 Subject: [PATCH] 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 --- llvm/lib/Target/X86/X86InstrInfo.td | 8 ++++---- llvm/test/MC/AsmParser/X86/x86_32-encoding.s | 13 +++++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td index befff27dd697..a2754eac2154 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.td +++ b/llvm/lib/Target/X86/X86InstrInfo.td @@ -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", []>; } diff --git a/llvm/test/MC/AsmParser/X86/x86_32-encoding.s b/llvm/test/MC/AsmParser/X86/x86_32-encoding.s index b5472ca49c48..475632cb78f0 100644 --- a/llvm/test/MC/AsmParser/X86/x86_32-encoding.s +++ b/llvm/test/MC/AsmParser/X86/x86_32-encoding.s @@ -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