diff options
author | David Goodwin <david_goodwin@apple.com> | 2009-07-10 17:03:29 +0000 |
---|---|---|
committer | David Goodwin <david_goodwin@apple.com> | 2009-07-10 17:03:29 +0000 |
commit | 3ca524e336ad0be449c080235a2d7a38516f0ca4 (patch) | |
tree | f5de2f013444135bddeff974869d2c7740b7f360 | |
parent | 1b342583f6fc42f548912632f6aa24fc6e11986a (diff) |
Predicate VFP instructions on HasVFP2 instead of IsARM. This allows VFP instructions with thumb-2.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75254 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/ARM/ARMInstrFormats.td | 48 | ||||
-rw-r--r-- | lib/Target/ARM/ARMInstrVFP.td | 8 |
2 files changed, 42 insertions, 14 deletions
diff --git a/lib/Target/ARM/ARMInstrFormats.td b/lib/Target/ARM/ARMInstrFormats.td index 89a0e7e02d..9ea4c33749 100644 --- a/lib/Target/ARM/ARMInstrFormats.td +++ b/lib/Target/ARM/ARMInstrFormats.td @@ -918,10 +918,38 @@ class T2Pat<dag pattern, dag result> : Pat<pattern, result> { // ARM VFP Instruction templates. // +// Almost all VFP instructions are predicable. +class VFPI<dag oops, dag iops, AddrMode am, SizeFlagVal sz, + IndexMode im, Format f, string opc, string asm, string cstr, + list<dag> pattern> + : InstARM<am, sz, im, f, cstr> { + let OutOperandList = oops; + let InOperandList = !con(iops, (ops pred:$p)); + let AsmString = !strconcat(opc, !strconcat("${p}", asm)); + let Pattern = pattern; + list<Predicate> Predicates = [HasVFP2]; +} + +// Special cases +class VFPXI<dag oops, dag iops, AddrMode am, SizeFlagVal sz, + IndexMode im, Format f, string asm, string cstr, list<dag> pattern> + : InstARM<am, sz, im, f, cstr> { + let OutOperandList = oops; + let InOperandList = iops; + let AsmString = asm; + let Pattern = pattern; + list<Predicate> Predicates = [HasVFP2]; +} + +class VFPAI<dag oops, dag iops, Format f, string opc, + string asm, list<dag> pattern> + : VFPI<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, f, opc, + asm, "", pattern>; + // ARM VFP addrmode5 loads and stores class ADI5<bits<4> opcod1, bits<2> opcod2, dag oops, dag iops, string opc, string asm, list<dag> pattern> - : I<oops, iops, AddrMode5, Size4Bytes, IndexModeNone, + : VFPI<oops, iops, AddrMode5, Size4Bytes, IndexModeNone, VFPLdStFrm, opc, asm, "", pattern> { // TODO: Mark the instructions with the appropriate subtarget info. let Inst{27-24} = opcod1; @@ -931,7 +959,7 @@ class ADI5<bits<4> opcod1, bits<2> opcod2, dag oops, dag iops, class ASI5<bits<4> opcod1, bits<2> opcod2, dag oops, dag iops, string opc, string asm, list<dag> pattern> - : I<oops, iops, AddrMode5, Size4Bytes, IndexModeNone, + : VFPI<oops, iops, AddrMode5, Size4Bytes, IndexModeNone, VFPLdStFrm, opc, asm, "", pattern> { // TODO: Mark the instructions with the appropriate subtarget info. let Inst{27-24} = opcod1; @@ -941,7 +969,7 @@ class ASI5<bits<4> opcod1, bits<2> opcod2, dag oops, dag iops, // Load / store multiple class AXSI5<dag oops, dag iops, string asm, list<dag> pattern> - : XI<oops, iops, AddrMode5, Size4Bytes, IndexModeNone, + : VFPXI<oops, iops, AddrMode5, Size4Bytes, IndexModeNone, VFPLdStMulFrm, asm, "", pattern> { // TODO: Mark the instructions with the appropriate subtarget info. let Inst{27-25} = 0b110; @@ -949,7 +977,7 @@ class AXSI5<dag oops, dag iops, string asm, list<dag> pattern> } class AXDI5<dag oops, dag iops, string asm, list<dag> pattern> - : XI<oops, iops, AddrMode5, Size4Bytes, IndexModeNone, + : VFPXI<oops, iops, AddrMode5, Size4Bytes, IndexModeNone, VFPLdStMulFrm, asm, "", pattern> { // TODO: Mark the instructions with the appropriate subtarget info. let Inst{27-25} = 0b110; @@ -960,7 +988,7 @@ class AXDI5<dag oops, dag iops, string asm, list<dag> pattern> // Double precision, unary class ADuI<bits<8> opcod1, bits<4> opcod2, bits<4> opcod3, dag oops, dag iops, string opc, string asm, list<dag> pattern> - : AI<oops, iops, VFPUnaryFrm, opc, asm, pattern> { + : VFPAI<oops, iops, VFPUnaryFrm, opc, asm, pattern> { let Inst{27-20} = opcod1; let Inst{19-16} = opcod2; let Inst{11-8} = 0b1011; @@ -970,7 +998,7 @@ class ADuI<bits<8> opcod1, bits<4> opcod2, bits<4> opcod3, dag oops, dag iops, // Double precision, binary class ADbI<bits<8> opcod, dag oops, dag iops, string opc, string asm, list<dag> pattern> - : AI<oops, iops, VFPBinaryFrm, opc, asm, pattern> { + : VFPAI<oops, iops, VFPBinaryFrm, opc, asm, pattern> { let Inst{27-20} = opcod; let Inst{11-8} = 0b1011; } @@ -978,7 +1006,7 @@ class ADbI<bits<8> opcod, dag oops, dag iops, string opc, // Single precision, unary class ASuI<bits<8> opcod1, bits<4> opcod2, bits<4> opcod3, dag oops, dag iops, string opc, string asm, list<dag> pattern> - : AI<oops, iops, VFPUnaryFrm, opc, asm, pattern> { + : VFPAI<oops, iops, VFPUnaryFrm, opc, asm, pattern> { // Bits 22 (D bit) and 5 (M bit) will be changed during instruction encoding. let Inst{27-20} = opcod1; let Inst{19-16} = opcod2; @@ -989,7 +1017,7 @@ class ASuI<bits<8> opcod1, bits<4> opcod2, bits<4> opcod3, dag oops, dag iops, // Single precision, binary class ASbI<bits<8> opcod, dag oops, dag iops, string opc, string asm, list<dag> pattern> - : AI<oops, iops, VFPBinaryFrm, opc, asm, pattern> { + : VFPAI<oops, iops, VFPBinaryFrm, opc, asm, pattern> { // Bit 22 (D bit) can be changed during instruction encoding. let Inst{27-20} = opcod; let Inst{11-8} = 0b1010; @@ -998,7 +1026,7 @@ class ASbI<bits<8> opcod, dag oops, dag iops, string opc, // VFP conversion instructions class AVConv1I<bits<8> opcod1, bits<4> opcod2, bits<4> opcod3, dag oops, dag iops, string opc, string asm, list<dag> pattern> - : AI<oops, iops, VFPConv1Frm, opc, asm, pattern> { + : VFPAI<oops, iops, VFPConv1Frm, opc, asm, pattern> { let Inst{27-20} = opcod1; let Inst{19-16} = opcod2; let Inst{11-8} = opcod3; @@ -1007,7 +1035,7 @@ class AVConv1I<bits<8> opcod1, bits<4> opcod2, bits<4> opcod3, class AVConvXI<bits<8> opcod1, bits<4> opcod2, dag oops, dag iops, Format f, string opc, string asm, list<dag> pattern> - : AI<oops, iops, f, opc, asm, pattern> { + : VFPAI<oops, iops, f, opc, asm, pattern> { let Inst{27-20} = opcod1; let Inst{11-8} = opcod2; let Inst{4} = 1; diff --git a/lib/Target/ARM/ARMInstrVFP.td b/lib/Target/ARM/ARMInstrVFP.td index 9104c77115..a4deaca491 100644 --- a/lib/Target/ARM/ARMInstrVFP.td +++ b/lib/Target/ARM/ARMInstrVFP.td @@ -183,9 +183,9 @@ def FCVTDS : ASuI<0b11101011, 0b0111, 0b1100, (outs DPR:$dst), (ins SPR:$a), [(set DPR:$dst, (fextend SPR:$a))]>; // Special case encoding: bits 11-8 is 0b1011. -def FCVTSD : AI<(outs SPR:$dst), (ins DPR:$a), VFPUnaryFrm, - "fcvtsd", " $dst, $a", - [(set SPR:$dst, (fround DPR:$a))]> { +def FCVTSD : VFPAI<(outs SPR:$dst), (ins DPR:$a), VFPUnaryFrm, + "fcvtsd", " $dst, $a", + [(set SPR:$dst, (fround DPR:$a))]> { let Inst{27-23} = 0b11101; let Inst{21-16} = 0b110111; let Inst{11-8} = 0b1011; @@ -390,7 +390,7 @@ def FNEGScc : ASuI<0b11101011, 0b0001, 0b0100, // let Defs = [CPSR] in -def FMSTAT : AI<(outs), (ins), VFPMiscFrm, "fmstat", "", [(arm_fmstat)]> { +def FMSTAT : VFPAI<(outs), (ins), VFPMiscFrm, "fmstat", "", [(arm_fmstat)]> { let Inst{27-20} = 0b11101111; let Inst{19-16} = 0b0001; let Inst{15-12} = 0b1111; |