summaryrefslogtreecommitdiffstats
path: root/test/MC/Mips/nacl-mask.s
diff options
context:
space:
mode:
Diffstat (limited to 'test/MC/Mips/nacl-mask.s')
-rw-r--r--test/MC/Mips/nacl-mask.s285
1 files changed, 285 insertions, 0 deletions
diff --git a/test/MC/Mips/nacl-mask.s b/test/MC/Mips/nacl-mask.s
new file mode 100644
index 0000000..8205835
--- /dev/null
+++ b/test/MC/Mips/nacl-mask.s
@@ -0,0 +1,285 @@
+# RUN: llvm-mc -filetype=obj -triple=mipsel-unknown-nacl %s \
+# RUN: | llvm-objdump -triple mipsel -disassemble -no-show-raw-insn - \
+# RUN: | 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-LABEL: test5:
+
+# CHECK-NEXT: nop
+# CHECK-NEXT: nop
+# 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