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" 2606c3fb27SDimitry 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") { 34*0fca6ea1SDimitry Andric ELFObjectWriter &W = getStreamer().getWriter(); 3581ad6265SDimitry Andric const FeatureBitset &Features = STI.getFeatureBits(); 3681ad6265SDimitry Andric 37*0fca6ea1SDimitry Andric unsigned EFlags = W.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 65*0fca6ea1SDimitry Andric W.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 171*0fca6ea1SDimitry Andric auto *Symbol = cast<MCSymbolELF>(getContext().createLocalSymbol(Name)); 17281ad6265SDimitry Andric emitLabel(Symbol); 17381ad6265SDimitry Andric 17481ad6265SDimitry Andric Symbol->setType(ELF::STT_NOTYPE); 17581ad6265SDimitry Andric Symbol->setBinding(ELF::STB_LOCAL); 17681ad6265SDimitry Andric } 17781ad6265SDimitry Andric 17881ad6265SDimitry Andric void CSKYTargetELFStreamer::emitTargetAttributes(const MCSubtargetInfo &STI) { 17981ad6265SDimitry Andric StringRef CPU = STI.getCPU(); 18081ad6265SDimitry Andric CSKY::ArchKind ArchID = CSKY::parseCPUArch(CPU); 18181ad6265SDimitry Andric 18281ad6265SDimitry Andric if (ArchID == CSKY::ArchKind::CK804) 18381ad6265SDimitry Andric ArchID = CSKY::ArchKind::CK803; 18481ad6265SDimitry Andric 18581ad6265SDimitry Andric StringRef CPU_ARCH = CSKY::getArchName(ArchID); 18681ad6265SDimitry Andric 18781ad6265SDimitry Andric if (ArchID == CSKY::ArchKind::INVALID) { 18881ad6265SDimitry Andric CPU = "ck810"; 18981ad6265SDimitry Andric CPU_ARCH = "ck810"; 19081ad6265SDimitry Andric } 19181ad6265SDimitry Andric emitTextAttribute(CSKYAttrs::CSKY_ARCH_NAME, CPU_ARCH); 19281ad6265SDimitry Andric emitTextAttribute(CSKYAttrs::CSKY_CPU_NAME, CPU); 19381ad6265SDimitry Andric 19481ad6265SDimitry Andric unsigned ISAFlag = 0; 19581ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasE1)) 19681ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_E1; 19781ad6265SDimitry Andric 19881ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasE2)) 19981ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_1E2; 20081ad6265SDimitry Andric 20181ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has2E3)) 20281ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_2E3; 20381ad6265SDimitry Andric 20481ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasMP)) 20581ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_MP; 20681ad6265SDimitry Andric 20781ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has3E3r1)) 20881ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_3E3R1; 20981ad6265SDimitry Andric 21081ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has3r1E3r2)) 21181ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_3E3R2; 21281ad6265SDimitry Andric 21381ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has3r2E3r3)) 21481ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_3E3R3; 21581ad6265SDimitry Andric 21681ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has3E7)) 21781ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_3E7; 21881ad6265SDimitry Andric 21981ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasMP1E2)) 22081ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_MP_1E2; 22181ad6265SDimitry Andric 22281ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has7E10)) 22381ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_7E10; 22481ad6265SDimitry Andric 22581ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has10E60)) 22681ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_10E60; 22781ad6265SDimitry Andric 22881ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureTrust)) 22981ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_TRUST; 23081ad6265SDimitry Andric 23181ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureJAVA)) 23281ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_JAVA; 23381ad6265SDimitry Andric 23481ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureCache)) 23581ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_CACHE; 23681ad6265SDimitry Andric 23781ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureNVIC)) 23881ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_NVIC; 23981ad6265SDimitry Andric 24081ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureDSP)) 24181ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_DSP; 24281ad6265SDimitry Andric 24381ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasDSP1E2)) 24481ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_DSP_1E2; 24581ad6265SDimitry Andric 24681ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasDSPE60)) 24781ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_DSPE60; 24881ad6265SDimitry Andric 24981ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureDSPV2)) 25081ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_DSP_ENHANCE; 25181ad6265SDimitry Andric 25281ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureDSP_Silan)) 25381ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_DSP_SILAN; 25481ad6265SDimitry Andric 25581ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureVDSPV1_128)) 25681ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_VDSP; 25781ad6265SDimitry Andric 25881ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureVDSPV2)) 25981ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_VDSP_2; 26081ad6265SDimitry Andric 26181ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasVDSP2E3)) 26281ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_VDSP_2E3; 26381ad6265SDimitry Andric 26481ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasVDSP2E60F)) 26581ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_VDSP_2E60F; 26681ad6265SDimitry Andric 26781ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_ISA_FLAGS, ISAFlag); 26881ad6265SDimitry Andric 26981ad6265SDimitry Andric unsigned ISAExtFlag = 0; 27081ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasFLOATE1)) 27181ad6265SDimitry Andric ISAExtFlag |= CSKYAttrs::ISA_FLOAT_E1; 27281ad6265SDimitry Andric 27381ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasFLOAT1E2)) 27481ad6265SDimitry Andric ISAExtFlag |= CSKYAttrs::ISA_FLOAT_1E2; 27581ad6265SDimitry Andric 27681ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasFLOAT1E3)) 27781ad6265SDimitry Andric ISAExtFlag |= CSKYAttrs::ISA_FLOAT_1E3; 27881ad6265SDimitry Andric 27981ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasFLOAT3E4)) 28081ad6265SDimitry Andric ISAExtFlag |= CSKYAttrs::ISA_FLOAT_3E4; 28181ad6265SDimitry Andric 28281ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasFLOAT7E60)) 28381ad6265SDimitry Andric ISAExtFlag |= CSKYAttrs::ISA_FLOAT_7E60; 28481ad6265SDimitry Andric 28581ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_ISA_EXT_FLAGS, ISAExtFlag); 28681ad6265SDimitry Andric 28781ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureDSP)) 28881ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_DSP_VERSION, 28981ad6265SDimitry Andric CSKYAttrs::DSP_VERSION_EXTENSION); 29081ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureDSPV2)) 29181ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_DSP_VERSION, CSKYAttrs::DSP_VERSION_2); 29281ad6265SDimitry Andric 29381ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureVDSPV2)) 29481ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_VDSP_VERSION, CSKYAttrs::VDSP_VERSION_2); 29581ad6265SDimitry Andric 29681ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureFPUV2_SF) || 29781ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV2_DF)) 29881ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_VERSION, CSKYAttrs::FPU_VERSION_2); 29981ad6265SDimitry Andric else if (STI.hasFeature(CSKY::FeatureFPUV3_HF) || 30081ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_SF) || 30181ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_DF)) 30281ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_VERSION, CSKYAttrs::FPU_VERSION_3); 30381ad6265SDimitry Andric 30481ad6265SDimitry Andric bool hasAnyFloatExt = STI.hasFeature(CSKY::FeatureFPUV2_SF) || 30581ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV2_DF) || 30681ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_HF) || 30781ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_SF) || 30881ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_DF); 30981ad6265SDimitry Andric 31081ad6265SDimitry Andric if (hasAnyFloatExt && STI.hasFeature(CSKY::ModeHardFloat) && 31181ad6265SDimitry Andric STI.hasFeature(CSKY::ModeHardFloatABI)) 31281ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_ABI, CSKYAttrs::FPU_ABI_HARD); 31381ad6265SDimitry Andric else if (hasAnyFloatExt && STI.hasFeature(CSKY::ModeHardFloat)) 31481ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_ABI, CSKYAttrs::FPU_ABI_SOFTFP); 31581ad6265SDimitry Andric else 31681ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_ABI, CSKYAttrs::FPU_ABI_SOFT); 31781ad6265SDimitry Andric 31881ad6265SDimitry Andric unsigned HardFPFlag = 0; 31981ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureFPUV3_HF)) 32081ad6265SDimitry Andric HardFPFlag |= CSKYAttrs::FPU_HARDFP_HALF; 32181ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureFPUV2_SF) || 32281ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_SF)) 32381ad6265SDimitry Andric HardFPFlag |= CSKYAttrs::FPU_HARDFP_SINGLE; 32481ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureFPUV2_DF) || 32581ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_DF)) 32681ad6265SDimitry Andric HardFPFlag |= CSKYAttrs::FPU_HARDFP_DOUBLE; 32781ad6265SDimitry Andric 32881ad6265SDimitry Andric if (HardFPFlag != 0) { 32981ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_DENORMAL, CSKYAttrs::NEEDED); 33081ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_EXCEPTION, CSKYAttrs::NEEDED); 33181ad6265SDimitry Andric emitTextAttribute(CSKYAttrs::CSKY_FPU_NUMBER_MODULE, "IEEE 754"); 33281ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_HARDFP, HardFPFlag); 33381ad6265SDimitry Andric } 33481ad6265SDimitry Andric } 335