Detail messages for ArrayIndexOutOfBoundsExceptions.

This adds ARM fast interpreter and JIT support. x86 is still missing.

Change-Id: Ide46fd9dcd06780193848f594ce7d1491d7f5a96
diff --git a/vm/mterp/armv5te/OP_APUT_OBJECT.S b/vm/mterp/armv5te/OP_APUT_OBJECT.S
index 9e98784..7eac323 100644
--- a/vm/mterp/armv5te/OP_APUT_OBJECT.S
+++ b/vm/mterp/armv5te/OP_APUT_OBJECT.S
@@ -1,9 +1,6 @@
 %verify "executed"
     /*
      * Store an object into an array.  vBB[vCC] <- vAA.
-     *
-     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
-     * instructions.  We use a pair of FETCH_Bs instead.
      */
     /* op vAA, vBB, vCC */
     FETCH(r0, 1)                        @ r0<- CCBB
@@ -11,13 +8,13 @@
     and     r2, r0, #255                @ r2<- BB
     mov     r3, r0, lsr #8              @ r3<- CC
     GET_VREG(rINST, r2)                 @ rINST<- vBB (array object)
-    GET_VREG(r0, r3)                    @ r0<- vCC (requested index)
+    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
     cmp     rINST, #0                   @ null array object?
     GET_VREG(r9, r9)                    @ r9<- vAA
     beq     common_errNullObject        @ yes, bail
     ldr     r3, [rINST, #offArrayObject_length]   @ r3<- arrayObj->length
-    add     r10, rINST, r0, lsl #2      @ r10<- arrayObj + index*width
-    cmp     r0, r3                      @ compare unsigned index, length
+    add     r10, rINST, r1, lsl #2      @ r10<- arrayObj + index*width
+    cmp     r1, r3                      @ compare unsigned index, length
     bcc     .L${opcode}_finish          @ we're okay, continue on
     b       common_errArrayIndex        @ index >= length, bail
 
diff --git a/vm/mterp/armv5te/footer.S b/vm/mterp/armv5te/footer.S
index ac348a4..6118a6c 100644
--- a/vm/mterp/armv5te/footer.S
+++ b/vm/mterp/armv5te/footer.S
@@ -995,13 +995,17 @@
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
 /*
- * Invalid array index.
+ * Invalid array index. Note that our calling convention is strange; we use r1
+ * and r3 because those just happen to be the registers all our callers are
+ * using. We shuffle them here before calling the C function.
+ * r1: index
+ * r3: size
  */
 common_errArrayIndex:
     EXPORT_PC()
-    ldr     r0, strArrayIndexException
-    mov     r1, #0
-    bl      dvmThrowException
+    mov     r0, r1
+    mov     r1, r3
+    bl      dvmThrowAIOOBE
     b       common_exceptionThrown
 
 /*
@@ -1191,8 +1195,6 @@
     .align  2
 strArithmeticException:
     .word   .LstrArithmeticException
-strArrayIndexException:
-    .word   .LstrArrayIndexException
 strArrayStoreException:
     .word   .LstrArrayStoreException
 strDivideByZero:
@@ -1233,8 +1235,6 @@
     .asciz  "Bad entry point %d\n"
 .LstrArithmeticException:
     .asciz  "Ljava/lang/ArithmeticException;"
-.LstrArrayIndexException:
-    .asciz  "Ljava/lang/ArrayIndexOutOfBoundsException;"
 .LstrArrayStoreException:
     .asciz  "Ljava/lang/ArrayStoreException;"
 .LstrClassCastException:
diff --git a/vm/mterp/out/InterpAsm-armv5te-vfp.S b/vm/mterp/out/InterpAsm-armv5te-vfp.S
index 8b6eeca..32ba8bc 100644
--- a/vm/mterp/out/InterpAsm-armv5te-vfp.S
+++ b/vm/mterp/out/InterpAsm-armv5te-vfp.S
@@ -2271,13 +2271,13 @@
     and     r2, r0, #255                @ r2<- BB
     mov     r3, r0, lsr #8              @ r3<- CC
     GET_VREG(rINST, r2)                 @ rINST<- vBB (array object)
-    GET_VREG(r0, r3)                    @ r0<- vCC (requested index)
+    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
     cmp     rINST, #0                   @ null array object?
     GET_VREG(r9, r9)                    @ r9<- vAA
     beq     common_errNullObject        @ yes, bail
     ldr     r3, [rINST, #offArrayObject_length]   @ r3<- arrayObj->length
-    add     r10, rINST, r0, lsl #2      @ r10<- arrayObj + index*width
-    cmp     r0, r3                      @ compare unsigned index, length
+    add     r10, rINST, r1, lsl #2      @ r10<- arrayObj + index*width
+    cmp     r1, r3                      @ compare unsigned index, length
     bcc     .LOP_APUT_OBJECT_finish          @ we're okay, continue on
     b       common_errArrayIndex        @ index >= length, bail
 
@@ -10386,12 +10386,14 @@
 
 /*
  * Invalid array index.
+ * r0: index
+ * r1: size
  */
 common_errArrayIndex:
     EXPORT_PC()
-    ldr     r0, strArrayIndexException
-    mov     r1, #0
-    bl      dvmThrowException
+    mov     r0, r1
+    mov     r1, r3
+    bl      dvmThrowAIOOBE
     b       common_exceptionThrown
 
 /*
@@ -10581,8 +10583,6 @@
     .align  2
 strArithmeticException:
     .word   .LstrArithmeticException
-strArrayIndexException:
-    .word   .LstrArrayIndexException
 strArrayStoreException:
     .word   .LstrArrayStoreException
 strDivideByZero:
@@ -10623,8 +10623,6 @@
     .asciz  "Bad entry point %d\n"
 .LstrArithmeticException:
     .asciz  "Ljava/lang/ArithmeticException;"
-.LstrArrayIndexException:
-    .asciz  "Ljava/lang/ArrayIndexOutOfBoundsException;"
 .LstrArrayStoreException:
     .asciz  "Ljava/lang/ArrayStoreException;"
 .LstrClassCastException:
diff --git a/vm/mterp/out/InterpAsm-armv5te.S b/vm/mterp/out/InterpAsm-armv5te.S
index 3b1b786..f86a791 100644
--- a/vm/mterp/out/InterpAsm-armv5te.S
+++ b/vm/mterp/out/InterpAsm-armv5te.S
@@ -2293,13 +2293,13 @@
     and     r2, r0, #255                @ r2<- BB
     mov     r3, r0, lsr #8              @ r3<- CC
     GET_VREG(rINST, r2)                 @ rINST<- vBB (array object)
-    GET_VREG(r0, r3)                    @ r0<- vCC (requested index)
+    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
     cmp     rINST, #0                   @ null array object?
     GET_VREG(r9, r9)                    @ r9<- vAA
     beq     common_errNullObject        @ yes, bail
     ldr     r3, [rINST, #offArrayObject_length]   @ r3<- arrayObj->length
-    add     r10, rINST, r0, lsl #2      @ r10<- arrayObj + index*width
-    cmp     r0, r3                      @ compare unsigned index, length
+    add     r10, rINST, r1, lsl #2      @ r10<- arrayObj + index*width
+    cmp     r1, r3                      @ compare unsigned index, length
     bcc     .LOP_APUT_OBJECT_finish          @ we're okay, continue on
     b       common_errArrayIndex        @ index >= length, bail
 
@@ -10844,12 +10844,14 @@
 
 /*
  * Invalid array index.
+ * r0: index
+ * r1: size
  */
 common_errArrayIndex:
     EXPORT_PC()
-    ldr     r0, strArrayIndexException
-    mov     r1, #0
-    bl      dvmThrowException
+    mov     r0, r1
+    mov     r1, r3
+    bl      dvmThrowAIOOBE
     b       common_exceptionThrown
 
 /*
@@ -11039,8 +11041,6 @@
     .align  2
 strArithmeticException:
     .word   .LstrArithmeticException
-strArrayIndexException:
-    .word   .LstrArrayIndexException
 strArrayStoreException:
     .word   .LstrArrayStoreException
 strDivideByZero:
@@ -11081,8 +11081,6 @@
     .asciz  "Bad entry point %d\n"
 .LstrArithmeticException:
     .asciz  "Ljava/lang/ArithmeticException;"
-.LstrArrayIndexException:
-    .asciz  "Ljava/lang/ArrayIndexOutOfBoundsException;"
 .LstrArrayStoreException:
     .asciz  "Ljava/lang/ArrayStoreException;"
 .LstrClassCastException:
diff --git a/vm/mterp/out/InterpAsm-armv7-a-neon.S b/vm/mterp/out/InterpAsm-armv7-a-neon.S
index 63ffa8b..6e28216 100644
--- a/vm/mterp/out/InterpAsm-armv7-a-neon.S
+++ b/vm/mterp/out/InterpAsm-armv7-a-neon.S
@@ -2275,13 +2275,13 @@
     and     r2, r0, #255                @ r2<- BB
     mov     r3, r0, lsr #8              @ r3<- CC
     GET_VREG(rINST, r2)                 @ rINST<- vBB (array object)
-    GET_VREG(r0, r3)                    @ r0<- vCC (requested index)
+    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
     cmp     rINST, #0                   @ null array object?
     GET_VREG(r9, r9)                    @ r9<- vAA
     beq     common_errNullObject        @ yes, bail
     ldr     r3, [rINST, #offArrayObject_length]   @ r3<- arrayObj->length
-    add     r10, rINST, r0, lsl #2      @ r10<- arrayObj + index*width
-    cmp     r0, r3                      @ compare unsigned index, length
+    add     r10, rINST, r1, lsl #2      @ r10<- arrayObj + index*width
+    cmp     r1, r3                      @ compare unsigned index, length
     bcc     .LOP_APUT_OBJECT_finish          @ we're okay, continue on
     b       common_errArrayIndex        @ index >= length, bail
 
@@ -10324,12 +10324,14 @@
 
 /*
  * Invalid array index.
+ * r0: index
+ * r1: size
  */
 common_errArrayIndex:
     EXPORT_PC()
-    ldr     r0, strArrayIndexException
-    mov     r1, #0
-    bl      dvmThrowException
+    mov     r0, r1
+    mov     r1, r3
+    bl      dvmThrowAIOOBE
     b       common_exceptionThrown
 
 /*
@@ -10519,8 +10521,6 @@
     .align  2
 strArithmeticException:
     .word   .LstrArithmeticException
-strArrayIndexException:
-    .word   .LstrArrayIndexException
 strArrayStoreException:
     .word   .LstrArrayStoreException
 strDivideByZero:
@@ -10561,8 +10561,6 @@
     .asciz  "Bad entry point %d\n"
 .LstrArithmeticException:
     .asciz  "Ljava/lang/ArithmeticException;"
-.LstrArrayIndexException:
-    .asciz  "Ljava/lang/ArrayIndexOutOfBoundsException;"
 .LstrArrayStoreException:
     .asciz  "Ljava/lang/ArrayStoreException;"
 .LstrClassCastException:
diff --git a/vm/mterp/out/InterpAsm-armv7-a.S b/vm/mterp/out/InterpAsm-armv7-a.S
index 11dabde..78ef2b4 100644
--- a/vm/mterp/out/InterpAsm-armv7-a.S
+++ b/vm/mterp/out/InterpAsm-armv7-a.S
@@ -2275,13 +2275,13 @@
     and     r2, r0, #255                @ r2<- BB
     mov     r3, r0, lsr #8              @ r3<- CC
     GET_VREG(rINST, r2)                 @ rINST<- vBB (array object)
-    GET_VREG(r0, r3)                    @ r0<- vCC (requested index)
+    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
     cmp     rINST, #0                   @ null array object?
     GET_VREG(r9, r9)                    @ r9<- vAA
     beq     common_errNullObject        @ yes, bail
     ldr     r3, [rINST, #offArrayObject_length]   @ r3<- arrayObj->length
-    add     r10, rINST, r0, lsl #2      @ r10<- arrayObj + index*width
-    cmp     r0, r3                      @ compare unsigned index, length
+    add     r10, rINST, r1, lsl #2      @ r10<- arrayObj + index*width
+    cmp     r1, r3                      @ compare unsigned index, length
     bcc     .LOP_APUT_OBJECT_finish          @ we're okay, continue on
     b       common_errArrayIndex        @ index >= length, bail
 
@@ -10324,12 +10324,14 @@
 
 /*
  * Invalid array index.
+ * r0: index
+ * r1: size
  */
 common_errArrayIndex:
     EXPORT_PC()
-    ldr     r0, strArrayIndexException
-    mov     r1, #0
-    bl      dvmThrowException
+    mov     r0, r1
+    mov     r1, r3
+    bl      dvmThrowAIOOBE
     b       common_exceptionThrown
 
 /*
@@ -10519,8 +10521,6 @@
     .align  2
 strArithmeticException:
     .word   .LstrArithmeticException
-strArrayIndexException:
-    .word   .LstrArrayIndexException
 strArrayStoreException:
     .word   .LstrArrayStoreException
 strDivideByZero:
@@ -10561,8 +10561,6 @@
     .asciz  "Bad entry point %d\n"
 .LstrArithmeticException:
     .asciz  "Ljava/lang/ArithmeticException;"
-.LstrArrayIndexException:
-    .asciz  "Ljava/lang/ArrayIndexOutOfBoundsException;"
 .LstrArrayStoreException:
     .asciz  "Ljava/lang/ArrayStoreException;"
 .LstrClassCastException: