Home | History | Annotate | Download | only in Mips
      1 ; RUN: llc -march=mipsel -relocation-model=pic < %s | FileCheck %s
      2 ; RUN: llc -march=mipsel -force-mips-long-branch -O3 -relocation-model=pic < %s \
      3 ; RUN:   | FileCheck %s -check-prefix=O32
      4 ; RUN: llc -march=mipsel -mcpu=mips32r6 -force-mips-long-branch -O3 \
      5 ; RUN:   -relocation-model=pic -asm-show-inst < %s | FileCheck %s -check-prefix=O32-R6
      6 ; RUN: llc -march=mips64el -mcpu=mips4 -target-abi=n64 -force-mips-long-branch -O3 -relocation-model=pic \
      7 ; RUN:   < %s | FileCheck %s -check-prefix=N64
      8 ; RUN: llc -march=mips64el -mcpu=mips64 -target-abi=n64 -force-mips-long-branch -O3 -relocation-model=pic \
      9 ; RUN:   < %s | FileCheck %s -check-prefix=N64
     10 ; RUN: llc -march=mips64el -mcpu=mips64r6 -target-abi=n64 -force-mips-long-branch -O3 \
     11 ; RUN:   -relocation-model=pic -asm-show-inst < %s | FileCheck %s -check-prefix=N64-R6
     12 ; RUN: llc -march=mipsel -mcpu=mips32r2 -mattr=micromips \
     13 ; RUN:   -force-mips-long-branch -O3 -relocation-model=pic < %s | FileCheck %s -check-prefix=MICROMIPS
     14 ; RUN: llc -mtriple=mipsel-none-nacl -force-mips-long-branch -O3 -relocation-model=pic < %s \
     15 ; RUN:   | FileCheck %s -check-prefix=NACL
     16 
     17 
     18 @x = external global i32
     19 
     20 define void @test1(i32 signext %s) {
     21 entry:
     22   %cmp = icmp eq i32 %s, 0
     23   br i1 %cmp, label %end, label %then
     24 
     25 then:
     26   store i32 1, i32* @x, align 4
     27   br label %end
     28 
     29 end:
     30   ret void
     31 
     32 
     33 ; First check the normal version (without long branch).  beqz jumps to return,
     34 ; and fallthrough block stores 1 to global variable.
     35 
     36 ; CHECK:        lui     $[[R0:[0-9]+]], %hi(_gp_disp)
     37 ; CHECK:        addiu   $[[R0]], $[[R0]], %lo(_gp_disp)
     38 ; CHECK:        beqz    $4, $[[BB0:BB[0-9_]+]]
     39 ; CHECK:        addu    $[[GP:[0-9]+]], $[[R0]], $25
     40 ; CHECK:        lw      $[[R1:[0-9]+]], %got(x)($[[GP]])
     41 ; CHECK:        addiu   $[[R2:[0-9]+]], $zero, 1
     42 ; CHECK:        sw      $[[R2]], 0($[[R1]])
     43 ; CHECK:   $[[BB0]]:
     44 ; CHECK:        jr      $ra
     45 ; CHECK:        nop
     46 
     47 
     48 ; Check the MIPS32 version.  Check that branch logic is inverted, so that the
     49 ; target of the new branch (bnez) is the fallthrough block of the original
     50 ; branch.  Check that fallthrough block of the new branch contains long branch
     51 ; expansion which at the end indirectly jumps to the target of the original
     52 ; branch.
     53 
     54 ; O32:        lui     $[[R0:[0-9]+]], %hi(_gp_disp)
     55 ; O32:        addiu   $[[R0]], $[[R0]], %lo(_gp_disp)
     56 ; O32:        bnez    $4, $[[BB0:BB[0-9_]+]]
     57 ; O32:        addu    $[[GP:[0-9]+]], $[[R0]], $25
     58 
     59 ; Check for long branch expansion:
     60 ; O32:             addiu   $sp, $sp, -8
     61 ; O32-NEXT:        sw      $ra, 0($sp)
     62 ; O32-NEXT:        lui     $1, %hi(($[[BB2:BB[0-9_]+]])-($[[BB1:BB[0-9_]+]]))
     63 ; O32-NEXT:        bal     $[[BB1]]
     64 ; O32-NEXT:        addiu   $1, $1, %lo(($[[BB2]])-($[[BB1]]))
     65 ; O32-NEXT:   $[[BB1]]:
     66 ; O32-NEXT:        addu    $1, $ra, $1
     67 ; O32-NEXT:        lw      $ra, 0($sp)
     68 ; O32-NEXT:        jr      $1
     69 ; O32-NEXT:        addiu   $sp, $sp, 8
     70 
     71 ; O32:   $[[BB0]]:
     72 ; O32:        lw      $[[R1:[0-9]+]], %got(x)($[[GP]])
     73 ; O32:        addiu   $[[R2:[0-9]+]], $zero, 1
     74 ; O32:        sw      $[[R2]], 0($[[R1]])
     75 ; O32:   $[[BB2]]:
     76 ; O32:        jr      $ra
     77 ; O32:        nop
     78 
     79 ; In MIPS32R6 JR is an alias to JALR with $rd=0. As everything else remains the
     80 ; same with the O32 prefix, we use -asm-show-inst in order to make sure that
     81 ; the opcode of the MachineInst is a JALR.
     82 ; O32-R6:     JALR
     83 
     84 ; Check the MIPS64 version.
     85 
     86 ; N64:        lui     $[[R0:[0-9]+]], %hi(%neg(%gp_rel(test1)))
     87 ; N64:        bnez    $4, $[[BB0:BB[0-9_]+]]
     88 ; N64:        daddu   $[[R1:[0-9]+]], $[[R0]], $25
     89 
     90 ; Check for long branch expansion:
     91 ; N64:           daddiu  $sp, $sp, -16
     92 ; N64-NEXT:      sd      $ra, 0($sp)
     93 ; N64-NEXT:      daddiu  $1, $zero, %hi(($[[BB2:BB[0-9_]+]])-($[[BB1:BB[0-9_]+]]))
     94 ; N64-NEXT:      dsll    $1, $1, 16
     95 ; N64-NEXT:      bal     $[[BB1]]
     96 ; N64-NEXT:      daddiu  $1, $1, %lo(($[[BB2]])-($[[BB1]]))
     97 ; N64-NEXT:  $[[BB1]]:
     98 ; N64-NEXT:      daddu   $1, $ra, $1
     99 ; N64-NEXT:      ld      $ra, 0($sp)
    100 ; N64-NEXT:      jr      $1
    101 ; N64-NEXT:      daddiu  $sp, $sp, 16
    102 
    103 ; N64:   $[[BB0]]:
    104 ; N64:        daddiu  $[[GP:[0-9]+]], $[[R1]], %lo(%neg(%gp_rel(test1)))
    105 ; N64:        ld      $[[R2:[0-9]+]], %got_disp(x)($[[GP]])
    106 ; N64:        addiu   $[[R3:[0-9]+]], $zero, 1
    107 ; N64:        sw      $[[R3]], 0($[[R2]])
    108 ; N64:   $[[BB2]]:
    109 ; N64:        jr      $ra
    110 ; N64:        nop
    111 
    112 ; In MIPS64R6 JR is an alias to JALR with $rd=0. As everything else remains the
    113 ; same with the N64 prefix, we use -asm-show-inst in order to make sure that
    114 ; the opcode of the MachineInst is a JALR.
    115 ; N64-R6:     JALR64
    116 
    117 
    118 ; Check the microMIPS version.
    119 
    120 ; MICROMIPS:        lui     $[[R0:[0-9]+]], %hi(_gp_disp)
    121 ; MICROMIPS:        addiu   $[[R0]], $[[R0]], %lo(_gp_disp)
    122 ; MICROMIPS:        bnez    $4, $[[BB0:BB[0-9_]+]]
    123 ; MICROMIPS:        addu    $[[GP:[0-9]+]], $[[R0]], $25
    124 
    125 ; Check for long branch expansion:
    126 ; MICROMIPS:          addiu   $sp, $sp, -8
    127 ; MICROMIPS-NEXT:     sw      $ra, 0($sp)
    128 ; MICROMIPS-NEXT:     lui     $1, %hi(($[[BB2:BB[0-9_]+]])-($[[BB1:BB[0-9_]+]]))
    129 ; MICROMIPS-NEXT:     bal     $[[BB1]]
    130 ; MICROMIPS-NEXT:     addiu   $1, $1, %lo(($[[BB2]])-($[[BB1]]))
    131 ; MICROMIPS-NEXT:  $[[BB1]]:
    132 ; MICROMIPS-NEXT:     addu    $1, $ra, $1
    133 ; MICROMIPS-NEXT:     lw      $ra, 0($sp)
    134 ; MICROMIPS-NEXT:     jr      $1
    135 ; MICROMIPS-NEXT:     addiu   $sp, $sp, 8
    136 
    137 ; MICROMIPS:   $[[BB0]]:
    138 ; MICROMIPS:        lw      $[[R1:[0-9]+]], %got(x)($[[GP]])
    139 ; MICROMIPS:        li16    $[[R2:[0-9]+]], 1
    140 ; MICROMIPS:        sw16    $[[R2]], 0($[[R1]])
    141 ; MICROMIPS:   $[[BB2]]:
    142 ; MICROMIPS:        jrc      $ra
    143 
    144 
    145 ; Check the NaCl version.  Check that sp change is not in the branch delay slot
    146 ; of "jr $1" instruction.  Check that target of indirect branch "jr $1" is
    147 ; bundle aligned.
    148 
    149 ; NACL:        lui     $[[R0:[0-9]+]], %hi(_gp_disp)
    150 ; NACL:        addiu   $[[R0]], $[[R0]], %lo(_gp_disp)
    151 ; NACL:        bnez    $4, $[[BB0:BB[0-9_]+]]
    152 ; NACL:        addu    $[[GP:[0-9]+]], $[[R0]], $25
    153 
    154 ; Check for long branch expansion:
    155 ; NACL:             addiu   $sp, $sp, -8
    156 ; NACL-NEXT:        sw      $ra, 0($sp)
    157 ; NACL-NEXT:        lui     $1, %hi(($[[BB2:BB[0-9_]+]])-($[[BB1:BB[0-9_]+]]))
    158 ; NACL-NEXT:        bal     $[[BB1]]
    159 ; NACL-NEXT:        addiu   $1, $1, %lo(($[[BB2]])-($[[BB1]]))
    160 ; NACL-NEXT:   $[[BB1]]:
    161 ; NACL-NEXT:        addu    $1, $ra, $1
    162 ; NACL-NEXT:        lw      $ra, 0($sp)
    163 ; NACL-NEXT:        addiu   $sp, $sp, 8
    164 ; NACL-NEXT:        jr      $1
    165 ; NACL-NEXT:        nop
    166 
    167 ; NACL:        $[[BB0]]:
    168 ; NACL:             lw      $[[R1:[0-9]+]], %got(x)($[[GP]])
    169 ; NACL:             addiu   $[[R2:[0-9]+]], $zero, 1
    170 ; NACL:             sw      $[[R2]], 0($[[R1]])
    171 ; NACL:             .p2align  4
    172 ; NACL-NEXT:   $[[BB2]]:
    173 ; NACL:             jr      $ra
    174 ; NACL:             nop
    175 }
    176