<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div>HI,</div><div>I am learning cpu0 backend and trying to transplant it from llvm 3.9 to llvm 9.0.</div><div>I have 3 questions?</div><div><br></div><div>1) In include/llvm/BinaryFormat/MachO.h of version 9.0, line 1410 - line 1423:</div><div>enum CPUType {<br>  CPU_TYPE_ANY = -1,<br>  CPU_TYPE_X86 = 7,<br>  CPU_TYPE_I386 = CPU_TYPE_X86,<br>  CPU_TYPE_X86_64 = CPU_TYPE_X86 | CPU_ARCH_ABI64,<br>  /* CPU_TYPE_MIPS      = 8, */<br>  CPU_TYPE_MC98000 = 10, // Old Motorola PowerPC<br>  CPU_TYPE_ARM = 12,<br>  CPU_TYPE_ARM64 = CPU_TYPE_ARM | CPU_ARCH_ABI64,<br>  CPU_TYPE_ARM64_32 = CPU_TYPE_ARM | CPU_ARCH_ABI64_32,<br>  CPU_TYPE_SPARC = 14,<br>  CPU_TYPE_POWERPC = 18,<br>  CPU_TYPE_POWERPC64 = CPU_TYPE_POWERPC | CPU_ARCH_ABI64<br>};</div><div>I notice that not all backends are included in CPUType. For example, Sparc is included, but MIPS is not. What is this CPUType used for? How could I decide whether I need to add Cpu0 to it?</div><div><br></div><div>2) About include/llvm/BinaryFormat/ELFRelocs/*.def, how could we decide that which items are needed and which are not? what materials do you suggest me to read?</div><div><br></div><div>3) In Cpu0 backend tutorial(llvm 3.9), there is a file named Cpu0Schedule.td:</div><div>//===----------------------------------------------------------------------===//<br>// Functional units across Cpu0 chips sets. Based on GCC/Cpu0 backend files.<br>//===----------------------------------------------------------------------===//<br>def ALU     : FuncUnit;<br>def IMULDIV : FuncUnit;<br><br>//===----------------------------------------------------------------------===//<br>// Instruction Itinerary classes used for Cpu0<br>//===----------------------------------------------------------------------===//<br>def IIAlu              : InstrItinClass;<br>def II_CLO             : InstrItinClass;<br>def II_CLZ             : InstrItinClass;<br>def IILoad             : InstrItinClass;<br>def IIStore            : InstrItinClass;<br>//#if CH >= CH4_1 1<br>def IIHiLo             : InstrItinClass;<br>def IIImul             : InstrItinClass;<br>def IIIdiv             : InstrItinClass;<br>//#endif<br>def IIBranch           : InstrItinClass;<br><br>def IIPseudo           : InstrItinClass;<br><br>//===----------------------------------------------------------------------===//<br>// Cpu0 Generic instruction itineraries.<br>//===----------------------------------------------------------------------===//<br>//@ http://llvm.org/docs/doxygen/html/structllvm_1_1InstrStage.html<br>def Cpu0GenericItineraries : ProcessorItineraries<[ALU, IMULDIV], [], [<br>//@2<br>  InstrItinData<IIAlu              , [InstrStage<1,  [ALU]>]>,<br>  InstrItinData<II_CLO             , [InstrStage<1,  [ALU]>]>,<br>  InstrItinData<II_CLZ             , [InstrStage<1,  [ALU]>]>,<br>  InstrItinData<IILoad             , [InstrStage<3,  [ALU]>]>,<br>  InstrItinData<IIStore            , [InstrStage<1,  [ALU]>]>,<br>//#if CH >= CH4_1 2<br>  InstrItinData<IIHiLo             , [InstrStage<1,  [IMULDIV]>]>,<br>  InstrItinData<IIImul             , [InstrStage<17, [IMULDIV]>]>,<br>  InstrItinData<IIIdiv             , [InstrStage<38, [IMULDIV]>]>,<br>//#endif<br>  InstrItinData<IIBranch           , [InstrStage<1,  [ALU]>]><br>]>;</div><div><br></div><div>There is 10 InstrItinClass definition. When should we add a new InstrItinClass definition for a new cpu or chip?</div><div>I read the comment in TargetItinerary.td:</div><div><br></div><div>// Instruction itinerary classes - These values represent 'named' instruction<br>// itinerary.  Using named itineraries simplifies managing groups of<br>// instructions across chip sets.  An instruction uses the same itinerary class<br>// across all chip sets.  Thus a new chip set can be added without modifying<br>// instruction information.<br>//<br>class InstrItinClass;<br>def NoItinerary : InstrItinClass;<br></div><div>But I still can not understand it. Are there any materials? <br></div><div><br></div><div>Thanks!</div><div><br></div><div>Jack<br></div></div><br><br><span title="neteasefooter"><p> </p></span>