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

Simon Atanasyan via llvm-dev llvm-dev at lists.llvm.org
Thu Sep 6 04:01:10 PDT 2018


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

-- 
Simon Atanasyan


More information about the llvm-dev mailing list