181ad6265SDimitry Andric //===-- CSKYELFStreamer.cpp - CSKY ELF Target Streamer Methods ------------===// 281ad6265SDimitry Andric // 381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 681ad6265SDimitry Andric // 781ad6265SDimitry Andric //===----------------------------------------------------------------------===// 881ad6265SDimitry Andric // 981ad6265SDimitry Andric // This file provides CSKY specific target streamer methods. 1081ad6265SDimitry Andric // 1181ad6265SDimitry Andric //===----------------------------------------------------------------------===// 1281ad6265SDimitry Andric 1381ad6265SDimitry Andric #include "CSKYELFStreamer.h" 1481ad6265SDimitry Andric #include "CSKYMCTargetDesc.h" 1581ad6265SDimitry Andric #include "MCTargetDesc/CSKYAsmBackend.h" 1681ad6265SDimitry Andric #include "MCTargetDesc/CSKYBaseInfo.h" 1781ad6265SDimitry Andric #include "llvm/BinaryFormat/ELF.h" 1881ad6265SDimitry Andric #include "llvm/MC/MCAssembler.h" 1981ad6265SDimitry Andric #include "llvm/MC/MCContext.h" 2081ad6265SDimitry Andric #include "llvm/MC/MCSectionELF.h" 2181ad6265SDimitry Andric #include "llvm/MC/MCSubtargetInfo.h" 2281ad6265SDimitry Andric #include "llvm/MC/MCSymbolELF.h" 2381ad6265SDimitry Andric #include "llvm/Support/CSKYAttributes.h" 2481ad6265SDimitry Andric #include "llvm/Support/Casting.h" 2581ad6265SDimitry Andric #include "llvm/Support/LEB128.h" 26*06c3fb27SDimitry Andric #include "llvm/TargetParser/CSKYTargetParser.h" 2781ad6265SDimitry Andric 2881ad6265SDimitry Andric using namespace llvm; 2981ad6265SDimitry Andric 3081ad6265SDimitry Andric // This part is for ELF object output. 3181ad6265SDimitry Andric CSKYTargetELFStreamer::CSKYTargetELFStreamer(MCStreamer &S, 3281ad6265SDimitry Andric const MCSubtargetInfo &STI) 3381ad6265SDimitry Andric : CSKYTargetStreamer(S), CurrentVendor("csky") { 3481ad6265SDimitry Andric MCAssembler &MCA = getStreamer().getAssembler(); 3581ad6265SDimitry Andric const FeatureBitset &Features = STI.getFeatureBits(); 3681ad6265SDimitry Andric 3781ad6265SDimitry Andric unsigned EFlags = MCA.getELFHeaderEFlags(); 3881ad6265SDimitry Andric 3981ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_ABIV2; 4081ad6265SDimitry Andric 4181ad6265SDimitry Andric if (Features[CSKY::ProcCK801]) 4281ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_801; 4381ad6265SDimitry Andric else if (Features[CSKY::ProcCK802]) 4481ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_802; 4581ad6265SDimitry Andric else if (Features[CSKY::ProcCK803]) 4681ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_803; 4781ad6265SDimitry Andric else if (Features[CSKY::ProcCK804]) 4881ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_803; 4981ad6265SDimitry Andric else if (Features[CSKY::ProcCK805]) 5081ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_805; 5181ad6265SDimitry Andric else if (Features[CSKY::ProcCK807]) 5281ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_807; 5381ad6265SDimitry Andric else if (Features[CSKY::ProcCK810]) 5481ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_810; 5581ad6265SDimitry Andric else if (Features[CSKY::ProcCK860]) 5681ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_860; 5781ad6265SDimitry Andric else 5881ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_810; 5981ad6265SDimitry Andric 6081ad6265SDimitry Andric if (Features[CSKY::FeatureFPUV2_SF] || Features[CSKY::FeatureFPUV3_SF]) 6181ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_FLOAT; 6281ad6265SDimitry Andric 6381ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_EFV1; 6481ad6265SDimitry Andric 6581ad6265SDimitry Andric MCA.setELFHeaderEFlags(EFlags); 6681ad6265SDimitry Andric } 6781ad6265SDimitry Andric 6881ad6265SDimitry Andric MCELFStreamer &CSKYTargetELFStreamer::getStreamer() { 6981ad6265SDimitry Andric return static_cast<MCELFStreamer &>(Streamer); 7081ad6265SDimitry Andric } 7181ad6265SDimitry Andric 7281ad6265SDimitry Andric void CSKYTargetELFStreamer::emitAttribute(unsigned Attribute, unsigned Value) { 7381ad6265SDimitry Andric setAttributeItem(Attribute, Value, /*OverwriteExisting=*/true); 7481ad6265SDimitry Andric } 7581ad6265SDimitry Andric 7681ad6265SDimitry Andric void CSKYTargetELFStreamer::emitTextAttribute(unsigned Attribute, 7781ad6265SDimitry Andric StringRef String) { 7881ad6265SDimitry Andric setAttributeItem(Attribute, String, /*OverwriteExisting=*/true); 7981ad6265SDimitry Andric } 8081ad6265SDimitry Andric 8181ad6265SDimitry Andric void CSKYTargetELFStreamer::finishAttributeSection() { 8281ad6265SDimitry Andric if (Contents.empty()) 8381ad6265SDimitry Andric return; 8481ad6265SDimitry Andric 8581ad6265SDimitry Andric if (AttributeSection) { 8681ad6265SDimitry Andric Streamer.switchSection(AttributeSection); 8781ad6265SDimitry Andric } else { 8881ad6265SDimitry Andric MCAssembler &MCA = getStreamer().getAssembler(); 8981ad6265SDimitry Andric AttributeSection = MCA.getContext().getELFSection( 9081ad6265SDimitry Andric ".csky.attributes", ELF::SHT_CSKY_ATTRIBUTES, 0); 9181ad6265SDimitry Andric Streamer.switchSection(AttributeSection); 9281ad6265SDimitry Andric Streamer.emitInt8(ELFAttrs::Format_Version); 9381ad6265SDimitry Andric } 9481ad6265SDimitry Andric 9581ad6265SDimitry Andric // Vendor size + Vendor name + '\0' 9681ad6265SDimitry Andric const size_t VendorHeaderSize = 4 + CurrentVendor.size() + 1; 9781ad6265SDimitry Andric 9881ad6265SDimitry Andric // Tag + Tag Size 9981ad6265SDimitry Andric const size_t TagHeaderSize = 1 + 4; 10081ad6265SDimitry Andric 10181ad6265SDimitry Andric const size_t ContentsSize = calculateContentSize(); 10281ad6265SDimitry Andric 10381ad6265SDimitry Andric Streamer.emitInt32(VendorHeaderSize + TagHeaderSize + ContentsSize); 10481ad6265SDimitry Andric Streamer.emitBytes(CurrentVendor); 10581ad6265SDimitry Andric Streamer.emitInt8(0); // '\0' 10681ad6265SDimitry Andric 10781ad6265SDimitry Andric Streamer.emitInt8(ELFAttrs::File); 10881ad6265SDimitry Andric Streamer.emitInt32(TagHeaderSize + ContentsSize); 10981ad6265SDimitry Andric 11081ad6265SDimitry Andric // Size should have been accounted for already, now 11181ad6265SDimitry Andric // emit each field as its type (ULEB or String). 11281ad6265SDimitry Andric for (AttributeItem item : Contents) { 11381ad6265SDimitry Andric Streamer.emitULEB128IntValue(item.Tag); 11481ad6265SDimitry Andric switch (item.Type) { 11581ad6265SDimitry Andric default: 11681ad6265SDimitry Andric llvm_unreachable("Invalid attribute type"); 11781ad6265SDimitry Andric case AttributeType::Numeric: 11881ad6265SDimitry Andric Streamer.emitULEB128IntValue(item.IntValue); 11981ad6265SDimitry Andric break; 12081ad6265SDimitry Andric case AttributeType::Text: 12181ad6265SDimitry Andric Streamer.emitBytes(item.StringValue); 12281ad6265SDimitry Andric Streamer.emitInt8(0); // '\0' 12381ad6265SDimitry Andric break; 12481ad6265SDimitry Andric case AttributeType::NumericAndText: 12581ad6265SDimitry Andric Streamer.emitULEB128IntValue(item.IntValue); 12681ad6265SDimitry Andric Streamer.emitBytes(item.StringValue); 12781ad6265SDimitry Andric Streamer.emitInt8(0); // '\0' 12881ad6265SDimitry Andric break; 12981ad6265SDimitry Andric } 13081ad6265SDimitry Andric } 13181ad6265SDimitry Andric 13281ad6265SDimitry Andric Contents.clear(); 13381ad6265SDimitry Andric } 13481ad6265SDimitry Andric 13581ad6265SDimitry Andric size_t CSKYTargetELFStreamer::calculateContentSize() const { 13681ad6265SDimitry Andric size_t Result = 0; 13781ad6265SDimitry Andric for (AttributeItem item : Contents) { 13881ad6265SDimitry Andric switch (item.Type) { 13981ad6265SDimitry Andric case AttributeType::Hidden: 14081ad6265SDimitry Andric break; 14181ad6265SDimitry Andric case AttributeType::Numeric: 14281ad6265SDimitry Andric Result += getULEB128Size(item.Tag); 14381ad6265SDimitry Andric Result += getULEB128Size(item.IntValue); 14481ad6265SDimitry Andric break; 14581ad6265SDimitry Andric case AttributeType::Text: 14681ad6265SDimitry Andric Result += getULEB128Size(item.Tag); 14781ad6265SDimitry Andric Result += item.StringValue.size() + 1; // string + '\0' 14881ad6265SDimitry Andric break; 14981ad6265SDimitry Andric case AttributeType::NumericAndText: 15081ad6265SDimitry Andric Result += getULEB128Size(item.Tag); 15181ad6265SDimitry Andric Result += getULEB128Size(item.IntValue); 15281ad6265SDimitry Andric Result += item.StringValue.size() + 1; // string + '\0'; 15381ad6265SDimitry Andric break; 15481ad6265SDimitry Andric } 15581ad6265SDimitry Andric } 15681ad6265SDimitry Andric return Result; 15781ad6265SDimitry Andric } 15881ad6265SDimitry Andric 15981ad6265SDimitry Andric void CSKYELFStreamer::EmitMappingSymbol(StringRef Name) { 16081ad6265SDimitry Andric if (Name == "$d" && State == EMS_Data) 16181ad6265SDimitry Andric return; 16281ad6265SDimitry Andric if (Name == "$t" && State == EMS_Text) 16381ad6265SDimitry Andric return; 16481ad6265SDimitry Andric if (Name == "$t" && State == EMS_None) { 16581ad6265SDimitry Andric State = EMS_Text; 16681ad6265SDimitry Andric return; 16781ad6265SDimitry Andric } 16881ad6265SDimitry Andric 16981ad6265SDimitry Andric State = (Name == "$t" ? EMS_Text : EMS_Data); 17081ad6265SDimitry Andric 17181ad6265SDimitry Andric auto *Symbol = cast<MCSymbolELF>(getContext().getOrCreateSymbol( 17281ad6265SDimitry Andric Name + "." + Twine(MappingSymbolCounter++))); 17381ad6265SDimitry Andric emitLabel(Symbol); 17481ad6265SDimitry Andric 17581ad6265SDimitry Andric Symbol->setType(ELF::STT_NOTYPE); 17681ad6265SDimitry Andric Symbol->setBinding(ELF::STB_LOCAL); 17781ad6265SDimitry Andric } 17881ad6265SDimitry Andric 17981ad6265SDimitry Andric void CSKYTargetELFStreamer::emitTargetAttributes(const MCSubtargetInfo &STI) { 18081ad6265SDimitry Andric StringRef CPU = STI.getCPU(); 18181ad6265SDimitry Andric CSKY::ArchKind ArchID = CSKY::parseCPUArch(CPU); 18281ad6265SDimitry Andric 18381ad6265SDimitry Andric if (ArchID == CSKY::ArchKind::CK804) 18481ad6265SDimitry Andric ArchID = CSKY::ArchKind::CK803; 18581ad6265SDimitry Andric 18681ad6265SDimitry Andric StringRef CPU_ARCH = CSKY::getArchName(ArchID); 18781ad6265SDimitry Andric 18881ad6265SDimitry Andric if (ArchID == CSKY::ArchKind::INVALID) { 18981ad6265SDimitry Andric CPU = "ck810"; 19081ad6265SDimitry Andric CPU_ARCH = "ck810"; 19181ad6265SDimitry Andric } 19281ad6265SDimitry Andric emitTextAttribute(CSKYAttrs::CSKY_ARCH_NAME, CPU_ARCH); 19381ad6265SDimitry Andric emitTextAttribute(CSKYAttrs::CSKY_CPU_NAME, CPU); 19481ad6265SDimitry Andric 19581ad6265SDimitry Andric unsigned ISAFlag = 0; 19681ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasE1)) 19781ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_E1; 19881ad6265SDimitry Andric 19981ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasE2)) 20081ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_1E2; 20181ad6265SDimitry Andric 20281ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has2E3)) 20381ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_2E3; 20481ad6265SDimitry Andric 20581ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasMP)) 20681ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_MP; 20781ad6265SDimitry Andric 20881ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has3E3r1)) 20981ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_3E3R1; 21081ad6265SDimitry Andric 21181ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has3r1E3r2)) 21281ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_3E3R2; 21381ad6265SDimitry Andric 21481ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has3r2E3r3)) 21581ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_3E3R3; 21681ad6265SDimitry Andric 21781ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has3E7)) 21881ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_3E7; 21981ad6265SDimitry Andric 22081ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasMP1E2)) 22181ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_MP_1E2; 22281ad6265SDimitry Andric 22381ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has7E10)) 22481ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_7E10; 22581ad6265SDimitry Andric 22681ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has10E60)) 22781ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_10E60; 22881ad6265SDimitry Andric 22981ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureTrust)) 23081ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_TRUST; 23181ad6265SDimitry Andric 23281ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureJAVA)) 23381ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_JAVA; 23481ad6265SDimitry Andric 23581ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureCache)) 23681ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_CACHE; 23781ad6265SDimitry Andric 23881ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureNVIC)) 23981ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_NVIC; 24081ad6265SDimitry Andric 24181ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureDSP)) 24281ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_DSP; 24381ad6265SDimitry Andric 24481ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasDSP1E2)) 24581ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_DSP_1E2; 24681ad6265SDimitry Andric 24781ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasDSPE60)) 24881ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_DSPE60; 24981ad6265SDimitry Andric 25081ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureDSPV2)) 25181ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_DSP_ENHANCE; 25281ad6265SDimitry Andric 25381ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureDSP_Silan)) 25481ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_DSP_SILAN; 25581ad6265SDimitry Andric 25681ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureVDSPV1_128)) 25781ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_VDSP; 25881ad6265SDimitry Andric 25981ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureVDSPV2)) 26081ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_VDSP_2; 26181ad6265SDimitry Andric 26281ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasVDSP2E3)) 26381ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_VDSP_2E3; 26481ad6265SDimitry Andric 26581ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasVDSP2E60F)) 26681ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_VDSP_2E60F; 26781ad6265SDimitry Andric 26881ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_ISA_FLAGS, ISAFlag); 26981ad6265SDimitry Andric 27081ad6265SDimitry Andric unsigned ISAExtFlag = 0; 27181ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasFLOATE1)) 27281ad6265SDimitry Andric ISAExtFlag |= CSKYAttrs::ISA_FLOAT_E1; 27381ad6265SDimitry Andric 27481ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasFLOAT1E2)) 27581ad6265SDimitry Andric ISAExtFlag |= CSKYAttrs::ISA_FLOAT_1E2; 27681ad6265SDimitry Andric 27781ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasFLOAT1E3)) 27881ad6265SDimitry Andric ISAExtFlag |= CSKYAttrs::ISA_FLOAT_1E3; 27981ad6265SDimitry Andric 28081ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasFLOAT3E4)) 28181ad6265SDimitry Andric ISAExtFlag |= CSKYAttrs::ISA_FLOAT_3E4; 28281ad6265SDimitry Andric 28381ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasFLOAT7E60)) 28481ad6265SDimitry Andric ISAExtFlag |= CSKYAttrs::ISA_FLOAT_7E60; 28581ad6265SDimitry Andric 28681ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_ISA_EXT_FLAGS, ISAExtFlag); 28781ad6265SDimitry Andric 28881ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureDSP)) 28981ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_DSP_VERSION, 29081ad6265SDimitry Andric CSKYAttrs::DSP_VERSION_EXTENSION); 29181ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureDSPV2)) 29281ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_DSP_VERSION, CSKYAttrs::DSP_VERSION_2); 29381ad6265SDimitry Andric 29481ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureVDSPV2)) 29581ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_VDSP_VERSION, CSKYAttrs::VDSP_VERSION_2); 29681ad6265SDimitry Andric 29781ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureFPUV2_SF) || 29881ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV2_DF)) 29981ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_VERSION, CSKYAttrs::FPU_VERSION_2); 30081ad6265SDimitry Andric else if (STI.hasFeature(CSKY::FeatureFPUV3_HF) || 30181ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_SF) || 30281ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_DF)) 30381ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_VERSION, CSKYAttrs::FPU_VERSION_3); 30481ad6265SDimitry Andric 30581ad6265SDimitry Andric bool hasAnyFloatExt = STI.hasFeature(CSKY::FeatureFPUV2_SF) || 30681ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV2_DF) || 30781ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_HF) || 30881ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_SF) || 30981ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_DF); 31081ad6265SDimitry Andric 31181ad6265SDimitry Andric if (hasAnyFloatExt && STI.hasFeature(CSKY::ModeHardFloat) && 31281ad6265SDimitry Andric STI.hasFeature(CSKY::ModeHardFloatABI)) 31381ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_ABI, CSKYAttrs::FPU_ABI_HARD); 31481ad6265SDimitry Andric else if (hasAnyFloatExt && STI.hasFeature(CSKY::ModeHardFloat)) 31581ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_ABI, CSKYAttrs::FPU_ABI_SOFTFP); 31681ad6265SDimitry Andric else 31781ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_ABI, CSKYAttrs::FPU_ABI_SOFT); 31881ad6265SDimitry Andric 31981ad6265SDimitry Andric unsigned HardFPFlag = 0; 32081ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureFPUV3_HF)) 32181ad6265SDimitry Andric HardFPFlag |= CSKYAttrs::FPU_HARDFP_HALF; 32281ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureFPUV2_SF) || 32381ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_SF)) 32481ad6265SDimitry Andric HardFPFlag |= CSKYAttrs::FPU_HARDFP_SINGLE; 32581ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureFPUV2_DF) || 32681ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_DF)) 32781ad6265SDimitry Andric HardFPFlag |= CSKYAttrs::FPU_HARDFP_DOUBLE; 32881ad6265SDimitry Andric 32981ad6265SDimitry Andric if (HardFPFlag != 0) { 33081ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_DENORMAL, CSKYAttrs::NEEDED); 33181ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_EXCEPTION, CSKYAttrs::NEEDED); 33281ad6265SDimitry Andric emitTextAttribute(CSKYAttrs::CSKY_FPU_NUMBER_MODULE, "IEEE 754"); 33381ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_HARDFP, HardFPFlag); 33481ad6265SDimitry Andric } 33581ad6265SDimitry Andric } 336