1a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===-- ARMISelLowering.h - ARM DAG Lowering Interface ----------*- C++ -*-===// 2a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 3a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// The LLVM Compiler Infrastructure 4a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 8a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===// 9a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 10a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// This file defines the interfaces that ARM uses to lower LLVM code into a 11a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// selection DAG. 12a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 13a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===// 14a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 15a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#ifndef ARMISELLOWERING_H 16a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#define ARMISELLOWERING_H 17a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 18f1ba1cad387dc52f3c2c5afc665edf9caad00992Rafael Espindola#include "ARMSubtarget.h" 19a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "llvm/Target/TargetLowering.h" 203144687df78731ac4ddbc716a24b951678a73f57Evan Cheng#include "llvm/Target/TargetRegisterInfo.h" 21ab695889c67fb499bd902e8a969d0ff02ce66788Eric Christopher#include "llvm/CodeGen/FastISel.h" 22a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "llvm/CodeGen/SelectionDAG.h" 231f595bb42950088ccb8246e6b065a96027b46ec6Bob Wilson#include "llvm/CodeGen/CallingConvLower.h" 24a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include <vector> 25a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 26a8e2989ece6dc46df59b0768184028257f913843Evan Chengnamespace llvm { 27a8e2989ece6dc46df59b0768184028257f913843Evan Cheng class ARMConstantPoolValue; 28a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 29a8e2989ece6dc46df59b0768184028257f913843Evan Cheng namespace ARMISD { 30a8e2989ece6dc46df59b0768184028257f913843Evan Cheng // ARM Specific DAG Nodes 31a8e2989ece6dc46df59b0768184028257f913843Evan Cheng enum NodeType { 326aa7197fb5aa478a5c813d41a11689bb6d8f7abcJim Grosbach // Start the numbering where the builtin ops and target ops leave off. 330ba2bcfcc3149a25d08aa8aa00fb6c34a4e25bddDan Gohman FIRST_NUMBER = ISD::BUILTIN_OP_END, 34a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 35a8e2989ece6dc46df59b0768184028257f913843Evan Cheng Wrapper, // Wrapper - A wrapper node for TargetConstantPool, 36a8e2989ece6dc46df59b0768184028257f913843Evan Cheng // TargetExternalSymbol, and TargetGlobalAddress. 3753519f015e3e84e9f57b677cc8724805a6009b73Evan Cheng WrapperDYN, // WrapperDYN - A wrapper node for TargetGlobalAddress in 3853519f015e3e84e9f57b677cc8724805a6009b73Evan Cheng // DYN mode. 395de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng WrapperPIC, // WrapperPIC - A wrapper node for TargetGlobalAddress in 405de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng // PIC mode. 41a8e2989ece6dc46df59b0768184028257f913843Evan Cheng WrapperJT, // WrapperJT - A wrapper node for TargetJumpTable 426aa7197fb5aa478a5c813d41a11689bb6d8f7abcJim Grosbach 43a8e2989ece6dc46df59b0768184028257f913843Evan Cheng CALL, // Function call. 44277f0741c5ea123b30360c382a153df238c31caeEvan Cheng CALL_PRED, // Function call that's predicable. 45a8e2989ece6dc46df59b0768184028257f913843Evan Cheng CALL_NOLINK, // Function call with branch not branch-and-link. 46a8e2989ece6dc46df59b0768184028257f913843Evan Cheng tCALL, // Thumb function call. 47a8e2989ece6dc46df59b0768184028257f913843Evan Cheng BRCOND, // Conditional branch. 48a8e2989ece6dc46df59b0768184028257f913843Evan Cheng BR_JT, // Jumptable branch. 495657c01949dca6c012ac60d242d1a8d2ffdf5603Evan Cheng BR2_JT, // Jumptable branch (2 level - jumptable entry is a jump). 50a8e2989ece6dc46df59b0768184028257f913843Evan Cheng RET_FLAG, // Return with a flag operand. 51a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 52a8e2989ece6dc46df59b0768184028257f913843Evan Cheng PIC_ADD, // Add with a PC operand and a PIC label. 53a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 54a8e2989ece6dc46df59b0768184028257f913843Evan Cheng CMP, // ARM compare instructions. 55c0309b48b560f119982c02a81416c8c1fd208648David Goodwin CMPZ, // ARM compare that sets only Z flag. 56a8e2989ece6dc46df59b0768184028257f913843Evan Cheng CMPFP, // ARM VFP compare instruction, sets FPSCR. 57a8e2989ece6dc46df59b0768184028257f913843Evan Cheng CMPFPw0, // ARM VFP compare against zero instruction, sets FPSCR. 58a8e2989ece6dc46df59b0768184028257f913843Evan Cheng FMSTAT, // ARM fmstat instruction. 59a8e2989ece6dc46df59b0768184028257f913843Evan Cheng CMOV, // ARM conditional move instructions. 606aa7197fb5aa478a5c813d41a11689bb6d8f7abcJim Grosbach 61218977b53eb215e5534db2f727d109ab18817cc1Evan Cheng BCC_i64, 62218977b53eb215e5534db2f727d109ab18817cc1Evan Cheng 633482c8003ad0c88469b7333aaf658036e3fd0468Jim Grosbach RBIT, // ARM bitreverse instruction 643482c8003ad0c88469b7333aaf658036e3fd0468Jim Grosbach 6576a312b7d1c2b41394696510506967cd0794b831Bob Wilson FTOSI, // FP to sint within a FP register. 6676a312b7d1c2b41394696510506967cd0794b831Bob Wilson FTOUI, // FP to uint within a FP register. 6776a312b7d1c2b41394696510506967cd0794b831Bob Wilson SITOF, // sint to FP within a FP register. 6876a312b7d1c2b41394696510506967cd0794b831Bob Wilson UITOF, // uint to FP within a FP register. 6976a312b7d1c2b41394696510506967cd0794b831Bob Wilson 70a8e2989ece6dc46df59b0768184028257f913843Evan Cheng SRL_FLAG, // V,Flag = srl_flag X -> srl X, 1 + save carry out. 71a8e2989ece6dc46df59b0768184028257f913843Evan Cheng SRA_FLAG, // V,Flag = sra_flag X -> sra X, 1 + save carry out. 72a8e2989ece6dc46df59b0768184028257f913843Evan Cheng RRX, // V = RRX X, Flag -> srl X, 1 + shift in carry flag. 736aa7197fb5aa478a5c813d41a11689bb6d8f7abcJim Grosbach 74342e3161d9dd4fa485b47788aa0266f9c91c3832Evan Cheng ADDC, // Add with carry 75342e3161d9dd4fa485b47788aa0266f9c91c3832Evan Cheng ADDE, // Add using carry 76342e3161d9dd4fa485b47788aa0266f9c91c3832Evan Cheng SUBC, // Sub with carry 77342e3161d9dd4fa485b47788aa0266f9c91c3832Evan Cheng SUBE, // Sub using carry 78342e3161d9dd4fa485b47788aa0266f9c91c3832Evan Cheng 79e5165490b7ba24bb2f3043399e0d60e7f3bcf8a5Jim Grosbach VMOVRRD, // double to two gprs. 80e5165490b7ba24bb2f3043399e0d60e7f3bcf8a5Jim Grosbach VMOVDRR, // Two gprs to double. 8164f4fa5e0eb505eec3a72041bec6b3a7f7739dedLauro Ramos Venancio 82e4ad387a5a88dae20f0f7578e55170bbc8eee2a9Jim Grosbach EH_SJLJ_SETJMP, // SjLj exception handling setjmp. 83e4ad387a5a88dae20f0f7578e55170bbc8eee2a9Jim Grosbach EH_SJLJ_LONGJMP, // SjLj exception handling longjmp. 84e4ad387a5a88dae20f0f7578e55170bbc8eee2a9Jim Grosbach EH_SJLJ_DISPATCHSETUP, // SjLj exception handling dispatch setup. 850e0da734bbdfa1d3f55cd04db31d83b97e4556f7Jim Grosbach 8651e28e634880849ed9f7c02e93c08d25dd70291bDale Johannesen TC_RETURN, // Tail call return pseudo. 8751e28e634880849ed9f7c02e93c08d25dd70291bDale Johannesen 885bafff36c798608a189c517d37527e4a38863071Bob Wilson THREAD_POINTER, 895bafff36c798608a189c517d37527e4a38863071Bob Wilson 90861986401e05e437cb33bfd8320d510b956fe41eEvan Cheng DYN_ALLOC, // Dynamic allocation on the stack. 91861986401e05e437cb33bfd8320d510b956fe41eEvan Cheng 92f74a4298163a7d0b500c7f7a818829c153dc942eBob Wilson MEMBARRIER, // Memory barrier (DMB) 93f74a4298163a7d0b500c7f7a818829c153dc942eBob Wilson MEMBARRIER_MCR, // Memory barrier (MCR) 94dfed19fe2c34c1209108afa58e8ab014ffd894e2Evan Cheng 95dfed19fe2c34c1209108afa58e8ab014ffd894e2Evan Cheng PRELOAD, // Preload 965adfba283dc0795ba005545ce38fa5b0ada14511Andrew Trick 975bafff36c798608a189c517d37527e4a38863071Bob Wilson VCEQ, // Vector compare equal. 98c24cb3551ed66830b53362f593269873cb53a0c4Owen Anderson VCEQZ, // Vector compare equal to zero. 995bafff36c798608a189c517d37527e4a38863071Bob Wilson VCGE, // Vector compare greater than or equal. 100c24cb3551ed66830b53362f593269873cb53a0c4Owen Anderson VCGEZ, // Vector compare greater than or equal to zero. 101c24cb3551ed66830b53362f593269873cb53a0c4Owen Anderson VCLEZ, // Vector compare less than or equal to zero. 1025bafff36c798608a189c517d37527e4a38863071Bob Wilson VCGEU, // Vector compare unsigned greater than or equal. 1035bafff36c798608a189c517d37527e4a38863071Bob Wilson VCGT, // Vector compare greater than. 104c24cb3551ed66830b53362f593269873cb53a0c4Owen Anderson VCGTZ, // Vector compare greater than zero. 105c24cb3551ed66830b53362f593269873cb53a0c4Owen Anderson VCLTZ, // Vector compare less than zero. 1065bafff36c798608a189c517d37527e4a38863071Bob Wilson VCGTU, // Vector compare unsigned greater than. 1075bafff36c798608a189c517d37527e4a38863071Bob Wilson VTST, // Vector test bits. 1085bafff36c798608a189c517d37527e4a38863071Bob Wilson 1095bafff36c798608a189c517d37527e4a38863071Bob Wilson // Vector shift by immediate: 1105bafff36c798608a189c517d37527e4a38863071Bob Wilson VSHL, // ...left 1115bafff36c798608a189c517d37527e4a38863071Bob Wilson VSHRs, // ...right (signed) 1125bafff36c798608a189c517d37527e4a38863071Bob Wilson VSHRu, // ...right (unsigned) 1135bafff36c798608a189c517d37527e4a38863071Bob Wilson VSHLLs, // ...left long (signed) 1145bafff36c798608a189c517d37527e4a38863071Bob Wilson VSHLLu, // ...left long (unsigned) 1155bafff36c798608a189c517d37527e4a38863071Bob Wilson VSHLLi, // ...left long (with maximum shift count) 1165bafff36c798608a189c517d37527e4a38863071Bob Wilson VSHRN, // ...right narrow 1175bafff36c798608a189c517d37527e4a38863071Bob Wilson 1185bafff36c798608a189c517d37527e4a38863071Bob Wilson // Vector rounding shift by immediate: 1195bafff36c798608a189c517d37527e4a38863071Bob Wilson VRSHRs, // ...right (signed) 1205bafff36c798608a189c517d37527e4a38863071Bob Wilson VRSHRu, // ...right (unsigned) 1215bafff36c798608a189c517d37527e4a38863071Bob Wilson VRSHRN, // ...right narrow 1225bafff36c798608a189c517d37527e4a38863071Bob Wilson 1235bafff36c798608a189c517d37527e4a38863071Bob Wilson // Vector saturating shift by immediate: 1245bafff36c798608a189c517d37527e4a38863071Bob Wilson VQSHLs, // ...left (signed) 1255bafff36c798608a189c517d37527e4a38863071Bob Wilson VQSHLu, // ...left (unsigned) 1265bafff36c798608a189c517d37527e4a38863071Bob Wilson VQSHLsu, // ...left (signed to unsigned) 1275bafff36c798608a189c517d37527e4a38863071Bob Wilson VQSHRNs, // ...right narrow (signed) 1285bafff36c798608a189c517d37527e4a38863071Bob Wilson VQSHRNu, // ...right narrow (unsigned) 1295bafff36c798608a189c517d37527e4a38863071Bob Wilson VQSHRNsu, // ...right narrow (signed to unsigned) 1305bafff36c798608a189c517d37527e4a38863071Bob Wilson 1315bafff36c798608a189c517d37527e4a38863071Bob Wilson // Vector saturating rounding shift by immediate: 1325bafff36c798608a189c517d37527e4a38863071Bob Wilson VQRSHRNs, // ...right narrow (signed) 1335bafff36c798608a189c517d37527e4a38863071Bob Wilson VQRSHRNu, // ...right narrow (unsigned) 1345bafff36c798608a189c517d37527e4a38863071Bob Wilson VQRSHRNsu, // ...right narrow (signed to unsigned) 1355bafff36c798608a189c517d37527e4a38863071Bob Wilson 1365bafff36c798608a189c517d37527e4a38863071Bob Wilson // Vector shift and insert: 1375bafff36c798608a189c517d37527e4a38863071Bob Wilson VSLI, // ...left 1385bafff36c798608a189c517d37527e4a38863071Bob Wilson VSRI, // ...right 1395bafff36c798608a189c517d37527e4a38863071Bob Wilson 1405bafff36c798608a189c517d37527e4a38863071Bob Wilson // Vector get lane (VMOV scalar to ARM core register) 1415bafff36c798608a189c517d37527e4a38863071Bob Wilson // (These are used for 8- and 16-bit element types only.) 1425bafff36c798608a189c517d37527e4a38863071Bob Wilson VGETLANEu, // zero-extend vector extract element 1435bafff36c798608a189c517d37527e4a38863071Bob Wilson VGETLANEs, // sign-extend vector extract element 1445bafff36c798608a189c517d37527e4a38863071Bob Wilson 1457e3f0d26908b82bc6a3699251e0d38821610bca7Bob Wilson // Vector move immediate and move negated immediate: 146cba270d042862bca213b812656a2181b0de0578eBob Wilson VMOVIMM, 1477e3f0d26908b82bc6a3699251e0d38821610bca7Bob Wilson VMVNIMM, 1487e3f0d26908b82bc6a3699251e0d38821610bca7Bob Wilson 1497e3f0d26908b82bc6a3699251e0d38821610bca7Bob Wilson // Vector duplicate: 150c1d287b4b73487b6ab094a253a7357addc1d8b84Bob Wilson VDUP, 1510ce371082565330672c276f76297f46b362d74b7Bob Wilson VDUPLANE, 152a599bff101095e528198ae85739fe8b97ffba82bBob Wilson 153d8e1757eacbcbae6657558f40fdada4279a9d1edBob Wilson // Vector shuffles: 154de95c1b88be44d4af916af8fba9d7940b7e98e32Bob Wilson VEXT, // extract 155d8e1757eacbcbae6657558f40fdada4279a9d1edBob Wilson VREV64, // reverse elements within 64-bit doublewords 156d8e1757eacbcbae6657558f40fdada4279a9d1edBob Wilson VREV32, // reverse elements within 32-bit words 1571c8e581832440a114c9587d41473d107de4cac74Anton Korobeynikov VREV16, // reverse elements within 16-bit halfwords 158c692cb77aaa8b16bcc7fe0c70d47adce94c43911Bob Wilson VZIP, // zip (interleave) 159c692cb77aaa8b16bcc7fe0c70d47adce94c43911Bob Wilson VUZP, // unzip (deinterleave) 1609f6c4c141ffa9c8b13e90dce2f2285c4479ff403Bob Wilson VTRN, // transpose 16169a05a7b9205fd4628ed614d1845f3879f6be949Bill Wendling VTBL1, // 1-register shuffle with mask 16269a05a7b9205fd4628ed614d1845f3879f6be949Bill Wendling VTBL2, // 2-register shuffle with mask 1639f6c4c141ffa9c8b13e90dce2f2285c4479ff403Bob Wilson 164d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson // Vector multiply long: 165d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson VMULLs, // ...signed 166d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson VMULLu, // ...unsigned 167d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson 16840cbe7d5d41d22d32e8ce773548f510fd1ee0ed9Bob Wilson // Operands of the standard BUILD_VECTOR node are not legalized, which 16940cbe7d5d41d22d32e8ce773548f510fd1ee0ed9Bob Wilson // is fine if BUILD_VECTORs are always lowered to shuffles or other 17040cbe7d5d41d22d32e8ce773548f510fd1ee0ed9Bob Wilson // operations, but for ARM some BUILD_VECTORs are legal as-is and their 17140cbe7d5d41d22d32e8ce773548f510fd1ee0ed9Bob Wilson // operands need to be legalized. Define an ARM-specific version of 17240cbe7d5d41d22d32e8ce773548f510fd1ee0ed9Bob Wilson // BUILD_VECTOR for this purpose. 17340cbe7d5d41d22d32e8ce773548f510fd1ee0ed9Bob Wilson BUILD_VECTOR, 17440cbe7d5d41d22d32e8ce773548f510fd1ee0ed9Bob Wilson 1759f6c4c141ffa9c8b13e90dce2f2285c4479ff403Bob Wilson // Floating-point max and min: 1769f6c4c141ffa9c8b13e90dce2f2285c4479ff403Bob Wilson FMAX, 177469bbdb597f27d6900c95b6d8ae20a45b79ce91bJim Grosbach FMIN, 178469bbdb597f27d6900c95b6d8ae20a45b79ce91bJim Grosbach 179469bbdb597f27d6900c95b6d8ae20a45b79ce91bJim Grosbach // Bit-field insert 180d966817f3cb87897cbec29c967b974924fe939baOwen Anderson BFI, 1815adfba283dc0795ba005545ce38fa5b0ada14511Andrew Trick 182d966817f3cb87897cbec29c967b974924fe939baOwen Anderson // Vector OR with immediate 183080c09229739ec2b13f7bccc361994a8d26b4ed2Owen Anderson VORRIMM, 184080c09229739ec2b13f7bccc361994a8d26b4ed2Owen Anderson // Vector AND with NOT of immediate 185b1dfa7a8e0c1972231bee636afd5239b009ba4daBob Wilson VBICIMM, 186b1dfa7a8e0c1972231bee636afd5239b009ba4daBob Wilson 187c0e6d780cd7a0935f545a0ec0a9ad4a6ae8db2a9Cameron Zwarich // Vector bitwise select 188c0e6d780cd7a0935f545a0ec0a9ad4a6ae8db2a9Cameron Zwarich VBSL, 189c0e6d780cd7a0935f545a0ec0a9ad4a6ae8db2a9Cameron Zwarich 190b1dfa7a8e0c1972231bee636afd5239b009ba4daBob Wilson // Vector load N-element structure to all lanes: 191b1dfa7a8e0c1972231bee636afd5239b009ba4daBob Wilson VLD2DUP = ISD::FIRST_TARGET_MEMORY_OPCODE, 192b1dfa7a8e0c1972231bee636afd5239b009ba4daBob Wilson VLD3DUP, 1931c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson VLD4DUP, 1941c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson 1951c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson // NEON loads with post-increment base updates: 1961c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson VLD1_UPD, 1971c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson VLD2_UPD, 1981c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson VLD3_UPD, 1991c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson VLD4_UPD, 2001c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson VLD2LN_UPD, 2011c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson VLD3LN_UPD, 2021c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson VLD4LN_UPD, 2031c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson VLD2DUP_UPD, 2041c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson VLD3DUP_UPD, 2051c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson VLD4DUP_UPD, 2061c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson 2071c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson // NEON stores with post-increment base updates: 2081c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson VST1_UPD, 2091c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson VST2_UPD, 2101c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson VST3_UPD, 2111c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson VST4_UPD, 2121c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson VST2LN_UPD, 2131c3ef90cab9a563427bdd3c2fcd875c717750562Bob Wilson VST3LN_UPD, 2142bdffe488203a08a2ca98548a157e0eaf39d4b2dEli Friedman VST4LN_UPD, 2152bdffe488203a08a2ca98548a157e0eaf39d4b2dEli Friedman 2162bdffe488203a08a2ca98548a157e0eaf39d4b2dEli Friedman // 64-bit atomic ops (value split into two registers) 2172bdffe488203a08a2ca98548a157e0eaf39d4b2dEli Friedman ATOMADD64_DAG, 2182bdffe488203a08a2ca98548a157e0eaf39d4b2dEli Friedman ATOMSUB64_DAG, 2192bdffe488203a08a2ca98548a157e0eaf39d4b2dEli Friedman ATOMOR64_DAG, 2202bdffe488203a08a2ca98548a157e0eaf39d4b2dEli Friedman ATOMXOR64_DAG, 2212bdffe488203a08a2ca98548a157e0eaf39d4b2dEli Friedman ATOMAND64_DAG, 2222bdffe488203a08a2ca98548a157e0eaf39d4b2dEli Friedman ATOMNAND64_DAG, 2232bdffe488203a08a2ca98548a157e0eaf39d4b2dEli Friedman ATOMSWAP64_DAG, 2242bdffe488203a08a2ca98548a157e0eaf39d4b2dEli Friedman ATOMCMPXCHG64_DAG 225a8e2989ece6dc46df59b0768184028257f913843Evan Cheng }; 226a8e2989ece6dc46df59b0768184028257f913843Evan Cheng } 227a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 2285bafff36c798608a189c517d37527e4a38863071Bob Wilson /// Define some predicates that are used for node matching. 2295bafff36c798608a189c517d37527e4a38863071Bob Wilson namespace ARM { 230469bbdb597f27d6900c95b6d8ae20a45b79ce91bJim Grosbach bool isBitFieldInvertedMask(unsigned v); 2315bafff36c798608a189c517d37527e4a38863071Bob Wilson } 2325bafff36c798608a189c517d37527e4a38863071Bob Wilson 233261f2a2337990bc7cc3d9e20d3338de54b26c74cBob Wilson //===--------------------------------------------------------------------===// 23480dae195c75a3ef38854645ae3cf41f8ae835644Dale Johannesen // ARMTargetLowering - ARM Implementation of the TargetLowering interface 2356aa7197fb5aa478a5c813d41a11689bb6d8f7abcJim Grosbach 236a8e2989ece6dc46df59b0768184028257f913843Evan Cheng class ARMTargetLowering : public TargetLowering { 237a8e2989ece6dc46df59b0768184028257f913843Evan Cheng public: 23861e729e2e9517ab2d8887bab86fb377900fa1081Dan Gohman explicit ARMTargetLowering(TargetMachine &TM); 239a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 240e1102caf86c8e09387ac7ee83aae4e69d2d35fc4Jim Grosbach virtual unsigned getJumpTableEncoding(void) const; 241e1102caf86c8e09387ac7ee83aae4e69d2d35fc4Jim Grosbach 242d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const; 2431607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands 2441607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands /// ReplaceNodeResults - Replace the results of node with an illegal result 2451607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands /// type with new values built out of custom code. 2461607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands /// 2471607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands virtual void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results, 248d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SelectionDAG &DAG) const; 2491607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands 250a8e2989ece6dc46df59b0768184028257f913843Evan Cheng virtual const char *getTargetNodeName(unsigned Opcode) const; 251a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 25228b77e968d2b01fc9da724762bd8ddcd80650e32Duncan Sands /// getSetCCResultType - Return the value type to use for ISD::SETCC. 25328b77e968d2b01fc9da724762bd8ddcd80650e32Duncan Sands virtual EVT getSetCCResultType(EVT VT) const; 25428b77e968d2b01fc9da724762bd8ddcd80650e32Duncan Sands 255af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman virtual MachineBasicBlock * 256af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman EmitInstrWithCustomInserter(MachineInstr *MI, 257af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman MachineBasicBlock *MBB) const; 258a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 25937fefc20d3a1e3934a377567d54a141f67752227Evan Cheng virtual void 26037fefc20d3a1e3934a377567d54a141f67752227Evan Cheng AdjustInstrPostInstrSelection(MachineInstr *MI, SDNode *Node) const; 26137fefc20d3a1e3934a377567d54a141f67752227Evan Cheng 262e721f5c8d3ea2cc2cc8c3c308ce8bdd8a3fc3b32Evan Cheng SDValue PerformCMOVCombine(SDNode *N, SelectionDAG &DAG) const; 26331959b19a72608051888160514977875a8027dfcEvan Cheng virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const; 26431959b19a72608051888160514977875a8027dfcEvan Cheng 26531959b19a72608051888160514977875a8027dfcEvan Cheng bool isDesirableToTransformToIntegerOp(unsigned Opc, EVT VT) const; 26631959b19a72608051888160514977875a8027dfcEvan Cheng 267af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling /// allowsUnalignedMemoryAccesses - Returns true if the target allows 268af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling /// unaligned memory accesses. of the specified type. 269af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling /// FIXME: Add getOptimalMemOpType to implement memcpy with NEON? 270af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling virtual bool allowsUnalignedMemoryAccesses(EVT VT) const; 271af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling 272c9addb74883fef318140272768422656a694341fChris Lattner /// isLegalAddressingMode - Return true if the addressing mode represented 273c9addb74883fef318140272768422656a694341fChris Lattner /// by AM is legal for this target, for a load/store of the specified type. 274db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty)const; 275e6c835f42418c0fae6b63908d3c576a26d64cab2Evan Cheng bool isLegalT2ScaledAddressingMode(const AddrMode &AM, EVT VT) const; 2766aa7197fb5aa478a5c813d41a11689bb6d8f7abcJim Grosbach 27777e4751011da2d6afa930ab91f7baee39e7c7e89Evan Cheng /// isLegalICmpImmediate - Return true if the specified immediate is legal 27818f30e6f5e80787808fe1455742452a5210afe07Jim Grosbach /// icmp immediate, that is the target has icmp instructions which can 27918f30e6f5e80787808fe1455742452a5210afe07Jim Grosbach /// compare a register against the immediate without having to materialize 28018f30e6f5e80787808fe1455742452a5210afe07Jim Grosbach /// the immediate into a register. 28106b53c0d51f029eb754b40350faf5ba4b33c4bcbEvan Cheng virtual bool isLegalICmpImmediate(int64_t Imm) const; 28277e4751011da2d6afa930ab91f7baee39e7c7e89Evan Cheng 283cca82149adef8306a295abdc963213ae3b11bbb6Dan Gohman /// isLegalAddImmediate - Return true if the specified immediate is legal 284cca82149adef8306a295abdc963213ae3b11bbb6Dan Gohman /// add immediate, that is the target has add instructions which can 285cca82149adef8306a295abdc963213ae3b11bbb6Dan Gohman /// add a register and the immediate without having to materialize 286cca82149adef8306a295abdc963213ae3b11bbb6Dan Gohman /// the immediate into a register. 287cca82149adef8306a295abdc963213ae3b11bbb6Dan Gohman virtual bool isLegalAddImmediate(int64_t Imm) const; 288cca82149adef8306a295abdc963213ae3b11bbb6Dan Gohman 289a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// getPreIndexedAddressParts - returns true by value, base pointer and 290a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// offset pointer and addressing mode by reference if the node's address 291a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// can be legally represented as pre-indexed load / store address. 292475871a144eb604ddaf37503397ba0941442e5fbDan Gohman virtual bool getPreIndexedAddressParts(SDNode *N, SDValue &Base, 293475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue &Offset, 294a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ISD::MemIndexedMode &AM, 29573e0914848662404cf2aa18eb049ff5aae543388Dan Gohman SelectionDAG &DAG) const; 296a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 297a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// getPostIndexedAddressParts - returns true by value, base pointer and 298a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// offset pointer and addressing mode by reference if this node can be 299a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// combined with a load / store to form a post-indexed load / store. 300a8e2989ece6dc46df59b0768184028257f913843Evan Cheng virtual bool getPostIndexedAddressParts(SDNode *N, SDNode *Op, 301475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue &Base, SDValue &Offset, 302a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ISD::MemIndexedMode &AM, 30373e0914848662404cf2aa18eb049ff5aae543388Dan Gohman SelectionDAG &DAG) const; 304a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 305475871a144eb604ddaf37503397ba0941442e5fbDan Gohman virtual void computeMaskedBitsForTargetNode(const SDValue Op, 306977a76fbb6ea1b87dfd7fbbe2ae2afb63e982ff3Dan Gohman const APInt &Mask, 3076aa7197fb5aa478a5c813d41a11689bb6d8f7abcJim Grosbach APInt &KnownZero, 308fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman APInt &KnownOne, 309ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman const SelectionDAG &DAG, 310a8e2989ece6dc46df59b0768184028257f913843Evan Cheng unsigned Depth) const; 311af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling 312af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling 31355d42003368c57d3a41c5f464d39b8440050d558Evan Cheng virtual bool ExpandInlineAsm(CallInst *CI) const; 31455d42003368c57d3a41c5f464d39b8440050d558Evan Cheng 3154234f57fa02b1f04a9f52a7b3c2aa22d32ac521cChris Lattner ConstraintType getConstraintType(const std::string &Constraint) const; 31644ab89eb376af838d1123293a79975aede501464John Thompson 31744ab89eb376af838d1123293a79975aede501464John Thompson /// Examine constraint string and operand type and determine a weight value. 31844ab89eb376af838d1123293a79975aede501464John Thompson /// The operand object must already have been set up with the operand type. 31944ab89eb376af838d1123293a79975aede501464John Thompson ConstraintWeight getSingleConstraintMatchWeight( 32044ab89eb376af838d1123293a79975aede501464John Thompson AsmOperandInfo &info, const char *constraint) const; 32144ab89eb376af838d1123293a79975aede501464John Thompson 3226aa7197fb5aa478a5c813d41a11689bb6d8f7abcJim Grosbach std::pair<unsigned, const TargetRegisterClass*> 323a8e2989ece6dc46df59b0768184028257f913843Evan Cheng getRegForInlineAsmConstraint(const std::string &Constraint, 324e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT VT) const; 325f1ba1cad387dc52f3c2c5afc665edf9caad00992Rafael Espindola 326bf6396bed0597238110aad5b680fd18a4f8769faBob Wilson /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops 327bf6396bed0597238110aad5b680fd18a4f8769faBob Wilson /// vector. If it is invalid, don't add anything to Ops. If hasMemory is 328bf6396bed0597238110aad5b680fd18a4f8769faBob Wilson /// true it means one of the asm constraint of the inline asm instruction 329bf6396bed0597238110aad5b680fd18a4f8769faBob Wilson /// being processed is 'm'. 330bf6396bed0597238110aad5b680fd18a4f8769faBob Wilson virtual void LowerAsmOperandForConstraint(SDValue Op, 331100c83341676d8aae8fc34b5452563ed08b14f3eEric Christopher std::string &Constraint, 332bf6396bed0597238110aad5b680fd18a4f8769faBob Wilson std::vector<SDValue> &Ops, 333bf6396bed0597238110aad5b680fd18a4f8769faBob Wilson SelectionDAG &DAG) const; 3346aa7197fb5aa478a5c813d41a11689bb6d8f7abcJim Grosbach 335419e4f92635cfaa409282691437aff99062e4e0bDan Gohman const ARMSubtarget* getSubtarget() const { 336707e0184233f27e0e9f9aee0309f2daab8cfe7f8Dan Gohman return Subtarget; 337f1ba1cad387dc52f3c2c5afc665edf9caad00992Rafael Espindola } 338f1ba1cad387dc52f3c2c5afc665edf9caad00992Rafael Espindola 33906b666c7056376b8aaf40be0dc00b97b2cfceb6cEvan Cheng /// getRegClassFor - Return the register class that should be used for the 34006b666c7056376b8aaf40be0dc00b97b2cfceb6cEvan Cheng /// specified value type. 34106b666c7056376b8aaf40be0dc00b97b2cfceb6cEvan Cheng virtual TargetRegisterClass *getRegClassFor(EVT VT) const; 34206b666c7056376b8aaf40be0dc00b97b2cfceb6cEvan Cheng 343cec36f4c1118dc8388910d4753fe7cbf88d2d793Anton Korobeynikov /// getMaximalGlobalOffset - Returns the maximal possible offset which can 344cec36f4c1118dc8388910d4753fe7cbf88d2d793Anton Korobeynikov /// be used for loads / stores from the global. 345cec36f4c1118dc8388910d4753fe7cbf88d2d793Anton Korobeynikov virtual unsigned getMaximalGlobalOffset() const; 346cec36f4c1118dc8388910d4753fe7cbf88d2d793Anton Korobeynikov 347ab695889c67fb499bd902e8a969d0ff02ce66788Eric Christopher /// createFastISel - This method returns a target specific FastISel object, 348ab695889c67fb499bd902e8a969d0ff02ce66788Eric Christopher /// or null if the target does not support "fast" ISel. 349ab695889c67fb499bd902e8a969d0ff02ce66788Eric Christopher virtual FastISel *createFastISel(FunctionLoweringInfo &funcInfo) const; 350ab695889c67fb499bd902e8a969d0ff02ce66788Eric Christopher 3511cc3984148be113c6e5e470f23c9ddbd37679c5fEvan Cheng Sched::Preference getSchedulingPreference(SDNode *N) const; 3521cc3984148be113c6e5e470f23c9ddbd37679c5fEvan Cheng 353d0ac234b1b3a88946ad8bb52677764f3e3eeb8b3Anton Korobeynikov bool isShuffleMaskLegal(const SmallVectorImpl<int> &M, EVT VT) const; 35448e19352840a5f7012493ead894e81a2dbec1778Anton Korobeynikov bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const; 35539382427f1095f089d73a7dd3d9a371dea75b781Evan Cheng 35639382427f1095f089d73a7dd3d9a371dea75b781Evan Cheng /// isFPImmLegal - Returns true if the target can instruction select the 35739382427f1095f089d73a7dd3d9a371dea75b781Evan Cheng /// specified FP immediate natively. If false, the legalizer will 35839382427f1095f089d73a7dd3d9a371dea75b781Evan Cheng /// materialize the FP immediate as a load from a constant pool. 35939382427f1095f089d73a7dd3d9a371dea75b781Evan Cheng virtual bool isFPImmLegal(const APFloat &Imm, EVT VT) const; 36039382427f1095f089d73a7dd3d9a371dea75b781Evan Cheng 36165ffec49f73d1f8856211b107712c58cc9636b78Bob Wilson virtual bool getTgtMemIntrinsic(IntrinsicInfo &Info, 36265ffec49f73d1f8856211b107712c58cc9636b78Bob Wilson const CallInst &I, 36365ffec49f73d1f8856211b107712c58cc9636b78Bob Wilson unsigned Intrinsic) const; 364d70f57b254114841892425a40944268d38ae0bcdEvan Cheng protected: 3654f6b4674be5473319ac5e70c76fd5cb964da2128Evan Cheng std::pair<const TargetRegisterClass*, uint8_t> 3664f6b4674be5473319ac5e70c76fd5cb964da2128Evan Cheng findRepresentativeClass(EVT VT) const; 367d70f57b254114841892425a40944268d38ae0bcdEvan Cheng 368a8e2989ece6dc46df59b0768184028257f913843Evan Cheng private: 369a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// Subtarget - Keep a pointer to the ARMSubtarget around so that we can 370a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// make the right decision when generating code for different targets. 371a8e2989ece6dc46df59b0768184028257f913843Evan Cheng const ARMSubtarget *Subtarget; 372a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 3733144687df78731ac4ddbc716a24b951678a73f57Evan Cheng const TargetRegisterInfo *RegInfo; 3743144687df78731ac4ddbc716a24b951678a73f57Evan Cheng 3753ef1c8759a20167457eb7fd82ebcaffe7ccaa1d1Evan Cheng const InstrItineraryData *Itins; 3763ef1c8759a20167457eb7fd82ebcaffe7ccaa1d1Evan Cheng 377d2559bf3f30cc7400483825414489ec0fb36481aBob Wilson /// ARMPCLabelIndex - Keep track of the number of ARM PC labels created. 378a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// 379a8e2989ece6dc46df59b0768184028257f913843Evan Cheng unsigned ARMPCLabelIndex; 380a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 381e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson void addTypeForNEON(EVT VT, EVT PromotedLdStVT, EVT PromotedBitwiseVT); 382e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson void addDRTypeForNEON(EVT VT); 383e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson void addQRTypeForNEON(EVT VT); 3845bafff36c798608a189c517d37527e4a38863071Bob Wilson 3855bafff36c798608a189c517d37527e4a38863071Bob Wilson typedef SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPassVector; 38698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman void PassF64ArgInRegs(DebugLoc dl, SelectionDAG &DAG, 3875bafff36c798608a189c517d37527e4a38863071Bob Wilson SDValue Chain, SDValue &Arg, 3885bafff36c798608a189c517d37527e4a38863071Bob Wilson RegsToPassVector &RegsToPass, 3895bafff36c798608a189c517d37527e4a38863071Bob Wilson CCValAssign &VA, CCValAssign &NextVA, 3905bafff36c798608a189c517d37527e4a38863071Bob Wilson SDValue &StackPtr, 3915bafff36c798608a189c517d37527e4a38863071Bob Wilson SmallVector<SDValue, 8> &MemOpChains, 392d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman ISD::ArgFlagsTy Flags) const; 3935bafff36c798608a189c517d37527e4a38863071Bob Wilson SDValue GetF64FormalArgument(CCValAssign &VA, CCValAssign &NextVA, 394d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue &Root, SelectionDAG &DAG, 395d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman DebugLoc dl) const; 3965bafff36c798608a189c517d37527e4a38863071Bob Wilson 39718f30e6f5e80787808fe1455742452a5210afe07Jim Grosbach CCAssignFn *CCAssignFnForNode(CallingConv::ID CC, bool Return, 39818f30e6f5e80787808fe1455742452a5210afe07Jim Grosbach bool isVarArg) const; 39998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue LowerMemOpCallTo(SDValue Chain, SDValue StackPtr, SDValue Arg, 40098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 40198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const CCValAssign &VA, 402d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman ISD::ArgFlagsTy Flags) const; 40323ff7cff52702a8bff904d8ab4c9ca67cc19d6caJim Grosbach SDValue LowerEH_SJLJ_SETJMP(SDValue Op, SelectionDAG &DAG) const; 4045eb195153950bc7ebfc30649494a78b2096b5ef8Jim Grosbach SDValue LowerEH_SJLJ_LONGJMP(SDValue Op, SelectionDAG &DAG) const; 405e4ad387a5a88dae20f0f7578e55170bbc8eee2a9Jim Grosbach SDValue LowerEH_SJLJ_DISPATCHSETUP(SDValue Op, SelectionDAG &DAG) const; 406a87ded2695e5bce30dbd0d2d2ac10c571bf1d161Jim Grosbach SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG, 407d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman const ARMSubtarget *Subtarget) const; 408d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const; 409d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerGlobalAddressDarwin(SDValue Op, SelectionDAG &DAG) const; 410d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerGlobalAddressELF(SDValue Op, SelectionDAG &DAG) const; 411d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const; 412475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerToTLSGeneralDynamicModel(GlobalAddressSDNode *GA, 413d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SelectionDAG &DAG) const; 414475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerToTLSExecModels(GlobalAddressSDNode *GA, 415d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SelectionDAG &DAG) const; 416d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerGLOBAL_OFFSET_TABLE(SDValue Op, SelectionDAG &DAG) const; 417d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const; 418de2b151dbf125af49717807b9cfc1f6f7a5b9ea6Bill Wendling SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const; 419d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const; 420d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const; 421515fe3a58877c745a922252a4492e866a2f1e42eEvan Cheng SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const; 4222457f2c66184e978d4ed8fa9e2128effff26cb0bEvan Cheng SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const; 423d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const; 424d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerShiftRightParts(SDValue Op, SelectionDAG &DAG) const; 425d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) const; 426d1fb583128c6682bb8a7c74eafa810a9270cc8dfNate Begeman SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) const; 4275adfba283dc0795ba005545ce38fa5b0ada14511Andrew Trick SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG, 42811a1dfffc8b6bbe0c0936c2c70681bc74bb5cd56Bob Wilson const ARMSubtarget *ST) const; 42911a1dfffc8b6bbe0c0936c2c70681bc74bb5cd56Bob Wilson 43011a1dfffc8b6bbe0c0936c2c70681bc74bb5cd56Bob Wilson SDValue ReconstructShuffle(SDValue Op, SelectionDAG &DAG) const; 431475871a144eb604ddaf37503397ba0941442e5fbDan Gohman 43298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue LowerCallResult(SDValue Chain, SDValue InFlag, 43365c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, 43498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 43598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 436d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SmallVectorImpl<SDValue> &InVals) const; 43798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 43898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman virtual SDValue 43998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman LowerFormalArguments(SDValue Chain, 44065c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, 44198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 44298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 443d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SmallVectorImpl<SDValue> &InVals) const; 44498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 445c73158730d43e7c8bdef32b2107566a6e78a8538Stuart Hastings void VarArgStyleRegisters(CCState &CCInfo, SelectionDAG &DAG, 446c73158730d43e7c8bdef32b2107566a6e78a8538Stuart Hastings DebugLoc dl, SDValue &Chain, unsigned ArgOffset) 447c73158730d43e7c8bdef32b2107566a6e78a8538Stuart Hastings const; 448c73158730d43e7c8bdef32b2107566a6e78a8538Stuart Hastings 449c73158730d43e7c8bdef32b2107566a6e78a8538Stuart Hastings void computeRegArea(CCState &CCInfo, MachineFunction &MF, 450c73158730d43e7c8bdef32b2107566a6e78a8538Stuart Hastings unsigned &VARegSize, unsigned &VARegSaveSize) const; 451c73158730d43e7c8bdef32b2107566a6e78a8538Stuart Hastings 45298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman virtual SDValue 453022d9e1cef7586a80a96446ae8691a37def9bbf4Evan Cheng LowerCall(SDValue Chain, SDValue Callee, 45465c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, 4550c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng bool &isTailCall, 45698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::OutputArg> &Outs, 457c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman const SmallVectorImpl<SDValue> &OutVals, 45898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 45998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 460d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SmallVectorImpl<SDValue> &InVals) const; 46198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 462f222e595c0137b8a9571408257f7000c2fb95473Stuart Hastings /// HandleByVal - Target-specific cleanup for ByVal support. 463c73158730d43e7c8bdef32b2107566a6e78a8538Stuart Hastings virtual void HandleByVal(CCState *, unsigned &) const; 464f222e595c0137b8a9571408257f7000c2fb95473Stuart Hastings 46551e28e634880849ed9f7c02e93c08d25dd70291bDale Johannesen /// IsEligibleForTailCallOptimization - Check whether the call is eligible 46651e28e634880849ed9f7c02e93c08d25dd70291bDale Johannesen /// for tail call optimization. Targets which want to do tail call 46751e28e634880849ed9f7c02e93c08d25dd70291bDale Johannesen /// optimization should implement this function. 46851e28e634880849ed9f7c02e93c08d25dd70291bDale Johannesen bool IsEligibleForTailCallOptimization(SDValue Callee, 46951e28e634880849ed9f7c02e93c08d25dd70291bDale Johannesen CallingConv::ID CalleeCC, 47051e28e634880849ed9f7c02e93c08d25dd70291bDale Johannesen bool isVarArg, 47151e28e634880849ed9f7c02e93c08d25dd70291bDale Johannesen bool isCalleeStructRet, 47251e28e634880849ed9f7c02e93c08d25dd70291bDale Johannesen bool isCallerStructRet, 47351e28e634880849ed9f7c02e93c08d25dd70291bDale Johannesen const SmallVectorImpl<ISD::OutputArg> &Outs, 474c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman const SmallVectorImpl<SDValue> &OutVals, 47551e28e634880849ed9f7c02e93c08d25dd70291bDale Johannesen const SmallVectorImpl<ISD::InputArg> &Ins, 47651e28e634880849ed9f7c02e93c08d25dd70291bDale Johannesen SelectionDAG& DAG) const; 47798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman virtual SDValue 47898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman LowerReturn(SDValue Chain, 47965c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, 48098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::OutputArg> &Outs, 481c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman const SmallVectorImpl<SDValue> &OutVals, 482d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman DebugLoc dl, SelectionDAG &DAG) const; 48306b53c0d51f029eb754b40350faf5ba4b33c4bcbEvan Cheng 4843d2125c9dbac695c93f42c0f59fd040e413fd711Evan Cheng virtual bool isUsedByReturnOnly(SDNode *N) const; 4853d2125c9dbac695c93f42c0f59fd040e413fd711Evan Cheng 486485fafc8406db8552ba5e3ff871a6ee32694ad90Evan Cheng virtual bool mayBeEmittedAsTailCall(CallInst *CI) const; 487485fafc8406db8552ba5e3ff871a6ee32694ad90Evan Cheng 48806b53c0d51f029eb754b40350faf5ba4b33c4bcbEvan Cheng SDValue getARMCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC, 489218977b53eb215e5534db2f727d109ab18817cc1Evan Cheng SDValue &ARMcc, SelectionDAG &DAG, DebugLoc dl) const; 490218977b53eb215e5534db2f727d109ab18817cc1Evan Cheng SDValue getVFPCmp(SDValue LHS, SDValue RHS, 491218977b53eb215e5534db2f727d109ab18817cc1Evan Cheng SelectionDAG &DAG, DebugLoc dl) const; 49279f56c9618e60c390932a6866929b82c9a6d6f96Bob Wilson SDValue duplicateCmp(SDValue Cmp, SelectionDAG &DAG) const; 493218977b53eb215e5534db2f727d109ab18817cc1Evan Cheng 494218977b53eb215e5534db2f727d109ab18817cc1Evan Cheng SDValue OptimizeVFPBrcond(SDValue Op, SelectionDAG &DAG) const; 4955278eb802fae2ee1a7b2a428596bc364d8bcd9dbJim Grosbach 496e801dc4a7b89f68f40ff2753de988c482d4d117fJim Grosbach MachineBasicBlock *EmitAtomicCmpSwap(MachineInstr *MI, 497e801dc4a7b89f68f40ff2753de988c482d4d117fJim Grosbach MachineBasicBlock *BB, 498e801dc4a7b89f68f40ff2753de988c482d4d117fJim Grosbach unsigned Size) const; 499e801dc4a7b89f68f40ff2753de988c482d4d117fJim Grosbach MachineBasicBlock *EmitAtomicBinary(MachineInstr *MI, 500e801dc4a7b89f68f40ff2753de988c482d4d117fJim Grosbach MachineBasicBlock *BB, 501e801dc4a7b89f68f40ff2753de988c482d4d117fJim Grosbach unsigned Size, 502e801dc4a7b89f68f40ff2753de988c482d4d117fJim Grosbach unsigned BinOpcode) const; 5032bdffe488203a08a2ca98548a157e0eaf39d4b2dEli Friedman MachineBasicBlock *EmitAtomicBinary64(MachineInstr *MI, 5042bdffe488203a08a2ca98548a157e0eaf39d4b2dEli Friedman MachineBasicBlock *BB, 5052bdffe488203a08a2ca98548a157e0eaf39d4b2dEli Friedman unsigned Op1, 5062bdffe488203a08a2ca98548a157e0eaf39d4b2dEli Friedman unsigned Op2, 5074d3f3294535a3b622c715f2d9675d4f3e86c3378Eli Friedman bool NeedsCarry = false, 5084d3f3294535a3b622c715f2d9675d4f3e86c3378Eli Friedman bool IsCmpxchg = false) const; 509f7da8821b4c491b1c2ce7ac2374e46d8abdba518Jim Grosbach MachineBasicBlock * EmitAtomicBinaryMinMax(MachineInstr *MI, 510f7da8821b4c491b1c2ce7ac2374e46d8abdba518Jim Grosbach MachineBasicBlock *BB, 511f7da8821b4c491b1c2ce7ac2374e46d8abdba518Jim Grosbach unsigned Size, 512f7da8821b4c491b1c2ce7ac2374e46d8abdba518Jim Grosbach bool signExtend, 513f7da8821b4c491b1c2ce7ac2374e46d8abdba518Jim Grosbach ARMCC::CondCodes Cond) const; 5145278eb802fae2ee1a7b2a428596bc364d8bcd9dbJim Grosbach 515f1083d4139720b41457528f81919d9587e442862Bill Wendling void EmitBasePointerRecalculation(MachineInstr *MI, MachineBasicBlock *MBB, 516f1083d4139720b41457528f81919d9587e442862Bill Wendling MachineBasicBlock *DispatchBB) const; 517f1083d4139720b41457528f81919d9587e442862Bill Wendling 518e29fa1df55584b6f07290a91e33bf742f1c549e4Bill Wendling void SetupEntryBlockForSjLj(MachineInstr *MI, 519e29fa1df55584b6f07290a91e33bf742f1c549e4Bill Wendling MachineBasicBlock *MBB, 520e29fa1df55584b6f07290a91e33bf742f1c549e4Bill Wendling MachineBasicBlock *DispatchBB, int FI) const; 521e29fa1df55584b6f07290a91e33bf742f1c549e4Bill Wendling 522f7e4aefd0f78441bef3b9eb683ecccbed9582b8aBill Wendling MachineBasicBlock *EmitSjLjDispatchBlock(MachineInstr *MI, 523f7e4aefd0f78441bef3b9eb683ecccbed9582b8aBill Wendling MachineBasicBlock *MBB) const; 524f7e4aefd0f78441bef3b9eb683ecccbed9582b8aBill Wendling 5251c3af779fc6b184204efd7e98dc16e475c251e7fAndrew Trick bool RemapAddSubWithFlags(MachineInstr *MI, MachineBasicBlock *BB) const; 526a8e2989ece6dc46df59b0768184028257f913843Evan Cheng }; 5275adfba283dc0795ba005545ce38fa5b0ada14511Andrew Trick 52836fa3ea566c66b42e4dd7b4394be2f1e071647b8Owen Anderson enum NEONModImmType { 52936fa3ea566c66b42e4dd7b4394be2f1e071647b8Owen Anderson VMOVModImm, 53036fa3ea566c66b42e4dd7b4394be2f1e071647b8Owen Anderson VMVNModImm, 53136fa3ea566c66b42e4dd7b4394be2f1e071647b8Owen Anderson OtherModImm 53236fa3ea566c66b42e4dd7b4394be2f1e071647b8Owen Anderson }; 5335adfba283dc0795ba005545ce38fa5b0ada14511Andrew Trick 5345adfba283dc0795ba005545ce38fa5b0ada14511Andrew Trick 535ab695889c67fb499bd902e8a969d0ff02ce66788Eric Christopher namespace ARM { 536ab695889c67fb499bd902e8a969d0ff02ce66788Eric Christopher FastISel *createFastISel(FunctionLoweringInfo &funcInfo); 537ab695889c67fb499bd902e8a969d0ff02ce66788Eric Christopher } 538a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} 539a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 540a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#endif // ARMISELLOWERING_H 541