Lines Matching refs:instruction

109   BoundsCheckSlowPathARM64(HBoundsCheck* instruction,
112 : instruction_(instruction),
141 explicit DivZeroCheckSlowPathARM64(HDivZeroCheck* instruction) : instruction_(instruction) {}
200 // The instruction where this slow path is happening.
215 explicit LoadStringSlowPathARM64(HLoadString* instruction) : instruction_(instruction) {}
263 explicit SuspendCheckSlowPathARM64(HSuspendCheck* instruction,
265 : instruction_(instruction), successor_(successor) {}
304 TypeCheckSlowPathARM64(HInstruction* instruction,
308 : instruction_(instruction),
358 explicit DeoptimizationSlowPathARM64(HInstruction* instruction)
359 : instruction_(instruction) {}
535 void CodeGeneratorARM64::Move(HInstruction* instruction,
538 LocationSummary* locations = instruction->GetLocations();
543 Primitive::Type type = instruction->GetType();
546 if (instruction->IsIntConstant()
547 || instruction->IsLongConstant()
548 || instruction->IsNullConstant()) {
549 int64_t value = GetInt64ValueOf(instruction->AsConstant());
552 DCHECK(((instruction->IsIntConstant() || instruction->IsNullConstant()) && dst.Is32Bits()) ||
553 (instruction->IsLongConstant() && dst.Is64Bits()));
558 Register temp = (instruction->IsIntConstant() || instruction->IsNullConstant())
564 } else if (instruction->IsTemporary()) {
565 Location temp_location = GetTemporaryLocation(instruction->AsTemporary());
567 } else if (instruction->IsLoadLocal()) {
568 uint32_t stack_slot = GetStackSlot(instruction->AsLoadLocal()->GetLocal());
576 DCHECK((instruction->GetNext() == move_for) || instruction->GetNext()->IsTemporary());
843 void CodeGeneratorARM64::LoadAcquire(HInstruction* instruction,
850 Primitive::Type type = instruction->GetType();
861 MaybeRecordImplicitNullCheck(instruction);
865 MaybeRecordImplicitNullCheck(instruction);
870 MaybeRecordImplicitNullCheck(instruction);
874 MaybeRecordImplicitNullCheck(instruction);
882 MaybeRecordImplicitNullCheck(instruction);
891 MaybeRecordImplicitNullCheck(instruction);
975 HInstruction* instruction,
981 if (instruction != nullptr) {
982 RecordPcInfo(instruction, dex_pc, slow_path);
983 DCHECK(instruction->IsSuspendCheck()
984 || instruction->IsBoundsCheck()
985 || instruction->IsNullCheck()
986 || instruction->IsDivZeroCheck()
1037 void InstructionCodeGeneratorARM64::GenerateSuspendCheck(HSuspendCheck* instruction,
1040 down_cast<SuspendCheckSlowPathARM64*>(instruction->GetSlowPath());
1042 slow_path = new (GetGraph()->GetArena()) SuspendCheckSlowPathARM64(instruction, successor);
1043 instruction->SetSlowPath(slow_path);
1047 codegen_->ClearSpillSlotsFromLoopPhisInStackMap(instruction);
1125 void LocationsBuilderARM64::HandleFieldGet(HInstruction* instruction) {
1127 new (GetGraph()->GetArena()) LocationSummary(instruction, LocationSummary::kNoCall);
1129 if (Primitive::IsFloatingPointType(instruction->GetType())) {
1136 void InstructionCodeGeneratorARM64::HandleFieldGet(HInstruction* instruction,
1138 DCHECK(instruction->IsInstanceFieldGet() || instruction->IsStaticFieldGet());
1141 MemOperand field = HeapOperand(InputRegisterAt(instruction, 0), field_info.GetFieldOffset());
1147 codegen_->LoadAcquire(instruction, OutputCPURegister(instruction), field);
1149 codegen_->Load(field_info.GetFieldType(), OutputCPURegister(instruction), field);
1150 codegen_->MaybeRecordImplicitNullCheck(instruction);
1155 codegen_->Load(field_info.GetFieldType(), OutputCPURegister(instruction), field);
1156 codegen_->MaybeRecordImplicitNullCheck(instruction);
1160 void LocationsBuilderARM64::HandleFieldSet(HInstruction* instruction) {
1162 new (GetGraph()->GetArena()) LocationSummary(instruction, LocationSummary::kNoCall);
1164 if (Primitive::IsFloatingPointType(instruction->InputAt(1)->GetType())) {
1171 void InstructionCodeGeneratorARM64::HandleFieldSet(HInstruction* instruction,
1173 DCHECK(instruction->IsInstanceFieldSet() || instruction->IsStaticFieldSet());
1176 Register obj = InputRegisterAt(instruction, 0);
1177 CPURegister value = InputCPURegisterAt(instruction, 1);
1185 codegen_->MaybeRecordImplicitNullCheck(instruction);
1189 codegen_->MaybeRecordImplicitNullCheck(instruction);
1194 codegen_->MaybeRecordImplicitNullCheck(instruction);
1197 if (CodeGenerator::StoreNeedsWriteBarrier(field_type, instruction->InputAt(1))) {
1301 void LocationsBuilderARM64::VisitAdd(HAdd* instruction) {
1302 HandleBinaryOp(instruction);
1305 void InstructionCodeGeneratorARM64::VisitAdd(HAdd* instruction) {
1306 HandleBinaryOp(instruction);
1309 void LocationsBuilderARM64::VisitAnd(HAnd* instruction) {
1310 HandleBinaryOp(instruction);
1313 void InstructionCodeGeneratorARM64::VisitAnd(HAnd* instruction) {
1314 HandleBinaryOp(instruction);
1317 void LocationsBuilderARM64::VisitArrayGet(HArrayGet* instruction) {
1319 new (GetGraph()->GetArena()) LocationSummary(instruction, LocationSummary::kNoCall);
1321 locations->SetInAt(1, Location::RegisterOrConstant(instruction->InputAt(1)));
1322 if (Primitive::IsFloatingPointType(instruction->GetType())) {
1329 void InstructionCodeGeneratorARM64::VisitArrayGet(HArrayGet* instruction) {
1330 LocationSummary* locations = instruction->GetLocations();
1331 Primitive::Type type = instruction->GetType();
1332 Register obj = InputRegisterAt(instruction, 0);
1350 codegen_->Load(type, OutputCPURegister(instruction), source);
1351 codegen_->MaybeRecordImplicitNullCheck(instruction);
1354 void LocationsBuilderARM64::VisitArrayLength(HArrayLength* instruction) {
1355 LocationSummary* locations = new (GetGraph()->GetArena()) LocationSummary(instruction);
1360 void InstructionCodeGeneratorARM64::VisitArrayLength(HArrayLength* instruction) {
1362 __ Ldr(OutputRegister(instruction),
1363 HeapOperand(InputRegisterAt(instruction, 0), mirror::Array::LengthOffset()));
1364 codegen_->MaybeRecordImplicitNullCheck(instruction);
1367 void LocationsBuilderARM64::VisitArraySet(HArraySet* instruction) {
1368 if (instruction->NeedsTypeCheck()) {
1370 new (GetGraph()->GetArena()) LocationSummary(instruction, LocationSummary::kCall);
1377 new (GetGraph()->GetArena()) LocationSummary(instruction, LocationSummary::kNoCall);
1379 locations->SetInAt(1, Location::RegisterOrConstant(instruction->InputAt(1)));
1380 if (Primitive::IsFloatingPointType(instruction->InputAt(2)->GetType())) {
1388 void InstructionCodeGeneratorARM64::VisitArraySet(HArraySet* instruction) {
1389 Primitive::Type value_type = instruction->GetComponentType();
1390 LocationSummary* locations = instruction->GetLocations();
1395 QUICK_ENTRY_POINT(pAputObject), instruction, instruction->GetDexPc(), nullptr);
1398 Register obj = InputRegisterAt(instruction, 0);
1399 CPURegister value = InputCPURegisterAt(instruction, 2);
1415 Register index_reg = InputRegisterAt(instruction, 1);
1421 codegen_->MaybeRecordImplicitNullCheck(instruction);
1423 if (CodeGenerator::StoreNeedsWriteBarrier(value_type, instruction->GetValue())) {
1429 void LocationsBuilderARM64::VisitBoundsCheck(HBoundsCheck* instruction) {
1431 new (GetGraph()->GetArena()) LocationSummary(instruction, LocationSummary::kNoCall);
1433 locations->SetInAt(1, ARM64EncodableConstantOrRegister(instruction->InputAt(1), instruction));
1434 if (instruction->HasUses()) {
1439 void InstructionCodeGeneratorARM64::VisitBoundsCheck(HBoundsCheck* instruction) {
1440 LocationSummary* locations = instruction->GetLocations();
1442 instruction, locations->InAt(0), locations->InAt(1));
1445 __ Cmp(InputRegisterAt(instruction, 0), InputOperandAt(instruction, 1));
1449 void LocationsBuilderARM64::VisitCheckCast(HCheckCast* instruction) {
1451 instruction, LocationSummary::kCallOnSlowPath);
1457 void InstructionCodeGeneratorARM64::VisitCheckCast(HCheckCast* instruction) {
1458 LocationSummary* locations = instruction->GetLocations();
1459 Register obj = InputRegisterAt(instruction, 0);;
1460 Register cls = InputRegisterAt(instruction, 1);;
1461 Register obj_cls = WRegisterFrom(instruction->GetLocations()->GetTemp(0));
1464 instruction, locations->InAt(1), LocationFrom(obj_cls), instruction->GetDexPc());
1468 if (instruction->MustDoNullCheck()) {
1551 // 0.0 is the only immediate that can be encoded directly in a FCMP instruction.
1569 void LocationsBuilderARM64::VisitCondition(HCondition* instruction) {
1570 LocationSummary* locations = new (GetGraph()->GetArena()) LocationSummary(instruction);
1572 locations->SetInAt(1, ARM64EncodableConstantOrRegister(instruction->InputAt(1), instruction));
1573 if (instruction->NeedsMaterialization()) {
1578 void InstructionCodeGeneratorARM64::VisitCondition(HCondition* instruction) {
1579 if (!instruction->NeedsMaterialization()) {
1583 LocationSummary* locations = instruction->GetLocations();
1584 Register lhs = InputRegisterAt(instruction, 0);
1585 Operand rhs = InputOperandAt(instruction, 1);
1586 Register res = RegisterFrom(locations->Out(), instruction->GetType());
1587 Condition cond = ARM64Condition(instruction->GetCondition());
1648 void LocationsBuilderARM64::VisitDivZeroCheck(HDivZeroCheck* instruction) {
1650 new (GetGraph()->GetArena()) LocationSummary(instruction, LocationSummary::kNoCall);
1651 locations->SetInAt(0, Location::RegisterOrConstant(instruction->InputAt(0)));
1652 if (instruction->HasUses()) {
1657 void InstructionCodeGeneratorARM64::VisitDivZeroCheck(HDivZeroCheck* instruction) {
1659 new (GetGraph()->GetArena()) DivZeroCheckSlowPathARM64(instruction);
1661 Location value = instruction->GetLocations()->InAt(0);
1663 Primitive::Type type = instruction->GetType();
1679 __ Cbz(InputRegisterAt(instruction, 0), slow_path->GetEntryLabel());
1737 void InstructionCodeGeneratorARM64::GenerateTestAndBranch(HInstruction* instruction,
1741 HInstruction* cond = instruction->InputAt(0);
1755 // The condition instruction has been materialized, compare the output to 0.
1756 Location cond_val = instruction->GetLocations()->InAt(0);
1758 __ Cbnz(InputRegisterAt(instruction, 0), true_target);
1760 // The condition instruction has not been materialized, use its inputs as
1837 void LocationsBuilderARM64::VisitInstanceFieldGet(HInstanceFieldGet* instruction) {
1838 HandleFieldGet(instruction);
1841 void InstructionCodeGeneratorARM64::VisitInstanceFieldGet(HInstanceFieldGet* instruction) {
1842 HandleFieldGet(instruction, instruction->GetFieldInfo());
1845 void LocationsBuilderARM64::VisitInstanceFieldSet(HInstanceFieldSet* instruction) {
1846 HandleFieldSet(instruction);
1849 void InstructionCodeGeneratorARM64::VisitInstanceFieldSet(HInstanceFieldSet* instruction) {
1850 HandleFieldSet(instruction, instruction->GetFieldInfo());
1853 void LocationsBuilderARM64::VisitInstanceOf(HInstanceOf* instruction) {
1855 instruction->IsClassFinal() ? LocationSummary::kNoCall : LocationSummary::kCallOnSlowPath;
1856 LocationSummary* locations = new (GetGraph()->GetArena()) LocationSummary(instruction, call_kind);
1863 void InstructionCodeGeneratorARM64::VisitInstanceOf(HInstanceOf* instruction) {
1864 LocationSummary* locations = instruction->GetLocations();
1865 Register obj = InputRegisterAt(instruction, 0);;
1866 Register cls = InputRegisterAt(instruction, 1);;
1867 Register out = OutputRegister(instruction);
1873 if (instruction->MustDoNullCheck()) {
1881 if (instruction->IsClassFinal()) {
1889 instruction, locations->InAt(1), locations->Out(), instruction->GetDexPc());
2135 void InstructionCodeGeneratorARM64::VisitLoadException(HLoadException* instruction) {
2137 __ Ldr(OutputRegister(instruction), exception);
2187 void LocationsBuilderARM64::VisitMonitorOperation(HMonitorOperation* instruction) {
2189 new (GetGraph()->GetArena()) LocationSummary(instruction, LocationSummary::kCall);
2194 void InstructionCodeGeneratorARM64::VisitMonitorOperation(HMonitorOperation* instruction) {
2195 codegen_->InvokeRuntime(instruction->IsEnter()
2197 instruction,
2198 instruction->GetDexPc(),
2281 void LocationsBuilderARM64::VisitNewArray(HNewArray* instruction) {
2283 new (GetGraph()->GetArena()) LocationSummary(instruction, LocationSummary::kCall);
2293 void InstructionCodeGeneratorARM64::VisitNewArray(HNewArray* instruction) {
2294 LocationSummary* locations = instruction->GetLocations();
2301 __ Mov(type_index, instruction->GetTypeIndex());
2303 GetThreadOffset<kArm64WordSize>(instruction->GetEntrypoint()).Int32Value(),
2304 instruction,
2305 instruction->GetDexPc(),
2310 void LocationsBuilderARM64::VisitNewInstance(HNewInstance* instruction) {
2312 new (GetGraph()->GetArena()) LocationSummary(instruction, LocationSummary::kCall);
2320 void InstructionCodeGeneratorARM64::VisitNewInstance(HNewInstance* instruction) {
2321 LocationSummary* locations = instruction->GetLocations();
2327 __ Mov(type_index, instruction->GetTypeIndex());
2329 GetThreadOffset<kArm64WordSize>(instruction->GetEntrypoint()).Int32Value(),
2330 instruction,
2331 instruction->GetDexPc(),
2336 void LocationsBuilderARM64::VisitNot(HNot* instruction) {
2337 LocationSummary* locations = new (GetGraph()->GetArena()) LocationSummary(instruction);
2342 void InstructionCodeGeneratorARM64::VisitNot(HNot* instruction) {
2343 switch (instruction->GetResultType()) {
2346 __ Mvn(OutputRegister(instruction), InputOperandAt(instruction, 0));
2350 LOG(FATAL) << "Unexpected type for not operation " << instruction->GetResultType();
2354 void LocationsBuilderARM64::VisitBooleanNot(HBooleanNot* instruction) {
2355 LocationSummary* locations = new (GetGraph()->GetArena()) LocationSummary(instruction);
2360 void InstructionCodeGeneratorARM64::VisitBooleanNot(HBooleanNot* instruction) {
2361 __ Eor(OutputRegister(instruction), InputRegisterAt(instruction, 0), vixl::Operand(1));
2364 void LocationsBuilderARM64::VisitNullCheck(HNullCheck* instruction) {
2366 new (GetGraph()->GetArena()) LocationSummary(instruction, LocationSummary::kNoCall);
2368 if (instruction->HasUses()) {
2373 void InstructionCodeGeneratorARM64::GenerateImplicitNullCheck(HNullCheck* instruction) {
2374 if (codegen_->CanMoveNullCheckToUser(instruction)) {
2379 Location obj = instruction->GetLocations()->InAt(0);
2381 codegen_->RecordPcInfo(instruction, instruction->GetDexPc());
2384 void InstructionCodeGeneratorARM64::GenerateExplicitNullCheck(HNullCheck* instruction) {
2385 SlowPathCodeARM64* slow_path = new (GetGraph()->GetArena()) NullCheckSlowPathARM64(instruction);
2388 LocationSummary* locations = instruction->GetLocations();
2391 __ Cbz(RegisterFrom(obj, instruction->InputAt(0)->GetType()), slow_path->GetEntryLabel());
2394 void InstructionCodeGeneratorARM64::VisitNullCheck(HNullCheck* instruction) {
2396 GenerateImplicitNullCheck(instruction);
2398 GenerateExplicitNullCheck(instruction);
2402 void LocationsBuilderARM64::VisitOr(HOr* instruction) {
2403 HandleBinaryOp(instruction);
2406 void InstructionCodeGeneratorARM64::VisitOr(HOr* instruction) {
2407 HandleBinaryOp(instruction);
2410 void LocationsBuilderARM64::VisitParallelMove(HParallelMove* instruction ATTRIBUTE_UNUSED) {
2414 void InstructionCodeGeneratorARM64::VisitParallelMove(HParallelMove* instruction) {
2415 codegen_->GetMoveResolver()->EmitNativeCode(instruction);
2418 void LocationsBuilderARM64::VisitParameterValue(HParameterValue* instruction) {
2419 LocationSummary* locations = new (GetGraph()->GetArena()) LocationSummary(instruction);
2420 Location location = parameter_visitor_.GetNextLocation(instruction->GetType());
2429 void InstructionCodeGeneratorARM64::VisitParameterValue(HParameterValue* instruction) {
2431 UNUSED(instruction);
2434 void LocationsBuilderARM64::VisitPhi(HPhi* instruction) {
2435 LocationSummary* locations = new (GetGraph()->GetArena()) LocationSummary(instruction);
2436 for (size_t i = 0, e = instruction->InputCount(); i < e; ++i) {
2442 void InstructionCodeGeneratorARM64::VisitPhi(HPhi* instruction) {
2443 UNUSED(instruction);
2514 void LocationsBuilderARM64::VisitReturn(HReturn* instruction) {
2515 LocationSummary* locations = new (GetGraph()->GetArena()) LocationSummary(instruction);
2516 Primitive::Type return_type = instruction->InputAt(0)->GetType();
2520 void InstructionCodeGeneratorARM64::VisitReturn(HReturn* instruction) {
2521 UNUSED(instruction);
2525 void LocationsBuilderARM64::VisitReturnVoid(HReturnVoid* instruction) {
2526 instruction->SetLocations(nullptr);
2529 void InstructionCodeGeneratorARM64::VisitReturnVoid(HReturnVoid* instruction) {
2530 UNUSED(instruction);
2578 void LocationsBuilderARM64::VisitSub(HSub* instruction) {
2579 HandleBinaryOp(instruction);
2582 void InstructionCodeGeneratorARM64::VisitSub(HSub* instruction) {
2583 HandleBinaryOp(instruction);
2586 void LocationsBuilderARM64::VisitStaticFieldGet(HStaticFieldGet* instruction) {
2587 HandleFieldGet(instruction);
2590 void InstructionCodeGeneratorARM64::VisitStaticFieldGet(HStaticFieldGet* instruction) {
2591 HandleFieldGet(instruction, instruction->GetFieldInfo());
2594 void LocationsBuilderARM64::VisitStaticFieldSet(HStaticFieldSet* instruction) {
2595 HandleFieldSet(instruction);
2598 void InstructionCodeGeneratorARM64::VisitStaticFieldSet(HStaticFieldSet* instruction) {
2599 HandleFieldSet(instruction, instruction->GetFieldInfo());
2602 void LocationsBuilderARM64::VisitSuspendCheck(HSuspendCheck* instruction) {
2603 new (GetGraph()->GetArena()) LocationSummary(instruction, LocationSummary::kCallOnSlowPath);
2606 void InstructionCodeGeneratorARM64::VisitSuspendCheck(HSuspendCheck* instruction) {
2607 HBasicBlock* block = instruction->GetBlock();
2609 DCHECK(block->GetLoopInformation()->GetSuspendCheck() == instruction);
2613 if (block->IsEntryBlock() && instruction->GetNext()->IsGoto()) {
2617 GenerateSuspendCheck(instruction, nullptr);
2629 void LocationsBuilderARM64::VisitThrow(HThrow* instruction) {
2631 new (GetGraph()->GetArena()) LocationSummary(instruction, LocationSummary::kCall);
2636 void InstructionCodeGeneratorARM64::VisitThrow(HThrow* instruction) {
2638 QUICK_ENTRY_POINT(pDeliverException), instruction, instruction->GetDexPc(), nullptr);
2708 void LocationsBuilderARM64::VisitXor(HXor* instruction) {
2709 HandleBinaryOp(instruction);
2712 void InstructionCodeGeneratorARM64::VisitXor(HXor* instruction) {
2713 HandleBinaryOp(instruction);
2716 void LocationsBuilderARM64::VisitBoundType(HBoundType* instruction) {
2718 UNUSED(instruction);
2722 void InstructionCodeGeneratorARM64::VisitBoundType(HBoundType* instruction) {
2724 UNUSED(instruction);