changeset 2970:2eed594c7cdb

Merge
author andrew
date Tue, 12 Jun 2012 23:50:11 +0100
parents 01a83786a9f6 (current diff) 07db9a656dea (diff)
children b41a43560dc8
files
diffstat 1 files changed, 55 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- a/src/cpu/zero/vm/thumb2.cpp	Thu Jun 07 19:21:20 2012 +0100
+++ b/src/cpu/zero/vm/thumb2.cpp	Tue Jun 12 23:50:11 2012 +0100
@@ -734,8 +734,8 @@
 #define IS_INT_SIZE_BASE_TYPE(c) (c=='B' || c=='C' || c=='F' || c=='I' || c=='S' || c=='Z')
 #define IS_INT_SIZE_TYPE(c) (IS_INT_SIZE_BASE_TYPE(c) || c == 'L' || c == '[')
 
-void Thumb2_save_locals(Thumb2_Info *jinfo, unsigned stackdepth);
-void Thumb2_restore_locals(Thumb2_Info *jinfo, unsigned stackdepth);
+void Thumb2_save_local_refs(Thumb2_Info *jinfo, unsigned stackdepth);
+void Thumb2_restore_local_refs(Thumb2_Info *jinfo, unsigned stackdepth);
 void Thumb2_Exit(Thumb2_Info *jinfo, unsigned handler, unsigned bci, unsigned stackdepth);
 
 static int method_stackchange(const jbyte *base)
@@ -4270,7 +4270,7 @@
 
     // We don't save or restore locals if we're returning.
     if (! is_return)
-      Thumb2_save_locals(jinfo, stackdepth);
+      Thumb2_save_local_refs(jinfo, stackdepth);
 
     // now the safepoint polling code itself
     mov_imm(jinfo->codebuf, ARM_R1, bci+CONSTMETHOD_CODEOFFSET);
@@ -4279,7 +4279,7 @@
     bl(jinfo->codebuf, handlers[H_SAFEPOINT]);
 
     if (! is_return)
-      Thumb2_restore_locals(jinfo, stackdepth);
+      Thumb2_restore_local_refs(jinfo, stackdepth);
 
     RESTORE_STACK(jinfo->jstack, jinfo->codebuf);
 
@@ -4344,7 +4344,7 @@
     return -1;
 }
 
-void Thumb2_save_locals(Thumb2_Info *jinfo, unsigned stackdepth)
+void Thumb2_save_local_refs(Thumb2_Info *jinfo, unsigned stackdepth)
 {
   int nlocals = jinfo->method->max_locals();
   unsigned *locals_info = jinfo->locals_info;
@@ -4361,7 +4361,7 @@
   }
 }
 
-void Thumb2_restore_locals(Thumb2_Info *jinfo, unsigned stackdepth)
+void Thumb2_restore_local_refs(Thumb2_Info *jinfo, unsigned stackdepth)
 {
   int nlocals = jinfo->method->max_locals();
   unsigned *locals_info = jinfo->locals_info;
@@ -4378,7 +4378,7 @@
   }
 }
 
-void Thumb2_invoke_save(Thumb2_Info *jinfo, unsigned stackdepth)
+void Thumb2_save_all_locals(Thumb2_Info *jinfo, unsigned stackdepth)
 {
   int nlocals = jinfo->method->max_locals();
   unsigned *locals_info = jinfo->locals_info;
@@ -4395,7 +4395,7 @@
   }
 }
 
-void Thumb2_invoke_restore(Thumb2_Info *jinfo, unsigned stackdepth)
+void Thumb2_restore_all_locals(Thumb2_Info *jinfo, unsigned stackdepth)
 {
   int nlocals = jinfo->method->max_locals();
   unsigned *locals_info = jinfo->locals_info;
@@ -4413,7 +4413,7 @@
 void Thumb2_Exit(Thumb2_Info *jinfo, unsigned handler, unsigned bci, unsigned stackdepth)
 {
     Thumb2_Flush(jinfo);
-    Thumb2_invoke_save(jinfo, stackdepth);
+    Thumb2_save_all_locals(jinfo, stackdepth);
     mov_imm(jinfo->codebuf, ARM_R0, bci+CONSTMETHOD_CODEOFFSET);
     bl(jinfo->codebuf, handlers[handler]);
 }
@@ -4433,7 +4433,7 @@
     unsigned loc_success1, loc_success2, loc_failed, loc_retry, loc_exception;
     unsigned loc_illegal_monitor_state;
     Thumb2_Flush(jinfo);
-//    Thumb2_save_locals(jinfo);
+//    Thumb2_save_local_refs(jinfo);
     // Free the monitor
     //
     // 		add	r1, #<stackdepth>-8
@@ -5000,7 +5000,7 @@
       unsigned expect_hi = POP(jstack);
 
       Thumb2_Flush(jinfo);
-      Thumb2_save_locals(jinfo, stackdepth - 4); // 4 args popped above
+      Thumb2_save_all_locals(jinfo, stackdepth - 4); // 4 args popped above
 
       // instance of java.lang.Unsafe:
       ldr_imm(jinfo->codebuf, ARM_LR, Rstack, 3 * wordSize, 1, 0);
@@ -5033,7 +5033,7 @@
       mov_imm(codebuf, result, 1);
       fullBarrier(codebuf);
 
-      Thumb2_restore_locals(jinfo, stackdepth - 4); // 4 args popped above
+      Thumb2_restore_all_locals(jinfo, stackdepth - 4); // 4 args popped above
       add_imm(codebuf, Rstack, Rstack, 4 * wordSize);
       PUSH(jstack, result);
     }
@@ -5286,10 +5286,10 @@
 	    JASSERT(opcode != opc_ldc2_w, "ldc2_w unresolved?");
 	    Thumb2_Flush(jinfo);
 	    mov_imm(jinfo->codebuf, ARM_R0, bci+CONSTMETHOD_CODEOFFSET);
-	  Thumb2_save_locals(jinfo, stackdepth);
+	  Thumb2_save_local_refs(jinfo, stackdepth);
 //	    mov_imm(jinfo->codebuf, ARM_R1, opcode != opc_ldc);
 	    bl(jinfo->codebuf, handlers[opcode == opc_ldc ? H_LDC : H_LDC_W]);
-	  Thumb2_restore_locals(jinfo, stackdepth);
+	  Thumb2_restore_local_refs(jinfo, stackdepth);
 	    ldr_imm(jinfo->codebuf, ARM_R0, Rthread, THREAD_VM_RESULT, 1, 0);
 	    mov_imm(jinfo->codebuf, ARM_R2, 0);
 	    str_imm(jinfo->codebuf, ARM_R2, Rthread, THREAD_VM_RESULT, 1, 0);
@@ -5858,11 +5858,11 @@
 	  if (c == 'C') handler = H_GETFIELD_H;
 	  if (c == 'S') handler = H_GETFIELD_SH;
 	  Thumb2_Flush(jinfo);
-	  Thumb2_save_locals(jinfo, stackdepth);
+	  Thumb2_save_local_refs(jinfo, stackdepth);
 	  mov_imm(jinfo->codebuf, ARM_R0, bci+CONSTMETHOD_CODEOFFSET);
 	  mov_imm(jinfo->codebuf, ARM_R1, index);
 	  blx(jinfo->codebuf, handlers[handler]);
-	  Thumb2_restore_locals(jinfo, STACKDEPTH(jinfo, bc_stackinfo[bci+len]));
+	  Thumb2_restore_local_refs(jinfo, STACKDEPTH(jinfo, bc_stackinfo[bci+len]));
 	  break;
 	}
 
@@ -5921,11 +5921,11 @@
 	  if (c == 'C') handler = H_GETSTATIC_H;
 	  if (c == 'S') handler = H_GETSTATIC_SH;
 	  Thumb2_Flush(jinfo);
-	  Thumb2_save_locals(jinfo, stackdepth);
+	  Thumb2_save_local_refs(jinfo, stackdepth);
 	  mov_imm(jinfo->codebuf, ARM_R0, bci+CONSTMETHOD_CODEOFFSET);
 	  mov_imm(jinfo->codebuf, ARM_R1, index);
 	  blx(jinfo->codebuf, handlers[handler]);
-	  Thumb2_restore_locals(jinfo, STACKDEPTH(jinfo, bc_stackinfo[bci+len]));
+	  Thumb2_restore_local_refs(jinfo, STACKDEPTH(jinfo, bc_stackinfo[bci+len]));
 	  break;
 	}
 
@@ -5986,11 +5986,11 @@
 	  if (c == 'C' || c == 'S') handler = H_PUTFIELD_H;
  	  if (c == '[' || c == 'L') handler = H_PUTFIELD_A;
 	  Thumb2_Flush(jinfo);
-	  Thumb2_save_locals(jinfo, stackdepth);
+	  Thumb2_save_local_refs(jinfo, stackdepth);
 	  mov_imm(jinfo->codebuf, ARM_R0, bci+CONSTMETHOD_CODEOFFSET);
 	  mov_imm(jinfo->codebuf, ARM_R1, index);
 	  blx(jinfo->codebuf, handlers[handler]);
-	  Thumb2_restore_locals(jinfo, STACKDEPTH(jinfo, bc_stackinfo[bci+len]));
+	  Thumb2_restore_local_refs(jinfo, STACKDEPTH(jinfo, bc_stackinfo[bci+len]));
 
 	  break;
 	}
@@ -6052,11 +6052,11 @@
 	  if (c == 'C' || c == 'S') handler = H_PUTSTATIC_H;
 	  if (c == '[' || c == 'L') handler = H_PUTSTATIC_A;
 	  Thumb2_Flush(jinfo);
-	  Thumb2_save_locals(jinfo, stackdepth);
+	  Thumb2_save_local_refs(jinfo, stackdepth);
 	  mov_imm(jinfo->codebuf, ARM_R0, bci+CONSTMETHOD_CODEOFFSET);
 	  mov_imm(jinfo->codebuf, ARM_R1, index);
 	  blx(jinfo->codebuf, handlers[handler]);
-	  Thumb2_restore_locals(jinfo, STACKDEPTH(jinfo, bc_stackinfo[bci+len]));
+	  Thumb2_restore_local_refs(jinfo, STACKDEPTH(jinfo, bc_stackinfo[bci+len]));
 	  break;
 	}
 
@@ -6134,22 +6134,24 @@
         cache = cp->entry_at(index);
         if (!cache->is_resolved((Bytecodes::Code)opcode)) {
 	  Thumb2_Flush(jinfo);
-	  Thumb2_invoke_save(jinfo, stackdepth);
+	  Thumb2_save_all_locals(jinfo, stackdepth);
 	  mov_imm(jinfo->codebuf, ARM_R0, bci+CONSTMETHOD_CODEOFFSET);
 	  mov_imm(jinfo->codebuf, ARM_R1, index);
 	  blx(jinfo->codebuf,
 	    handlers[opcode == opc_invokestatic ? H_INVOKESTATIC :
 		     opcode == opc_invokespecial ? H_INVOKESPECIAL : H_INVOKEVIRTUAL]);
-	  Thumb2_invoke_restore(jinfo, STACKDEPTH(jinfo, bc_stackinfo[bci+len]));
+	  Thumb2_restore_all_locals(jinfo, STACKDEPTH(jinfo, bc_stackinfo[bci+len]));
 	  break;
 	}
 
 	callee = opcode == opc_invokevirtual ? (methodOop)cache->f2() : (methodOop)cache->f1();
-	if ((opcode != opc_invokevirtual || cache->is_vfinal()) && callee->is_accessor()) {
-
+
+	if (opcode != opc_invokevirtual || cache->is_vfinal()) {
 	  if (handle_special_method(callee, jinfo, stackdepth))
 	    break;
-
+	}
+
+	if ((opcode != opc_invokevirtual || cache->is_vfinal()) && callee->is_accessor()) {
 	  u1 *code = callee->code_base();
 	  int index = GET_NATIVE_U2(&code[2]);
 	  constantPoolCacheOop callee_cache = callee->constants()->cache();
@@ -6183,14 +6185,14 @@
 
  	Thumb2_Flush(jinfo);
 	if (OSPACE) {
-	  Thumb2_invoke_save(jinfo, stackdepth);
+	  Thumb2_save_all_locals(jinfo, stackdepth);
 	  mov_imm(jinfo->codebuf, ARM_R0, bci+CONSTMETHOD_CODEOFFSET);
 	  mov_imm(jinfo->codebuf, ARM_R1, index);
 	  blx(jinfo->codebuf, handlers[
 	      opcode == opc_invokestatic ? H_INVOKESTATIC_RESOLVED :
 	      opcode == opc_invokespecial ? H_INVOKESPECIAL_RESOLVED :
 	      cache->is_vfinal() ? H_INVOKEVFINAL : H_INVOKEVIRTUAL_RESOLVED]);
-	  Thumb2_invoke_restore(jinfo, STACKDEPTH(jinfo, bc_stackinfo[bci+len]));
+	  Thumb2_restore_all_locals(jinfo, STACKDEPTH(jinfo, bc_stackinfo[bci+len]));
 	  break;
 	}
 
@@ -6214,7 +6216,7 @@
  	ldr_imm(jinfo->codebuf, ARM_R1, ARM_R0, METHOD_FROM_INTERPRETED, 1, 0);
 	store_istate(jinfo, ARM_R2, ISTATE_BCP, stackdepth);
  	str_imm(jinfo->codebuf, Rstack, Rthread, THREAD_JAVA_SP, 1, 0);
- 	Thumb2_invoke_save(jinfo, stackdepth);
+ 	Thumb2_save_all_locals(jinfo, stackdepth);
 	sub_imm(jinfo->codebuf, Rstack, Rstack, 4);
  	ldr_imm(jinfo->codebuf, ARM_R3, ARM_R1, 0, 1, 0);
 	store_istate(jinfo, Rstack, ISTATE_STACK, stackdepth+1);
@@ -6225,12 +6227,12 @@
 	ldr_imm(jinfo->codebuf, Rstack, Rthread, THREAD_JAVA_SP, 1, 0);
 	load_istate(jinfo, ARM_R2, ISTATE_STACK_LIMIT, stackdepth);
  	ldr_imm(jinfo->codebuf, ARM_R1, Rthread, THREAD_TOP_ZERO_FRAME, 1, 0);
-	Thumb2_invoke_restore(jinfo, stackdepth);
+	Thumb2_restore_all_locals(jinfo, stackdepth);
 	mov_imm(jinfo->codebuf, ARM_R0, 0);   // set last SP to zero
 					      // before setting FP
 	str_imm(jinfo->codebuf, ARM_R0, Rthread, THREAD_LAST_JAVA_SP, 1, 0);
 	ldr_imm(jinfo->codebuf, ARM_R1, Rthread, THREAD_TOP_ZERO_FRAME, 1, 0);
-	Thumb2_invoke_restore(jinfo, stackdepth);
+	Thumb2_restore_all_locals(jinfo, stackdepth);
 	add_imm(jinfo->codebuf, ARM_R2, ARM_R2, 4);
 	ldr_imm(jinfo->codebuf, ARM_R3, Rthread, THREAD_PENDING_EXC, 1, 0);
 	str_imm(jinfo->codebuf, ARM_R2, Rthread, THREAD_JAVA_SP, 1, 0);
@@ -6251,11 +6253,11 @@
 	// Currently we just call the unresolved invokeinterface entry for resolved /
 	// unresolved alike!
 	Thumb2_Flush(jinfo);
-	Thumb2_invoke_save(jinfo, stackdepth);
+	Thumb2_save_all_locals(jinfo, stackdepth);
 	mov_imm(jinfo->codebuf, ARM_R0, bci+CONSTMETHOD_CODEOFFSET);
 	mov_imm(jinfo->codebuf, ARM_R1, index);
 	blx(jinfo->codebuf, handlers[H_INVOKEINTERFACE]);
-	Thumb2_invoke_restore(jinfo, STACKDEPTH(jinfo, bc_stackinfo[bci+len]));
+	Thumb2_restore_all_locals(jinfo, STACKDEPTH(jinfo, bc_stackinfo[bci+len]));
 	break;
       }
 
@@ -6386,7 +6388,7 @@
 	ldr_imm(jinfo->codebuf, r_tmp, r_tmp, KLASS_PART+KLASS_ACCESSFLAGS, 1, 0);
 	tst_imm(jinfo->codebuf, r_tmp, JVM_ACC_HAS_FINALIZER);
 	loc_eq = forward_16(jinfo->codebuf);
-	Thumb2_save_locals(jinfo, stackdepth);
+	Thumb2_save_local_refs(jinfo, stackdepth);
 	mov_reg(jinfo->codebuf, ARM_R1, r);
 	load_istate(jinfo, ARM_R0, ISTATE_METHOD, stackdepth);
 	ldr_imm(jinfo->codebuf, ARM_R0, ARM_R0, METHOD_CONSTMETHOD, 1, 0);
@@ -6414,9 +6416,9 @@
 	Thumb2_Flush(jinfo);
 	mov_imm(jinfo->codebuf, ARM_R1, GET_JAVA_U2(code_base+bci+1));
 	mov_imm(jinfo->codebuf, ARM_R3, bci+CONSTMETHOD_CODEOFFSET);
-      Thumb2_save_locals(jinfo, stackdepth);
+      Thumb2_save_local_refs(jinfo, stackdepth);
 	bl(jinfo->codebuf, handlers[H_NEW]);
-      Thumb2_restore_locals(jinfo, stackdepth);
+      Thumb2_restore_local_refs(jinfo, stackdepth);
 	cmp_imm(jinfo->codebuf, ARM_R0, 0);
 	it(jinfo->codebuf, COND_EQ, IT_MASK_T);
 	bl(jinfo->codebuf, handlers[H_HANDLE_EXCEPTION]);
@@ -6438,9 +6440,9 @@
 	dst[2] = ARM_R3;
 	mov_multiple(jinfo->codebuf, dst, src, 3);
 	mov_imm(jinfo->codebuf, ARM_R0, bci+CONSTMETHOD_CODEOFFSET);
-      Thumb2_save_locals(jinfo, stackdepth - 3);	// 3 args popped above
+      Thumb2_save_local_refs(jinfo, stackdepth - 3);	// 3 args popped above
 	bl(jinfo->codebuf, handlers[H_AASTORE]);
-      Thumb2_restore_locals(jinfo, stackdepth - 3);
+      Thumb2_restore_local_refs(jinfo, stackdepth - 3);
 	cmp_imm(jinfo->codebuf, ARM_R0, 0);
 	it(jinfo->codebuf, COND_NE, IT_MASK_T);
 	bl(jinfo->codebuf, handlers[H_HANDLE_EXCEPTION]);
@@ -6457,9 +6459,9 @@
 	mov_reg(jinfo->codebuf, ARM_R2, r);
 	mov_imm(jinfo->codebuf, ARM_R1, GET_JAVA_U2(code_base+bci+1));
 	mov_imm(jinfo->codebuf, ARM_R3, bci+CONSTMETHOD_CODEOFFSET);
-      Thumb2_save_locals(jinfo, stackdepth - 1);
+      Thumb2_save_local_refs(jinfo, stackdepth - 1);
 	bl(jinfo->codebuf, handlers[H_INSTANCEOF]);
-      Thumb2_restore_locals(jinfo, stackdepth - 1);	// 1 arg popped above
+      Thumb2_restore_local_refs(jinfo, stackdepth - 1);	// 1 arg popped above
 	cmp_imm(jinfo->codebuf, ARM_R0, (unsigned)-1);
 	it(jinfo->codebuf, COND_EQ, IT_MASK_T);
 	bl(jinfo->codebuf, handlers[H_HANDLE_EXCEPTION]);
@@ -6477,9 +6479,9 @@
 	mov_reg(jinfo->codebuf, ARM_R2, r);
 	mov_imm(jinfo->codebuf, ARM_R1, GET_JAVA_U2(code_base+bci+1));
 	mov_imm(jinfo->codebuf, ARM_R3, bci+CONSTMETHOD_CODEOFFSET);
-      Thumb2_save_locals(jinfo, stackdepth);
+      Thumb2_save_local_refs(jinfo, stackdepth);
 	bl(jinfo->codebuf, handlers[H_CHECKCAST]);
-      Thumb2_restore_locals(jinfo, stackdepth);
+      Thumb2_restore_local_refs(jinfo, stackdepth);
 	cmp_imm(jinfo->codebuf, ARM_R0, 0);
 	it(jinfo->codebuf, COND_NE, IT_MASK_T);
 	bl(jinfo->codebuf, handlers[H_HANDLE_EXCEPTION]);
@@ -6488,10 +6490,10 @@
 
       case opc_monitorenter:
 	Thumb2_Flush(jinfo);
-	Thumb2_invoke_save(jinfo, stackdepth);
+	Thumb2_save_all_locals(jinfo, stackdepth);
 	mov_imm(jinfo->codebuf, ARM_R0, bci+CONSTMETHOD_CODEOFFSET);
 	bl(jinfo->codebuf, handlers[H_MONITORENTER]);
-	Thumb2_invoke_restore(jinfo, stackdepth);
+	Thumb2_restore_all_locals(jinfo, stackdepth);
 	break;
 
       case opc_monitorexit: {
@@ -6502,9 +6504,9 @@
 	Thumb2_Flush(jinfo);
 	mov_reg(jinfo->codebuf, ARM_R1, r);
 	mov_imm(jinfo->codebuf, ARM_R3, bci+CONSTMETHOD_CODEOFFSET);
-        Thumb2_save_locals(jinfo, stackdepth);
+        Thumb2_save_local_refs(jinfo, stackdepth);
 	bl(jinfo->codebuf, handlers[H_MONITOREXIT]);
-        Thumb2_restore_locals(jinfo, stackdepth);
+        Thumb2_restore_local_refs(jinfo, stackdepth);
 	cmp_imm(jinfo->codebuf, ARM_R0, 0);
 	it(jinfo->codebuf, COND_NE, IT_MASK_T);
 	bl(jinfo->codebuf, handlers[H_HANDLE_EXCEPTION]);
@@ -6521,9 +6523,9 @@
 	mov_reg(jinfo->codebuf, ARM_R2, r);
 	mov_imm(jinfo->codebuf, ARM_R1, code_base[bci+1]);
 	mov_imm(jinfo->codebuf, ARM_R3, bci+CONSTMETHOD_CODEOFFSET);
-      Thumb2_save_locals(jinfo, stackdepth-1);
+      Thumb2_save_local_refs(jinfo, stackdepth-1);
 	bl(jinfo->codebuf, handlers[H_NEWARRAY]);
-      Thumb2_restore_locals(jinfo, stackdepth-1);
+      Thumb2_restore_local_refs(jinfo, stackdepth-1);
 	ldr_imm(jinfo->codebuf, ARM_R0, Rthread, THREAD_VM_RESULT, 1, 0);
 	mov_imm(jinfo->codebuf, ARM_R2, 0);
   	str_imm(jinfo->codebuf, ARM_R2, Rthread, THREAD_VM_RESULT, 1, 0);
@@ -6544,9 +6546,9 @@
 	mov_reg(jinfo->codebuf, ARM_R3, r);
 	mov_imm(jinfo->codebuf, ARM_R2, GET_JAVA_U2(code_base+bci+1));
 	mov_imm(jinfo->codebuf, ARM_R0, bci+CONSTMETHOD_CODEOFFSET);
-      Thumb2_save_locals(jinfo, stackdepth-1);
+      Thumb2_save_local_refs(jinfo, stackdepth-1);
 	bl(jinfo->codebuf, handlers[H_ANEWARRAY]);
-      Thumb2_restore_locals(jinfo, stackdepth-1);
+      Thumb2_restore_local_refs(jinfo, stackdepth-1);
 	ldr_imm(jinfo->codebuf, ARM_R0, Rthread, THREAD_VM_RESULT, 1, 0);
 	mov_imm(jinfo->codebuf, ARM_R2, 0);
   	str_imm(jinfo->codebuf, ARM_R2, Rthread, THREAD_VM_RESULT, 1, 0);
@@ -6563,9 +6565,9 @@
 	Thumb2_Flush(jinfo);
 	mov_imm(jinfo->codebuf, ARM_R0, bci+CONSTMETHOD_CODEOFFSET);
 	mov_imm(jinfo->codebuf, ARM_R1, code_base[bci+3] * 4);
-      Thumb2_save_locals(jinfo, stackdepth);
+      Thumb2_save_local_refs(jinfo, stackdepth);
 	bl(jinfo->codebuf, handlers[H_MULTIANEWARRAY]);
-      Thumb2_restore_locals(jinfo, stackdepth - code_base[bci+3]);
+      Thumb2_restore_local_refs(jinfo, stackdepth - code_base[bci+3]);
 	ldr_imm(jinfo->codebuf, ARM_R0, Rthread, THREAD_VM_RESULT, 1, 0);
 	mov_imm(jinfo->codebuf, ARM_R2, 0);
   	str_imm(jinfo->codebuf, ARM_R2, Rthread, THREAD_VM_RESULT, 1, 0);