Lines Matching refs:info
331 static int NextSDCallInsn(CompilationUnit* cu, CallInfo* info,
435 static int NextVCallInsn(CompilationUnit* cu, CallInfo* info,
446 RegLocation rl_arg = info->args[0];
451 cg->GenNullCheck(info->args[0].s_reg_low, cg->TargetReg(kArg1), info->opt_flags);
483 static int NextInterfaceCallInsn(CompilationUnit* cu, CallInfo* info, int state,
551 static int NextInvokeInsnSP(CompilationUnit* cu, CallInfo* info, ThreadOffset trampoline,
572 static int NextStaticCallInsnSP(CompilationUnit* cu, CallInfo* info,
579 return NextInvokeInsnSP(cu, info, trampoline, state, target_method, 0);
582 static int NextDirectCallInsnSP(CompilationUnit* cu, CallInfo* info, int state,
587 return NextInvokeInsnSP(cu, info, trampoline, state, target_method, 0);
590 static int NextSuperCallInsnSP(CompilationUnit* cu, CallInfo* info, int state,
595 return NextInvokeInsnSP(cu, info, trampoline, state, target_method, 0);
598 static int NextVCallInsnSP(CompilationUnit* cu, CallInfo* info, int state,
603 return NextInvokeInsnSP(cu, info, trampoline, state, target_method, 0);
607 CallInfo* info, int state,
613 return NextInvokeInsnSP(cu, info, trampoline, state, target_method, 0);
616 int Mir2Lir::LoadArgRegs(CallInfo* info, int call_state,
628 for (; (next_reg <= last_arg_reg) && (next_arg < info->num_arg_words); next_reg++) {
629 RegLocation rl_arg = info->args[next_arg++];
642 call_state = next_call_insn(cu_, info, call_state, target_method, vtable_idx,
655 int Mir2Lir::GenDalvikArgsNoRange(CallInfo* info,
663 if (info->num_arg_words == 0)
666 call_state = next_call_insn(cu_, info, call_state, target_method, vtable_idx,
669 DCHECK_LE(info->num_arg_words, 5);
670 if (info->num_arg_words > 3) {
673 RegLocation rl_use0 = info->args[0];
674 RegLocation rl_use1 = info->args[1];
675 RegLocation rl_use2 = info->args[2];
687 call_state = next_call_insn(cu_, info, call_state, target_method,
692 call_state = next_call_insn(cu_, info, call_state, target_method, vtable_idx,
697 while (next_use < info->num_arg_words) {
700 rl_arg = info->args[next_use];
713 call_state = next_call_insn(cu_, info, call_state, target_method,
724 call_state = next_call_insn(cu_, info, call_state, target_method, vtable_idx,
729 call_state = LoadArgRegs(info, call_state, next_call_insn,
734 *pcrLabel = GenNullCheck(info->args[0].s_reg_low, TargetReg(kArg1), info->opt_flags);
754 int Mir2Lir::GenDalvikArgsRange(CallInfo* info, int call_state,
760 if (info->num_arg_words <= 5)
761 return GenDalvikArgsNoRange(info, call_state, pcrLabel,
771 for (int next_arg = 0; next_arg < info->num_arg_words;) {
772 RegLocation loc = info->args[next_arg];
790 info->args[3].s_reg_low);
797 TargetReg(kArg1), (info->num_arg_words - 3) * 4, false);
799 if (info->num_arg_words >= 20) {
804 TargetReg(kArg1), (info->num_arg_words - 3) * 4, false);
807 int regs_left = std::min(info->num_arg_words - 3, 16);
808 call_state = next_call_insn(cu_, info, call_state, target_method, vtable_idx,
815 call_state = next_call_insn(cu_, info, call_state, target_method, vtable_idx,
818 call_state = next_call_insn(cu_, info, call_state, target_method, vtable_idx,
823 call_state = next_call_insn(cu_, info, call_state, target_method, vtable_idx,
828 call_state = LoadArgRegs(info, call_state, next_call_insn,
832 call_state = next_call_insn(cu_, info, call_state, target_method, vtable_idx,
835 *pcrLabel = GenNullCheck(info->args[0].s_reg_low, TargetReg(kArg1), info->opt_flags);
840 RegLocation Mir2Lir::InlineTarget(CallInfo* info) {
842 if (info->result.location == kLocInvalid) {
845 res = info->result;
850 RegLocation Mir2Lir::InlineTargetWide(CallInfo* info) {
852 if (info->result.location == kLocInvalid) {
855 res = info->result;
860 bool Mir2Lir::GenInlinedCharAt(CallInfo* info) {
874 RegLocation rl_obj = info->args[0];
875 RegLocation rl_idx = info->args[1];
879 GenNullCheck(rl_obj.s_reg_low, rl_obj.low_reg, info->opt_flags);
880 bool range_check = (!(info->opt_flags & MIR_IGNORE_RANGE_CHECK));
895 launch_pad = RawLIR(0, kPseudoIntrinsicRetry, reinterpret_cast<uintptr_t>(info));
906 launch_pad = RawLIR(0, kPseudoIntrinsicRetry, reinterpret_cast<uintptr_t>(info));
921 RegLocation rl_dest = InlineTarget(info);
931 info->opt_flags |= (MIR_INLINED | MIR_IGNORE_NULL_CHECK);
936 bool Mir2Lir::GenInlinedStringIsEmptyOrLength(CallInfo* info, bool is_empty) {
942 RegLocation rl_obj = info->args[0];
944 RegLocation rl_dest = InlineTarget(info);
946 GenNullCheck(rl_obj.s_reg_low, rl_obj.low_reg, info->opt_flags);
964 bool Mir2Lir::GenInlinedAbsInt(CallInfo* info) {
969 RegLocation rl_src = info->args[0];
971 RegLocation rl_dest = InlineTarget(info);
982 bool Mir2Lir::GenInlinedAbsLong(CallInfo* info) {
988 RegLocation rl_src = info->args[0];
990 RegLocation rl_dest = InlineTargetWide(info);
1004 RegLocation rl_src = info->args[0];
1006 RegLocation rl_dest = InlineTargetWide(info);
1023 bool Mir2Lir::GenInlinedFloatCvt(CallInfo* info) {
1028 RegLocation rl_src = info->args[0];
1029 RegLocation rl_dest = InlineTarget(info);
1034 bool Mir2Lir::GenInlinedDoubleCvt(CallInfo* info) {
1039 RegLocation rl_src = info->args[0];
1040 RegLocation rl_dest = InlineTargetWide(info);
1049 bool Mir2Lir::GenInlinedIndexOf(CallInfo* info, bool zero_based) {
1060 RegLocation rl_obj = info->args[0];
1061 RegLocation rl_char = info->args[1];
1062 RegLocation rl_start = info->args[2];
1071 GenNullCheck(rl_obj.s_reg_low, reg_ptr, info->opt_flags);
1072 LIR* launch_pad = RawLIR(0, kPseudoIntrinsicRetry, reinterpret_cast<uintptr_t>(info));
1084 info->opt_flags |= (MIR_INLINED | MIR_IGNORE_NULL_CHECK);
1086 RegLocation rl_dest = InlineTarget(info);
1092 bool Mir2Lir::GenInlinedStringCompareTo(CallInfo* info) {
1102 RegLocation rl_this = info->args[0];
1103 RegLocation rl_cmp = info->args[1];
1108 GenNullCheck(rl_this.s_reg_low, reg_this, info->opt_flags);
1110 LIR* launch_pad = RawLIR(0, kPseudoIntrinsicRetry, reinterpret_cast<uintptr_t>(info));
1121 info->opt_flags |= (MIR_INLINED | MIR_IGNORE_NULL_CHECK);
1123 RegLocation rl_dest = InlineTarget(info);
1128 bool Mir2Lir::GenInlinedCurrentThread(CallInfo* info) {
1129 RegLocation rl_dest = InlineTarget(info);
1142 bool Mir2Lir::GenInlinedUnsafeGet(CallInfo* info,
1148 // Unused - RegLocation rl_src_unsafe = info->args[0];
1149 RegLocation rl_src_obj = info->args[1]; // Object
1150 RegLocation rl_src_offset = info->args[2]; // long low
1151 rl_src_offset.wide = 0; // ignore high half in info->args[3]
1152 RegLocation rl_dest = InlineTarget(info); // result reg
1170 bool Mir2Lir::GenInlinedUnsafePut(CallInfo* info, bool is_long,
1180 // Unused - RegLocation rl_src_unsafe = info->args[0];
1181 RegLocation rl_src_obj = info->args[1]; // Object
1182 RegLocation rl_src_offset = info->args[2]; // long low
1183 rl_src_offset.wide = 0; // ignore high half in info->args[3]
1184 RegLocation rl_src_value = info->args[4]; // value to store
1208 bool Mir2Lir::GenIntrinsic(CallInfo* info) {
1209 if (info->opt_flags & MIR_INLINED) {
1220 * take advantage of/generate new useful dataflow info.
1223 cu_->dex_file->GetMethodDeclaringClassDescriptor(cu_->dex_file->GetMethodId(info->index)));
1225 std::string tgt_method(PrettyMethod(info->index, *cu_->dex_file));
1227 return GenInlinedDoubleCvt(info);
1230 return GenInlinedDoubleCvt(info);
1233 std::string tgt_method(PrettyMethod(info->index, *cu_->dex_file));
1235 return GenInlinedFloatCvt(info);
1238 return GenInlinedFloatCvt(info);
1242 std::string tgt_method(PrettyMethod(info->index, *cu_->dex_file));
1245 return GenInlinedAbsInt(info);
1249 return GenInlinedAbsLong(info);
1253 return GenInlinedMinMaxInt(info, false /* is_min */);
1257 return GenInlinedMinMaxInt(info, true /* is_min */);
1261 return GenInlinedSqrt(info);
1264 std::string tgt_method(PrettyMethod(info->index, *cu_->dex_file));
1266 return GenInlinedCharAt(info);
1269 return GenInlinedStringCompareTo(info);
1272 return GenInlinedStringIsEmptyOrLength(info, true /* is_empty */);
1275 return GenInlinedIndexOf(info, false /* base 0 */);
1278 return GenInlinedIndexOf(info, true /* base 0 */);
1281 return GenInlinedStringIsEmptyOrLength(info, false /* is_empty */);
1284 std::string tgt_method(PrettyMethod(info->index, *cu_->dex_file));
1286 return GenInlinedCurrentThread(info);
1289 std::string tgt_method(PrettyMethod(info->index, *cu_->dex_file));
1291 return GenInlinedCas32(info, false);
1294 return GenInlinedCas32(info, true);
1297 return GenInlinedUnsafeGet(info, false /* is_long */, false /* is_volatile */);
1300 return GenInlinedUnsafeGet(info, false /* is_long */, true /* is_volatile */);
1303 return GenInlinedUnsafePut(info, false /* is_long */, false /* is_object */,
1307 return GenInlinedUnsafePut(info, false /* is_long */, false /* is_object */,
1311 return GenInlinedUnsafePut(info, false /* is_long */, false /* is_object */,
1315 return GenInlinedUnsafeGet(info, true /* is_long */, false /* is_volatile */);
1318 return GenInlinedUnsafeGet(info, true /* is_long */, true /* is_volatile */);
1321 return GenInlinedUnsafePut(info, true /* is_long */, false /* is_object */,
1325 return GenInlinedUnsafePut(info, true /* is_long */, false /* is_object */,
1329 return GenInlinedUnsafePut(info, true /* is_long */, false /* is_object */,
1333 return GenInlinedUnsafeGet(info, false /* is_long */, false /* is_volatile */);
1336 return GenInlinedUnsafeGet(info, false /* is_long */, true /* is_volatile */);
1339 return GenInlinedUnsafePut(info, false /* is_long */, true /* is_object */,
1343 return GenInlinedUnsafePut(info, false /* is_long */, true /* is_object */,
1347 return GenInlinedUnsafePut(info, false /* is_long */, true /* is_object */,
1354 void Mir2Lir::GenInvoke(CallInfo* info) {
1355 if (GenIntrinsic(info)) {
1358 InvokeType original_type = info->type; // avoiding mutation by ComputeInvokeInfo
1368 MethodReference target_method(cUnit->GetDexFile(), info->index);
1376 info->type, target_method,
1380 if (info->type == kInterface) {
1386 } else if (info->type == kDirect) {
1392 } else if (info->type == kStatic) {
1395 } else if (info->type == kSuper) {
1400 DCHECK_EQ(info->type, kVirtual);
1404 if (!info->is_range) {
1405 call_state = GenDalvikArgsNoRange(info, call_state, p_null_ck,
1410 call_state = GenDalvikArgsRange(info, call_state, p_null_ck,
1417 call_state = next_call_insn(cu_, info, call_state, target_method,
1425 if (fast_path && info->type != kInterface) {
1430 switch (info->type) {
1456 if (info->result.location != kLocInvalid) {
1458 if (info->result.wide) {
1459 RegLocation ret_loc = GetReturnWide(info->result.fp);
1460 StoreValueWide(info->result, ret_loc);
1462 RegLocation ret_loc = GetReturn(info->result.fp);
1463 StoreValue(info->result, ret_loc);