From: Bradley Smith Date: Wed, 9 Apr 2014 14:43:15 +0000 (+0000) Subject: [ARM64] Port over the PostEncoderMethod fix for SMULH/UMULH from AArch64. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=8acef8d96d5b5abfa5ce5e5d7d7519a81d8bc187;p=oota-llvm.git [ARM64] Port over the PostEncoderMethod fix for SMULH/UMULH from AArch64. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205877 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/ARM64/ARM64InstrFormats.td b/lib/Target/ARM64/ARM64InstrFormats.td index 16db02ed275..00658edefa5 100644 --- a/lib/Target/ARM64/ARM64InstrFormats.td +++ b/lib/Target/ARM64/ARM64InstrFormats.td @@ -1200,9 +1200,13 @@ class MulHi opc, string asm, SDNode OpNode> let Inst{31-24} = 0b10011011; let Inst{23-21} = opc; let Inst{20-16} = Rm; - let Inst{15-10} = 0b011111; + let Inst{15} = 0; let Inst{9-5} = Rn; let Inst{4-0} = Rd; + + // The Ra field of SMULH and UMULH is unused: it should be assembled as 31 + // (i.e. all bits 1) but is ignored by the processor. + let PostEncoderMethod = "fixMulHigh"; } class MulAccumWAlias diff --git a/lib/Target/ARM64/MCTargetDesc/ARM64MCCodeEmitter.cpp b/lib/Target/ARM64/MCTargetDesc/ARM64MCCodeEmitter.cpp index 48172d894aa..5d4651cf274 100644 --- a/lib/Target/ARM64/MCTargetDesc/ARM64MCCodeEmitter.cpp +++ b/lib/Target/ARM64/MCTargetDesc/ARM64MCCodeEmitter.cpp @@ -177,6 +177,9 @@ public: SmallVectorImpl &Fixups, const MCSubtargetInfo &STI) const; + unsigned fixMulHigh(const MCInst &MI, unsigned EncodedValue, + const MCSubtargetInfo &STI) const; + template unsigned fixLoadStoreExclusive(const MCInst &MI, unsigned EncodedValue, const MCSubtargetInfo &STI) const; @@ -565,6 +568,16 @@ void ARM64MCCodeEmitter::EncodeInstruction(const MCInst &MI, raw_ostream &OS, ++MCNumEmitted; // Keep track of the # of mi's emitted. } +unsigned +ARM64MCCodeEmitter::fixMulHigh(const MCInst &MI, + unsigned EncodedValue, + const MCSubtargetInfo &STI) const { + // The Ra field of SMULH and UMULH is unused: it should be assembled as 31 + // (i.e. all bits 1) but is ignored by the processor. + EncodedValue |= 0x1f << 10; + return EncodedValue; +} + template unsigned ARM64MCCodeEmitter::fixLoadStoreExclusive(const MCInst &MI, unsigned EncodedValue, diff --git a/test/MC/Disassembler/ARM64/canonical-form.txt b/test/MC/Disassembler/ARM64/canonical-form.txt index 6aaa5da3987..ccc93e6e956 100644 --- a/test/MC/Disassembler/ARM64/canonical-form.txt +++ b/test/MC/Disassembler/ARM64/canonical-form.txt @@ -3,3 +3,7 @@ 0x00 0x08 0x00 0xc8 # CHECK: stxr w0, x0, [x0] + +0x00 0x00 0x40 0x9b + +# CHECK: smulh x0, x0, x0