MipsABIFlagsSection.h revision 37ed9c199ca639565f6ce88105f9e39e898d82d0
1c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines//===-- MipsABIFlagsSection.h - Mips ELF ABI Flags Section -----*- C++ -*--===//
2c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines//
3c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines//                     The LLVM Compiler Infrastructure
4c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines//
5c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// This file is distributed under the University of Illinois Open Source
6c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// License. See LICENSE.TXT for details.
7c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines//
8c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines//===----------------------------------------------------------------------===//
9c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
1037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSABIFLAGSSECTION_H
1137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSABIFLAGSSECTION_H
12c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
13c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "llvm/MC/MCStreamer.h"
14c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
15c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesnamespace llvm {
16c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
17c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesclass MCStreamer;
18c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
19c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesstruct MipsABIFlagsSection {
20c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // Values for the xxx_size bytes of an ABI flags structure.
21c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  enum AFL_REG {
22c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_REG_NONE = 0x00, // No registers.
23c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_REG_32 = 0x01,   // 32-bit registers.
24c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_REG_64 = 0x02,   // 64-bit registers.
25c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_REG_128 = 0x03   // 128-bit registers.
26c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  };
27c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
28c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // Masks for the ases word of an ABI flags structure.
29c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  enum AFL_ASE {
30c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_ASE_DSP = 0x00000001,       // DSP ASE.
31c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_ASE_DSPR2 = 0x00000002,     // DSP R2 ASE.
32c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_ASE_EVA = 0x00000004,       // Enhanced VA Scheme.
33c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_ASE_MCU = 0x00000008,       // MCU (MicroController) ASE.
34c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_ASE_MDMX = 0x00000010,      // MDMX ASE.
35c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_ASE_MIPS3D = 0x00000020,    // MIPS-3D ASE.
36c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_ASE_MT = 0x00000040,        // MT ASE.
37c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_ASE_SMARTMIPS = 0x00000080, // SmartMIPS ASE.
38c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_ASE_VIRT = 0x00000100,      // VZ ASE.
39c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_ASE_MSA = 0x00000200,       // MSA ASE.
40c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_ASE_MIPS16 = 0x00000400,    // MIPS16 ASE.
41c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_ASE_MICROMIPS = 0x00000800, // MICROMIPS ASE.
42c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_ASE_XPA = 0x00001000        // XPA ASE.
43c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  };
44c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
45c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // Values for the isa_ext word of an ABI flags structure.
46c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  enum AFL_EXT {
47c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_EXT_XLR = 1,          // RMI Xlr instruction.
48c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_EXT_OCTEON2 = 2,      // Cavium Networks Octeon2.
49c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_EXT_OCTEONP = 3,      // Cavium Networks OcteonP.
50c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_EXT_LOONGSON_3A = 4,  // Loongson 3A.
51c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_EXT_OCTEON = 5,       // Cavium Networks Octeon.
52c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_EXT_5900 = 6,         // MIPS R5900 instruction.
53c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_EXT_4650 = 7,         // MIPS R4650 instruction.
54c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_EXT_4010 = 8,         // LSI R4010 instruction.
55c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_EXT_4100 = 9,         // NEC VR4100 instruction.
56c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_EXT_3900 = 10,        // Toshiba R3900 instruction.
57c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_EXT_10000 = 11,       // MIPS R10000 instruction.
58c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_EXT_SB1 = 12,         // Broadcom SB-1 instruction.
59c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_EXT_4111 = 13,        // NEC VR4111/VR4181 instruction.
60c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_EXT_4120 = 14,        // NEC VR4120 instruction.
61c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_EXT_5400 = 15,        // NEC VR5400 instruction.
62c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_EXT_5500 = 16,        // NEC VR5500 instruction.
63c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_EXT_LOONGSON_2E = 17, // ST Microelectronics Loongson 2E.
64c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_EXT_LOONGSON_2F = 18  // ST Microelectronics Loongson 2F.
65c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  };
66c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
67c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // Values for the fp_abi word of an ABI flags structure.
68c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  enum Val_GNU_MIPS_ABI {
69c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    Val_GNU_MIPS_ABI_FP_ANY = 0,
70c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    Val_GNU_MIPS_ABI_FP_DOUBLE = 1,
71c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    Val_GNU_MIPS_ABI_FP_XX = 5,
72c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    Val_GNU_MIPS_ABI_FP_64 = 6,
73c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    Val_GNU_MIPS_ABI_FP_64A = 7
74c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  };
75c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
76c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  enum AFL_FLAGS1 {
77c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    AFL_FLAGS1_ODDSPREG = 1
78c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  };
79c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
80c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // Internal representation of the values used in .module fp=value
81c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  enum class FpABIKind { ANY, XX, S32, S64 };
82c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
83c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // Version of flags structure.
84c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  uint16_t Version;
85c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // The level of the ISA: 1-5, 32, 64.
86c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  uint8_t ISALevel;
87c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // The revision of ISA: 0 for MIPS V and below, 1-n otherwise.
88c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  uint8_t ISARevision;
89c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // The size of general purpose registers.
90c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  AFL_REG GPRSize;
91c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // The size of co-processor 1 registers.
92c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  AFL_REG CPR1Size;
93c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // The size of co-processor 2 registers.
94c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  AFL_REG CPR2Size;
95c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // Processor-specific extension.
96c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  uint32_t ISAExtensionSet;
97c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // Mask of ASEs used.
98c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  uint32_t ASESet;
99c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
100c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  bool OddSPReg;
101c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
102c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  bool Is32BitABI;
103c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
104c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesprotected:
105c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  // The floating-point ABI.
106c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  FpABIKind FpABI;
107c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
108c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinespublic:
109c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  MipsABIFlagsSection()
110c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      : Version(0), ISALevel(0), ISARevision(0), GPRSize(AFL_REG_NONE),
111c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        CPR1Size(AFL_REG_NONE), CPR2Size(AFL_REG_NONE), ISAExtensionSet(0),
112c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        ASESet(0), OddSPReg(false), Is32BitABI(false), FpABI(FpABIKind::ANY) {}
113c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
114c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  uint16_t getVersionValue() { return (uint16_t)Version; }
115c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  uint8_t getISALevelValue() { return (uint8_t)ISALevel; }
116c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  uint8_t getISARevisionValue() { return (uint8_t)ISARevision; }
117c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  uint8_t getGPRSizeValue() { return (uint8_t)GPRSize; }
11837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint8_t getCPR1SizeValue();
119c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  uint8_t getCPR2SizeValue() { return (uint8_t)CPR2Size; }
120c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  uint8_t getFpABIValue();
121c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  uint32_t getISAExtensionSetValue() { return (uint32_t)ISAExtensionSet; }
122c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  uint32_t getASESetValue() { return (uint32_t)ASESet; }
123c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
124c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  uint32_t getFlags1Value() {
125c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    uint32_t Value = 0;
126c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
127c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (OddSPReg)
128c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      Value |= (uint32_t)AFL_FLAGS1_ODDSPREG;
129c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
130c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    return Value;
131c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
132c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
133c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  uint32_t getFlags2Value() { return 0; }
134c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
135c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  FpABIKind getFpABI() { return FpABI; }
136c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  void setFpABI(FpABIKind Value, bool IsABI32Bit) {
137c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    FpABI = Value;
138c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    Is32BitABI = IsABI32Bit;
139c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
140c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  StringRef getFpABIString(FpABIKind Value);
141c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
142c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  template <class PredicateLibrary>
143c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  void setISALevelAndRevisionFromPredicates(const PredicateLibrary &P) {
144c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (P.hasMips64()) {
145c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      ISALevel = 64;
146c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      if (P.hasMips64r6())
147c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        ISARevision = 6;
148c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      else if (P.hasMips64r2())
149c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        ISARevision = 2;
150c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      else
151c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        ISARevision = 1;
152c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    } else if (P.hasMips32()) {
153c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      ISALevel = 32;
154c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      if (P.hasMips32r6())
155c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        ISARevision = 6;
156c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      else if (P.hasMips32r2())
157c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        ISARevision = 2;
158c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      else
159c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        ISARevision = 1;
160c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    } else {
161c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      ISARevision = 0;
162c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      if (P.hasMips5())
163c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        ISALevel = 5;
164c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      else if (P.hasMips4())
165c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        ISALevel = 4;
166c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      else if (P.hasMips3())
167c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        ISALevel = 3;
168c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      else if (P.hasMips2())
169c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        ISALevel = 2;
170c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      else if (P.hasMips1())
171c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        ISALevel = 1;
172c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      else
173c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        llvm_unreachable("Unknown ISA level!");
174c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    }
175c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
176c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
177c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  template <class PredicateLibrary>
178c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  void setGPRSizeFromPredicates(const PredicateLibrary &P) {
179c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    GPRSize = P.isGP64bit() ? AFL_REG_64 : AFL_REG_32;
180c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
181c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
182c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  template <class PredicateLibrary>
183c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  void setCPR1SizeFromPredicates(const PredicateLibrary &P) {
18437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (P.abiUsesSoftFloat())
185c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      CPR1Size = AFL_REG_NONE;
186c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    else if (P.hasMSA())
187c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      CPR1Size = AFL_REG_128;
188c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    else
189c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      CPR1Size = P.isFP64bit() ? AFL_REG_64 : AFL_REG_32;
190c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
191c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
192c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  template <class PredicateLibrary>
193c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  void setASESetFromPredicates(const PredicateLibrary &P) {
194c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    ASESet = 0;
195c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (P.hasDSP())
196c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      ASESet |= AFL_ASE_DSP;
197c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (P.hasDSPR2())
198c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      ASESet |= AFL_ASE_DSPR2;
199c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (P.hasMSA())
200c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      ASESet |= AFL_ASE_MSA;
201c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (P.inMicroMipsMode())
202c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      ASESet |= AFL_ASE_MICROMIPS;
203c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (P.inMips16Mode())
204c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      ASESet |= AFL_ASE_MIPS16;
205c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
206c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
207c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  template <class PredicateLibrary>
208c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  void setFpAbiFromPredicates(const PredicateLibrary &P) {
209c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    Is32BitABI = P.isABI_O32();
210c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
211c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    FpABI = FpABIKind::ANY;
212c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    if (P.isABI_N32() || P.isABI_N64())
213c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      FpABI = FpABIKind::S64;
214c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    else if (P.isABI_O32()) {
21537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      if (P.isABI_FPXX())
216c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        FpABI = FpABIKind::XX;
21737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      else if (P.isFP64bit())
21837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        FpABI = FpABIKind::S64;
219c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      else
220c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        FpABI = FpABIKind::S32;
221c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    }
222c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
223c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
224c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  template <class PredicateLibrary>
225c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  void setAllFromPredicates(const PredicateLibrary &P) {
226c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    setISALevelAndRevisionFromPredicates(P);
227c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    setGPRSizeFromPredicates(P);
228c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    setCPR1SizeFromPredicates(P);
229c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    setASESetFromPredicates(P);
230c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    setFpAbiFromPredicates(P);
23137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    OddSPReg = P.useOddSPReg();
232c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
233c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines};
234c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
235c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen HinesMCStreamer &operator<<(MCStreamer &OS, MipsABIFlagsSection &ABIFlagsSection);
236c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
237c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
238c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#endif
239