blob: c6951ab67b08e14c89af0bfd2083629dfe58988c [file] [log] [blame]
Chris Lattner12e97302006-09-04 04:14:57 +00001//===-- PPC.h - Top-level interface for PowerPC Target ----------*- C++ -*-===//
Misha Brukmanb4402432005-04-21 23:30:14 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Misha Brukmanb4402432005-04-21 23:30:14 +00006//
Misha Brukmane05203f2004-06-21 16:55:25 +00007//===----------------------------------------------------------------------===//
8//
9// This file contains the entry points for global functions defined in the LLVM
10// PowerPC back-end.
11//
12//===----------------------------------------------------------------------===//
13
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000014#ifndef LLVM_LIB_TARGET_POWERPC_PPC_H
15#define LLVM_LIB_TARGET_POWERPC_PPC_H
Misha Brukmane05203f2004-06-21 16:55:25 +000016
Hiroshi Inoue51020282017-06-27 04:52:17 +000017#include "llvm/Support/CodeGen.h"
Chris Lattneraac9fa72010-11-15 08:49:58 +000018
Chris Lattner6be72602006-11-04 05:27:39 +000019// GCC #defines PPC on Linux but we use it as our namespace name
20#undef PPC
21
Misha Brukmane05203f2004-06-21 16:55:25 +000022namespace llvm {
Chris Lattner6be72602006-11-04 05:27:39 +000023 class PPCTargetMachine;
Hal Finkel174e5902014-03-25 23:29:21 +000024 class PassRegistry;
Chris Lattner6be72602006-11-04 05:27:39 +000025 class FunctionPass;
Chris Lattner5c1b0cd2010-11-14 21:12:33 +000026 class MachineInstr;
Tim Shencee75362017-09-22 18:30:02 +000027 class MachineOperand;
Chris Lattner5c1b0cd2010-11-14 21:12:33 +000028 class AsmPrinter;
Chris Lattner9ec375c2010-11-15 04:16:32 +000029 class MCInst;
Tim Shencee75362017-09-22 18:30:02 +000030 class MCOperand;
Craig Topperb25fda92012-03-17 18:46:09 +000031
Eric Christopherb16eacf2017-06-29 23:28:45 +000032 FunctionPass *createPPCCTRLoops();
Hal Finkel8ca38842013-05-20 16:08:17 +000033#ifndef NDEBUG
34 FunctionPass *createPPCCTRLoopsVerify();
35#endif
Hal Finkelc9dd0202015-02-05 18:43:00 +000036 FunctionPass *createPPCLoopPreIncPrepPass(PPCTargetMachine &TM);
Hal Finkel8340de12015-05-18 06:25:59 +000037 FunctionPass *createPPCTOCRegDepsPass();
Hal Finkelb5aa7e52013-04-08 16:24:03 +000038 FunctionPass *createPPCEarlyReturnPass();
Hal Finkel27774d92014-03-13 07:58:58 +000039 FunctionPass *createPPCVSXCopyPass();
Hal Finkel174e5902014-03-25 23:29:21 +000040 FunctionPass *createPPCVSXFMAMutatePass();
Bill Schmidtfe723b92015-04-27 19:57:34 +000041 FunctionPass *createPPCVSXSwapRemovalPass();
Nemanja Ivanovic6f590bf2017-12-13 14:47:35 +000042 FunctionPass *createPPCReduceCRLogicalsPass();
Bill Schmidt34af5e12015-11-10 21:38:26 +000043 FunctionPass *createPPCMIPeepholePass();
Chris Lattnerdd6df842010-11-15 03:13:19 +000044 FunctionPass *createPPCBranchSelectionPass();
Lei Huang34e66212017-09-12 18:39:11 +000045 FunctionPass *createPPCBranchCoalescingPass();
Hal Finkelfc353912016-03-31 20:39:41 +000046 FunctionPass *createPPCQPXLoadSplatPass();
Hiroshi Inoue51020282017-06-27 04:52:17 +000047 FunctionPass *createPPCISelDag(PPCTargetMachine &TM, CodeGenOpt::Level OL);
Bill Schmidt82f1c772015-02-10 19:09:05 +000048 FunctionPass *createPPCTLSDynamicCallPass();
Eric Christopher9fd267c2017-03-31 02:16:54 +000049 FunctionPass *createPPCBoolRetToIntPass();
Tony Jiang8e8c4442017-01-16 20:12:26 +000050 FunctionPass *createPPCExpandISELPass();
Nemanja Ivanovic6995e5d2017-12-15 07:27:53 +000051 FunctionPass *createPPCPreEmitPeepholePass();
Chris Lattnerdd6df842010-11-15 03:13:19 +000052 void LowerPPCMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI,
Ulrich Weigand266db7f2013-07-08 20:20:51 +000053 AsmPrinter &AP, bool isDarwin);
Tim Shencee75362017-09-22 18:30:02 +000054 bool LowerPPCMachineOperandToMCOperand(const MachineOperand &MO,
55 MCOperand &OutMO, AsmPrinter &AP,
56 bool isDarwin);
Hal Finkel4e5ca9e2013-01-25 23:05:59 +000057
Kang Zhang2446f842019-04-12 09:59:40 +000058 void initializePPCCTRLoopsPass(PassRegistry&);
59#ifndef NDEBUG
60 void initializePPCCTRLoopsVerifyPass(PassRegistry&);
61#endif
62 void initializePPCLoopPreIncPrepPass(PassRegistry&);
63 void initializePPCTOCRegDepsPass(PassRegistry&);
64 void initializePPCEarlyReturnPass(PassRegistry&);
65 void initializePPCVSXCopyPass(PassRegistry&);
Hal Finkel174e5902014-03-25 23:29:21 +000066 void initializePPCVSXFMAMutatePass(PassRegistry&);
Kang Zhang2446f842019-04-12 09:59:40 +000067 void initializePPCVSXSwapRemovalPass(PassRegistry&);
68 void initializePPCReduceCRLogicalsPass(PassRegistry&);
69 void initializePPCBSelPass(PassRegistry&);
70 void initializePPCBranchCoalescingPass(PassRegistry&);
71 void initializePPCQPXLoadSplatPass(PassRegistry&);
Kit Bartona1c712f2015-12-07 20:50:29 +000072 void initializePPCBoolRetToIntPass(PassRegistry&);
Tony Jiang8e8c4442017-01-16 20:12:26 +000073 void initializePPCExpandISELPass(PassRegistry &);
Nemanja Ivanovic6995e5d2017-12-15 07:27:53 +000074 void initializePPCPreEmitPeepholePass(PassRegistry &);
Hiroshi Inoue6989caa2017-06-29 14:13:38 +000075 void initializePPCTLSDynamicCallPass(PassRegistry &);
Nemanja Ivanovic6995e5d2017-12-15 07:27:53 +000076 void initializePPCMIPeepholePass(PassRegistry&);
Kang Zhang2446f842019-04-12 09:59:40 +000077
Hal Finkel174e5902014-03-25 23:29:21 +000078 extern char &PPCVSXFMAMutateID;
79
Chris Lattnerdf8e17d2010-11-14 23:42:06 +000080 namespace PPCII {
Fangrui Songf78650a2018-07-30 19:41:25 +000081
Chris Lattnerdf8e17d2010-11-14 23:42:06 +000082 /// Target Operand Flag enum.
83 enum TOF {
84 //===------------------------------------------------------------------===//
85 // PPC Specific MachineOperand flags.
86 MO_NO_FLAG,
Rafael Espindolaa99ccfc2016-06-29 14:59:50 +000087
88 /// On a symbol operand "FOO", this indicates that the reference is actually
89 /// to "FOO@plt". This is used for calls and jumps to external functions on
Hal Finkel3ee2af72014-07-18 23:29:49 +000090 /// for PIC calls on Linux and ELF systems.
Rafael Espindolaa99ccfc2016-06-29 14:59:50 +000091 MO_PLT = 1,
92
Chris Lattnerdd6df842010-11-15 03:13:19 +000093 /// MO_PIC_FLAG - If this bit is set, the symbol reference is relative to
94 /// the function's picbase, e.g. lo16(symbol-picbase).
Bill Schmidt3822ef22013-02-21 00:05:29 +000095 MO_PIC_FLAG = 2,
Chris Lattnerdd6df842010-11-15 03:13:19 +000096
97 /// MO_NLP_FLAG - If this bit is set, the symbol reference is actually to
98 /// the non_lazy_ptr for the global, e.g. lo16(symbol$non_lazy_ptr-picbase).
Bill Schmidt3822ef22013-02-21 00:05:29 +000099 MO_NLP_FLAG = 4,
Rafael Espindolaa99ccfc2016-06-29 14:59:50 +0000100
Chris Lattnerdd6df842010-11-15 03:13:19 +0000101 /// MO_NLP_HIDDEN_FLAG - If this bit is set, the symbol reference is to a
102 /// symbol with hidden visibility. This causes a different kind of
103 /// non-lazy-pointer to be generated.
Bill Schmidt3822ef22013-02-21 00:05:29 +0000104 MO_NLP_HIDDEN_FLAG = 8,
Roman Divackye3f15c982012-06-04 17:36:38 +0000105
106 /// The next are not flags but distinct values.
Bill Schmidt3822ef22013-02-21 00:05:29 +0000107 MO_ACCESS_MASK = 0xf0,
Roman Divackye3f15c982012-06-04 17:36:38 +0000108
Ulrich Weigandd51c09f2013-06-21 14:42:20 +0000109 /// MO_LO, MO_HA - lo16(symbol) and ha16(symbol)
110 MO_LO = 1 << 4,
111 MO_HA = 2 << 4,
Roman Divackye3f15c982012-06-04 17:36:38 +0000112
Ulrich Weigandd51c09f2013-06-21 14:42:20 +0000113 MO_TPREL_LO = 4 << 4,
114 MO_TPREL_HA = 3 << 4,
Bill Schmidt3822ef22013-02-21 00:05:29 +0000115
116 /// These values identify relocations on immediates folded
117 /// into memory operations.
Ulrich Weigandd51c09f2013-06-21 14:42:20 +0000118 MO_DTPREL_LO = 5 << 4,
Rafael Espindolaa99ccfc2016-06-29 14:59:50 +0000119 MO_TLSLD_LO = 6 << 4,
120 MO_TOC_LO = 7 << 4,
Ulrich Weigand5b427592013-07-05 12:22:36 +0000121
122 // Symbol for VK_PPC_TLS fixup attached to an ADD instruction
Rafael Espindolaa99ccfc2016-06-29 14:59:50 +0000123 MO_TLS = 8 << 4
Chris Lattnerdf8e17d2010-11-14 23:42:06 +0000124 };
125 } // end namespace PPCII
Fangrui Songf78650a2018-07-30 19:41:25 +0000126
Alexander Kornienkof00654e2015-06-23 09:49:53 +0000127} // end namespace llvm;
Misha Brukmane05203f2004-06-21 16:55:25 +0000128
Misha Brukmane05203f2004-06-21 16:55:25 +0000129#endif