| Index: src/trusted/validator_mips/testdata/test_sp_updates.S | 
| diff --git a/src/trusted/validator_mips/testdata/test_sp_updates.S b/src/trusted/validator_mips/testdata/test_sp_updates.S | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..e0ac14f0b6069eb97e6a1ba695da4266a5205e85 | 
| --- /dev/null | 
| +++ b/src/trusted/validator_mips/testdata/test_sp_updates.S | 
| @@ -0,0 +1,95 @@ | 
| +# Copyright 2012 The Native Client Authors.  All rights reserved. | 
| +# Use of this source code is governed by a BSD-style license that can | 
| +# be found in the LICENSE file. | 
| + | 
| +# | 
| +# Tests both legal and illegal variations on SP updates. | 
| +# | 
| + | 
| +.globl _start | 
| +_start: | 
| +.align 4 | 
| +.set noreorder | 
| +.set STORE_MASK,$t7 | 
| + | 
| +   # Test sp alteration without the appropriate mask. | 
| + | 
| +bundle_sp_dest_reg: | 
| +   addiu   $sp, $sp, 64             # Error, no mask after sp alteration. | 
| +   and     $sp, $a0, $a1            # Error, no mask after sp alteration. | 
| +   mfhi    $sp                      # Error, no mask after sp alteration. | 
| +   clo     $sp, $a2                 # Error, no mask after sp alteration. | 
| +   ins     $sp, $s3, 2, 10          # Error, no mask after sp alteration. | 
| +   lui     $sp, 0x1f                # Error, no mask after sp alteration. | 
| +   mfc1    $sp, $f12                # Error, no mask after sp alteration. | 
| +   mfhc1   $sp, $f10                # Error, no mask after sp alteration. | 
| +   mflo    $sp                      # Error, no mask after sp alteration. | 
| +   movn    $sp, $v0, $v1            # Error, no mask after sp alteration. | 
| +   movt    $sp, $s4, $fcc4          # Error, no mask after sp alteration. | 
| +   mul     $sp, $s0, $s1            # Error, no mask after sp alteration. | 
| + | 
| +   # Modify sp with lw instruction. | 
| + | 
| +bundle_load_into_sp: | 
| +   lw      $sp, 16($a0)             # Error, no mask after sp alteration. | 
| +   nop | 
| +   lw      $sp, 16($a0) | 
| +   and     $sp, $sp, STORE_MASK     # Error, a0 register is not masked. | 
| + | 
| +   # Alteration of sp with mask doesn't need a mask. | 
| + | 
| +bundle_mask_doesnt_need_mask: | 
| +   nop | 
| +   and     $sp, $sp, STORE_MASK     # OK | 
| +   nop | 
| +   nop | 
| + | 
| +   # A few instructions where sp is the first operand, but is not altered. | 
| + | 
| +bundle_sp_not_altered: | 
| +   mthi    $sp                      # OK | 
| +   mult    $sp, $t9                 # OK | 
| +   nop | 
| +   nop | 
| + | 
| +   # Alteration of sp with jalr instruction, not allowed. | 
| + | 
| +bundle_jalr_sp_t9: | 
| +   nop | 
| +   and     $t9, $t9, $t6 | 
| +   jalr    $sp, $t9                 # Error, alteration of sp register. | 
| +    nop                             # Instruction in delay slot is indented. | 
| + | 
| +   # Changing value of sp in delay slot, not allowed. | 
| + | 
| +bundle_chk_delay_slot: | 
| +   b       bundle_chk_cross_1 | 
| +    addiu   $sp, $sp, -32           # Error, delay slot splits sp alteration. | 
| +   and     $sp, $sp, STORE_MASK | 
| +   nop | 
| + | 
| +   # Pseudo-instruction with sp modification crosses bundle. | 
| +   # We allow this, because the potential jump at the start of bundle will | 
| +   # cause executing only mask instruction for sp, which is OK. | 
| + | 
| +bundle_chk_cross_1: | 
| +   nop | 
| +   nop | 
| +   nop | 
| +   addiu   $sp, $sp, -32            # OK | 
| + | 
| +bundle_chk_cross_2: | 
| +   and     $sp, $sp, STORE_MASK | 
| +   nop | 
| +   nop | 
| +   nop | 
| + | 
| +   # Correct sp changes. | 
| + | 
| +bundle_OK: | 
| +   add     $sp, $sp, 64             # OK | 
| +   and     $sp, $sp, STORE_MASK | 
| +   sub     $sp, $sp, 56             # OK | 
| +   and     $sp, $sp, STORE_MASK | 
| + | 
| +end_of_code: | 
|  |