+ ARM_CMP_REG_IMM8 (code, ARMREG_IP, GSHAREDVT_RET_VFP_R4);
+ br [0] = code;
+ ARM_B_COND (code, ARMCOND_NE, 0);
+
+ /* OUT R4 case */
+ /* Load vtype ret addr from the caller arg regs */
+ ARM_LDR_IMM (code, ARMREG_IP, fp, info_offset);
+ ARM_LDR_IMM (code, ARMREG_IP, ARMREG_IP, MONO_STRUCT_OFFSET (GSharedVtCallInfo, vret_arg_reg));
+ ARM_SHL_IMM (code, ARMREG_IP, ARMREG_IP, 2);
+ ARM_ADD_REG_REG (code, ARMREG_IP, ARMREG_IP, fp);
+ ARM_ADD_REG_IMM8 (code, ARMREG_IP, ARMREG_IP, caller_reg_area_offset);
+ ARM_LDR_IMM (code, ARMREG_IP, ARMREG_IP, 0);
+ /* Save the return value to the buffer pointed to by the vret addr */
+ ARM_FSTS (code, ARM_VFP_D0, ARMREG_IP, 0);
+ br_ret [br_ret_index ++] = code;
+ ARM_B (code, 0);
+ arm_patch (br [0], code);
+
+ ARM_CMP_REG_IMM8 (code, ARMREG_IP, GSHAREDVT_RET_VFP_R8);
+ br [0] = code;
+ ARM_B_COND (code, ARMCOND_NE, 0);
+
+ /* OUT R8 case */
+ /* Load vtype ret addr from the caller arg regs */
+ ARM_LDR_IMM (code, ARMREG_IP, fp, info_offset);
+ ARM_LDR_IMM (code, ARMREG_IP, ARMREG_IP, MONO_STRUCT_OFFSET (GSharedVtCallInfo, vret_arg_reg));
+ ARM_SHL_IMM (code, ARMREG_IP, ARMREG_IP, 2);
+ ARM_ADD_REG_REG (code, ARMREG_IP, ARMREG_IP, fp);
+ ARM_ADD_REG_IMM8 (code, ARMREG_IP, ARMREG_IP, caller_reg_area_offset);
+ ARM_LDR_IMM (code, ARMREG_IP, ARMREG_IP, 0);
+ /* Save the return value to the buffer pointed to by the vret addr */
+ ARM_FSTD (code, ARM_VFP_D0, ARMREG_IP, 0);
+ br_ret [br_ret_index ++] = code;
+ ARM_B (code, 0);
+ arm_patch (br [0], code);
+