| # RUN: llvm-mc -filetype=obj -triple=mipsel-unknown-nacl %s \ |
| # RUN: | llvm-objdump -disassemble -z -no-show-raw-insn - | FileCheck %s |
| |
| # This test tests that address-masking sandboxing is added when given assembly |
| # input. |
| |
| |
| # Test that address-masking sandboxing is added before indirect branches and |
| # returns. |
| |
| .align 4 |
| test1: |
| .set noreorder |
| |
| jr $a0 |
| nop |
| jr $ra |
| nop |
| |
| # CHECK-LABEL: test1: |
| |
| # CHECK: and $4, $4, $14 |
| # CHECK-NEXT: jr $4 |
| |
| # Check that additional nop is inserted, to align mask and jr to the next |
| # bundle. |
| |
| # CHECK-NEXT: nop |
| # CHECK-NEXT: nop |
| |
| # CHECK: and $ra, $ra, $14 |
| # CHECK-NEXT: jr $ra |
| |
| |
| |
| # Test that address-masking sandboxing is added before load instructions. |
| |
| .align 4 |
| test2: |
| .set noreorder |
| |
| lb $4, 0($1) |
| nop |
| lbu $4, 0($2) |
| lh $4, 0($3) |
| lhu $1, 0($4) |
| lw $4, 0($5) |
| lwc1 $f0, 0($6) |
| ldc1 $f2, 0($7) |
| ll $4, 0($8) |
| lwl $4, 0($9) |
| lwr $4, 0($10) |
| |
| lw $4, 0($sp) |
| lw $4, 0($t8) |
| |
| # CHECK-LABEL: test2: |
| |
| # CHECK: and $1, $1, $15 |
| # CHECK-NEXT: lb $4, 0($1) |
| |
| # Check that additional nop is inserted, to align mask and load to the next |
| # bundle. |
| |
| # CHECK: nop |
| # CHECK: nop |
| |
| # CHECK: and $2, $2, $15 |
| # CHECK-NEXT: lbu $4, 0($2) |
| |
| # CHECK: and $3, $3, $15 |
| # CHECK-NEXT: lh $4, 0($3) |
| |
| # CHECK: and $4, $4, $15 |
| # CHECK-NEXT: lhu $1, 0($4) |
| |
| # CHECK: and $5, $5, $15 |
| # CHECK-NEXT: lw $4, 0($5) |
| |
| # CHECK: and $6, $6, $15 |
| # CHECK-NEXT: lwc1 $f0, 0($6) |
| |
| # CHECK: and $7, $7, $15 |
| # CHECK-NEXT: ldc1 $f2, 0($7) |
| |
| # CHECK: and $8, $8, $15 |
| # CHECK-NEXT: ll $4, 0($8) |
| |
| # CHECK: and $9, $9, $15 |
| # CHECK-NEXT: lwl $4, 0($9) |
| |
| # CHECK: and $10, $10, $15 |
| # CHECK-NEXT: lwr $4, 0($10) |
| |
| |
| # Check that loads where base register is $sp or $t8 (thread pointer register) |
| # are not masked. |
| |
| # CHECK-NOT: and |
| # CHECK: lw $4, 0($sp) |
| # CHECK-NOT: and |
| # CHECK: lw $4, 0($24) |
| |
| |
| |
| # Test that address-masking sandboxing is added before store instructions. |
| |
| .align 4 |
| test3: |
| .set noreorder |
| |
| sb $4, 0($1) |
| nop |
| sh $4, 0($2) |
| sw $4, 0($3) |
| swc1 $f0, 0($4) |
| sdc1 $f2, 0($5) |
| swl $4, 0($6) |
| swr $4, 0($7) |
| sc $4, 0($8) |
| |
| sw $4, 0($sp) |
| sw $4, 0($t8) |
| |
| # CHECK-LABEL: test3: |
| |
| # CHECK: and $1, $1, $15 |
| # CHECK-NEXT: sb $4, 0($1) |
| |
| # Check that additional nop is inserted, to align mask and store to the next |
| # bundle. |
| |
| # CHECK: nop |
| # CHECK: nop |
| |
| # CHECK: and $2, $2, $15 |
| # CHECK-NEXT: sh $4, 0($2) |
| |
| # CHECK: and $3, $3, $15 |
| # CHECK-NEXT: sw $4, 0($3) |
| |
| # CHECK: and $4, $4, $15 |
| # CHECK-NEXT: swc1 $f0, 0($4) |
| |
| # CHECK: and $5, $5, $15 |
| # CHECK-NEXT: sdc1 $f2, 0($5) |
| |
| # CHECK: and $6, $6, $15 |
| # CHECK-NEXT: swl $4, 0($6) |
| |
| # CHECK: and $7, $7, $15 |
| # CHECK-NEXT: swr $4, 0($7) |
| |
| # CHECK: and $8, $8, $15 |
| # CHECK-NEXT: sc $4, 0($8) |
| |
| |
| # Check that stores where base register is $sp or $t8 (thread pointer register) |
| # are not masked. |
| |
| # CHECK-NOT: and |
| # CHECK: sw $4, 0($sp) |
| # CHECK-NOT: and |
| # CHECK: sw $4, 0($24) |
| |
| |
| |
| # Test that address-masking sandboxing is added after instructions that change |
| # stack pointer. |
| |
| .align 4 |
| test4: |
| .set noreorder |
| |
| addiu $sp, $sp, 24 |
| nop |
| addu $sp, $sp, $1 |
| lw $sp, 0($2) |
| lw $sp, 123($sp) |
| sw $sp, 123($sp) |
| |
| # CHECK-LABEL: test4: |
| |
| # CHECK: addiu $sp, $sp, 24 |
| # CHECK-NEXT: and $sp, $sp, $15 |
| |
| # Check that additional nop is inserted, to align instruction and mask to the |
| # next bundle. |
| |
| # CHECK: nop |
| # CHECK: nop |
| |
| # CHECK: addu $sp, $sp, $1 |
| # CHECK-NEXT: and $sp, $sp, $15 |
| |
| # Since we next check sandboxing sequence which consists of 3 instructions, |
| # check that 2 additional nops are inserted, to align it to the next bundle. |
| |
| # CHECK: nop |
| # CHECK: nop |
| |
| |
| # Check that for instructions that change stack-pointer and load from memory |
| # masks are added before and after the instruction. |
| |
| # CHECK: and $2, $2, $15 |
| # CHECK-NEXT: lw $sp, 0($2) |
| # CHECK-NEXT: and $sp, $sp, $15 |
| |
| # For loads where $sp is destination and base, check that mask is added after |
| # but not before. |
| |
| # CHECK-NOT: and |
| # CHECK: lw $sp, 123($sp) |
| # CHECK-NEXT: and $sp, $sp, $15 |
| |
| # For stores where $sp is destination and base, check that mask is added neither |
| # before nor after. |
| |
| # CHECK-NOT: and |
| # CHECK: sw $sp, 123($sp) |
| # CHECK-NOT: and |
| |
| |
| |
| # Test that call + branch delay is aligned at bundle end. Test that mask is |
| # added before indirect calls. |
| |
| .align 4 |
| test5: |
| .set noreorder |
| |
| jal func1 |
| addiu $4, $zero, 1 |
| |
| nop |
| bal func2 |
| addiu $4, $zero, 2 |
| |
| nop |
| nop |
| bltzal $t1, func3 |
| addiu $4, $zero, 3 |
| |
| nop |
| nop |
| nop |
| bgezal $t2, func4 |
| addiu $4, $zero, 4 |
| |
| jalr $t9 |
| addiu $4, $zero, 5 |
| |
| |
| # CHECK: nop |
| # CHECK-NEXT: nop |
| # CHECK-LABEL: test5: |
| # CHECK-NEXT: jal |
| # CHECK-NEXT: addiu $4, $zero, 1 |
| |
| # CHECK-NEXT: nop |
| # CHECK-NEXT: nop |
| # CHECK-NEXT: bal |
| # CHECK-NEXT: addiu $4, $zero, 2 |
| |
| # CHECK-NEXT: nop |
| # CHECK-NEXT: nop |
| # CHECK-NEXT: bltzal |
| # CHECK-NEXT: addiu $4, $zero, 3 |
| |
| # CHECK-NEXT: nop |
| # CHECK-NEXT: nop |
| # CHECK-NEXT: nop |
| # CHECK-NEXT: nop |
| |
| # CHECK-NEXT: nop |
| # CHECK-NEXT: nop |
| # CHECK-NEXT: bgezal |
| # CHECK-NEXT: addiu $4, $zero, 4 |
| |
| # CHECK-NEXT: nop |
| # CHECK-NEXT: and $25, $25, $14 |
| # CHECK-NEXT: jalr $25 |
| # CHECK-NEXT: addiu $4, $zero, 5 |
| |
| |
| |
| # Test that we can put non-dangerous loads and stores in branch delay slot. |
| |
| .align 4 |
| test6: |
| .set noreorder |
| |
| jal func1 |
| sw $4, 0($sp) |
| |
| bal func2 |
| lw $5, 0($t8) |
| |
| jalr $t9 |
| sw $sp, 0($sp) |
| |
| |
| |
| # CHECK: nop |
| # CHECK-NEXT: nop |
| # CHECK-LABEL: test6: |
| # CHECK-NEXT: jal |
| # CHECK-NEXT: sw $4, 0($sp) |
| |
| # CHECK-NEXT: nop |
| # CHECK-NEXT: nop |
| # CHECK-NEXT: bal |
| # CHECK-NEXT: lw $5, 0($24) |
| |
| # CHECK-NEXT: nop |
| # CHECK-NEXT: and $25, $25, $14 |
| # CHECK-NEXT: jalr |
| # CHECK-NEXT: sw $sp, 0($sp) |