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