[llvm-dev] How to add Loongson ISA for Mips target?

Leslie Zhai via llvm-dev llvm-dev at lists.llvm.org
Thu Sep 6 09:13:31 PDT 2018


Hi Simon,

Thanks for your teaching!

As an apprentice in the backend,  I just followed AVRSubtarget and 
ARMSubtarget:

https://github.com/xiangzhai/llvm/commits?author=xiangzhai

So I thought there might also need Loongson3A subtarget:

https://en.wikipedia.org/wiki/Loongson#Loongson_3

I just copied the MipsInstrInfo.td and renamed to 
Loongson3AInstrInfo.td,  and implemented some load and store LoongExt64 
instructions for ISA_LOONGSON class:

let AdditionalPredicates = [NotInMicroMips] in {
   def GSLDLE   : LoadMemory<"gsldle", GPR64Opnd, mem_simmptr, load, 
II_GSLDLE>,
                  LW_FM<0x16>, ISA_LOONGSON;
   def GSLDGT   : LoadMemory<"gsldgt", GPR64Opnd, mem_simmptr, load, 
II_GSLDGT>,
                  LW_FM<0x17>, ISA_LOONGSON;
   def GSSDLE   : StoreMemory<"gssdle", GPR64Opnd, mem_simmptr, store, 
II_GSSDLE>,
                  LW_FM<0x16>, ISA_LOONGSON;
   def GSSDGT   : StoreMemory<"gssdgt", GPR64Opnd, mem_simmptr, store, 
II_GSSDGT>,
                  LW_FM<0x17>, ISA_LOONGSON;
}

There are about 14 load and store,  13 arithmetic && logic operations 
LoongExt64 instructions, not including LoongExt32 and binary translation 
ISA.

But I have a requirement:
* If  $ llc -mtriple=mips64el-redhat-linux -mcpu=mips64r2 helloworld.ll  
it only codegen generic MIPS64 ISA;
* If  $ llc -mtriple=mips64el-redhat-linux -mcpu=loongson3a 
helloworld.ll  not only codegen generic MIPS64 ISA,  but also Loongson 
ISA to take place of *some* MIPS64 ISA for optimization.
And in the `MipsTargetMachine::getSubtargetImpl` function, it is able to 
get `+loongson3a` CPU when using -mcpu=loongson3a,  perhaps is there 
some opportunity to hack the FS to distinguish the two cases?  
Furthermore, I have no idea whether or not tablegen support such 
requirement,  or it needs to write some custom code based on 
SelectionDAG.  So I need to read `Writing an LLVM Backend` document and 
other targets' source code more carefully :)

在 2018年09月06日 19:01, Simon Atanasyan 写道:
> Hi,
>
> LLVM MIPS backend now supports different MIPS ISA like mips1, mips2,
> mips3, mips32, mips32r6 etc. If Loongson ISA just add a few new
> instructions I think you do not have to add a new subtarget. Take a
> look at MipsInstrInfo.td file. In that file there are multiple
> ISA_MIPSxxx classes. Take for example ISA_MIPS3 and search it through
> *.td files. Here is an example of instruction definition specific to
> mips3:
> [[
>    def DMTC1 : MTC1_FT<"dmtc1", FGR64Opnd, GPR64Opnd, II_DMTC1,
>                bitconvert>, MFC1_FM<5>, ISA_MIPS3;
> ]]
>
> More general and complete guide can be found here:
> http://llvm.org/docs/WritingAnLLVMBackend.html
>
> On Thu, Sep 6, 2018 at 1:01 PM Leslie Zhai <zhaixiang at loongson.cn> wrote:
>> Hi LLVM developers,
>>
>> GCC[1] is able to use Loongson ISA[2] for instruction selection:
>>
>> $ cat hello.c
>> #include <stdio.h>
>>
>> int main(int argc, char *argv[]) {
>>     printf("Hello World\n");
>>     return 0;
>> }
>>
>> $ gcc -O0 -S hello.c
>>
>> $ cat hello.s
>>       .file    1 "hello.c"
>>       .section .mdebug.abi64
>>       .previous
>>       .nan    legacy
>>       .gnu_attribute 4, 1
>>       .abicalls
>>       .rdata
>>       .align    3
>> .LC0:
>>       .ascii    "Hello World\000"
>>       .text
>>       .align    2
>>       .globl    main
>>       .set    nomips16
>>       .set    nomicromips
>>       .ent    main
>>       .type    main, @function
>> main:
>>       .frame    $fp,48,$31        # vars= 16, regs= 3/0, args= 0, gp= 0
>>       .mask    0xd0000000,-8
>>       .fmask    0x00000000,0
>>       .set    noreorder
>>       .set    nomacro
>>       daddiu    $sp,$sp,-48
>>       gssq    $31,$fp,32($sp)
>>       sd    $28,24($sp)
>>       move    $fp,$sp
>>       lui    $28,%hi(%neg(%gp_rel(main)))
>>       daddu    $28,$28,$25
>>       daddiu    $28,$28,%lo(%neg(%gp_rel(main)))
>>       move    $2,$4
>>       sd    $5,8($fp)
>>       sll    $2,$2,0
>>       sw    $2,0($fp)
>>       ld    $2,%got_page(.LC0)($28)
>>       daddiu    $4,$2,%got_ofst(.LC0)
>>       ld    $2,%call16(puts)($28)
>>       move    $25,$2
>>       .reloc    1f,R_MIPS_JALR,puts
>> 1:    jalr    $25
>>       nop
>>
>>       move    $2,$0
>>       move    $sp,$fp
>>       gslq    $31,$fp,32($sp)
>>       ld    $28,24($sp)
>>       daddiu    $sp,$sp,48
>>       j    $31
>>       nop
>>
>>       .set    macro
>>       .set    reorder
>>       .end    main
>>       .size    main, .-main
>>       .ident    "GCC: (GNU) 4.9.3 20150626 (Red Hat 4.9.3-8)"
>>
>> gssq and gslq are some instructions of Loongson ISA.  How to add
>> Loongson ISA for Mips target?
>>
>> I just:
>>
>> * add loongson3a cpu in frontend
>> https://github.com/xiangzhai/clang/commits?author=xiangzhai
>>
>> * initial Loongson3A subtarget skeleton.
>>
>> Are there some documents or papers?  Please teach me,  thanks a lot!
>>
>> 1. https://github.com/loongson-community/gcc
>> 2. Chinese Simplified version
>> http://www.loongson.cn/uploadfile/cpu/3A3000/Loongson3A3000_3B3000user2.pdf

-- 
Regards,
Leslie Zhai




More information about the llvm-dev mailing list