Home | History | Annotate | Download | only in Mips
      1 # RUN: llvm-mc -filetype=obj -triple=mipsel-unknown-nacl %s \
      2 # RUN:   | llvm-objdump -disassemble -no-show-raw-insn - | FileCheck %s
      3 
      4 # This test tests that address-masking sandboxing is added when given assembly
      5 # input.
      6 
      7 
      8 # Test that address-masking sandboxing is added before indirect branches and
      9 # returns.
     10 
     11 	.align	4
     12 test1:
     13 	.set	noreorder
     14 
     15         jr	$a0
     16         nop
     17         jr	$ra
     18         nop
     19 
     20 # CHECK-LABEL:   test1:
     21 
     22 # CHECK:         and     $4, $4, $14
     23 # CHECK-NEXT:    jr      $4
     24 
     25 # Check that additional nop is inserted, to align mask and jr to the next
     26 # bundle.
     27 
     28 # CHECK-NEXT:    nop
     29 # CHECK-NEXT:    nop
     30 
     31 # CHECK:         and     $ra, $ra, $14
     32 # CHECK-NEXT:    jr      $ra
     33 
     34 
     35 
     36 # Test that address-masking sandboxing is added before load instructions.
     37 
     38 	.align	4
     39 test2:
     40 	.set	noreorder
     41 
     42         lb      $4, 0($1)
     43         nop
     44         lbu     $4, 0($2)
     45         lh      $4, 0($3)
     46         lhu     $1, 0($4)
     47         lw      $4, 0($5)
     48         lwc1    $f0, 0($6)
     49         ldc1    $f2, 0($7)
     50         ll      $4, 0($8)
     51         lwl     $4, 0($9)
     52         lwr     $4, 0($10)
     53 
     54         lw      $4, 0($sp)
     55         lw      $4, 0($t8)
     56 
     57 # CHECK-LABEL:   test2:
     58 
     59 # CHECK:         and     $1, $1, $15
     60 # CHECK-NEXT:    lb      $4, 0($1)
     61 
     62 # Check that additional nop is inserted, to align mask and load to the next
     63 # bundle.
     64 
     65 # CHECK:         nop
     66 # CHECK:         nop
     67 
     68 # CHECK:         and     $2, $2, $15
     69 # CHECK-NEXT:    lbu     $4, 0($2)
     70 
     71 # CHECK:         and     $3, $3, $15
     72 # CHECK-NEXT:    lh      $4, 0($3)
     73 
     74 # CHECK:         and     $4, $4, $15
     75 # CHECK-NEXT:    lhu     $1, 0($4)
     76 
     77 # CHECK:         and     $5, $5, $15
     78 # CHECK-NEXT:    lw      $4, 0($5)
     79 
     80 # CHECK:         and     $6, $6, $15
     81 # CHECK-NEXT:    lwc1    $f0, 0($6)
     82 
     83 # CHECK:         and     $7, $7, $15
     84 # CHECK-NEXT:    ldc1    $f2, 0($7)
     85 
     86 # CHECK:         and     $8, $8, $15
     87 # CHECK-NEXT:    ll      $4, 0($8)
     88 
     89 # CHECK:         and     $9, $9, $15
     90 # CHECK-NEXT:    lwl     $4, 0($9)
     91 
     92 # CHECK:         and     $10, $10, $15
     93 # CHECK-NEXT:    lwr     $4, 0($10)
     94 
     95 
     96 # Check that loads where base register is $sp or $t8 (thread pointer register)
     97 # are not masked.
     98 
     99 # CHECK-NOT:     and
    100 # CHECK:         lw      $4, 0($sp)
    101 # CHECK-NOT:     and
    102 # CHECK:         lw      $4, 0($24)
    103 
    104 
    105 
    106 # Test that address-masking sandboxing is added before store instructions.
    107 
    108 	.align	4
    109 test3:
    110 	.set	noreorder
    111 
    112         sb      $4, 0($1)
    113         nop
    114         sh      $4, 0($2)
    115         sw      $4, 0($3)
    116         swc1    $f0, 0($4)
    117         sdc1    $f2, 0($5)
    118         swl     $4, 0($6)
    119         swr     $4, 0($7)
    120         sc      $4, 0($8)
    121 
    122         sw      $4, 0($sp)
    123         sw      $4, 0($t8)
    124 
    125 # CHECK-LABEL:   test3:
    126 
    127 # CHECK:         and     $1, $1, $15
    128 # CHECK-NEXT:    sb      $4, 0($1)
    129 
    130 # Check that additional nop is inserted, to align mask and store to the next
    131 # bundle.
    132 
    133 # CHECK:         nop
    134 # CHECK:         nop
    135 
    136 # CHECK:         and     $2, $2, $15
    137 # CHECK-NEXT:    sh      $4, 0($2)
    138 
    139 # CHECK:         and     $3, $3, $15
    140 # CHECK-NEXT:    sw      $4, 0($3)
    141 
    142 # CHECK:         and     $4, $4, $15
    143 # CHECK-NEXT:    swc1    $f0, 0($4)
    144 
    145 # CHECK:         and     $5, $5, $15
    146 # CHECK-NEXT:    sdc1    $f2, 0($5)
    147 
    148 # CHECK:         and     $6, $6, $15
    149 # CHECK-NEXT:    swl     $4, 0($6)
    150 
    151 # CHECK:         and     $7, $7, $15
    152 # CHECK-NEXT:    swr     $4, 0($7)
    153 
    154 # CHECK:         and     $8, $8, $15
    155 # CHECK-NEXT:    sc      $4, 0($8)
    156 
    157 
    158 # Check that stores where base register is $sp or $t8 (thread pointer register)
    159 # are not masked.
    160 
    161 # CHECK-NOT:     and
    162 # CHECK:         sw      $4, 0($sp)
    163 # CHECK-NOT:     and
    164 # CHECK:         sw      $4, 0($24)
    165 
    166 
    167 
    168 # Test that address-masking sandboxing is added after instructions that change
    169 # stack pointer.
    170 
    171 	.align	4
    172 test4:
    173 	.set	noreorder
    174 
    175         addiu   $sp, $sp, 24
    176         nop
    177         addu    $sp, $sp, $1
    178         lw      $sp, 0($2)
    179         lw      $sp, 123($sp)
    180         sw      $sp, 123($sp)
    181 
    182 # CHECK-LABEL:   test4:
    183 
    184 # CHECK:         addiu   $sp, $sp, 24
    185 # CHECK-NEXT:    and     $sp, $sp, $15
    186 
    187 # Check that additional nop is inserted, to align instruction and mask to the
    188 # next bundle.
    189 
    190 # CHECK:         nop
    191 # CHECK:         nop
    192 
    193 # CHECK:         addu    $sp, $sp, $1
    194 # CHECK-NEXT:    and     $sp, $sp, $15
    195 
    196 # Since we next check sandboxing sequence which consists of 3 instructions,
    197 # check that 2 additional nops are inserted, to align it to the next bundle.
    198 
    199 # CHECK:         nop
    200 # CHECK:         nop
    201 
    202 
    203 # Check that for instructions that change stack-pointer and load from memory
    204 # masks are added before and after the instruction.
    205 
    206 # CHECK:         and     $2, $2, $15
    207 # CHECK-NEXT:    lw      $sp, 0($2)
    208 # CHECK-NEXT:    and     $sp, $sp, $15
    209 
    210 # For loads where $sp is destination and base, check that mask is added after
    211 # but not before.
    212 
    213 # CHECK-NOT:     and
    214 # CHECK:         lw      $sp, 123($sp)
    215 # CHECK-NEXT:    and     $sp, $sp, $15
    216 
    217 # For stores where $sp is destination and base, check that mask is added neither
    218 # before nor after.
    219 
    220 # CHECK-NOT:     and
    221 # CHECK:         sw      $sp, 123($sp)
    222 # CHECK-NOT:     and
    223 
    224 
    225 
    226 # Test that call + branch delay is aligned at bundle end.  Test that mask is
    227 # added before indirect calls.
    228 
    229 	.align	4
    230 test5:
    231 	.set	noreorder
    232 
    233         jal func1
    234         addiu $4, $zero, 1
    235 
    236         nop
    237         bal func2
    238         addiu $4, $zero, 2
    239 
    240         nop
    241         nop
    242         bltzal $t1, func3
    243         addiu $4, $zero, 3
    244 
    245         nop
    246         nop
    247         nop
    248         bgezal $t2, func4
    249         addiu $4, $zero, 4
    250 
    251         jalr $t9
    252         addiu $4, $zero, 5
    253 
    254 
    255 # CHECK:             nop
    256 # CHECK-NEXT:        nop
    257 # CHECK-LABEL:       test5:
    258 # CHECK-NEXT:        jal
    259 # CHECK-NEXT:        addiu   $4, $zero, 1
    260 
    261 # CHECK-NEXT:        nop
    262 # CHECK-NEXT:        nop
    263 # CHECK-NEXT:        bal
    264 # CHECK-NEXT:        addiu   $4, $zero, 2
    265 
    266 # CHECK-NEXT:        nop
    267 # CHECK-NEXT:        nop
    268 # CHECK-NEXT:        bltzal
    269 # CHECK-NEXT:        addiu   $4, $zero, 3
    270 
    271 # CHECK-NEXT:        nop
    272 # CHECK-NEXT:        nop
    273 # CHECK-NEXT:        nop
    274 # CHECK-NEXT:        nop
    275 
    276 # CHECK-NEXT:        nop
    277 # CHECK-NEXT:        nop
    278 # CHECK-NEXT:        bgezal
    279 # CHECK-NEXT:        addiu   $4, $zero, 4
    280 
    281 # CHECK-NEXT:        nop
    282 # CHECK-NEXT:        and     $25, $25, $14
    283 # CHECK-NEXT:        jalr    $25
    284 # CHECK-NEXT:        addiu   $4, $zero, 5
    285 
    286 
    287 
    288 # Test that we can put non-dangerous loads and stores in branch delay slot.
    289 
    290 	.align	4
    291 test6:
    292 	.set	noreorder
    293 
    294         jal func1
    295         sw      $4, 0($sp)
    296 
    297         bal func2
    298         lw      $5, 0($t8)
    299 
    300         jalr $t9
    301         sw      $sp, 0($sp)
    302 
    303 
    304 
    305 # CHECK:             nop
    306 # CHECK-NEXT:        nop
    307 # CHECK-LABEL:       test6:
    308 # CHECK-NEXT:        jal
    309 # CHECK-NEXT:        sw      $4, 0($sp)
    310 
    311 # CHECK-NEXT:        nop
    312 # CHECK-NEXT:        nop
    313 # CHECK-NEXT:        bal
    314 # CHECK-NEXT:        lw      $5, 0($24)
    315 
    316 # CHECK-NEXT:        nop
    317 # CHECK-NEXT:        and     $25, $25, $14
    318 # CHECK-NEXT:        jalr
    319 # CHECK-NEXT:        sw      $sp, 0($sp)
    320