| OLD | NEW |
| 1 //===- ARMInstrInfo.td - Target Description for ARM Target -*- tablegen -*-===// | 1 //===- ARMInstrInfo.td - Target Description for ARM Target -*- tablegen -*-===// |
| 2 // | 2 // |
| 3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 // | 9 // |
| 10 // This file describes the ARM instructions in TableGen format. | 10 // This file describes the ARM instructions in TableGen format. |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 def SDT_ARM64bitmlal : SDTypeProfile<2,4, [ SDTCisVT<0, i32>, SDTCisVT<1, i32>, | 90 def SDT_ARM64bitmlal : SDTypeProfile<2,4, [ SDTCisVT<0, i32>, SDTCisVT<1, i32>, |
| 91 SDTCisVT<2, i32>, SDTCisVT<3, i32>, | 91 SDTCisVT<2, i32>, SDTCisVT<3, i32>, |
| 92 SDTCisVT<4, i32>, SDTCisVT<5, i32> ] >; | 92 SDTCisVT<4, i32>, SDTCisVT<5, i32> ] >; |
| 93 def ARMUmlal : SDNode<"ARMISD::UMLAL", SDT_ARM64bitmlal>; | 93 def ARMUmlal : SDNode<"ARMISD::UMLAL", SDT_ARM64bitmlal>; |
| 94 def ARMSmlal : SDNode<"ARMISD::SMLAL", SDT_ARM64bitmlal>; | 94 def ARMSmlal : SDNode<"ARMISD::SMLAL", SDT_ARM64bitmlal>; |
| 95 | 95 |
| 96 // Node definitions. | 96 // Node definitions. |
| 97 def ARMWrapper : SDNode<"ARMISD::Wrapper", SDTIntUnaryOp>; | 97 def ARMWrapper : SDNode<"ARMISD::Wrapper", SDTIntUnaryOp>; |
| 98 def ARMWrapperPIC : SDNode<"ARMISD::WrapperPIC", SDTIntUnaryOp>; | 98 def ARMWrapperPIC : SDNode<"ARMISD::WrapperPIC", SDTIntUnaryOp>; |
| 99 def ARMWrapperJT : SDNode<"ARMISD::WrapperJT", SDTIntBinOp>; | 99 def ARMWrapperJT : SDNode<"ARMISD::WrapperJT", SDTIntBinOp>; |
| 100 // @LOCALMOD-START |
| 101 // support non-inline jumptables |
| 102 // we do not use the extre uid immediate that comes with ARMWrapperJT |
| 103 // TODO(robertm): figure out what it is used for |
| 104 def ARMWrapperJT2 : SDNode<"ARMISD::WrapperJT2", SDTIntUnaryOp>; |
| 105 // Support for MOVW/MOVT'ing the GOT address directly into a register. |
| 106 def ARMWrapperGOT : SDNode<"ARMISD::WrapperGOT", SDTPtrLeaf>; |
| 107 // @LOCALMOD-END |
| 100 | 108 |
| 101 def ARMcallseq_start : SDNode<"ISD::CALLSEQ_START", SDT_ARMCallSeqStart, | 109 def ARMcallseq_start : SDNode<"ISD::CALLSEQ_START", SDT_ARMCallSeqStart, |
| 102 [SDNPHasChain, SDNPSideEffect, SDNPOutGlue]>; | 110 [SDNPHasChain, SDNPSideEffect, SDNPOutGlue]>; |
| 103 def ARMcallseq_end : SDNode<"ISD::CALLSEQ_END", SDT_ARMCallSeqEnd, | 111 def ARMcallseq_end : SDNode<"ISD::CALLSEQ_END", SDT_ARMCallSeqEnd, |
| 104 [SDNPHasChain, SDNPSideEffect, | 112 [SDNPHasChain, SDNPSideEffect, |
| 105 SDNPOptInGlue, SDNPOutGlue]>; | 113 SDNPOptInGlue, SDNPOutGlue]>; |
| 106 def ARMcopystructbyval : SDNode<"ARMISD::COPY_STRUCT_BYVAL" , | 114 def ARMcopystructbyval : SDNode<"ARMISD::COPY_STRUCT_BYVAL" , |
| 107 SDT_ARMStructByVal, | 115 SDT_ARMStructByVal, |
| 108 [SDNPHasChain, SDNPInGlue, SDNPOutGlue, | 116 [SDNPHasChain, SDNPInGlue, SDNPOutGlue, |
| 109 SDNPMayStore, SDNPMayLoad]>; | 117 SDNPMayStore, SDNPMayLoad]>; |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 | 308 |
| 301 // Cortex-A9 prefers VMOVSR to VMOVDRR even when using NEON for scalar FP, as | 309 // Cortex-A9 prefers VMOVSR to VMOVDRR even when using NEON for scalar FP, as |
| 302 // this allows more effective execution domain optimization. See | 310 // this allows more effective execution domain optimization. See |
| 303 // setExecutionDomain(). | 311 // setExecutionDomain(). |
| 304 def UseVMOVSR : Predicate<"Subtarget->isCortexA9() || !Subtarget->useNEONForSing
lePrecisionFP()">; | 312 def UseVMOVSR : Predicate<"Subtarget->isCortexA9() || !Subtarget->useNEONForSing
lePrecisionFP()">; |
| 305 def DontUseVMOVSR : Predicate<"!Subtarget->isCortexA9() && Subtarget->useNEONFor
SinglePrecisionFP()">; | 313 def DontUseVMOVSR : Predicate<"!Subtarget->isCortexA9() && Subtarget->useNEONFor
SinglePrecisionFP()">; |
| 306 | 314 |
| 307 def IsLE : Predicate<"getTargetLowering()->isLittleEndian()">; | 315 def IsLE : Predicate<"getTargetLowering()->isLittleEndian()">; |
| 308 def IsBE : Predicate<"getTargetLowering()->isBigEndian()">; | 316 def IsBE : Predicate<"getTargetLowering()->isBigEndian()">; |
| 309 | 317 |
| 318 // @LOCALMOD-BEGIN |
| 319 def UseConstIslands : Predicate<"Subtarget->useConstIslands()">; |
| 320 def DontUseConstIslands : Predicate<"!Subtarget->useConstIslands()">; |
| 321 // @LOCALMOD-END |
| 322 |
| 310 //===----------------------------------------------------------------------===// | 323 //===----------------------------------------------------------------------===// |
| 311 // ARM Flag Definitions. | 324 // ARM Flag Definitions. |
| 312 | 325 |
| 313 class RegConstraint<string C> { | 326 class RegConstraint<string C> { |
| 314 string Constraints = C; | 327 string Constraints = C; |
| 315 } | 328 } |
| 316 | 329 |
| 317 //===----------------------------------------------------------------------===// | 330 //===----------------------------------------------------------------------===// |
| 318 // ARM specific transformation functions and pattern fragments. | 331 // ARM specific transformation functions and pattern fragments. |
| 319 // | 332 // |
| (...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 862 } | 875 } |
| 863 | 876 |
| 864 | 877 |
| 865 // addrmode2 := reg +/- imm12 | 878 // addrmode2 := reg +/- imm12 |
| 866 // := reg +/- reg shop imm | 879 // := reg +/- reg shop imm |
| 867 // | 880 // |
| 868 // FIXME: addrmode2 should be refactored the rest of the way to always | 881 // FIXME: addrmode2 should be refactored the rest of the way to always |
| 869 // use explicit imm vs. reg versions above (addrmode_imm12 and ldst_so_reg). | 882 // use explicit imm vs. reg versions above (addrmode_imm12 and ldst_so_reg). |
| 870 def AddrMode2AsmOperand : AsmOperandClass { let Name = "AddrMode2"; } | 883 def AddrMode2AsmOperand : AsmOperandClass { let Name = "AddrMode2"; } |
| 871 def addrmode2 : Operand<i32>, | 884 def addrmode2 : Operand<i32>, |
| 872 ComplexPattern<i32, 3, "SelectAddrMode2", []> { | 885 ComplexPattern<i32, 3, "SelectAddrMode2", [], |
| 886 [SDNPWantRoot]> { // @LOCALMOD |
| 873 let EncoderMethod = "getAddrMode2OpValue"; | 887 let EncoderMethod = "getAddrMode2OpValue"; |
| 874 let PrintMethod = "printAddrMode2Operand"; | 888 let PrintMethod = "printAddrMode2Operand"; |
| 875 let ParserMatchClass = AddrMode2AsmOperand; | 889 let ParserMatchClass = AddrMode2AsmOperand; |
| 876 let MIOperandInfo = (ops GPR:$base, GPR:$offsreg, i32imm:$offsimm); | 890 let MIOperandInfo = (ops GPR:$base, GPR:$offsreg, i32imm:$offsimm); |
| 877 } | 891 } |
| 878 | 892 |
| 879 def PostIdxRegShiftedAsmOperand : AsmOperandClass { | 893 def PostIdxRegShiftedAsmOperand : AsmOperandClass { |
| 880 let Name = "PostIdxRegShifted"; | 894 let Name = "PostIdxRegShifted"; |
| 881 let ParserMethod = "parsePostIdxReg"; | 895 let ParserMethod = "parsePostIdxReg"; |
| 882 } | 896 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 902 let MIOperandInfo = (ops GPRnopc, i32imm); | 916 let MIOperandInfo = (ops GPRnopc, i32imm); |
| 903 } | 917 } |
| 904 | 918 |
| 905 | 919 |
| 906 // addrmode3 := reg +/- reg | 920 // addrmode3 := reg +/- reg |
| 907 // addrmode3 := reg +/- imm8 | 921 // addrmode3 := reg +/- imm8 |
| 908 // | 922 // |
| 909 // FIXME: split into imm vs. reg versions. | 923 // FIXME: split into imm vs. reg versions. |
| 910 def AddrMode3AsmOperand : AsmOperandClass { let Name = "AddrMode3"; } | 924 def AddrMode3AsmOperand : AsmOperandClass { let Name = "AddrMode3"; } |
| 911 class AddrMode3 : Operand<i32>, | 925 class AddrMode3 : Operand<i32>, |
| 912 ComplexPattern<i32, 3, "SelectAddrMode3", []> { | 926 ComplexPattern<i32, 3, "SelectAddrMode3", [], |
| 927 [SDNPWantRoot]> { // @LOCALMOD |
| 913 let EncoderMethod = "getAddrMode3OpValue"; | 928 let EncoderMethod = "getAddrMode3OpValue"; |
| 914 let ParserMatchClass = AddrMode3AsmOperand; | 929 let ParserMatchClass = AddrMode3AsmOperand; |
| 915 let MIOperandInfo = (ops GPR:$base, GPR:$offsreg, i32imm:$offsimm); | 930 let MIOperandInfo = (ops GPR:$base, GPR:$offsreg, i32imm:$offsimm); |
| 916 } | 931 } |
| 917 | 932 |
| 918 def addrmode3 : AddrMode3 | 933 def addrmode3 : AddrMode3 |
| 919 { | 934 { |
| 920 let PrintMethod = "printAddrMode3Operand<false>"; | 935 let PrintMethod = "printAddrMode3Operand<false>"; |
| 921 } | 936 } |
| 922 | 937 |
| (...skipping 875 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1798 let Inst{15-12} = Rt; | 1813 let Inst{15-12} = Rt; |
| 1799 let Inst{11-0} = shift{11-0}; | 1814 let Inst{11-0} = shift{11-0}; |
| 1800 } | 1815 } |
| 1801 } | 1816 } |
| 1802 | 1817 |
| 1803 | 1818 |
| 1804 //===----------------------------------------------------------------------===// | 1819 //===----------------------------------------------------------------------===// |
| 1805 // Instructions | 1820 // Instructions |
| 1806 //===----------------------------------------------------------------------===// | 1821 //===----------------------------------------------------------------------===// |
| 1807 | 1822 |
| 1823 // @LOCALMOD-START |
| 1824 |
| 1825 def SFI_GUARD_LOADSTORE : |
| 1826 PseudoInst<(outs GPR:$dst), (ins GPR:$a, pred:$p), NoItinerary, []>; |
| 1827 |
| 1828 let Defs = [CPSR] in |
| 1829 def SFI_GUARD_LOADSTORE_TST : |
| 1830 PseudoInst<(outs), (ins GPR:$a), NoItinerary, []>; |
| 1831 |
| 1832 // Like SFI_GUARD_LOADSTORE, but reserved for loads into SP. |
| 1833 def SFI_GUARD_SP_LOAD : |
| 1834 PseudoInst<(outs GPR:$dst), (ins GPR:$src, pred:$p), NoItinerary, []>; |
| 1835 |
| 1836 def SFI_GUARD_INDIRECT_CALL : |
| 1837 PseudoInst<(outs GPR:$dst), (ins GPR:$a, pred:$p), NoItinerary, []>; |
| 1838 |
| 1839 def SFI_GUARD_INDIRECT_JMP : |
| 1840 PseudoInst<(outs GPR:$dst), (ins GPR:$a, pred:$p), NoItinerary, []>; |
| 1841 |
| 1842 def SFI_GUARD_CALL : |
| 1843 PseudoInst<(outs), (ins pred:$p), NoItinerary, []>; |
| 1844 |
| 1845 // NOTE: the BX_RET instruction hardcodes lr as well |
| 1846 def SFI_GUARD_RETURN : |
| 1847 PseudoInst<(outs), (ins pred:$p), NoItinerary, []>; |
| 1848 |
| 1849 def SFI_NOP_IF_AT_BUNDLE_END : |
| 1850 PseudoInst<(outs), (ins), NoItinerary, []>; |
| 1851 |
| 1852 // Note: intention is that $src and $dst are the same register. |
| 1853 def SFI_DATA_MASK : |
| 1854 PseudoInst<(outs GPR:$dst), (ins GPR:$src, pred:$p), NoItinerary, []>; |
| 1855 |
| 1856 // @LOCALMOD-END |
| 1857 |
| 1808 //===----------------------------------------------------------------------===// | 1858 //===----------------------------------------------------------------------===// |
| 1809 // Miscellaneous Instructions. | 1859 // Miscellaneous Instructions. |
| 1810 // | 1860 // |
| 1811 | 1861 |
| 1812 /// CONSTPOOL_ENTRY - This instruction represents a floating constant pool in | 1862 /// CONSTPOOL_ENTRY - This instruction represents a floating constant pool in |
| 1813 /// the function. The first operand is the ID# for this instruction, the second | 1863 /// the function. The first operand is the ID# for this instruction, the second |
| 1814 /// is the index into the MachineConstantPool that this is, the third is the | 1864 /// is the index into the MachineConstantPool that this is, the third is the |
| 1815 /// size in bytes of this constant pool entry. | 1865 /// size in bytes of this constant pool entry. |
| 1816 let hasSideEffects = 0, isNotDuplicable = 1 in | 1866 let hasSideEffects = 0, isNotDuplicable = 1 in |
| 1817 def CONSTPOOL_ENTRY : | 1867 def CONSTPOOL_ENTRY : |
| (...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2126 "bx", "\t$dst", [/* pattern left blank */]>, | 2176 "bx", "\t$dst", [/* pattern left blank */]>, |
| 2127 Requires<[IsARM, HasV4T]>, Sched<[WriteBr]> { | 2177 Requires<[IsARM, HasV4T]>, Sched<[WriteBr]> { |
| 2128 bits<4> dst; | 2178 bits<4> dst; |
| 2129 let Inst{27-4} = 0b000100101111111111110001; | 2179 let Inst{27-4} = 0b000100101111111111110001; |
| 2130 let Inst{3-0} = dst; | 2180 let Inst{3-0} = dst; |
| 2131 } | 2181 } |
| 2132 } | 2182 } |
| 2133 | 2183 |
| 2134 // SP is marked as a use to prevent stack-pointer assignments that appear | 2184 // SP is marked as a use to prevent stack-pointer assignments that appear |
| 2135 // immediately before calls from potentially appearing dead. | 2185 // immediately before calls from potentially appearing dead. |
| 2186 |
| 2187 // @LOCALMOD-START |
| 2188 // Exception handling related Node and Instructions. |
| 2189 // The conversion sequence is: |
| 2190 // ISD::EH_RETURN -> ARMISD::EH_RETURN -> |
| 2191 // ARMeh_return -> (stack change + indirect branch) |
| 2192 // |
| 2193 // ARMeh_return takes the place of regular return instruction |
| 2194 // but takes two arguments. |
| 2195 // R2, R3 are used for storing the offset and return address respectively. |
| 2196 def SDT_ARMEHRET : SDTypeProfile<0, 2, [SDTCisInt<0>, SDTCisPtrTy<1>]>; |
| 2197 |
| 2198 def ARMehret : SDNode<"ARMISD::EH_RETURN", SDT_ARMEHRET, |
| 2199 [SDNPHasChain, SDNPOptInGlue]>; |
| 2200 |
| 2201 |
| 2202 let isTerminator = 1, isReturn = 1, isBarrier = 1, |
| 2203 Defs = [SP], |
| 2204 Uses = [SP] in { |
| 2205 def ARMeh_return : PseudoInst<(outs), |
| 2206 (ins GPR:$spadj, GPR:$dst), |
| 2207 IIC_Br, |
| 2208 [(ARMehret GPR:$spadj, GPR:$dst)]>, |
| 2209 Requires<[IsARM]>; |
| 2210 } |
| 2211 // @LOCALMOD-END |
| 2212 |
| 2136 let isCall = 1, | 2213 let isCall = 1, |
| 2137 // FIXME: Do we really need a non-predicated version? If so, it should | 2214 // FIXME: Do we really need a non-predicated version? If so, it should |
| 2138 // at least be a pseudo instruction expanding to the predicated version | 2215 // at least be a pseudo instruction expanding to the predicated version |
| 2139 // at MC lowering time. | 2216 // at MC lowering time. |
| 2140 Defs = [LR], Uses = [SP] in { | 2217 Defs = [LR], Uses = [SP] in { |
| 2141 def BL : ABXI<0b1011, (outs), (ins bl_target:$func), | 2218 def BL : ABXI<0b1011, (outs), (ins bl_target:$func), |
| 2142 IIC_Br, "bl\t$func", | 2219 IIC_Br, "bl\t$func", |
| 2143 [(ARMcall tglobaladdr:$func)]>, | 2220 [(ARMcall tglobaladdr:$func)]>, |
| 2144 Requires<[IsARM]>, Sched<[WriteBrL]> { | 2221 Requires<[IsARM]>, Sched<[WriteBrL]> { |
| 2145 let Inst{31-28} = 0b1110; | 2222 let Inst{31-28} = 0b1110; |
| (...skipping 1131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3277 let Inst{25} = 1; | 3354 let Inst{25} = 1; |
| 3278 let DecoderMethod = "DecodeArmMOVTWInstruction"; | 3355 let DecoderMethod = "DecodeArmMOVTWInstruction"; |
| 3279 } | 3356 } |
| 3280 | 3357 |
| 3281 def MOVTi16_ga_pcrel : PseudoInst<(outs GPR:$Rd), | 3358 def MOVTi16_ga_pcrel : PseudoInst<(outs GPR:$Rd), |
| 3282 (ins GPR:$src, i32imm:$addr, pclabel:$id), IIC_iMOVi, []>, | 3359 (ins GPR:$src, i32imm:$addr, pclabel:$id), IIC_iMOVi, []>, |
| 3283 Sched<[WriteALU]>; | 3360 Sched<[WriteALU]>; |
| 3284 | 3361 |
| 3285 } // Constraints | 3362 } // Constraints |
| 3286 | 3363 |
| 3364 // @LOCALMOD-BEGIN |
| 3365 // PIC / PC-relative versions of MOVi16/MOVTi16, which have an extra |
| 3366 // operand representing the ID of the PICADD instruction that corrects |
| 3367 // for relativity. This is used to materialize addresses into |
| 3368 // a register in a PC-relative manner. |
| 3369 // |
| 3370 // E.g. Rather than have an absolute address in $imm, and transferred to |
| 3371 // a register with: |
| 3372 // movw $Rd, :lower16:$imm |
| 3373 // movt $Rd, :upper16:$imm |
| 3374 // |
| 3375 // we will instead have a relative offset: |
| 3376 // movw $Rd, :lower16:$imm - ($pic_add_id + 8) |
| 3377 // ... |
| 3378 // movt $Rd, :upper16:$imm - ($pic_add_id + 8) |
| 3379 // ... |
| 3380 // $pic_add_id: |
| 3381 // add $Rd, pc, $Rd |
| 3382 // |
| 3383 // One way these pseudo instructions (and the corresponding PICADD) |
| 3384 // come about is during expansion of the MOVi32imm pseudo instruction |
| 3385 // (see ARMExpandPseudo::ExpandMBB). |
| 3386 // These pseudo instructions become real instructions when they are |
| 3387 // finally lowered to MCInsts (e.g., at ARMAsmPrinter::EmitInstruction), |
| 3388 // and the extra pclabel ID becomes part of the appropriate operand. |
| 3389 // |
| 3390 // NOTE: aside from adding the pclabel operand, all other operands should |
| 3391 // be the same as the non-PIC versions to simplify conversion to the |
| 3392 // non-pseudo instructions. |
| 3393 let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1, |
| 3394 hasSideEffects = 0 in |
| 3395 def MOVi16PIC : PseudoInst<(outs GPR:$Rd), (ins imm0_65535_expr:$imm, |
| 3396 pclabel:$pic_add_id, |
| 3397 pred:$p), |
| 3398 IIC_iMOVi, |
| 3399 []>, |
| 3400 Requires<[IsARM, HasV6T2]>, UnaryDP; |
| 3401 |
| 3402 let Constraints = "$src = $Rd" in |
| 3403 def MOVTi16PIC : PseudoInst<(outs GPR:$Rd), (ins GPR:$src, |
| 3404 imm0_65535_expr:$imm, |
| 3405 pclabel:$pic_add_id, |
| 3406 pred:$p), |
| 3407 IIC_iMOVi, |
| 3408 []>, |
| 3409 UnaryDP, Requires<[IsARM, HasV6T2]>; |
| 3410 // @LOCALMOD-END |
| 3411 |
| 3412 // @LOCALMOD-BEGIN |
| 3413 // Pseudo-instruction that will be expanded into MOVW / MOVT (PIC versions) w/ |
| 3414 // GOT as the operand. |
| 3415 // The alternative is to create a constant pool entry with the (relative) |
| 3416 // GOT address and load from the constant pool. This is currently used |
| 3417 // when constant islands are turned off, since MOVW / MOVT will be faster. |
| 3418 let isReMaterializable = 1, isMoveImm = 1, hasSideEffects = 0 in |
| 3419 def MOVGOTAddr : PseudoInst<(outs GPR:$dst), (ins), |
| 3420 IIC_iMOVix2, // will expand to two MOVi's |
| 3421 []>, |
| 3422 Requires<[IsARM, UseMovt]>; |
| 3423 |
| 3424 def : ARMPat<(ARMWrapperGOT), (MOVGOTAddr)>; |
| 3425 // @LOCALMOD-END |
| 3426 |
| 3287 def : ARMPat<(or GPR:$src, 0xffff0000), (MOVTi16 GPR:$src, 0xffff)>, | 3427 def : ARMPat<(or GPR:$src, 0xffff0000), (MOVTi16 GPR:$src, 0xffff)>, |
| 3288 Requires<[IsARM, HasV6T2]>; | 3428 Requires<[IsARM, HasV6T2]>; |
| 3289 | 3429 |
| 3290 let Uses = [CPSR] in | 3430 let Uses = [CPSR] in |
| 3291 def RRX: PseudoInst<(outs GPR:$Rd), (ins GPR:$Rm), IIC_iMOVsi, | 3431 def RRX: PseudoInst<(outs GPR:$Rd), (ins GPR:$Rm), IIC_iMOVsi, |
| 3292 [(set GPR:$Rd, (ARMrrx GPR:$Rm))]>, UnaryDP, | 3432 [(set GPR:$Rd, (ARMrrx GPR:$Rm))]>, UnaryDP, |
| 3293 Requires<[IsARM]>, Sched<[WriteALU]>; | 3433 Requires<[IsARM]>, Sched<[WriteALU]>; |
| 3294 | 3434 |
| 3295 // These aren't really mov instructions, but we have to define them this way | 3435 // These aren't really mov instructions, but we have to define them this way |
| 3296 // due to flag operands. | 3436 // due to flag operands. |
| (...skipping 1994 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5291 Requires<[IsARM, DontUseMovt]>; | 5431 Requires<[IsARM, DontUseMovt]>; |
| 5292 | 5432 |
| 5293 let AddedComplexity = 10 in | 5433 let AddedComplexity = 10 in |
| 5294 def MOV_ga_pcrel_ldr : PseudoInst<(outs GPR:$dst), (ins i32imm:$addr), | 5434 def MOV_ga_pcrel_ldr : PseudoInst<(outs GPR:$dst), (ins i32imm:$addr), |
| 5295 IIC_iMOVix2ld, | 5435 IIC_iMOVix2ld, |
| 5296 [(set GPR:$dst, (load (ARMWrapperPIC tglobaladdr:$addr)))]>, | 5436 [(set GPR:$dst, (load (ARMWrapperPIC tglobaladdr:$addr)))]>, |
| 5297 Requires<[IsARM, UseMovt]>; | 5437 Requires<[IsARM, UseMovt]>; |
| 5298 } // isReMaterializable | 5438 } // isReMaterializable |
| 5299 | 5439 |
| 5300 // ConstantPool, GlobalAddress, and JumpTable | 5440 // ConstantPool, GlobalAddress, and JumpTable |
| 5301 def : ARMPat<(ARMWrapper tconstpool :$dst), (LEApcrel tconstpool :$dst)>; | 5441 def : ARMPat<(ARMWrapper tconstpool :$dst), (LEApcrel tconstpool :$dst)>, |
| 5442 Requires<[IsARM, UseConstIslands]>; // @LOCALMOD see tconstpool |
| 5443 // with DontUseConstIslands. |
| 5302 def : ARMPat<(ARMWrapper tglobaladdr :$dst), (MOVi32imm tglobaladdr :$dst)>, | 5444 def : ARMPat<(ARMWrapper tglobaladdr :$dst), (MOVi32imm tglobaladdr :$dst)>, |
| 5303 Requires<[IsARM, UseMovt]>; | 5445 Requires<[IsARM, UseMovt]>; |
| 5446 // @LOCALMOD-START |
| 5447 def : ARMPat<(ARMWrapper tconstpool :$dst), (MOVi32imm tconstpool :$dst)>, |
| 5448 Requires<[IsARM, UseMovt, DontUseConstIslands]>; |
| 5449 def : ARMPat<(ARMWrapperJT2 tjumptable :$dst), (MOVi32imm tjumptable :$dst)>, |
| 5450 Requires<[IsARM, UseMovt]>; |
| 5451 // @LOCALMOD-END |
| 5304 def : ARMPat<(ARMWrapperJT tjumptable:$dst, imm:$id), | 5452 def : ARMPat<(ARMWrapperJT tjumptable:$dst, imm:$id), |
| 5305 (LEApcrelJT tjumptable:$dst, imm:$id)>; | 5453 (LEApcrelJT tjumptable:$dst, imm:$id)>; |
| 5306 | 5454 |
| 5307 // TODO: add,sub,and, 3-instr forms? | 5455 // TODO: add,sub,and, 3-instr forms? |
| 5308 | 5456 |
| 5309 // Tail calls. These patterns also apply to Thumb mode. | 5457 // Tail calls. These patterns also apply to Thumb mode. |
| 5310 def : Pat<(ARMtcret tcGPR:$dst), (TCRETURNri tcGPR:$dst)>; | 5458 def : Pat<(ARMtcret tcGPR:$dst), (TCRETURNri tcGPR:$dst)>; |
| 5311 def : Pat<(ARMtcret (i32 tglobaladdr:$dst)), (TCRETURNdi texternalsym:$dst)>; | 5459 def : Pat<(ARMtcret (i32 tglobaladdr:$dst)), (TCRETURNdi texternalsym:$dst)>; |
| 5312 def : Pat<(ARMtcret (i32 texternalsym:$dst)), (TCRETURNdi texternalsym:$dst)>; | 5460 def : Pat<(ARMtcret (i32 texternalsym:$dst)), (TCRETURNdi texternalsym:$dst)>; |
| 5313 | 5461 |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5646 | 5794 |
| 5647 // 'it' blocks in ARM mode just validate the predicates. The IT itself | 5795 // 'it' blocks in ARM mode just validate the predicates. The IT itself |
| 5648 // is discarded. | 5796 // is discarded. |
| 5649 def ITasm : ARMAsmPseudo<"it$mask $cc", (ins it_pred:$cc, it_mask:$mask)>, | 5797 def ITasm : ARMAsmPseudo<"it$mask $cc", (ins it_pred:$cc, it_mask:$mask)>, |
| 5650 ComplexDeprecationPredicate<"IT">; | 5798 ComplexDeprecationPredicate<"IT">; |
| 5651 | 5799 |
| 5652 let mayLoad = 1, mayStore =1, hasSideEffects = 1 in | 5800 let mayLoad = 1, mayStore =1, hasSideEffects = 1 in |
| 5653 def SPACE : PseudoInst<(outs GPR:$Rd), (ins i32imm:$size, GPR:$Rn), | 5801 def SPACE : PseudoInst<(outs GPR:$Rd), (ins i32imm:$size, GPR:$Rn), |
| 5654 NoItinerary, | 5802 NoItinerary, |
| 5655 [(set GPR:$Rd, (int_arm_space imm:$size, GPR:$Rn))]>; | 5803 [(set GPR:$Rd, (int_arm_space imm:$size, GPR:$Rn))]>; |
| OLD | NEW |