2011-07-07 06:02:34 +08:00
|
|
|
//===-- ARMMCTargetDesc.h - ARM Target Descriptions -------------*- C++ -*-===//
|
|
|
|
//
|
2019-01-19 16:50:56 +08:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2011-07-07 06:02:34 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file provides ARM specific target descriptions.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2014-08-14 00:26:38 +08:00
|
|
|
#ifndef LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMMCTARGETDESC_H
|
|
|
|
#define LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMMCTARGETDESC_H
|
2011-07-07 06:02:34 +08:00
|
|
|
|
2011-07-23 09:16:22 +08:00
|
|
|
#include "llvm/Support/DataTypes.h"
|
[ARM] Set up infrastructure for MVE vector instructions.
This commit prepares the way to start adding the main collection of
MVE instructions, which operate on the 128-bit vector registers.
The most obvious thing that's needed, and the simplest, is to add the
MQPR register class, which is like the existing QPR except that it has
fewer registers in it.
The more complicated part: MVE defines a system of vector predication,
in which instructions operating on 128-bit vector registers can be
constrained to operate on only a subset of the lanes, using a system
of prefix instructions similar to the existing Thumb IT, in that you
have one prefix instruction which designates up to 4 following
instructions as subject to predication, and within that sequence, the
predicate can be inverted by means of T/E suffixes ('Then' / 'Else').
To support instructions of this type, we've added two new Tablegen
classes `vpred_n` and `vpred_r` for standard clusters of MC operands
to add to a predicated instruction. Both include a flag indicating how
the instruction is predicated at all (options are T, E and 'not
predicated'), and an input register field for the register controlling
the set of active lanes. They differ from each other in that `vpred_r`
also includes an input operand for the previous value of the output
register, for instructions that leave inactive lanes unchanged.
`vpred_n` lacks that extra operand; it will be used for instructions
that don't preserve inactive lanes in their output register (either
because inactive lanes are zeroed, as the MVE load instructions do, or
because the output register isn't a vector at all).
This commit also adds the family of prefix instructions themselves
(VPT / VPST), and all the machinery needed to work with them in
assembly and disassembly (e.g. generating the 't' and 'e' mnemonic
suffixes on disassembled instructions within a predicated block)
I've added a couple of demo instructions that derive from the new
Tablegen base classes and use those two operand clusters. The bulk of
the vector instructions will come in followup commits small enough to
be manageable. (One exception is that I've added the full version of
`isMnemonicVPTPredicable` in the AsmParser, because it seemed
pointless to carefully split it up.)
Reviewers: dmgreen, samparker, SjoerdMeijer, t.p.northover
Subscribers: javed.absar, kristof.beyls, hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D62669
llvm-svn: 363258
2019-06-13 21:11:13 +08:00
|
|
|
#include "llvm/MC/MCInstrDesc.h"
|
2017-10-11 00:59:01 +08:00
|
|
|
#include <memory>
|
2011-07-07 08:08:19 +08:00
|
|
|
#include <string>
|
|
|
|
|
2011-07-07 06:02:34 +08:00
|
|
|
namespace llvm {
|
2013-10-08 21:08:17 +08:00
|
|
|
class formatted_raw_ostream;
|
2011-07-26 07:24:55 +08:00
|
|
|
class MCAsmBackend;
|
2011-07-23 08:00:19 +08:00
|
|
|
class MCCodeEmitter;
|
|
|
|
class MCContext;
|
|
|
|
class MCInstrInfo;
|
2013-10-08 21:08:17 +08:00
|
|
|
class MCInstPrinter;
|
2018-05-22 03:20:29 +08:00
|
|
|
class MCObjectTargetWriter;
|
2011-07-23 08:00:19 +08:00
|
|
|
class MCObjectWriter;
|
2012-05-16 01:35:52 +08:00
|
|
|
class MCRegisterInfo;
|
2011-07-08 09:53:10 +08:00
|
|
|
class MCSubtargetInfo;
|
2013-10-08 21:08:17 +08:00
|
|
|
class MCStreamer;
|
2016-07-26 01:18:28 +08:00
|
|
|
class MCTargetOptions;
|
Add MCSymbolizer for symbolic/annotated disassembly.
This is a basic first step towards symbolization of disassembled
instructions. This used to be done using externally provided (C API)
callbacks. This patch introduces:
- the MCSymbolizer class, that mimics the same functions that were used
in the X86 and ARM disassemblers to symbolize immediate operands and
to annotate loads based off PC (for things like c string literals).
- the MCExternalSymbolizer class, which implements the old C API.
- the MCRelocationInfo class, which provides a way for targets to
translate relocations (either object::RelocationRef, or disassembler
C API VariantKinds) to MCExprs.
- the MCObjectSymbolizer class, which does symbolization using what it
finds in an object::ObjectFile. This makes simple symbolization (with
no fancy relocation stuff) work for all object formats!
- x86-64 Mach-O and ELF MCRelocationInfos.
- A basic ARM Mach-O MCRelocationInfo, that provides just enough to
support the C API VariantKinds.
Most of what works in otool (the only user of the old symbolization API
that I know of) for x86-64 symbolic disassembly (-tvV) works, namely:
- symbol references: call _foo; jmp 15 <_foo+50>
- relocations: call _foo-_bar; call _foo-4
- __cf?string: leaq 193(%rip), %rax ## literal pool for "hello"
Stub support is the main missing part (because libObject doesn't know,
among other things, about mach-o indirect symbols).
As for the MCSymbolizer API, instead of relying on the disassemblers
to call the tryAdding* methods, maybe this could be done automagically
using InstrInfo? For instance, even though PC-relative LEAs are used
to get the address of string literals in a typical Mach-O file, a MOV
would be used in an ELF file. And right now, the explicit symbolization
only recognizes PC-relative LEAs. InstrInfo should have already have
most of what is needed to know what to symbolize, so this can
definitely be improved.
I'd also like to remove object::RelocationRef::getValueString (it seems
only used by relocation printing in objdump), as simply printing the
created MCExpr is definitely enough (and cleaner than string concats).
llvm-svn: 182625
2013-05-24 08:39:57 +08:00
|
|
|
class MCRelocationInfo;
|
2015-02-19 08:45:02 +08:00
|
|
|
class MCTargetStreamer;
|
2011-07-07 08:08:19 +08:00
|
|
|
class StringRef;
|
2011-07-23 08:00:19 +08:00
|
|
|
class Target;
|
2015-09-16 00:17:27 +08:00
|
|
|
class Triple;
|
2011-07-23 08:00:19 +08:00
|
|
|
class raw_ostream;
|
2015-04-15 06:14:34 +08:00
|
|
|
class raw_pwrite_stream;
|
2011-07-07 06:02:34 +08:00
|
|
|
|
2011-07-07 08:08:19 +08:00
|
|
|
namespace ARM_MC {
|
2015-09-16 00:17:27 +08:00
|
|
|
std::string ParseARMTriple(const Triple &TT, StringRef CPU);
|
2011-07-08 09:53:10 +08:00
|
|
|
|
2015-06-10 20:11:26 +08:00
|
|
|
/// Create a ARM MCSubtargetInfo instance. This is exposed so Asm parser, etc.
|
|
|
|
/// do not need to go through TargetRegistry.
|
2015-09-16 00:17:27 +08:00
|
|
|
MCSubtargetInfo *createARMMCSubtargetInfo(const Triple &TT, StringRef CPU,
|
2015-06-10 20:11:26 +08:00
|
|
|
StringRef FS);
|
2011-07-07 08:08:19 +08:00
|
|
|
}
|
|
|
|
|
2015-02-19 08:45:02 +08:00
|
|
|
MCTargetStreamer *createARMNullTargetStreamer(MCStreamer &S);
|
2015-03-17 05:43:42 +08:00
|
|
|
MCTargetStreamer *createARMTargetAsmStreamer(MCStreamer &S,
|
|
|
|
formatted_raw_ostream &OS,
|
|
|
|
MCInstPrinter *InstPrint,
|
|
|
|
bool isVerboseAsm);
|
2015-03-19 09:50:16 +08:00
|
|
|
MCTargetStreamer *createARMObjectTargetStreamer(MCStreamer &S,
|
|
|
|
const MCSubtargetInfo &STI);
|
2015-02-19 08:45:02 +08:00
|
|
|
|
2014-04-01 23:19:30 +08:00
|
|
|
MCCodeEmitter *createARMLEMCCodeEmitter(const MCInstrInfo &MCII,
|
2014-03-28 22:35:30 +08:00
|
|
|
const MCRegisterInfo &MRI,
|
|
|
|
MCContext &Ctx);
|
|
|
|
|
2014-04-01 23:19:30 +08:00
|
|
|
MCCodeEmitter *createARMBEMCCodeEmitter(const MCInstrInfo &MCII,
|
2014-03-28 22:35:30 +08:00
|
|
|
const MCRegisterInfo &MRI,
|
|
|
|
MCContext &Ctx);
|
2011-07-23 08:00:19 +08:00
|
|
|
|
2018-01-03 16:53:05 +08:00
|
|
|
MCAsmBackend *createARMLEAsmBackend(const Target &T, const MCSubtargetInfo &STI,
|
|
|
|
const MCRegisterInfo &MRI,
|
2016-07-26 01:18:28 +08:00
|
|
|
const MCTargetOptions &Options);
|
2014-03-28 22:35:30 +08:00
|
|
|
|
2018-01-03 16:53:05 +08:00
|
|
|
MCAsmBackend *createARMBEAsmBackend(const Target &T, const MCSubtargetInfo &STI,
|
|
|
|
const MCRegisterInfo &MRI,
|
2016-07-26 01:18:28 +08:00
|
|
|
const MCTargetOptions &Options);
|
2011-07-23 08:00:19 +08:00
|
|
|
|
2015-03-19 09:50:16 +08:00
|
|
|
// Construct a PE/COFF machine code streamer which will generate a PE/COFF
|
|
|
|
// object file.
|
2017-10-11 09:57:21 +08:00
|
|
|
MCStreamer *createARMWinCOFFStreamer(MCContext &Context,
|
|
|
|
std::unique_ptr<MCAsmBackend> &&MAB,
|
2018-05-19 02:26:45 +08:00
|
|
|
std::unique_ptr<MCObjectWriter> &&OW,
|
2017-10-12 07:34:47 +08:00
|
|
|
std::unique_ptr<MCCodeEmitter> &&Emitter,
|
|
|
|
bool RelaxAll,
|
2015-12-22 06:09:27 +08:00
|
|
|
bool IncrementalLinkerCompatible);
|
2014-04-27 11:48:22 +08:00
|
|
|
|
2015-04-10 01:10:57 +08:00
|
|
|
/// Construct an ELF Mach-O object writer.
|
2018-05-22 03:20:29 +08:00
|
|
|
std::unique_ptr<MCObjectTargetWriter> createARMELFObjectWriter(uint8_t OSABI);
|
2011-12-22 08:37:50 +08:00
|
|
|
|
2015-04-10 01:10:57 +08:00
|
|
|
/// Construct an ARM Mach-O object writer.
|
2018-05-22 03:20:29 +08:00
|
|
|
std::unique_ptr<MCObjectTargetWriter>
|
|
|
|
createARMMachObjectWriter(bool Is64Bit, uint32_t CPUType,
|
|
|
|
uint32_t CPUSubtype);
|
2011-07-23 08:00:19 +08:00
|
|
|
|
2015-04-10 01:10:57 +08:00
|
|
|
/// Construct an ARM PE/COFF object writer.
|
2018-05-22 03:20:29 +08:00
|
|
|
std::unique_ptr<MCObjectTargetWriter>
|
|
|
|
createARMWinCOFFObjectWriter(bool Is64Bit);
|
Add MCSymbolizer for symbolic/annotated disassembly.
This is a basic first step towards symbolization of disassembled
instructions. This used to be done using externally provided (C API)
callbacks. This patch introduces:
- the MCSymbolizer class, that mimics the same functions that were used
in the X86 and ARM disassemblers to symbolize immediate operands and
to annotate loads based off PC (for things like c string literals).
- the MCExternalSymbolizer class, which implements the old C API.
- the MCRelocationInfo class, which provides a way for targets to
translate relocations (either object::RelocationRef, or disassembler
C API VariantKinds) to MCExprs.
- the MCObjectSymbolizer class, which does symbolization using what it
finds in an object::ObjectFile. This makes simple symbolization (with
no fancy relocation stuff) work for all object formats!
- x86-64 Mach-O and ELF MCRelocationInfos.
- A basic ARM Mach-O MCRelocationInfo, that provides just enough to
support the C API VariantKinds.
Most of what works in otool (the only user of the old symbolization API
that I know of) for x86-64 symbolic disassembly (-tvV) works, namely:
- symbol references: call _foo; jmp 15 <_foo+50>
- relocations: call _foo-_bar; call _foo-4
- __cf?string: leaq 193(%rip), %rax ## literal pool for "hello"
Stub support is the main missing part (because libObject doesn't know,
among other things, about mach-o indirect symbols).
As for the MCSymbolizer API, instead of relying on the disassemblers
to call the tryAdding* methods, maybe this could be done automagically
using InstrInfo? For instance, even though PC-relative LEAs are used
to get the address of string literals in a typical Mach-O file, a MOV
would be used in an ELF file. And right now, the explicit symbolization
only recognizes PC-relative LEAs. InstrInfo should have already have
most of what is needed to know what to symbolize, so this can
definitely be improved.
I'd also like to remove object::RelocationRef::getValueString (it seems
only used by relocation printing in objdump), as simply printing the
created MCExpr is definitely enough (and cleaner than string concats).
llvm-svn: 182625
2013-05-24 08:39:57 +08:00
|
|
|
|
2015-04-10 01:10:57 +08:00
|
|
|
/// Construct ARM Mach-O relocation info.
|
Add MCSymbolizer for symbolic/annotated disassembly.
This is a basic first step towards symbolization of disassembled
instructions. This used to be done using externally provided (C API)
callbacks. This patch introduces:
- the MCSymbolizer class, that mimics the same functions that were used
in the X86 and ARM disassemblers to symbolize immediate operands and
to annotate loads based off PC (for things like c string literals).
- the MCExternalSymbolizer class, which implements the old C API.
- the MCRelocationInfo class, which provides a way for targets to
translate relocations (either object::RelocationRef, or disassembler
C API VariantKinds) to MCExprs.
- the MCObjectSymbolizer class, which does symbolization using what it
finds in an object::ObjectFile. This makes simple symbolization (with
no fancy relocation stuff) work for all object formats!
- x86-64 Mach-O and ELF MCRelocationInfos.
- A basic ARM Mach-O MCRelocationInfo, that provides just enough to
support the C API VariantKinds.
Most of what works in otool (the only user of the old symbolization API
that I know of) for x86-64 symbolic disassembly (-tvV) works, namely:
- symbol references: call _foo; jmp 15 <_foo+50>
- relocations: call _foo-_bar; call _foo-4
- __cf?string: leaq 193(%rip), %rax ## literal pool for "hello"
Stub support is the main missing part (because libObject doesn't know,
among other things, about mach-o indirect symbols).
As for the MCSymbolizer API, instead of relying on the disassemblers
to call the tryAdding* methods, maybe this could be done automagically
using InstrInfo? For instance, even though PC-relative LEAs are used
to get the address of string literals in a typical Mach-O file, a MOV
would be used in an ELF file. And right now, the explicit symbolization
only recognizes PC-relative LEAs. InstrInfo should have already have
most of what is needed to know what to symbolize, so this can
definitely be improved.
I'd also like to remove object::RelocationRef::getValueString (it seems
only used by relocation printing in objdump), as simply printing the
created MCExpr is definitely enough (and cleaner than string concats).
llvm-svn: 182625
2013-05-24 08:39:57 +08:00
|
|
|
MCRelocationInfo *createARMMachORelocationInfo(MCContext &Ctx);
|
[ARM] Set up infrastructure for MVE vector instructions.
This commit prepares the way to start adding the main collection of
MVE instructions, which operate on the 128-bit vector registers.
The most obvious thing that's needed, and the simplest, is to add the
MQPR register class, which is like the existing QPR except that it has
fewer registers in it.
The more complicated part: MVE defines a system of vector predication,
in which instructions operating on 128-bit vector registers can be
constrained to operate on only a subset of the lanes, using a system
of prefix instructions similar to the existing Thumb IT, in that you
have one prefix instruction which designates up to 4 following
instructions as subject to predication, and within that sequence, the
predicate can be inverted by means of T/E suffixes ('Then' / 'Else').
To support instructions of this type, we've added two new Tablegen
classes `vpred_n` and `vpred_r` for standard clusters of MC operands
to add to a predicated instruction. Both include a flag indicating how
the instruction is predicated at all (options are T, E and 'not
predicated'), and an input register field for the register controlling
the set of active lanes. They differ from each other in that `vpred_r`
also includes an input operand for the previous value of the output
register, for instructions that leave inactive lanes unchanged.
`vpred_n` lacks that extra operand; it will be used for instructions
that don't preserve inactive lanes in their output register (either
because inactive lanes are zeroed, as the MVE load instructions do, or
because the output register isn't a vector at all).
This commit also adds the family of prefix instructions themselves
(VPT / VPST), and all the machinery needed to work with them in
assembly and disassembly (e.g. generating the 't' and 'e' mnemonic
suffixes on disassembled instructions within a predicated block)
I've added a couple of demo instructions that derive from the new
Tablegen base classes and use those two operand clusters. The bulk of
the vector instructions will come in followup commits small enough to
be manageable. (One exception is that I've added the full version of
`isMnemonicVPTPredicable` in the AsmParser, because it seemed
pointless to carefully split it up.)
Reviewers: dmgreen, samparker, SjoerdMeijer, t.p.northover
Subscribers: javed.absar, kristof.beyls, hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D62669
llvm-svn: 363258
2019-06-13 21:11:13 +08:00
|
|
|
|
|
|
|
namespace ARM {
|
|
|
|
enum OperandType {
|
|
|
|
OPERAND_VPRED_R = MCOI::OPERAND_FIRST_TARGET,
|
|
|
|
OPERAND_VPRED_N,
|
|
|
|
};
|
|
|
|
inline bool isVpred(OperandType op) {
|
|
|
|
return op == OPERAND_VPRED_R || op == OPERAND_VPRED_N;
|
|
|
|
}
|
|
|
|
inline bool isVpred(uint8_t op) {
|
|
|
|
return isVpred(static_cast<OperandType>(op));
|
|
|
|
}
|
|
|
|
} // end namespace ARM
|
|
|
|
|
2015-06-23 17:49:53 +08:00
|
|
|
} // End llvm namespace
|
2011-07-07 06:02:34 +08:00
|
|
|
|
|
|
|
// Defines symbolic names for ARM registers. This defines a mapping from
|
|
|
|
// register name to register number.
|
|
|
|
//
|
|
|
|
#define GET_REGINFO_ENUM
|
|
|
|
#include "ARMGenRegisterInfo.inc"
|
|
|
|
|
|
|
|
// Defines symbolic names for the ARM instructions.
|
|
|
|
//
|
|
|
|
#define GET_INSTRINFO_ENUM
|
|
|
|
#include "ARMGenInstrInfo.inc"
|
|
|
|
|
2011-07-15 04:59:42 +08:00
|
|
|
#define GET_SUBTARGETINFO_ENUM
|
|
|
|
#include "ARMGenSubtargetInfo.inc"
|
|
|
|
|
2011-07-07 06:02:34 +08:00
|
|
|
#endif
|