12cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee/* 22cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * Copyright (C) 2011 The Android Open Source Project 32cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * 42cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * Licensed under the Apache License, Version 2.0 (the "License"); 52cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * you may not use this file except in compliance with the License. 62cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * You may obtain a copy of the License at 72cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * 82cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * http://www.apache.org/licenses/LICENSE-2.0 92cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * 102cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * Unless required by applicable law or agreed to in writing, software 112cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * distributed under the License is distributed on an "AS IS" BASIS, 122cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * See the License for the specific language governing permissions and 142cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * limitations under the License. 152cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee */ 162cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 172cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee#include "object_utils.h" 182cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 192cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee#include <llvm/ADT/DepthFirstIterator.h> 2037d4879df243f7a2161b5416fad299ad1d495131Brian Carlstrom#include <llvm/Analysis/Verifier.h> 2137d4879df243f7a2161b5416fad299ad1d495131Brian Carlstrom#include <llvm/Bitcode/ReaderWriter.h> 2237d4879df243f7a2161b5416fad299ad1d495131Brian Carlstrom#include <llvm/IR/Instruction.h> 2337d4879df243f7a2161b5416fad299ad1d495131Brian Carlstrom#include <llvm/IR/Instructions.h> 2437d4879df243f7a2161b5416fad299ad1d495131Brian Carlstrom#include <llvm/IR/Metadata.h> 2537d4879df243f7a2161b5416fad299ad1d495131Brian Carlstrom#include <llvm/IR/Type.h> 262cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee#include <llvm/Support/Casting.h> 27ad8f15e0b13383b2eaa2486b230debeae7a55661buzbee#include <llvm/Support/InstIterator.h> 2837d4879df243f7a2161b5416fad299ad1d495131Brian Carlstrom#include <llvm/Support/ToolOutputFile.h> 292cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 307940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "dex/compiler_internals.h" 317940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "dex/dataflow_iterator-inl.h" 327940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "dex/frontend.h" 33b48b9eb6d181a1f52e2e605cf26a21505f1d46edIan Rogers#include "llvm/ir_builder.h" 347940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "llvm/llvm_compilation_unit.h" 357940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "llvm/utils_llvm.h" 3602ed4c04468ca5f5540c5b704ac3e2f30eb9e8f4Ian Rogers#include "mir_to_gbc.h" 3702ed4c04468ca5f5540c5b704ac3e2f30eb9e8f4Ian Rogers#include "thread-inl.h" 38eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee 391fd3346740dfb7f47be9922312b68a4227fada96buzbeeconst char* kLabelFormat = "%c0x%x_%d"; 401fd3346740dfb7f47be9922312b68a4227fada96buzbeeconst char kInvalidBlock = 0xff; 411fd3346740dfb7f47be9922312b68a4227fada96buzbeeconst char kNormalBlock = 'L'; 421fd3346740dfb7f47be9922312b68a4227fada96buzbeeconst char kCatchBlock = 'C'; 432cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 442cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbeenamespace art { 45f5df8974173124faddb8e2b6a331959afdb94fdfNicolas Geoffraynamespace llvm { 46f5df8974173124faddb8e2b6a331959afdb94fdfNicolas Geoffray::llvm::Module* makeLLVMModuleContents(::llvm::Module* module); 47f5df8974173124faddb8e2b6a331959afdb94fdfNicolas Geoffray} 48f5df8974173124faddb8e2b6a331959afdb94fdfNicolas Geoffray 49f5df8974173124faddb8e2b6a331959afdb94fdfNicolas GeoffrayLLVMInfo::LLVMInfo() { 50f5df8974173124faddb8e2b6a331959afdb94fdfNicolas Geoffray // Create context, module, intrinsic helper & ir builder 51f5df8974173124faddb8e2b6a331959afdb94fdfNicolas Geoffray llvm_context_.reset(new ::llvm::LLVMContext()); 52f5df8974173124faddb8e2b6a331959afdb94fdfNicolas Geoffray llvm_module_ = new ::llvm::Module("art", *llvm_context_); 53f5df8974173124faddb8e2b6a331959afdb94fdfNicolas Geoffray ::llvm::StructType::create(*llvm_context_, "JavaObject"); 54f5df8974173124faddb8e2b6a331959afdb94fdfNicolas Geoffray art::llvm::makeLLVMModuleContents(llvm_module_); 55f5df8974173124faddb8e2b6a331959afdb94fdfNicolas Geoffray intrinsic_helper_.reset(new art::llvm::IntrinsicHelper(*llvm_context_, *llvm_module_)); 56f5df8974173124faddb8e2b6a331959afdb94fdfNicolas Geoffray ir_builder_.reset(new art::llvm::IRBuilder(*llvm_context_, *llvm_module_, *intrinsic_helper_)); 57f5df8974173124faddb8e2b6a331959afdb94fdfNicolas Geoffray} 58f5df8974173124faddb8e2b6a331959afdb94fdfNicolas Geoffray 59f5df8974173124faddb8e2b6a331959afdb94fdfNicolas GeoffrayLLVMInfo::~LLVMInfo() { 60f5df8974173124faddb8e2b6a331959afdb94fdfNicolas Geoffray} 612cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 622ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom::llvm::BasicBlock* MirConverter::GetLLVMBlock(int id) { 631fd3346740dfb7f47be9922312b68a4227fada96buzbee return id_to_block_map_.Get(id); 642cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 652cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 662ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom::llvm::Value* MirConverter::GetLLVMValue(int s_reg) { 67862a76027076c341c26aa6cd4a30a7cdd6dc2143buzbee return llvm_values_.Get(s_reg); 682cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 692cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 702ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::SetVregOnValue(::llvm::Value* val, int s_reg) { 7126f10eed520942d3db754c31941e457048475f61buzbee // Set vreg for debugging 724c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntrinsicId id = art::llvm::IntrinsicHelper::SetVReg; 731fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* func = intrinsic_helper_->GetIntrinsicFunction(id); 741fd3346740dfb7f47be9922312b68a4227fada96buzbee int v_reg = mir_graph_->SRegToVReg(s_reg); 751fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* table_slot = irb_->getInt32(v_reg); 764c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::Value* args[] = { table_slot, val }; 771fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateCall(func, args); 7826f10eed520942d3db754c31941e457048475f61buzbee} 7926f10eed520942d3db754c31941e457048475f61buzbee 802cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee// Replace the placeholder value with the real definition 812ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::DefineValueOnly(::llvm::Value* val, int s_reg) { 821fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* placeholder = GetLLVMValue(s_reg); 839a2487f94efeb88016a695af823bf26799ef0f06buzbee if (placeholder == NULL) { 849a2487f94efeb88016a695af823bf26799ef0f06buzbee // This can happen on instruction rewrite on verification failure 85c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee LOG(WARNING) << "Null placeholder"; 869a2487f94efeb88016a695af823bf26799ef0f06buzbee return; 879a2487f94efeb88016a695af823bf26799ef0f06buzbee } 882cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee placeholder->replaceAllUsesWith(val); 892cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee val->takeName(placeholder); 90862a76027076c341c26aa6cd4a30a7cdd6dc2143buzbee llvm_values_.Put(s_reg, val); 914c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::Instruction* inst = ::llvm::dyn_cast< ::llvm::Instruction>(placeholder); 924be777b5efccbffddd6227d30ab1f658403e18cfbuzbee DCHECK(inst != NULL); 934be777b5efccbffddd6227d30ab1f658403e18cfbuzbee inst->eraseFromParent(); 9426f10eed520942d3db754c31941e457048475f61buzbee} 9526f10eed520942d3db754c31941e457048475f61buzbee 962ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::DefineValue(::llvm::Value* val, int s_reg) { 971fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValueOnly(val, s_reg); 981fd3346740dfb7f47be9922312b68a4227fada96buzbee SetVregOnValue(val, s_reg); 992cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 1002cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 1012ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom::llvm::Type* MirConverter::LlvmTypeFromLocRec(RegLocation loc) { 1024c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::Type* res = NULL; 1032cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (loc.wide) { 1042cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (loc.fp) 1051fd3346740dfb7f47be9922312b68a4227fada96buzbee res = irb_->getDoubleTy(); 1062cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee else 1071fd3346740dfb7f47be9922312b68a4227fada96buzbee res = irb_->getInt64Ty(); 1082cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } else { 1092cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (loc.fp) { 1101fd3346740dfb7f47be9922312b68a4227fada96buzbee res = irb_->getFloatTy(); 1112cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } else { 1122cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (loc.ref) 1131fd3346740dfb7f47be9922312b68a4227fada96buzbee res = irb_->getJObjectTy(); 1142cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee else 1151fd3346740dfb7f47be9922312b68a4227fada96buzbee res = irb_->getInt32Ty(); 1162cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 1172cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 1182cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee return res; 1192cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 1202cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 1212ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::InitIR() { 1221fd3346740dfb7f47be9922312b68a4227fada96buzbee if (llvm_info_ == NULL) { 1231fd3346740dfb7f47be9922312b68a4227fada96buzbee CompilerTls* tls = cu_->compiler_driver->GetTls(); 1244df2bbdfe6602ce5f141b7b44028b95faa0bd8efbuzbee CHECK(tls != NULL); 1251fd3346740dfb7f47be9922312b68a4227fada96buzbee llvm_info_ = static_cast<LLVMInfo*>(tls->GetLLVMInfo()); 1261fd3346740dfb7f47be9922312b68a4227fada96buzbee if (llvm_info_ == NULL) { 1271fd3346740dfb7f47be9922312b68a4227fada96buzbee llvm_info_ = new LLVMInfo(); 1281fd3346740dfb7f47be9922312b68a4227fada96buzbee tls->SetLLVMInfo(llvm_info_); 1294df2bbdfe6602ce5f141b7b44028b95faa0bd8efbuzbee } 1304df2bbdfe6602ce5f141b7b44028b95faa0bd8efbuzbee } 1311fd3346740dfb7f47be9922312b68a4227fada96buzbee context_ = llvm_info_->GetLLVMContext(); 1321fd3346740dfb7f47be9922312b68a4227fada96buzbee module_ = llvm_info_->GetLLVMModule(); 1331fd3346740dfb7f47be9922312b68a4227fada96buzbee intrinsic_helper_ = llvm_info_->GetIntrinsicHelper(); 1341fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_ = llvm_info_->GetIRBuilder(); 1352cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 1362cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 1372ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom::llvm::BasicBlock* MirConverter::FindCaseTarget(uint32_t vaddr) { 1381fd3346740dfb7f47be9922312b68a4227fada96buzbee BasicBlock* bb = mir_graph_->FindBlock(vaddr); 139f58c12c79cf11e6d6e3dd7db8f676d1edaf5d68bbuzbee DCHECK(bb != NULL); 1401fd3346740dfb7f47be9922312b68a4227fada96buzbee return GetLLVMBlock(bb->id); 141f58c12c79cf11e6d6e3dd7db8f676d1edaf5d68bbuzbee} 142f58c12c79cf11e6d6e3dd7db8f676d1edaf5d68bbuzbee 1431fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertPackedSwitch(BasicBlock* bb, 1442ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom int32_t table_offset, RegLocation rl_src) { 145f58c12c79cf11e6d6e3dd7db8f676d1edaf5d68bbuzbee const Instruction::PackedSwitchPayload* payload = 146f58c12c79cf11e6d6e3dd7db8f676d1edaf5d68bbuzbee reinterpret_cast<const Instruction::PackedSwitchPayload*>( 1471fd3346740dfb7f47be9922312b68a4227fada96buzbee cu_->insns + current_dalvik_offset_ + table_offset); 148f58c12c79cf11e6d6e3dd7db8f676d1edaf5d68bbuzbee 1491fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* value = GetLLVMValue(rl_src.orig_sreg); 150f58c12c79cf11e6d6e3dd7db8f676d1edaf5d68bbuzbee 1514c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SwitchInst* sw = 1520d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee irb_->CreateSwitch(value, GetLLVMBlock(bb->fall_through), 153f58c12c79cf11e6d6e3dd7db8f676d1edaf5d68bbuzbee payload->case_count); 154f58c12c79cf11e6d6e3dd7db8f676d1edaf5d68bbuzbee 155f58c12c79cf11e6d6e3dd7db8f676d1edaf5d68bbuzbee for (uint16_t i = 0; i < payload->case_count; ++i) { 1564c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::BasicBlock* llvm_bb = 1571fd3346740dfb7f47be9922312b68a4227fada96buzbee FindCaseTarget(current_dalvik_offset_ + payload->targets[i]); 1581fd3346740dfb7f47be9922312b68a4227fada96buzbee sw->addCase(irb_->getInt32(payload->first_key + i), llvm_bb); 159f58c12c79cf11e6d6e3dd7db8f676d1edaf5d68bbuzbee } 1604c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::MDNode* switch_node = 1611fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::MDNode::get(*context_, irb_->getInt32(table_offset)); 162fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee sw->setMetadata("SwitchTable", switch_node); 1630d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee bb->taken = NullBasicBlockId; 1640d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee bb->fall_through = NullBasicBlockId; 165f58c12c79cf11e6d6e3dd7db8f676d1edaf5d68bbuzbee} 166f58c12c79cf11e6d6e3dd7db8f676d1edaf5d68bbuzbee 1671fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertSparseSwitch(BasicBlock* bb, 1682ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom int32_t table_offset, RegLocation rl_src) { 169a1da8a553681d1f7aec305610c8848c26373e0f0buzbee const Instruction::SparseSwitchPayload* payload = 170a1da8a553681d1f7aec305610c8848c26373e0f0buzbee reinterpret_cast<const Instruction::SparseSwitchPayload*>( 1711fd3346740dfb7f47be9922312b68a4227fada96buzbee cu_->insns + current_dalvik_offset_ + table_offset); 172a1da8a553681d1f7aec305610c8848c26373e0f0buzbee 173a1da8a553681d1f7aec305610c8848c26373e0f0buzbee const int32_t* keys = payload->GetKeys(); 174a1da8a553681d1f7aec305610c8848c26373e0f0buzbee const int32_t* targets = payload->GetTargets(); 175a1da8a553681d1f7aec305610c8848c26373e0f0buzbee 1761fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* value = GetLLVMValue(rl_src.orig_sreg); 177a1da8a553681d1f7aec305610c8848c26373e0f0buzbee 1784c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SwitchInst* sw = 1790d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee irb_->CreateSwitch(value, GetLLVMBlock(bb->fall_through), 180a1da8a553681d1f7aec305610c8848c26373e0f0buzbee payload->case_count); 181a1da8a553681d1f7aec305610c8848c26373e0f0buzbee 182a1da8a553681d1f7aec305610c8848c26373e0f0buzbee for (size_t i = 0; i < payload->case_count; ++i) { 1834c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::BasicBlock* llvm_bb = 1841fd3346740dfb7f47be9922312b68a4227fada96buzbee FindCaseTarget(current_dalvik_offset_ + targets[i]); 1851fd3346740dfb7f47be9922312b68a4227fada96buzbee sw->addCase(irb_->getInt32(keys[i]), llvm_bb); 186a1da8a553681d1f7aec305610c8848c26373e0f0buzbee } 1874c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::MDNode* switch_node = 1881fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::MDNode::get(*context_, irb_->getInt32(table_offset)); 189fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee sw->setMetadata("SwitchTable", switch_node); 1900d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee bb->taken = NullBasicBlockId; 1910d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee bb->fall_through = NullBasicBlockId; 192a1da8a553681d1f7aec305610c8848c26373e0f0buzbee} 193a1da8a553681d1f7aec305610c8848c26373e0f0buzbee 1941fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertSget(int32_t field_index, 1952ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom art::llvm::IntrinsicHelper::IntrinsicId id, RegLocation rl_dest) { 1961fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Constant* field_idx = irb_->getInt32(field_index); 1971fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 1981fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateCall(intr, field_idx); 1991fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 2008fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee} 2018fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee 2021fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertSput(int32_t field_index, 2032ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom art::llvm::IntrinsicHelper::IntrinsicId id, RegLocation rl_src) { 2044c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SmallVector< ::llvm::Value*, 2> args; 2051fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(irb_->getInt32(field_index)); 2061fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_src.orig_sreg)); 2071fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 2081fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateCall(intr, args); 2094f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee} 2104f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee 2112ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::ConvertFillArrayData(int32_t offset, RegLocation rl_array) { 2124c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntrinsicId id; 2134c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::HLFillArrayData; 2144c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SmallVector< ::llvm::Value*, 2> args; 2151fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(irb_->getInt32(offset)); 2161fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_array.orig_sreg)); 2171fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 2181fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateCall(intr, args); 219101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee} 220101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee 2211fd3346740dfb7f47be9922312b68a4227fada96buzbee::llvm::Value* MirConverter::EmitConst(::llvm::ArrayRef< ::llvm::Value*> src, 2222ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom RegLocation loc) { 2234c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntrinsicId id; 2242cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (loc.wide) { 2252cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (loc.fp) { 2264c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::ConstDouble; 2272cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } else { 2284c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::ConstLong; 2292cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 2302cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } else { 2312cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (loc.fp) { 2324c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::ConstFloat; 2334f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee } else if (loc.ref) { 2344c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::ConstObj; 2352cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } else { 2364c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::ConstInt; 2372cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 2382cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 2391fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 2401fd3346740dfb7f47be9922312b68a4227fada96buzbee return irb_->CreateCall(intr, src); 2412cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 242b03f487219e446b0480aabd534fac139513502a4buzbee 2432ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::EmitPopShadowFrame() { 2441fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction( 2454c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::PopShadowFrame); 2461fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateCall(intr); 247b03f487219e446b0480aabd534fac139513502a4buzbee} 248b03f487219e446b0480aabd534fac139513502a4buzbee 2491fd3346740dfb7f47be9922312b68a4227fada96buzbee::llvm::Value* MirConverter::EmitCopy(::llvm::ArrayRef< ::llvm::Value*> src, 2502ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom RegLocation loc) { 2514c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntrinsicId id; 2522cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (loc.wide) { 2532cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (loc.fp) { 2544c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::CopyDouble; 2552cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } else { 2564c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::CopyLong; 2572cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 2582cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } else { 2592cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (loc.fp) { 2604c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::CopyFloat; 2614f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee } else if (loc.ref) { 2624c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::CopyObj; 2632cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } else { 2644c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::CopyInt; 2652cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 2662cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 2671fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 2681fd3346740dfb7f47be9922312b68a4227fada96buzbee return irb_->CreateCall(intr, src); 2692cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 2702cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 2712ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::ConvertMoveException(RegLocation rl_dest) { 2721fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* func = intrinsic_helper_->GetIntrinsicFunction( 2734c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::GetException); 2741fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateCall(func); 2751fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 27632412961b1c912faba30cdecd3560ab05e463807buzbee} 27732412961b1c912faba30cdecd3560ab05e463807buzbee 2782ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::ConvertThrow(RegLocation rl_src) { 2791fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* src = GetLLVMValue(rl_src.orig_sreg); 2801fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* func = intrinsic_helper_->GetIntrinsicFunction( 2814c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::HLThrowException); 2821fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateCall(func, src); 28332412961b1c912faba30cdecd3560ab05e463807buzbee} 28432412961b1c912faba30cdecd3560ab05e463807buzbee 2851fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertMonitorEnterExit(int opt_flags, 2864c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntrinsicId id, 2872ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom RegLocation rl_src) { 2884c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SmallVector< ::llvm::Value*, 2> args; 2891fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(irb_->getInt32(opt_flags)); 2901fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_src.orig_sreg)); 2911fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* func = intrinsic_helper_->GetIntrinsicFunction(id); 2921fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateCall(func, args); 2938fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee} 2948fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee 2951fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertArrayLength(int opt_flags, 2962ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom RegLocation rl_dest, RegLocation rl_src) { 2974c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SmallVector< ::llvm::Value*, 2> args; 2981fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(irb_->getInt32(opt_flags)); 2991fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_src.orig_sreg)); 3001fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* func = intrinsic_helper_->GetIntrinsicFunction( 3014c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::OptArrayLength); 3021fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateCall(func, args); 3031fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 3048fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee} 3058fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee 3062ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::EmitSuspendCheck() { 3074c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntrinsicId id = 3084c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::CheckSuspend; 3091fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 3101fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateCall(intr); 3112cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 3122cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 3131fd3346740dfb7f47be9922312b68a4227fada96buzbee::llvm::Value* MirConverter::ConvertCompare(ConditionCode cc, 3142ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom ::llvm::Value* src1, ::llvm::Value* src2) { 3154c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::Value* res = NULL; 31676592633b491e294d78db2c4dbc44ca679004b71buzbee DCHECK_EQ(src1->getType(), src2->getType()); 317df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom switch (cc) { 3181fd3346740dfb7f47be9922312b68a4227fada96buzbee case kCondEq: res = irb_->CreateICmpEQ(src1, src2); break; 3191fd3346740dfb7f47be9922312b68a4227fada96buzbee case kCondNe: res = irb_->CreateICmpNE(src1, src2); break; 3201fd3346740dfb7f47be9922312b68a4227fada96buzbee case kCondLt: res = irb_->CreateICmpSLT(src1, src2); break; 3211fd3346740dfb7f47be9922312b68a4227fada96buzbee case kCondGe: res = irb_->CreateICmpSGE(src1, src2); break; 3221fd3346740dfb7f47be9922312b68a4227fada96buzbee case kCondGt: res = irb_->CreateICmpSGT(src1, src2); break; 3231fd3346740dfb7f47be9922312b68a4227fada96buzbee case kCondLe: res = irb_->CreateICmpSLE(src1, src2); break; 3242cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee default: LOG(FATAL) << "Unexpected cc value " << cc; 3252cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 3262cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee return res; 3272cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 3282cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 3291fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertCompareAndBranch(BasicBlock* bb, MIR* mir, 3302ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom ConditionCode cc, RegLocation rl_src1, RegLocation rl_src2) { 3310d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee if (mir_graph_->GetBasicBlock(bb->taken)->start_offset <= mir->offset) { 3321fd3346740dfb7f47be9922312b68a4227fada96buzbee EmitSuspendCheck(); 3332cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 3341fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* src1 = GetLLVMValue(rl_src1.orig_sreg); 3351fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* src2 = GetLLVMValue(rl_src2.orig_sreg); 3361fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* cond_value = ConvertCompare(cc, src1, src2); 3371fd3346740dfb7f47be9922312b68a4227fada96buzbee cond_value->setName(StringPrintf("t%d", temp_name_++)); 3380d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee irb_->CreateCondBr(cond_value, GetLLVMBlock(bb->taken), 3390d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee GetLLVMBlock(bb->fall_through)); 3406969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee // Don't redo the fallthrough branch in the BB driver 3410d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee bb->fall_through = NullBasicBlockId; 3422cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 3432cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 3441fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertCompareZeroAndBranch(BasicBlock* bb, 3452ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom MIR* mir, ConditionCode cc, RegLocation rl_src1) { 3460d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee if (mir_graph_->GetBasicBlock(bb->taken)->start_offset <= mir->offset) { 3471fd3346740dfb7f47be9922312b68a4227fada96buzbee EmitSuspendCheck(); 3482cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 3491fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* src1 = GetLLVMValue(rl_src1.orig_sreg); 3504c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::Value* src2; 351fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (rl_src1.ref) { 3521fd3346740dfb7f47be9922312b68a4227fada96buzbee src2 = irb_->getJNull(); 3532cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } else { 3541fd3346740dfb7f47be9922312b68a4227fada96buzbee src2 = irb_->getInt32(0); 3552cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 3561fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* cond_value = ConvertCompare(cc, src1, src2); 3570d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee irb_->CreateCondBr(cond_value, GetLLVMBlock(bb->taken), 3580d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee GetLLVMBlock(bb->fall_through)); 3596969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee // Don't redo the fallthrough branch in the BB driver 3600d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee bb->fall_through = NullBasicBlockId; 3612cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 3622cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 3631fd3346740dfb7f47be9922312b68a4227fada96buzbee::llvm::Value* MirConverter::GenDivModOp(bool is_div, bool is_long, 3642ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom ::llvm::Value* src1, ::llvm::Value* src2) { 3654c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntrinsicId id; 366fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (is_long) { 367fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (is_div) { 3684c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::DivLong; 3692cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } else { 3704c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::RemLong; 3712cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 372554e6078db25b192c5f9a2e69671d05c43338283Logan Chien } else { 373fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (is_div) { 3744c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::DivInt; 3752cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } else { 3764c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::RemInt; 377554e6078db25b192c5f9a2e69671d05c43338283Logan Chien } 3782cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 3791fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 3804c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SmallVector< ::llvm::Value*, 2>args; 3812cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee args.push_back(src1); 3822cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee args.push_back(src2); 3831fd3346740dfb7f47be9922312b68a4227fada96buzbee return irb_->CreateCall(intr, args); 3842cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 3852cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 3861fd3346740dfb7f47be9922312b68a4227fada96buzbee::llvm::Value* MirConverter::GenArithOp(OpKind op, bool is_long, 3872ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom ::llvm::Value* src1, ::llvm::Value* src2) { 3884c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::Value* res = NULL; 389df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom switch (op) { 3901fd3346740dfb7f47be9922312b68a4227fada96buzbee case kOpAdd: res = irb_->CreateAdd(src1, src2); break; 3911fd3346740dfb7f47be9922312b68a4227fada96buzbee case kOpSub: res = irb_->CreateSub(src1, src2); break; 3921fd3346740dfb7f47be9922312b68a4227fada96buzbee case kOpRsub: res = irb_->CreateSub(src2, src1); break; 3931fd3346740dfb7f47be9922312b68a4227fada96buzbee case kOpMul: res = irb_->CreateMul(src1, src2); break; 3941fd3346740dfb7f47be9922312b68a4227fada96buzbee case kOpOr: res = irb_->CreateOr(src1, src2); break; 3951fd3346740dfb7f47be9922312b68a4227fada96buzbee case kOpAnd: res = irb_->CreateAnd(src1, src2); break; 3961fd3346740dfb7f47be9922312b68a4227fada96buzbee case kOpXor: res = irb_->CreateXor(src1, src2); break; 3971fd3346740dfb7f47be9922312b68a4227fada96buzbee case kOpDiv: res = GenDivModOp(true, is_long, src1, src2); break; 3981fd3346740dfb7f47be9922312b68a4227fada96buzbee case kOpRem: res = GenDivModOp(false, is_long, src1, src2); break; 3991fd3346740dfb7f47be9922312b68a4227fada96buzbee case kOpLsl: res = irb_->CreateShl(src1, src2); break; 4001fd3346740dfb7f47be9922312b68a4227fada96buzbee case kOpLsr: res = irb_->CreateLShr(src1, src2); break; 4011fd3346740dfb7f47be9922312b68a4227fada96buzbee case kOpAsr: res = irb_->CreateAShr(src1, src2); break; 4022cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee default: 4032cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee LOG(FATAL) << "Invalid op " << op; 4042cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 4052cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee return res; 4062cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 4072cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 4081fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertFPArithOp(OpKind op, RegLocation rl_dest, 4092ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom RegLocation rl_src1, RegLocation rl_src2) { 4101fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* src1 = GetLLVMValue(rl_src1.orig_sreg); 4111fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* src2 = GetLLVMValue(rl_src2.orig_sreg); 4124c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::Value* res = NULL; 413df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom switch (op) { 4141fd3346740dfb7f47be9922312b68a4227fada96buzbee case kOpAdd: res = irb_->CreateFAdd(src1, src2); break; 4151fd3346740dfb7f47be9922312b68a4227fada96buzbee case kOpSub: res = irb_->CreateFSub(src1, src2); break; 4161fd3346740dfb7f47be9922312b68a4227fada96buzbee case kOpMul: res = irb_->CreateFMul(src1, src2); break; 4171fd3346740dfb7f47be9922312b68a4227fada96buzbee case kOpDiv: res = irb_->CreateFDiv(src1, src2); break; 4181fd3346740dfb7f47be9922312b68a4227fada96buzbee case kOpRem: res = irb_->CreateFRem(src1, src2); break; 4192cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee default: 4202cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee LOG(FATAL) << "Invalid op " << op; 4212cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 4221fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 4232cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 4242cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 4251fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertShift(art::llvm::IntrinsicHelper::IntrinsicId id, 4262ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom RegLocation rl_dest, RegLocation rl_src1, RegLocation rl_src2) { 4271fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 4284c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SmallVector< ::llvm::Value*, 2>args; 4291fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_src1.orig_sreg)); 4301fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_src2.orig_sreg)); 4311fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateCall(intr, args); 4321fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 4332a83e8f06031948741ae3dda3633433ddd669693buzbee} 4342a83e8f06031948741ae3dda3633433ddd669693buzbee 4351fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertShiftLit(art::llvm::IntrinsicHelper::IntrinsicId id, 4362ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom RegLocation rl_dest, RegLocation rl_src, int shift_amount) { 4371fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 4384c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SmallVector< ::llvm::Value*, 2>args; 4391fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_src.orig_sreg)); 4401fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(irb_->getInt32(shift_amount)); 4411fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateCall(intr, args); 4421fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 4434f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee} 4444f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee 4451fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertArithOp(OpKind op, RegLocation rl_dest, 4462ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom RegLocation rl_src1, RegLocation rl_src2) { 4471fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* src1 = GetLLVMValue(rl_src1.orig_sreg); 4481fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* src2 = GetLLVMValue(rl_src2.orig_sreg); 4494f4dfc7ce0d309448d6fc47737c1f3c0a9eda7e5buzbee DCHECK_EQ(src1->getType(), src2->getType()); 4501fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = GenArithOp(op, rl_dest.wide, src1, src2); 4511fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 4522cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 4532cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 4541fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertArithOpLit(OpKind op, RegLocation rl_dest, 4552ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom RegLocation rl_src1, int32_t imm) { 4561fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* src1 = GetLLVMValue(rl_src1.orig_sreg); 4571fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* src2 = irb_->getInt32(imm); 4581fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = GenArithOp(op, rl_dest.wide, src1, src2); 4591fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 4602cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 4612cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 462101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee/* 463101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee * Process arguments for invoke. Note: this code is also used to 464101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee * collect and process arguments for NEW_FILLED_ARRAY and NEW_FILLED_ARRAY_RANGE. 465101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee * The requirements are similar. 466101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee */ 4671fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertInvoke(BasicBlock* bb, MIR* mir, 4682ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom InvokeType invoke_type, bool is_range, bool is_filled_new_array) { 4691fd3346740dfb7f47be9922312b68a4227fada96buzbee CallInfo* info = mir_graph_->NewMemCallInfo(bb, mir, invoke_type, is_range); 4704c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SmallVector< ::llvm::Value*, 10> args; 471fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee // Insert the invoke_type 4721fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(irb_->getInt32(static_cast<int>(invoke_type))); 4736969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee // Insert the method_idx 4741fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(irb_->getInt32(info->index)); 4756969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee // Insert the optimization flags 4761fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(irb_->getInt32(info->opt_flags)); 4776969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee // Now, insert the actual arguments 478fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee for (int i = 0; i < info->num_arg_words;) { 4791fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* val = GetLLVMValue(info->args[i].orig_sreg); 4806969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee args.push_back(val); 4816969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee i += info->args[i].wide ? 2 : 1; 4826969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee } 4836969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee /* 4846969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee * Choose the invoke return type based on actual usage. Note: may 4856969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee * be different than shorty. For example, if a function return value 4866969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee * is not used, we'll treat this as a void invoke. 4876969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee */ 4884c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntrinsicId id; 489fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (is_filled_new_array) { 4904c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::HLFilledNewArray; 491101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee } else if (info->result.location == kLocInvalid) { 4924c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::HLInvokeVoid; 4936969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee } else { 4946969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee if (info->result.wide) { 4956969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee if (info->result.fp) { 4964c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::HLInvokeDouble; 4976969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee } else { 4984c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::HLInvokeLong; 4996969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee } 5006969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee } else if (info->result.ref) { 5014c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::HLInvokeObj; 5026969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee } else if (info->result.fp) { 5034c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::HLInvokeFloat; 5046969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee } else { 5054c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::HLInvokeInt; 5066969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee } 5076969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee } 5081fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 5091fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateCall(intr, args); 5106969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee if (info->result.location != kLocInvalid) { 5111fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, info->result.orig_sreg); 5126969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee } 5136969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee} 5146969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee 5151fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertConstObject(uint32_t idx, 5162ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom art::llvm::IntrinsicHelper::IntrinsicId id, RegLocation rl_dest) { 5171fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 5181fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* index = irb_->getInt32(idx); 5191fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateCall(intr, index); 5201fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 5216969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee} 5226969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee 5232ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::ConvertCheckCast(uint32_t type_idx, RegLocation rl_src) { 5244c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntrinsicId id; 5254c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::HLCheckCast; 5261fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 5274c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SmallVector< ::llvm::Value*, 2> args; 5281fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(irb_->getInt32(type_idx)); 5291fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_src.orig_sreg)); 5301fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateCall(intr, args); 531101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee} 532101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee 5332ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::ConvertNewInstance(uint32_t type_idx, RegLocation rl_dest) { 5344c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntrinsicId id; 5354c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::NewInstance; 5361fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 5371fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* index = irb_->getInt32(type_idx); 5381fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateCall(intr, index); 5391fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 5404f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee} 5414f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee 5421fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertNewArray(uint32_t type_idx, 5432ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom RegLocation rl_dest, RegLocation rl_src) { 5444c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntrinsicId id; 5454c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::NewArray; 5461fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 5474c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SmallVector< ::llvm::Value*, 2> args; 5481fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(irb_->getInt32(type_idx)); 5491fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_src.orig_sreg)); 5501fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateCall(intr, args); 5511fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 5528fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee} 5538fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee 5541fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertAget(int opt_flags, 5554c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntrinsicId id, 5562ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom RegLocation rl_dest, RegLocation rl_array, RegLocation rl_index) { 5574c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SmallVector< ::llvm::Value*, 3> args; 5581fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(irb_->getInt32(opt_flags)); 5591fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_array.orig_sreg)); 5601fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_index.orig_sreg)); 5611fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 5621fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateCall(intr, args); 5631fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 5648fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee} 5658fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee 5661fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertAput(int opt_flags, 5674c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntrinsicId id, 5682ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom RegLocation rl_src, RegLocation rl_array, RegLocation rl_index) { 5694c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SmallVector< ::llvm::Value*, 4> args; 5701fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(irb_->getInt32(opt_flags)); 5711fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_src.orig_sreg)); 5721fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_array.orig_sreg)); 5731fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_index.orig_sreg)); 5741fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 5751fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateCall(intr, args); 5768fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee} 5778fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee 5781fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertIget(int opt_flags, 5794c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntrinsicId id, 5802ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom RegLocation rl_dest, RegLocation rl_obj, int field_index) { 5814c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SmallVector< ::llvm::Value*, 3> args; 5821fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(irb_->getInt32(opt_flags)); 5831fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_obj.orig_sreg)); 5841fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(irb_->getInt32(field_index)); 5851fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 5861fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateCall(intr, args); 5871fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 588101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee} 589101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee 5901fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertIput(int opt_flags, 5914c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntrinsicId id, 5922ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom RegLocation rl_src, RegLocation rl_obj, int field_index) { 5934c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SmallVector< ::llvm::Value*, 4> args; 5941fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(irb_->getInt32(opt_flags)); 5951fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_src.orig_sreg)); 5961fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_obj.orig_sreg)); 5971fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(irb_->getInt32(field_index)); 5981fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 5991fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateCall(intr, args); 600101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee} 601101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee 6021fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertInstanceOf(uint32_t type_idx, 6032ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom RegLocation rl_dest, RegLocation rl_src) { 6044c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntrinsicId id; 6054c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::InstanceOf; 6061fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 6074c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SmallVector< ::llvm::Value*, 2> args; 6081fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(irb_->getInt32(type_idx)); 6091fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_src.orig_sreg)); 6101fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateCall(intr, args); 6111fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 6128fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee} 6138fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee 6142ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::ConvertIntToLong(RegLocation rl_dest, RegLocation rl_src) { 6151fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateSExt(GetLLVMValue(rl_src.orig_sreg), 6161fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->getInt64Ty()); 6171fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 618101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee} 619101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee 6202ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::ConvertLongToInt(RegLocation rl_dest, RegLocation rl_src) { 6211fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* src = GetLLVMValue(rl_src.orig_sreg); 6221fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateTrunc(src, irb_->getInt32Ty()); 6231fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 62476592633b491e294d78db2c4dbc44ca679004b71buzbee} 62576592633b491e294d78db2c4dbc44ca679004b71buzbee 6262ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::ConvertFloatToDouble(RegLocation rl_dest, RegLocation rl_src) { 6271fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* src = GetLLVMValue(rl_src.orig_sreg); 6281fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateFPExt(src, irb_->getDoubleTy()); 6291fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 63076592633b491e294d78db2c4dbc44ca679004b71buzbee} 63176592633b491e294d78db2c4dbc44ca679004b71buzbee 6322ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::ConvertDoubleToFloat(RegLocation rl_dest, RegLocation rl_src) { 6331fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* src = GetLLVMValue(rl_src.orig_sreg); 6341fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateFPTrunc(src, irb_->getFloatTy()); 6351fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 63676592633b491e294d78db2c4dbc44ca679004b71buzbee} 63776592633b491e294d78db2c4dbc44ca679004b71buzbee 6381fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertWideComparison(art::llvm::IntrinsicHelper::IntrinsicId id, 6391fd3346740dfb7f47be9922312b68a4227fada96buzbee RegLocation rl_dest, RegLocation rl_src1, 6402ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom RegLocation rl_src2) { 641fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee DCHECK_EQ(rl_src1.fp, rl_src2.fp); 642fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee DCHECK_EQ(rl_src1.wide, rl_src2.wide); 6431fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 6444c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SmallVector< ::llvm::Value*, 2> args; 6451fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_src1.orig_sreg)); 6461fd3346740dfb7f47be9922312b68a4227fada96buzbee args.push_back(GetLLVMValue(rl_src2.orig_sreg)); 6471fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateCall(intr, args); 6481fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 64976592633b491e294d78db2c4dbc44ca679004b71buzbee} 65076592633b491e294d78db2c4dbc44ca679004b71buzbee 6511fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertIntNarrowing(RegLocation rl_dest, RegLocation rl_src, 6522ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom art::llvm::IntrinsicHelper::IntrinsicId id) { 6531fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 6544c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::Value* res = 6551fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateCall(intr, GetLLVMValue(rl_src.orig_sreg)); 6561fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 65776592633b491e294d78db2c4dbc44ca679004b71buzbee} 65876592633b491e294d78db2c4dbc44ca679004b71buzbee 6592ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::ConvertNeg(RegLocation rl_dest, RegLocation rl_src) { 6601fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateNeg(GetLLVMValue(rl_src.orig_sreg)); 6611fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 66276592633b491e294d78db2c4dbc44ca679004b71buzbee} 66376592633b491e294d78db2c4dbc44ca679004b71buzbee 6641fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertIntToFP(::llvm::Type* ty, RegLocation rl_dest, 6652ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom RegLocation rl_src) { 6664c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::Value* res = 6671fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateSIToFP(GetLLVMValue(rl_src.orig_sreg), ty); 6681fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 66976592633b491e294d78db2c4dbc44ca679004b71buzbee} 67076592633b491e294d78db2c4dbc44ca679004b71buzbee 6711fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertFPToInt(art::llvm::IntrinsicHelper::IntrinsicId id, 672fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee RegLocation rl_dest, 6732ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom RegLocation rl_src) { 6741fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 6751fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateCall(intr, GetLLVMValue(rl_src.orig_sreg)); 6761fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 67776592633b491e294d78db2c4dbc44ca679004b71buzbee} 67876592633b491e294d78db2c4dbc44ca679004b71buzbee 67976592633b491e294d78db2c4dbc44ca679004b71buzbee 6802ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::ConvertNegFP(RegLocation rl_dest, RegLocation rl_src) { 6814c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::Value* res = 6821fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateFNeg(GetLLVMValue(rl_src.orig_sreg)); 6831fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 68476592633b491e294d78db2c4dbc44ca679004b71buzbee} 68576592633b491e294d78db2c4dbc44ca679004b71buzbee 6862ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::ConvertNot(RegLocation rl_dest, RegLocation rl_src) { 6871fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* src = GetLLVMValue(rl_src.orig_sreg); 6881fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = irb_->CreateXor(src, static_cast<uint64_t>(-1)); 6891fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 690101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee} 691101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee 6921fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::EmitConstructorBarrier() { 6931fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction( 6944c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::ConstructorBarrier); 6951fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateCall(intr); 6960d43d5465f43eb8838e8ad3c02045d4d8c7ee380Sebastien Hertz} 6970d43d5465f43eb8838e8ad3c02045d4d8c7ee380Sebastien Hertz 6982cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee/* 6992cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * Target-independent code generation. Use only high-level 7002cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * load/store utilities here, or target-dependent genXX() handlers 7012cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * when necessary. 7022cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee */ 7031fd3346740dfb7f47be9922312b68a4227fada96buzbeebool MirConverter::ConvertMIRNode(MIR* mir, BasicBlock* bb, 7042ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom ::llvm::BasicBlock* llvm_bb) { 7052cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee bool res = false; // Assume success 706fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee RegLocation rl_src[3]; 7071fd3346740dfb7f47be9922312b68a4227fada96buzbee RegLocation rl_dest = mir_graph_->GetBadLoc(); 7082cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee Instruction::Code opcode = mir->dalvikInsn.opcode; 709fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int op_val = opcode; 7106969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee uint32_t vB = mir->dalvikInsn.vB; 7116969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee uint32_t vC = mir->dalvikInsn.vC; 712fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int opt_flags = mir->optimization_flags; 7136969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee 7141fd3346740dfb7f47be9922312b68a4227fada96buzbee if (cu_->verbose) { 71535ba7f3a78d38885ec54e61ed060d2771eeceea7buzbee if (!IsPseudoMirOp(op_val)) { 716fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee LOG(INFO) << ".. " << Instruction::Name(opcode) << " 0x" << std::hex << op_val; 717c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee } else { 7181fd3346740dfb7f47be9922312b68a4227fada96buzbee LOG(INFO) << mir_graph_->extended_mir_op_names_[op_val - kMirOpFirst] << " 0x" << std::hex << op_val; 719c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee } 720c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee } 721c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee 7222cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee /* Prep Src and Dest locations */ 723fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int next_sreg = 0; 724fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int next_loc = 0; 725cc794c3dc5b45601da23fb0d7bc16f9b4ef04065Jean Christophe Beyler uint64_t attrs = MirGraph::GetDataFlowAttributes(opcode); 7261fd3346740dfb7f47be9922312b68a4227fada96buzbee rl_src[0] = rl_src[1] = rl_src[2] = mir_graph_->GetBadLoc(); 7272cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (attrs & DF_UA) { 7282cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (attrs & DF_A_WIDE) { 7291fd3346740dfb7f47be9922312b68a4227fada96buzbee rl_src[next_loc++] = mir_graph_->GetSrcWide(mir, next_sreg); 730fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee next_sreg+= 2; 7312cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } else { 7321fd3346740dfb7f47be9922312b68a4227fada96buzbee rl_src[next_loc++] = mir_graph_->GetSrc(mir, next_sreg); 733fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee next_sreg++; 7342cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 7352cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 7362cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (attrs & DF_UB) { 7372cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (attrs & DF_B_WIDE) { 7381fd3346740dfb7f47be9922312b68a4227fada96buzbee rl_src[next_loc++] = mir_graph_->GetSrcWide(mir, next_sreg); 739fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee next_sreg+= 2; 7402cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } else { 7411fd3346740dfb7f47be9922312b68a4227fada96buzbee rl_src[next_loc++] = mir_graph_->GetSrc(mir, next_sreg); 742fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee next_sreg++; 7432cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 7442cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 7452cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (attrs & DF_UC) { 7462cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (attrs & DF_C_WIDE) { 7471fd3346740dfb7f47be9922312b68a4227fada96buzbee rl_src[next_loc++] = mir_graph_->GetSrcWide(mir, next_sreg); 7482cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } else { 7491fd3346740dfb7f47be9922312b68a4227fada96buzbee rl_src[next_loc++] = mir_graph_->GetSrc(mir, next_sreg); 7502cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 7512cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 7522cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (attrs & DF_DA) { 7532cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (attrs & DF_A_WIDE) { 7541fd3346740dfb7f47be9922312b68a4227fada96buzbee rl_dest = mir_graph_->GetDestWide(mir); 7552cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } else { 7561fd3346740dfb7f47be9922312b68a4227fada96buzbee rl_dest = mir_graph_->GetDest(mir); 7572cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 7582cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 7592cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 7602cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee switch (opcode) { 7612cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::NOP: 7622cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 7632cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 7642cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MOVE: 7652cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MOVE_OBJECT: 7662cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MOVE_16: 7672cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MOVE_OBJECT_16: 76876592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::MOVE_OBJECT_FROM16: 7692cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MOVE_FROM16: 7702cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MOVE_WIDE: 7712cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MOVE_WIDE_16: 7722cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MOVE_WIDE_FROM16: { 7732cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee /* 7742cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * Moves/copies are meaningless in pure SSA register form, 7752cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * but we need to preserve them for the conversion back into 7762cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * MIR (at least until we stop using the Dalvik register maps). 7772cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * Insert a dummy intrinsic copy call, which will be recognized 7782cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * by the quick path and removed by the portable path. 7792cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee */ 7801fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* src = GetLLVMValue(rl_src[0].orig_sreg); 7811fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = EmitCopy(src, rl_dest); 7821fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 7832cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 7842cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 7852cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 7862cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::CONST: 7872cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::CONST_4: 7882cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::CONST_16: { 7891fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Constant* imm_value = irb_->getJInt(vB); 7901fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = EmitConst(imm_value, rl_dest); 7911fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 7922cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 7932cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 7942cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 7952cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::CONST_WIDE_16: 7962cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::CONST_WIDE_32: { 79776592633b491e294d78db2c4dbc44ca679004b71buzbee // Sign extend to 64 bits 79876592633b491e294d78db2c4dbc44ca679004b71buzbee int64_t imm = static_cast<int32_t>(vB); 7991fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Constant* imm_value = irb_->getJLong(imm); 8001fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = EmitConst(imm_value, rl_dest); 8011fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 8022cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 8032cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 8042cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 8052cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::CONST_HIGH16: { 8061fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Constant* imm_value = irb_->getJInt(vB << 16); 8071fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = EmitConst(imm_value, rl_dest); 8081fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 8092cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 8102cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 8112cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 8122cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::CONST_WIDE: { 8134c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::Constant* imm_value = 8141fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->getJLong(mir->dalvikInsn.vB_wide); 8151fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = EmitConst(imm_value, rl_dest); 8161fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 8174f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee } 8184f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee break; 8192cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::CONST_WIDE_HIGH16: { 8206969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee int64_t imm = static_cast<int64_t>(vB) << 48; 8211fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Constant* imm_value = irb_->getJLong(imm); 8221fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* res = EmitConst(imm_value, rl_dest); 8231fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValue(res, rl_dest.orig_sreg); 8244f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee } 8254f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee break; 8264f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee 8278fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::SPUT_OBJECT: 8281fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSput(vB, art::llvm::IntrinsicHelper::HLSputObject, 829fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0]); 8308fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 8318fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::SPUT: 832fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (rl_src[0].fp) { 8331fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSput(vB, art::llvm::IntrinsicHelper::HLSputFloat, 834fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0]); 8358fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee } else { 8361fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSput(vB, art::llvm::IntrinsicHelper::HLSput, rl_src[0]); 8378fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee } 8388fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 8398fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::SPUT_BOOLEAN: 8401fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSput(vB, art::llvm::IntrinsicHelper::HLSputBoolean, 841fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0]); 8428fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 8438fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::SPUT_BYTE: 8441fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSput(vB, art::llvm::IntrinsicHelper::HLSputByte, rl_src[0]); 8458fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 8468fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::SPUT_CHAR: 8471fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSput(vB, art::llvm::IntrinsicHelper::HLSputChar, rl_src[0]); 8488fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 8498fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::SPUT_SHORT: 8501fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSput(vB, art::llvm::IntrinsicHelper::HLSputShort, rl_src[0]); 8518fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 8528fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::SPUT_WIDE: 853fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (rl_src[0].fp) { 8541fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSput(vB, art::llvm::IntrinsicHelper::HLSputDouble, 855fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0]); 8568fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee } else { 8571fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSput(vB, art::llvm::IntrinsicHelper::HLSputWide, 858fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0]); 8598fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee } 8608fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 8618fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee 8628fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::SGET_OBJECT: 8631fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSget(vB, art::llvm::IntrinsicHelper::HLSgetObject, rl_dest); 8648fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 8658fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::SGET: 866fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (rl_dest.fp) { 8671fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSget(vB, art::llvm::IntrinsicHelper::HLSgetFloat, rl_dest); 8688fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee } else { 8691fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSget(vB, art::llvm::IntrinsicHelper::HLSget, rl_dest); 8708fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee } 8718fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 8728fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::SGET_BOOLEAN: 8731fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSget(vB, art::llvm::IntrinsicHelper::HLSgetBoolean, rl_dest); 8748fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 8758fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::SGET_BYTE: 8761fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSget(vB, art::llvm::IntrinsicHelper::HLSgetByte, rl_dest); 8778fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 8788fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::SGET_CHAR: 8791fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSget(vB, art::llvm::IntrinsicHelper::HLSgetChar, rl_dest); 8808fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 8818fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::SGET_SHORT: 8821fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSget(vB, art::llvm::IntrinsicHelper::HLSgetShort, rl_dest); 8838fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 8848fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::SGET_WIDE: 885fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (rl_dest.fp) { 8861fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSget(vB, art::llvm::IntrinsicHelper::HLSgetDouble, 887fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest); 8888fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee } else { 8891fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSget(vB, art::llvm::IntrinsicHelper::HLSgetWide, rl_dest); 8904f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee } 8914f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee break; 8922cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 8932cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::RETURN_WIDE: 8942cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::RETURN: 8952cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::RETURN_OBJECT: { 8961fd3346740dfb7f47be9922312b68a4227fada96buzbee if (!mir_graph_->MethodIsLeaf()) { 8971fd3346740dfb7f47be9922312b68a4227fada96buzbee EmitSuspendCheck(); 8982cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 8991fd3346740dfb7f47be9922312b68a4227fada96buzbee EmitPopShadowFrame(); 9001fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateRet(GetLLVMValue(rl_src[0].orig_sreg)); 901bbdd05378516f11443fce29a0fbff25ad993db23buzbee DCHECK(bb->terminated_by_return); 9022cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 9032cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9042cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 9052cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::RETURN_VOID: { 9061fd3346740dfb7f47be9922312b68a4227fada96buzbee if (((cu_->access_flags & kAccConstructor) != 0) && 9071fd3346740dfb7f47be9922312b68a4227fada96buzbee cu_->compiler_driver->RequiresConstructorBarrier(Thread::Current(), 9081fd3346740dfb7f47be9922312b68a4227fada96buzbee cu_->dex_file, 9091fd3346740dfb7f47be9922312b68a4227fada96buzbee cu_->class_def_idx)) { 9101fd3346740dfb7f47be9922312b68a4227fada96buzbee EmitConstructorBarrier(); 9110d43d5465f43eb8838e8ad3c02045d4d8c7ee380Sebastien Hertz } 9121fd3346740dfb7f47be9922312b68a4227fada96buzbee if (!mir_graph_->MethodIsLeaf()) { 9131fd3346740dfb7f47be9922312b68a4227fada96buzbee EmitSuspendCheck(); 9142cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 9151fd3346740dfb7f47be9922312b68a4227fada96buzbee EmitPopShadowFrame(); 9161fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateRetVoid(); 917bbdd05378516f11443fce29a0fbff25ad993db23buzbee DCHECK(bb->terminated_by_return); 9182cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 9192cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9202cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 9212cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::IF_EQ: 9221fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertCompareAndBranch(bb, mir, kCondEq, rl_src[0], rl_src[1]); 9232cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9242cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::IF_NE: 9251fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertCompareAndBranch(bb, mir, kCondNe, rl_src[0], rl_src[1]); 9262cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9272cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::IF_LT: 9281fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertCompareAndBranch(bb, mir, kCondLt, rl_src[0], rl_src[1]); 9292cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9302cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::IF_GE: 9311fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertCompareAndBranch(bb, mir, kCondGe, rl_src[0], rl_src[1]); 9322cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9332cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::IF_GT: 9341fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertCompareAndBranch(bb, mir, kCondGt, rl_src[0], rl_src[1]); 9352cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9362cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::IF_LE: 9371fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertCompareAndBranch(bb, mir, kCondLe, rl_src[0], rl_src[1]); 9382cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9392cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::IF_EQZ: 9401fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertCompareZeroAndBranch(bb, mir, kCondEq, rl_src[0]); 9412cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9422cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::IF_NEZ: 9431fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertCompareZeroAndBranch(bb, mir, kCondNe, rl_src[0]); 9442cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9452cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::IF_LTZ: 9461fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertCompareZeroAndBranch(bb, mir, kCondLt, rl_src[0]); 9472cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9482cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::IF_GEZ: 9491fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertCompareZeroAndBranch(bb, mir, kCondGe, rl_src[0]); 9502cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9512cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::IF_GTZ: 9521fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertCompareZeroAndBranch(bb, mir, kCondGt, rl_src[0]); 9532cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9542cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::IF_LEZ: 9551fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertCompareZeroAndBranch(bb, mir, kCondLe, rl_src[0]); 9562cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9572cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 9582cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::GOTO: 9592cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::GOTO_16: 9602cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::GOTO_32: { 9610d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee if (mir_graph_->GetBasicBlock(bb->taken)->start_offset <= bb->start_offset) { 9621fd3346740dfb7f47be9922312b68a4227fada96buzbee EmitSuspendCheck(); 9632cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 9640d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee irb_->CreateBr(GetLLVMBlock(bb->taken)); 9652cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 9662cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9672cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 9682cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::ADD_LONG: 9692cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::ADD_LONG_2ADDR: 9702cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::ADD_INT: 9712cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::ADD_INT_2ADDR: 9721fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertArithOp(kOpAdd, rl_dest, rl_src[0], rl_src[1]); 9732cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9742cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::SUB_LONG: 9752cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::SUB_LONG_2ADDR: 9762cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::SUB_INT: 9772cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::SUB_INT_2ADDR: 9781fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertArithOp(kOpSub, rl_dest, rl_src[0], rl_src[1]); 9792cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9802cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MUL_LONG: 9812cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MUL_LONG_2ADDR: 9822cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MUL_INT: 9832cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MUL_INT_2ADDR: 9841fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertArithOp(kOpMul, rl_dest, rl_src[0], rl_src[1]); 9852cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9862cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::DIV_LONG: 9872cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::DIV_LONG_2ADDR: 9882cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::DIV_INT: 9892cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::DIV_INT_2ADDR: 9901fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertArithOp(kOpDiv, rl_dest, rl_src[0], rl_src[1]); 9912cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9922cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::REM_LONG: 9932cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::REM_LONG_2ADDR: 9942cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::REM_INT: 9952cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::REM_INT_2ADDR: 9961fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertArithOp(kOpRem, rl_dest, rl_src[0], rl_src[1]); 9972cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 9982cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::AND_LONG: 9992cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::AND_LONG_2ADDR: 10002cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::AND_INT: 10012cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::AND_INT_2ADDR: 10021fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertArithOp(kOpAnd, rl_dest, rl_src[0], rl_src[1]); 10032cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 10042cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::OR_LONG: 10052cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::OR_LONG_2ADDR: 10062cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::OR_INT: 10072cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::OR_INT_2ADDR: 10081fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertArithOp(kOpOr, rl_dest, rl_src[0], rl_src[1]); 10092cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 10102cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::XOR_LONG: 10112cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::XOR_LONG_2ADDR: 10122cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::XOR_INT: 10132cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::XOR_INT_2ADDR: 10141fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertArithOp(kOpXor, rl_dest, rl_src[0], rl_src[1]); 10152cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 10162cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::SHL_LONG: 10172cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::SHL_LONG_2ADDR: 10181fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertShift(art::llvm::IntrinsicHelper::SHLLong, 1019fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 10204f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee break; 10212cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::SHL_INT: 10222cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::SHL_INT_2ADDR: 10231fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertShift(art::llvm::IntrinsicHelper::SHLInt, 1024fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 10252cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 10262cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::SHR_LONG: 10272cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::SHR_LONG_2ADDR: 10281fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertShift(art::llvm::IntrinsicHelper::SHRLong, 1029fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 10304f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee break; 10312cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::SHR_INT: 10322cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::SHR_INT_2ADDR: 10331fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertShift(art::llvm::IntrinsicHelper::SHRInt, 1034fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 10352cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 10362cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::USHR_LONG: 10372cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::USHR_LONG_2ADDR: 10381fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertShift(art::llvm::IntrinsicHelper::USHRLong, 1039fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 10404f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee break; 10412cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::USHR_INT: 10422cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::USHR_INT_2ADDR: 10431fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertShift(art::llvm::IntrinsicHelper::USHRInt, 1044fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 10452cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 10462cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 10472cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::ADD_INT_LIT16: 10482cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::ADD_INT_LIT8: 10491fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertArithOpLit(kOpAdd, rl_dest, rl_src[0], vC); 10502cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 10512cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::RSUB_INT: 10522cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::RSUB_INT_LIT8: 10531fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertArithOpLit(kOpRsub, rl_dest, rl_src[0], vC); 10542cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 10552cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MUL_INT_LIT16: 10562cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MUL_INT_LIT8: 10571fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertArithOpLit(kOpMul, rl_dest, rl_src[0], vC); 10582cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 10592cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::DIV_INT_LIT16: 10602cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::DIV_INT_LIT8: 10611fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertArithOpLit(kOpDiv, rl_dest, rl_src[0], vC); 10622cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 10632cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::REM_INT_LIT16: 10642cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::REM_INT_LIT8: 10651fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertArithOpLit(kOpRem, rl_dest, rl_src[0], vC); 10662cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 10672cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::AND_INT_LIT16: 10682cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::AND_INT_LIT8: 10691fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertArithOpLit(kOpAnd, rl_dest, rl_src[0], vC); 10702cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 10712cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::OR_INT_LIT16: 10722cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::OR_INT_LIT8: 10731fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertArithOpLit(kOpOr, rl_dest, rl_src[0], vC); 10742cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 10752cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::XOR_INT_LIT16: 10762cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::XOR_INT_LIT8: 10771fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertArithOpLit(kOpXor, rl_dest, rl_src[0], vC); 10782cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 10792cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::SHL_INT_LIT8: 10801fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertShiftLit(art::llvm::IntrinsicHelper::SHLInt, 1081fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], vC & 0x1f); 10822cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 10832cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::SHR_INT_LIT8: 10841fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertShiftLit(art::llvm::IntrinsicHelper::SHRInt, 1085fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], vC & 0x1f); 10862cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 10872cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::USHR_INT_LIT8: 10881fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertShiftLit(art::llvm::IntrinsicHelper::USHRInt, 1089fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], vC & 0x1f); 10902cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 10912cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 10922cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::ADD_FLOAT: 10932cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::ADD_FLOAT_2ADDR: 10942cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::ADD_DOUBLE: 10952cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::ADD_DOUBLE_2ADDR: 10961fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertFPArithOp(kOpAdd, rl_dest, rl_src[0], rl_src[1]); 10972cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 10982cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 10992cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::SUB_FLOAT: 11002cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::SUB_FLOAT_2ADDR: 11012cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::SUB_DOUBLE: 11022cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::SUB_DOUBLE_2ADDR: 11031fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertFPArithOp(kOpSub, rl_dest, rl_src[0], rl_src[1]); 11042cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 11052cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 11062cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MUL_FLOAT: 11072cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MUL_FLOAT_2ADDR: 11082cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MUL_DOUBLE: 11092cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MUL_DOUBLE_2ADDR: 11101fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertFPArithOp(kOpMul, rl_dest, rl_src[0], rl_src[1]); 11112cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 11122cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 11132cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::DIV_FLOAT: 11142cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::DIV_FLOAT_2ADDR: 11152cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::DIV_DOUBLE: 11162cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::DIV_DOUBLE_2ADDR: 11171fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertFPArithOp(kOpDiv, rl_dest, rl_src[0], rl_src[1]); 11182cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 11192cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 11202cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::REM_FLOAT: 11212cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::REM_FLOAT_2ADDR: 11222cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::REM_DOUBLE: 11232cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::REM_DOUBLE_2ADDR: 11241fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertFPArithOp(kOpRem, rl_dest, rl_src[0], rl_src[1]); 11252cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 11262cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 11276969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee case Instruction::INVOKE_STATIC: 11281fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertInvoke(bb, mir, kStatic, false /*range*/, 1129101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee false /* NewFilledArray */); 11306969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee break; 11316969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee case Instruction::INVOKE_STATIC_RANGE: 11321fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertInvoke(bb, mir, kStatic, true /*range*/, 1133101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee false /* NewFilledArray */); 11346969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee break; 11356969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee 11366969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee case Instruction::INVOKE_DIRECT: 11371fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertInvoke(bb, mir, kDirect, false /*range*/, 1138101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee false /* NewFilledArray */); 11396969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee break; 11406969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee case Instruction::INVOKE_DIRECT_RANGE: 11411fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertInvoke(bb, mir, kDirect, true /*range*/, 1142101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee false /* NewFilledArray */); 11436969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee break; 11446969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee 11456969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee case Instruction::INVOKE_VIRTUAL: 11461fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertInvoke(bb, mir, kVirtual, false /*range*/, 1147101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee false /* NewFilledArray */); 11486969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee break; 11496969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee case Instruction::INVOKE_VIRTUAL_RANGE: 11501fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertInvoke(bb, mir, kVirtual, true /*range*/, 1151101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee false /* NewFilledArray */); 11526969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee break; 11536969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee 11546969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee case Instruction::INVOKE_SUPER: 11551fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertInvoke(bb, mir, kSuper, false /*range*/, 1156101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee false /* NewFilledArray */); 11576969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee break; 11586969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee case Instruction::INVOKE_SUPER_RANGE: 11591fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertInvoke(bb, mir, kSuper, true /*range*/, 1160101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee false /* NewFilledArray */); 11616969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee break; 11626969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee 11636969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee case Instruction::INVOKE_INTERFACE: 11641fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertInvoke(bb, mir, kInterface, false /*range*/, 1165101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee false /* NewFilledArray */); 11666969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee break; 11676969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee case Instruction::INVOKE_INTERFACE_RANGE: 11681fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertInvoke(bb, mir, kInterface, true /*range*/, 1169101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee false /* NewFilledArray */); 1170101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee break; 1171101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::FILLED_NEW_ARRAY: 11721fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertInvoke(bb, mir, kInterface, false /*range*/, 1173101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee true /* NewFilledArray */); 1174101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee break; 1175101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::FILLED_NEW_ARRAY_RANGE: 11761fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertInvoke(bb, mir, kInterface, true /*range*/, 1177101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee true /* NewFilledArray */); 11786969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee break; 11796969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee 11806969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee case Instruction::CONST_STRING: 11816969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee case Instruction::CONST_STRING_JUMBO: 11821fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertConstObject(vB, art::llvm::IntrinsicHelper::ConstString, 1183fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest); 1184101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee break; 1185101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee 1186101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::CONST_CLASS: 11871fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertConstObject(vB, art::llvm::IntrinsicHelper::ConstClass, 1188fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest); 1189101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee break; 1190101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee 1191101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::CHECK_CAST: 11921fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertCheckCast(vB, rl_src[0]); 11936969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee break; 11946969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee 11954f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee case Instruction::NEW_INSTANCE: 11961fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertNewInstance(vB, rl_dest); 11974f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee break; 11984f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee 11996f485c62b9cfce3ab71020c646ab9f48d9d29d6dBrian Carlstrom case Instruction::MOVE_EXCEPTION: 12001fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertMoveException(rl_dest); 120132412961b1c912faba30cdecd3560ab05e463807buzbee break; 120232412961b1c912faba30cdecd3560ab05e463807buzbee 12036f485c62b9cfce3ab71020c646ab9f48d9d29d6dBrian Carlstrom case Instruction::THROW: 12041fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertThrow(rl_src[0]); 1205c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee /* 1206c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee * If this throw is standalone, terminate. 1207c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee * If it might rethrow, force termination 1208c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee * of the following block. 1209c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee */ 12100d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee if (bb->fall_through == NullBasicBlockId) { 12111fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateUnreachable(); 1212c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee } else { 12130d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee mir_graph_->GetBasicBlock(bb->fall_through)->fall_through = NullBasicBlockId; 12140d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee mir_graph_->GetBasicBlock(bb->fall_through)->taken = NullBasicBlockId; 1215c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee } 121632412961b1c912faba30cdecd3560ab05e463807buzbee break; 121732412961b1c912faba30cdecd3560ab05e463807buzbee 12182cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MOVE_RESULT_WIDE: 12192cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MOVE_RESULT: 12202cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MOVE_RESULT_OBJECT: 12219a2487f94efeb88016a695af823bf26799ef0f06buzbee /* 12229a4f003f9a6da8e4c6ee279bd2a13aac37648183jeffhao * All move_results should have been folded into the preceeding invoke. 12239a2487f94efeb88016a695af823bf26799ef0f06buzbee */ 12249a4f003f9a6da8e4c6ee279bd2a13aac37648183jeffhao LOG(FATAL) << "Unexpected move_result"; 12252cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 12262cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 12272cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MONITOR_ENTER: 12281fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertMonitorEnterExit(opt_flags, 12294c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::MonitorEnter, 1230fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0]); 12312cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 12322cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 12332cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::MONITOR_EXIT: 12341fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertMonitorEnterExit(opt_flags, 12354c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::MonitorExit, 1236fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0]); 12372cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 12382cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 12398fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::ARRAY_LENGTH: 12401fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertArrayLength(opt_flags, rl_dest, rl_src[0]); 12418fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 12428fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee 12438fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::NEW_ARRAY: 12441fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertNewArray(vC, rl_dest, rl_src[0]); 12452cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 12462cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 12472cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::INSTANCE_OF: 12481fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertInstanceOf(vC, rl_dest, rl_src[0]); 12492cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 12502cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 12518fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::AGET: 1252fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (rl_dest.fp) { 12531fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertAget(opt_flags, 12544c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::HLArrayGetFloat, 1255fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 12568fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee } else { 12571fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertAget(opt_flags, art::llvm::IntrinsicHelper::HLArrayGet, 1258fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 12598fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee } 12608fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 12618fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::AGET_OBJECT: 12621fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertAget(opt_flags, art::llvm::IntrinsicHelper::HLArrayGetObject, 1263fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 12648fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 12658fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::AGET_BOOLEAN: 12661fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertAget(opt_flags, 12674c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::HLArrayGetBoolean, 1268fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 12698fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 12708fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::AGET_BYTE: 12711fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertAget(opt_flags, art::llvm::IntrinsicHelper::HLArrayGetByte, 1272fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 12738fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 12748fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::AGET_CHAR: 12751fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertAget(opt_flags, art::llvm::IntrinsicHelper::HLArrayGetChar, 1276fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 12778fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 12788fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::AGET_SHORT: 12791fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertAget(opt_flags, art::llvm::IntrinsicHelper::HLArrayGetShort, 1280fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 12818fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 12828fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::AGET_WIDE: 1283fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (rl_dest.fp) { 12841fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertAget(opt_flags, 12854c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::HLArrayGetDouble, 1286fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 12878fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee } else { 12881fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertAget(opt_flags, art::llvm::IntrinsicHelper::HLArrayGetWide, 1289fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 12908fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee } 12912cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 12922cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 12938fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::APUT: 1294fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (rl_src[0].fp) { 12951fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertAput(opt_flags, 12964c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::HLArrayPutFloat, 1297fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], rl_src[1], rl_src[2]); 12988fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee } else { 12991fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertAput(opt_flags, art::llvm::IntrinsicHelper::HLArrayPut, 1300fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], rl_src[1], rl_src[2]); 13018fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee } 13028fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 13038fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::APUT_OBJECT: 13041fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertAput(opt_flags, art::llvm::IntrinsicHelper::HLArrayPutObject, 1305fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], rl_src[1], rl_src[2]); 13068fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 13078fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::APUT_BOOLEAN: 13081fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertAput(opt_flags, 13094c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::HLArrayPutBoolean, 1310fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], rl_src[1], rl_src[2]); 13118fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 13128fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::APUT_BYTE: 13131fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertAput(opt_flags, art::llvm::IntrinsicHelper::HLArrayPutByte, 1314fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], rl_src[1], rl_src[2]); 13158fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 13168fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::APUT_CHAR: 13171fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertAput(opt_flags, art::llvm::IntrinsicHelper::HLArrayPutChar, 1318fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], rl_src[1], rl_src[2]); 13198fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 13208fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::APUT_SHORT: 13211fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertAput(opt_flags, art::llvm::IntrinsicHelper::HLArrayPutShort, 1322fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], rl_src[1], rl_src[2]); 13238fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee break; 13248fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee case Instruction::APUT_WIDE: 1325fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (rl_src[0].fp) { 13261fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertAput(opt_flags, 13274c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::HLArrayPutDouble, 1328fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], rl_src[1], rl_src[2]); 13298fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee } else { 13301fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertAput(opt_flags, art::llvm::IntrinsicHelper::HLArrayPutWide, 1331fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], rl_src[1], rl_src[2]); 13328fa0fda8e1b6aa0a759990b3d32b78bb08065e0fbuzbee } 13332cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 13342cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 1335101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::IGET: 1336fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (rl_dest.fp) { 13371fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIget(opt_flags, art::llvm::IntrinsicHelper::HLIGetFloat, 1338fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], vC); 1339101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee } else { 13401fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIget(opt_flags, art::llvm::IntrinsicHelper::HLIGet, 1341fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], vC); 1342101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee } 13432cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 1344101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::IGET_OBJECT: 13451fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIget(opt_flags, art::llvm::IntrinsicHelper::HLIGetObject, 1346fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], vC); 13472cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 1348101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::IGET_BOOLEAN: 13491fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIget(opt_flags, art::llvm::IntrinsicHelper::HLIGetBoolean, 1350fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], vC); 13512cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 1352101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::IGET_BYTE: 13531fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIget(opt_flags, art::llvm::IntrinsicHelper::HLIGetByte, 1354fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], vC); 13552cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 1356101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::IGET_CHAR: 13571fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIget(opt_flags, art::llvm::IntrinsicHelper::HLIGetChar, 1358fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], vC); 13592cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 1360101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::IGET_SHORT: 13611fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIget(opt_flags, art::llvm::IntrinsicHelper::HLIGetShort, 1362fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], vC); 13632cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 1364101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::IGET_WIDE: 1365fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (rl_dest.fp) { 13661fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIget(opt_flags, art::llvm::IntrinsicHelper::HLIGetDouble, 1367fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], vC); 1368101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee } else { 13691fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIget(opt_flags, art::llvm::IntrinsicHelper::HLIGetWide, 1370fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], vC); 1371101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee } 13722cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 1373101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::IPUT: 1374fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (rl_src[0].fp) { 13751fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIput(opt_flags, art::llvm::IntrinsicHelper::HLIPutFloat, 1376fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], rl_src[1], vC); 1377101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee } else { 13781fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIput(opt_flags, art::llvm::IntrinsicHelper::HLIPut, 1379fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], rl_src[1], vC); 1380101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee } 13812cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 1382101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::IPUT_OBJECT: 13831fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIput(opt_flags, art::llvm::IntrinsicHelper::HLIPutObject, 1384fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], rl_src[1], vC); 13852cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 1386101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::IPUT_BOOLEAN: 13871fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIput(opt_flags, art::llvm::IntrinsicHelper::HLIPutBoolean, 1388fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], rl_src[1], vC); 13892cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 1390101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::IPUT_BYTE: 13911fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIput(opt_flags, art::llvm::IntrinsicHelper::HLIPutByte, 1392fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], rl_src[1], vC); 13932cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 1394101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::IPUT_CHAR: 13951fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIput(opt_flags, art::llvm::IntrinsicHelper::HLIPutChar, 1396fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], rl_src[1], vC); 13972cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 1398101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::IPUT_SHORT: 13991fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIput(opt_flags, art::llvm::IntrinsicHelper::HLIPutShort, 1400fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], rl_src[1], vC); 1401101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee break; 1402101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::IPUT_WIDE: 1403fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (rl_src[0].fp) { 14041fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIput(opt_flags, art::llvm::IntrinsicHelper::HLIPutDouble, 1405fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], rl_src[1], vC); 1406101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee } else { 14071fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIput(opt_flags, art::llvm::IntrinsicHelper::HLIPutWide, 1408fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], rl_src[1], vC); 1409101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee } 14102cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 14112cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 1412101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::FILL_ARRAY_DATA: 14131fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertFillArrayData(vB, rl_src[0]); 14142cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 14152cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 141676592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::LONG_TO_INT: 14171fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertLongToInt(rl_dest, rl_src[0]); 141876592633b491e294d78db2c4dbc44ca679004b71buzbee break; 141976592633b491e294d78db2c4dbc44ca679004b71buzbee 1420101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::INT_TO_LONG: 14211fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIntToLong(rl_dest, rl_src[0]); 14222cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 14232cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 1424101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::INT_TO_CHAR: 14251fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIntNarrowing(rl_dest, rl_src[0], 14264c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntToChar); 1427101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee break; 1428101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::INT_TO_BYTE: 14291fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIntNarrowing(rl_dest, rl_src[0], 14304c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntToByte); 1431101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee break; 1432101305f7ca3da8c665e3c5f7cdf9e1f22f009567buzbee case Instruction::INT_TO_SHORT: 14331fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIntNarrowing(rl_dest, rl_src[0], 14344c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntToShort); 14352cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 14362cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 143776592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::INT_TO_FLOAT: 143876592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::LONG_TO_FLOAT: 14391fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIntToFP(irb_->getFloatTy(), rl_dest, rl_src[0]); 14402cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 14412cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 144276592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::INT_TO_DOUBLE: 144376592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::LONG_TO_DOUBLE: 14441fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertIntToFP(irb_->getDoubleTy(), rl_dest, rl_src[0]); 14452cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 14462cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 144776592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::FLOAT_TO_DOUBLE: 14481fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertFloatToDouble(rl_dest, rl_src[0]); 14492cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 14502cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 145176592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::DOUBLE_TO_FLOAT: 14521fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertDoubleToFloat(rl_dest, rl_src[0]); 14532cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 14542cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 14552cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::NEG_LONG: 145676592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::NEG_INT: 14571fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertNeg(rl_dest, rl_src[0]); 14582cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 14592cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 14602cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::NEG_FLOAT: 14612cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::NEG_DOUBLE: 14621fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertNegFP(rl_dest, rl_src[0]); 14632cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 14642cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 146576592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::NOT_LONG: 146676592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::NOT_INT: 14671fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertNot(rl_dest, rl_src[0]); 14682cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 14692cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 14702cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::FLOAT_TO_INT: 14711fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertFPToInt(art::llvm::IntrinsicHelper::F2I, rl_dest, rl_src[0]); 14724ec8ccdaeee1c4af1a70e1ac0dd482e83df72f38TDYa break; 14734ec8ccdaeee1c4af1a70e1ac0dd482e83df72f38TDYa 14742cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::DOUBLE_TO_INT: 14751fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertFPToInt(art::llvm::IntrinsicHelper::D2I, rl_dest, rl_src[0]); 147676592633b491e294d78db2c4dbc44ca679004b71buzbee break; 147776592633b491e294d78db2c4dbc44ca679004b71buzbee 147876592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::FLOAT_TO_LONG: 14791fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertFPToInt(art::llvm::IntrinsicHelper::F2L, rl_dest, rl_src[0]); 14804ec8ccdaeee1c4af1a70e1ac0dd482e83df72f38TDYa break; 14814ec8ccdaeee1c4af1a70e1ac0dd482e83df72f38TDYa 14822cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case Instruction::DOUBLE_TO_LONG: 14831fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertFPToInt(art::llvm::IntrinsicHelper::D2L, rl_dest, rl_src[0]); 14842cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 14852cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 148676592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::CMPL_FLOAT: 14871fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertWideComparison(art::llvm::IntrinsicHelper::CmplFloat, 1488fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 148976592633b491e294d78db2c4dbc44ca679004b71buzbee break; 149076592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::CMPG_FLOAT: 14911fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertWideComparison(art::llvm::IntrinsicHelper::CmpgFloat, 1492fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 149376592633b491e294d78db2c4dbc44ca679004b71buzbee break; 149476592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::CMPL_DOUBLE: 14951fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertWideComparison(art::llvm::IntrinsicHelper::CmplDouble, 1496fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 149776592633b491e294d78db2c4dbc44ca679004b71buzbee break; 149876592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::CMPG_DOUBLE: 14991fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertWideComparison(art::llvm::IntrinsicHelper::CmpgDouble, 1500fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 150176592633b491e294d78db2c4dbc44ca679004b71buzbee break; 150276592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::CMP_LONG: 15031fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertWideComparison(art::llvm::IntrinsicHelper::CmpLong, 1504fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_dest, rl_src[0], rl_src[1]); 150576592633b491e294d78db2c4dbc44ca679004b71buzbee break; 150676592633b491e294d78db2c4dbc44ca679004b71buzbee 150776592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::PACKED_SWITCH: 15081fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertPackedSwitch(bb, vB, rl_src[0]); 150976592633b491e294d78db2c4dbc44ca679004b71buzbee break; 151076592633b491e294d78db2c4dbc44ca679004b71buzbee 151176592633b491e294d78db2c4dbc44ca679004b71buzbee case Instruction::SPARSE_SWITCH: 15121fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertSparseSwitch(bb, vB, rl_src[0]); 151376592633b491e294d78db2c4dbc44ca679004b71buzbee break; 15142cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 15152cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee default: 151632412961b1c912faba30cdecd3560ab05e463807buzbee UNIMPLEMENTED(FATAL) << "Unsupported Dex opcode 0x" << std::hex << opcode; 15172cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee res = true; 15182cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 15192cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee return res; 15201895ea386ca78573302483f589ebabd8ce1480e7Brian Carlstrom} // NOLINT(readability/fn_size) 15212cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 15222ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::SetDexOffset(int32_t offset) { 15231fd3346740dfb7f47be9922312b68a4227fada96buzbee current_dalvik_offset_ = offset; 15244c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SmallVector< ::llvm::Value*, 1> array_ref; 15251fd3346740dfb7f47be9922312b68a4227fada96buzbee array_ref.push_back(irb_->getInt32(offset)); 15261fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::MDNode* node = ::llvm::MDNode::get(*context_, array_ref); 15271fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->SetDexOffset(node); 152826f10eed520942d3db754c31941e457048475f61buzbee} 152926f10eed520942d3db754c31941e457048475f61buzbee 153026f10eed520942d3db754c31941e457048475f61buzbee// Attach method info as metadata to special intrinsic 15312ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::SetMethodInfo() { 153226f10eed520942d3db754c31941e457048475f61buzbee // We don't want dex offset on this 15331fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->SetDexOffset(NULL); 15344c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntrinsicId id; 15354c1c283a7410784e9cab309f868248690b788a9cIan Rogers id = art::llvm::IntrinsicHelper::MethodInfo; 15361fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction(id); 15371fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Instruction* inst = irb_->CreateCall(intr); 15384c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SmallVector< ::llvm::Value*, 2> reg_info; 15391fd3346740dfb7f47be9922312b68a4227fada96buzbee reg_info.push_back(irb_->getInt32(cu_->num_ins)); 15401fd3346740dfb7f47be9922312b68a4227fada96buzbee reg_info.push_back(irb_->getInt32(cu_->num_regs)); 15411fd3346740dfb7f47be9922312b68a4227fada96buzbee reg_info.push_back(irb_->getInt32(cu_->num_outs)); 1542da7a69b3fa7bb22d087567364b7eb5a75824efd8Razvan A Lupusoru reg_info.push_back(irb_->getInt32(mir_graph_->GetNumUsedCompilerTemps())); 15431fd3346740dfb7f47be9922312b68a4227fada96buzbee reg_info.push_back(irb_->getInt32(mir_graph_->GetNumSSARegs())); 15441fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::MDNode* reg_info_node = ::llvm::MDNode::get(*context_, reg_info); 154526f10eed520942d3db754c31941e457048475f61buzbee inst->setMetadata("RegInfo", reg_info_node); 15461fd3346740dfb7f47be9922312b68a4227fada96buzbee SetDexOffset(current_dalvik_offset_); 154726f10eed520942d3db754c31941e457048475f61buzbee} 154826f10eed520942d3db754c31941e457048475f61buzbee 15492ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::HandlePhiNodes(BasicBlock* bb, ::llvm::BasicBlock* llvm_bb) { 15501fd3346740dfb7f47be9922312b68a4227fada96buzbee SetDexOffset(bb->start_offset); 155126f10eed520942d3db754c31941e457048475f61buzbee for (MIR* mir = bb->first_mir_insn; mir != NULL; mir = mir->next) { 155226f10eed520942d3db754c31941e457048475f61buzbee int opcode = mir->dalvikInsn.opcode; 155335ba7f3a78d38885ec54e61ed060d2771eeceea7buzbee if (!IsPseudoMirOp(opcode)) { 155426f10eed520942d3db754c31941e457048475f61buzbee // Stop after first non-pseudo MIR op. 155526f10eed520942d3db754c31941e457048475f61buzbee continue; 155626f10eed520942d3db754c31941e457048475f61buzbee } 155726f10eed520942d3db754c31941e457048475f61buzbee if (opcode != kMirOpPhi) { 155826f10eed520942d3db754c31941e457048475f61buzbee // Skip other mir Pseudos. 155926f10eed520942d3db754c31941e457048475f61buzbee continue; 156026f10eed520942d3db754c31941e457048475f61buzbee } 15611fd3346740dfb7f47be9922312b68a4227fada96buzbee RegLocation rl_dest = mir_graph_->reg_location_[mir->ssa_rep->defs[0]]; 156226f10eed520942d3db754c31941e457048475f61buzbee /* 156326f10eed520942d3db754c31941e457048475f61buzbee * The Art compiler's Phi nodes only handle 32-bit operands, 156426f10eed520942d3db754c31941e457048475f61buzbee * representing wide values using a matched set of Phi nodes 156526f10eed520942d3db754c31941e457048475f61buzbee * for the lower and upper halves. In the llvm world, we only 156626f10eed520942d3db754c31941e457048475f61buzbee * want a single Phi for wides. Here we will simply discard 156726f10eed520942d3db754c31941e457048475f61buzbee * the Phi node representing the high word. 156826f10eed520942d3db754c31941e457048475f61buzbee */ 156926f10eed520942d3db754c31941e457048475f61buzbee if (rl_dest.high_word) { 157026f10eed520942d3db754c31941e457048475f61buzbee continue; // No Phi node - handled via low word 157126f10eed520942d3db754c31941e457048475f61buzbee } 15720d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee BasicBlockId* incoming = mir->meta.phi_incoming; 15734c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::Type* phi_type = 15741fd3346740dfb7f47be9922312b68a4227fada96buzbee LlvmTypeFromLocRec(rl_dest); 15751fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::PHINode* phi = irb_->CreatePHI(phi_type, mir->ssa_rep->num_uses); 157626f10eed520942d3db754c31941e457048475f61buzbee for (int i = 0; i < mir->ssa_rep->num_uses; i++) { 157726f10eed520942d3db754c31941e457048475f61buzbee RegLocation loc; 157826f10eed520942d3db754c31941e457048475f61buzbee // Don't check width here. 15791fd3346740dfb7f47be9922312b68a4227fada96buzbee loc = mir_graph_->GetRawSrc(mir, i); 158026f10eed520942d3db754c31941e457048475f61buzbee DCHECK_EQ(rl_dest.wide, loc.wide); 158126f10eed520942d3db754c31941e457048475f61buzbee DCHECK_EQ(rl_dest.wide & rl_dest.high_word, loc.wide & loc.high_word); 158226f10eed520942d3db754c31941e457048475f61buzbee DCHECK_EQ(rl_dest.fp, loc.fp); 158326f10eed520942d3db754c31941e457048475f61buzbee DCHECK_EQ(rl_dest.core, loc.core); 158426f10eed520942d3db754c31941e457048475f61buzbee DCHECK_EQ(rl_dest.ref, loc.ref); 158526f10eed520942d3db754c31941e457048475f61buzbee SafeMap<unsigned int, unsigned int>::iterator it; 15861fd3346740dfb7f47be9922312b68a4227fada96buzbee it = mir_graph_->block_id_map_.find(incoming[i]); 15871fd3346740dfb7f47be9922312b68a4227fada96buzbee DCHECK(it != mir_graph_->block_id_map_.end()); 15881fd3346740dfb7f47be9922312b68a4227fada96buzbee DCHECK(GetLLVMValue(loc.orig_sreg) != NULL); 15891fd3346740dfb7f47be9922312b68a4227fada96buzbee DCHECK(GetLLVMBlock(it->second) != NULL); 15901fd3346740dfb7f47be9922312b68a4227fada96buzbee phi->addIncoming(GetLLVMValue(loc.orig_sreg), 15911fd3346740dfb7f47be9922312b68a4227fada96buzbee GetLLVMBlock(it->second)); 159226f10eed520942d3db754c31941e457048475f61buzbee } 15931fd3346740dfb7f47be9922312b68a4227fada96buzbee DefineValueOnly(phi, rl_dest.orig_sreg); 159426f10eed520942d3db754c31941e457048475f61buzbee } 159526f10eed520942d3db754c31941e457048475f61buzbee} 159626f10eed520942d3db754c31941e457048475f61buzbee 15972cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee/* Extended MIR instructions like PHI */ 15981fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MirConverter::ConvertExtendedMIR(BasicBlock* bb, MIR* mir, 15990cd7ec2dcd8d7ba30bf3ca420b40dac52849876cBrian Carlstrom ::llvm::BasicBlock* llvm_bb) { 1600cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee switch (static_cast<ExtendedMIROpcode>(mir->dalvikInsn.opcode)) { 16012cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case kMirOpPhi: { 160226f10eed520942d3db754c31941e457048475f61buzbee // The llvm Phi node already emitted - just DefineValue() here. 16031fd3346740dfb7f47be9922312b68a4227fada96buzbee RegLocation rl_dest = mir_graph_->reg_location_[mir->ssa_rep->defs[0]]; 160426f10eed520942d3db754c31941e457048475f61buzbee if (!rl_dest.high_word) { 160526f10eed520942d3db754c31941e457048475f61buzbee // Only consider low word of pairs. 16061fd3346740dfb7f47be9922312b68a4227fada96buzbee DCHECK(GetLLVMValue(rl_dest.orig_sreg) != NULL); 16071fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* phi = GetLLVMValue(rl_dest.orig_sreg); 16081fd3346740dfb7f47be9922312b68a4227fada96buzbee if (1) SetVregOnValue(phi, rl_dest.orig_sreg); 16092cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 16102cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 16112cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 16122cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case kMirOpCopy: { 16132cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee UNIMPLEMENTED(WARNING) << "unimp kMirOpPhi"; 16142cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 16152cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 1616c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee case kMirOpNop: 16170d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee if ((mir == bb->last_mir_insn) && (bb->taken == NullBasicBlockId) && 16180d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee (bb->fall_through == NullBasicBlockId)) { 16191fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateUnreachable(); 1620c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee } 1621c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee break; 1622c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee 1623b046e16d8b8da318d6055f9308950131f1255e08buzbee // TODO: need GBC intrinsic to take advantage of fused operations 16242cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case kMirOpFusedCmplFloat: 1625b046e16d8b8da318d6055f9308950131f1255e08buzbee UNIMPLEMENTED(FATAL) << "kMirOpFusedCmpFloat unsupported"; 16262cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 16272cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case kMirOpFusedCmpgFloat: 1628b046e16d8b8da318d6055f9308950131f1255e08buzbee UNIMPLEMENTED(FATAL) << "kMirOpFusedCmgFloat unsupported"; 16292cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 16302cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case kMirOpFusedCmplDouble: 1631b046e16d8b8da318d6055f9308950131f1255e08buzbee UNIMPLEMENTED(FATAL) << "kMirOpFusedCmplDouble unsupported"; 16322cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 16332cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case kMirOpFusedCmpgDouble: 1634b046e16d8b8da318d6055f9308950131f1255e08buzbee UNIMPLEMENTED(FATAL) << "kMirOpFusedCmpgDouble unsupported"; 16352cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 16362cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee case kMirOpFusedCmpLong: 1637b046e16d8b8da318d6055f9308950131f1255e08buzbee UNIMPLEMENTED(FATAL) << "kMirOpLongCmpBranch unsupported"; 16382cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 16392cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee default: 16402cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee break; 16412cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 16422cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 16432cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 16442cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee/* Handle the content in each basic block */ 16452ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrombool MirConverter::BlockBitcodeConversion(BasicBlock* bb) { 1646fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (bb->block_type == kDead) return false; 16471fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::BasicBlock* llvm_bb = GetLLVMBlock(bb->id); 1648fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (llvm_bb == NULL) { 1649fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee CHECK(bb->block_type == kExitBlock); 1650f5f5a12a74c6cc465d2757b4d77843fb1cbdac8fbuzbee } else { 16511fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->SetInsertPoint(llvm_bb); 16521fd3346740dfb7f47be9922312b68a4227fada96buzbee SetDexOffset(bb->start_offset); 1653f5f5a12a74c6cc465d2757b4d77843fb1cbdac8fbuzbee } 16542cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 16551fd3346740dfb7f47be9922312b68a4227fada96buzbee if (cu_->verbose) { 1656c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee LOG(INFO) << "................................"; 1657c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee LOG(INFO) << "Block id " << bb->id; 1658fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (llvm_bb != NULL) { 1659fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee LOG(INFO) << "label " << llvm_bb->getName().str().c_str(); 1660c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee } else { 1661fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee LOG(INFO) << "llvm_bb is NULL"; 1662c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee } 1663c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee } 1664c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee 1665fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (bb->block_type == kEntryBlock) { 16661fd3346740dfb7f47be9922312b68a4227fada96buzbee SetMethodInfo(); 1667dc5daa0db249f8cfb8290bc8f7068cb2a0383393TDYa 16687934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom { // Allocate shadowframe. 16694c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::IntrinsicId id = 16704c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::AllocaShadowFrame; 16711fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* func = intrinsic_helper_->GetIntrinsicFunction(id); 16721fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Value* entries = irb_->getInt32(cu_->num_dalvik_registers); 16731fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateCall(func, entries); 1674b03f487219e446b0480aabd534fac139513502a4buzbee } 1675dc5daa0db249f8cfb8290bc8f7068cb2a0383393TDYa 16767934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom { // Store arguments to vregs. 16771fd3346740dfb7f47be9922312b68a4227fada96buzbee uint16_t arg_reg = cu_->num_regs; 1678dc5daa0db249f8cfb8290bc8f7068cb2a0383393TDYa 16791fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function::arg_iterator arg_iter(func_->arg_begin()); 1680dc5daa0db249f8cfb8290bc8f7068cb2a0383393TDYa 16811fd3346740dfb7f47be9922312b68a4227fada96buzbee const char* shorty = cu_->shorty; 1682dc5daa0db249f8cfb8290bc8f7068cb2a0383393TDYa uint32_t shorty_size = strlen(shorty); 1683dc5daa0db249f8cfb8290bc8f7068cb2a0383393TDYa CHECK_GE(shorty_size, 1u); 1684dc5daa0db249f8cfb8290bc8f7068cb2a0383393TDYa 16857934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom ++arg_iter; // skip method object 1686dc5daa0db249f8cfb8290bc8f7068cb2a0383393TDYa 16871fd3346740dfb7f47be9922312b68a4227fada96buzbee if ((cu_->access_flags & kAccStatic) == 0) { 16881fd3346740dfb7f47be9922312b68a4227fada96buzbee SetVregOnValue(arg_iter, arg_reg); 1689dc5daa0db249f8cfb8290bc8f7068cb2a0383393TDYa ++arg_iter; 1690dc5daa0db249f8cfb8290bc8f7068cb2a0383393TDYa ++arg_reg; 1691b03f487219e446b0480aabd534fac139513502a4buzbee } 1692dc5daa0db249f8cfb8290bc8f7068cb2a0383393TDYa 1693dc5daa0db249f8cfb8290bc8f7068cb2a0383393TDYa for (uint32_t i = 1; i < shorty_size; ++i, ++arg_iter) { 16941fd3346740dfb7f47be9922312b68a4227fada96buzbee SetVregOnValue(arg_iter, arg_reg); 1695dc5daa0db249f8cfb8290bc8f7068cb2a0383393TDYa 1696dc5daa0db249f8cfb8290bc8f7068cb2a0383393TDYa ++arg_reg; 1697dc5daa0db249f8cfb8290bc8f7068cb2a0383393TDYa if (shorty[i] == 'J' || shorty[i] == 'D') { 1698dc5daa0db249f8cfb8290bc8f7068cb2a0383393TDYa // Wide types, such as long and double, are using a pair of registers 1699dc5daa0db249f8cfb8290bc8f7068cb2a0383393TDYa // to store the value, so we have to increase arg_reg again. 1700dc5daa0db249f8cfb8290bc8f7068cb2a0383393TDYa ++arg_reg; 1701b03f487219e446b0480aabd534fac139513502a4buzbee } 1702b03f487219e446b0480aabd534fac139513502a4buzbee } 1703b03f487219e446b0480aabd534fac139513502a4buzbee } 1704fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee } else if (bb->block_type == kExitBlock) { 17052cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee /* 17062cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * Because of the differences between how MIR/LIR and llvm handle exit 17072cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * blocks, we won't explicitly covert them. On the llvm-to-lir 17082cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * path, it will need to be regenereated. 17092cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee */ 17102cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee return false; 1711fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee } else if (bb->block_type == kExceptionHandling) { 17126969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee /* 17136969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee * Because we're deferring null checking, delete the associated empty 17146969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee * exception block. 17156969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee */ 1716fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee llvm_bb->eraseFromParent(); 17176969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee return false; 17182cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 17192cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 17201fd3346740dfb7f47be9922312b68a4227fada96buzbee HandlePhiNodes(bb, llvm_bb); 172126f10eed520942d3db754c31941e457048475f61buzbee 172228c9a83398a6e48eefb9b79a390920629bbb8519buzbee for (MIR* mir = bb->first_mir_insn; mir != NULL; mir = mir->next) { 17231fd3346740dfb7f47be9922312b68a4227fada96buzbee SetDexOffset(mir->offset); 17242cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 1725c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee int opcode = mir->dalvikInsn.opcode; 1726fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee Instruction::Format dalvik_format = 1727c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee Instruction::FormatOf(mir->dalvikInsn.opcode); 17282cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 1729c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee if (opcode == kMirOpCheck) { 1730c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee // Combine check and work halves of throwing instruction. 1731fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee MIR* work_half = mir->meta.throw_insn; 1732fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee mir->dalvikInsn.opcode = work_half->dalvikInsn.opcode; 1733c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee opcode = mir->dalvikInsn.opcode; 1734fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee SSARepresentation* ssa_rep = work_half->ssa_rep; 1735fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee work_half->ssa_rep = mir->ssa_rep; 1736fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee mir->ssa_rep = ssa_rep; 1737fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee work_half->dalvikInsn.opcode = static_cast<Instruction::Code>(kMirOpNop); 17380d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee if (bb->successor_block_list_type == kCatch) { 17391fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function* intr = intrinsic_helper_->GetIntrinsicFunction( 17404c1c283a7410784e9cab309f868248690b788a9cIan Rogers art::llvm::IntrinsicHelper::CatchTargets); 17414c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::Value* switch_key = 17421fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateCall(intr, irb_->getInt32(mir->offset)); 17430d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee GrowableArray<SuccessorBlockInfo*>::Iterator iter(bb->successor_blocks); 1744c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee // New basic block to use for work half 17454c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::BasicBlock* work_bb = 17461fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::BasicBlock::Create(*context_, "", func_); 17474c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::SwitchInst* sw = 17480d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee irb_->CreateSwitch(switch_key, work_bb, bb->successor_blocks->Size()); 1749c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee while (true) { 1750862a76027076c341c26aa6cd4a30a7cdd6dc2143buzbee SuccessorBlockInfo *successor_block_info = iter.Next(); 1751fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (successor_block_info == NULL) break; 17524c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::BasicBlock *target = 17530d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee GetLLVMBlock(successor_block_info->block); 1754fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int type_index = successor_block_info->key; 17551fd3346740dfb7f47be9922312b68a4227fada96buzbee sw->addCase(irb_->getInt32(type_index), target); 1756c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee } 1757fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee llvm_bb = work_bb; 17581fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->SetInsertPoint(llvm_bb); 1759c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee } 1760c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee } 1761c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee 176235ba7f3a78d38885ec54e61ed060d2771eeceea7buzbee if (IsPseudoMirOp(opcode)) { 17631fd3346740dfb7f47be9922312b68a4227fada96buzbee ConvertExtendedMIR(bb, mir, llvm_bb); 17642cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee continue; 17652cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 17662cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 17671fd3346740dfb7f47be9922312b68a4227fada96buzbee bool not_handled = ConvertMIRNode(mir, bb, llvm_bb); 1768fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (not_handled) { 1769fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee Instruction::Code dalvik_opcode = static_cast<Instruction::Code>(opcode); 17702cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee LOG(WARNING) << StringPrintf("%#06x: Op %#x (%s) / Fmt %d not handled", 1771c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee mir->offset, opcode, 1772fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee Instruction::Name(dalvik_opcode), 1773fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee dalvik_format); 17742cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 17752cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 17762cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 1777fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (bb->block_type == kEntryBlock) { 17780d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee entry_target_bb_ = GetLLVMBlock(bb->fall_through); 17790d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee } else if ((bb->fall_through != NullBasicBlockId) && !bb->terminated_by_return) { 17800d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee irb_->CreateBr(GetLLVMBlock(bb->fall_through)); 17812cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 17822cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 17832cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee return false; 17842cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 17852cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 1786fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeechar RemapShorty(char shorty_type) { 17874f4dfc7ce0d309448d6fc47737c1f3c0a9eda7e5buzbee /* 17884f4dfc7ce0d309448d6fc47737c1f3c0a9eda7e5buzbee * TODO: might want to revisit this. Dalvik registers are 32-bits wide, 17894f4dfc7ce0d309448d6fc47737c1f3c0a9eda7e5buzbee * and longs/doubles are represented as a pair of registers. When sub-word 17904f4dfc7ce0d309448d6fc47737c1f3c0a9eda7e5buzbee * arguments (and method results) are passed, they are extended to Dalvik 17914f4dfc7ce0d309448d6fc47737c1f3c0a9eda7e5buzbee * virtual register containers. Because llvm is picky about type consistency, 17924f4dfc7ce0d309448d6fc47737c1f3c0a9eda7e5buzbee * we must either cast the "real" type to 32-bit container multiple Dalvik 17934f4dfc7ce0d309448d6fc47737c1f3c0a9eda7e5buzbee * register types, or always use the expanded values. 17944f4dfc7ce0d309448d6fc47737c1f3c0a9eda7e5buzbee * Here, we're doing the latter. We map the shorty signature to container 17954f4dfc7ce0d309448d6fc47737c1f3c0a9eda7e5buzbee * types (which is valid so long as we always do a real expansion of passed 17964f4dfc7ce0d309448d6fc47737c1f3c0a9eda7e5buzbee * arguments and field loads). 17974f4dfc7ce0d309448d6fc47737c1f3c0a9eda7e5buzbee */ 1798df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom switch (shorty_type) { 1799fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee case 'Z' : shorty_type = 'I'; break; 1800fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee case 'B' : shorty_type = 'I'; break; 1801fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee case 'S' : shorty_type = 'I'; break; 1802fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee case 'C' : shorty_type = 'I'; break; 18034f4dfc7ce0d309448d6fc47737c1f3c0a9eda7e5buzbee default: break; 18044f4dfc7ce0d309448d6fc47737c1f3c0a9eda7e5buzbee } 1805fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee return shorty_type; 18064f4dfc7ce0d309448d6fc47737c1f3c0a9eda7e5buzbee} 18074f4dfc7ce0d309448d6fc47737c1f3c0a9eda7e5buzbee 18081fd3346740dfb7f47be9922312b68a4227fada96buzbee::llvm::FunctionType* MirConverter::GetFunctionType() { 18092cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee // Get return type 18101fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Type* ret_type = irb_->getJType(RemapShorty(cu_->shorty[0])); 18112cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 18122cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee // Get argument type 18134c1c283a7410784e9cab309f868248690b788a9cIan Rogers std::vector< ::llvm::Type*> args_type; 18142cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 18152cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee // method object 18161fd3346740dfb7f47be9922312b68a4227fada96buzbee args_type.push_back(irb_->getJMethodTy()); 18172cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 18182cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee // Do we have a "this"? 18191fd3346740dfb7f47be9922312b68a4227fada96buzbee if ((cu_->access_flags & kAccStatic) == 0) { 18201fd3346740dfb7f47be9922312b68a4227fada96buzbee args_type.push_back(irb_->getJObjectTy()); 18212cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 18222cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 18231fd3346740dfb7f47be9922312b68a4227fada96buzbee for (uint32_t i = 1; i < strlen(cu_->shorty); ++i) { 18241fd3346740dfb7f47be9922312b68a4227fada96buzbee args_type.push_back(irb_->getJType(RemapShorty(cu_->shorty[i]))); 18252cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 18262cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 18274c1c283a7410784e9cab309f868248690b788a9cIan Rogers return ::llvm::FunctionType::get(ret_type, args_type, false); 18282cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 18292cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 18301fd3346740dfb7f47be9922312b68a4227fada96buzbeebool MirConverter::CreateFunction() { 18311fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::FunctionType* func_type = GetFunctionType(); 18322cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee if (func_type == NULL) { 18332cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee return false; 18342cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 18352cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 18361fd3346740dfb7f47be9922312b68a4227fada96buzbee func_ = ::llvm::Function::Create(func_type, 1837265091e581c9f643b37e7966890911f09e223269Brian Carlstrom ::llvm::Function::InternalLinkage, 18381fd3346740dfb7f47be9922312b68a4227fada96buzbee symbol_, module_); 18392cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 18401fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function::arg_iterator arg_iter(func_->arg_begin()); 18411fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function::arg_iterator arg_end(func_->arg_end()); 18422cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 18432cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee arg_iter->setName("method"); 18442cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee ++arg_iter; 18452cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 18461fd3346740dfb7f47be9922312b68a4227fada96buzbee int start_sreg = cu_->num_regs; 18472cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 18482cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee for (unsigned i = 0; arg_iter != arg_end; ++i, ++arg_iter) { 1849fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee arg_iter->setName(StringPrintf("v%i_0", start_sreg)); 18501fd3346740dfb7f47be9922312b68a4227fada96buzbee start_sreg += mir_graph_->reg_location_[start_sreg].wide ? 2 : 1; 18512cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 18522cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 18532cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee return true; 18542cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 18552cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 18562ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrombool MirConverter::CreateLLVMBasicBlock(BasicBlock* bb) { 18572cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee // Skip the exit block 1858fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if ((bb->block_type == kDead) ||(bb->block_type == kExitBlock)) { 18591fd3346740dfb7f47be9922312b68a4227fada96buzbee id_to_block_map_.Put(bb->id, NULL); 18602cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } else { 1861fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int offset = bb->start_offset; 1862fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool entry_block = (bb->block_type == kEntryBlock); 18634c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::BasicBlock* llvm_bb = 18641fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::BasicBlock::Create(*context_, entry_block ? "entry" : 1865fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee StringPrintf(kLabelFormat, bb->catch_entry ? kCatchBlock : 18661fd3346740dfb7f47be9922312b68a4227fada96buzbee kNormalBlock, offset, bb->id), func_); 1867fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (entry_block) { 18681fd3346740dfb7f47be9922312b68a4227fada96buzbee entry_bb_ = llvm_bb; 18691fd3346740dfb7f47be9922312b68a4227fada96buzbee placeholder_bb_ = 18701fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::BasicBlock::Create(*context_, "placeholder", 18711fd3346740dfb7f47be9922312b68a4227fada96buzbee func_); 18722cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 18731fd3346740dfb7f47be9922312b68a4227fada96buzbee id_to_block_map_.Put(bb->id, llvm_bb); 18742cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 18752cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee return false; 18762cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 18772cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 18782cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 18792cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee/* 18802cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * Convert MIR to LLVM_IR 18812cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * o For each ssa name, create LLVM named value. Type these 18822cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * appropriately, and ignore high half of wide and double operands. 18832cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * o For each MIR basic block, create an LLVM basic block. 18842cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * o Iterate through the MIR a basic block at a time, setting arguments 18852cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * to recovered ssa name. 18862cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee */ 18872ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MirConverter::MethodMIR2Bitcode() { 18881fd3346740dfb7f47be9922312b68a4227fada96buzbee InitIR(); 18892cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 18902cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee // Create the function 18911fd3346740dfb7f47be9922312b68a4227fada96buzbee CreateFunction(); 18922cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 18932cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee // Create an LLVM basic block for each MIR block in dfs preorder 189456c717860df2d71d66fb77aa77f29dd346e559d3buzbee PreOrderDfsIterator iter(mir_graph_); 1895311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee for (BasicBlock* bb = iter.Next(); bb != NULL; bb = iter.Next()) { 18961fd3346740dfb7f47be9922312b68a4227fada96buzbee CreateLLVMBasicBlock(bb); 1897311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee } 1898311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee 18992cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee /* 19002cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * Create an llvm named value for each MIR SSA name. Note: we'll use 19012cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * placeholders for all non-argument values (because we haven't seen 19022cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee * the definition yet). 19032cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee */ 19041fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->SetInsertPoint(placeholder_bb_); 19051fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Function::arg_iterator arg_iter(func_->arg_begin()); 19062cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee arg_iter++; /* Skip path method */ 19071fd3346740dfb7f47be9922312b68a4227fada96buzbee for (int i = 0; i < mir_graph_->GetNumSSARegs(); i++) { 19084c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::Value* val; 19091fd3346740dfb7f47be9922312b68a4227fada96buzbee RegLocation rl_temp = mir_graph_->reg_location_[i]; 19101fd3346740dfb7f47be9922312b68a4227fada96buzbee if ((mir_graph_->SRegToVReg(i) < 0) || rl_temp.high_word) { 1911862a76027076c341c26aa6cd4a30a7cdd6dc2143buzbee llvm_values_.Insert(0); 19121fd3346740dfb7f47be9922312b68a4227fada96buzbee } else if ((i < cu_->num_regs) || 19131fd3346740dfb7f47be9922312b68a4227fada96buzbee (i >= (cu_->num_regs + cu_->num_ins))) { 19141fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::Constant* imm_value = mir_graph_->reg_location_[i].wide ? 19151fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->getJLong(0) : irb_->getJInt(0); 19161fd3346740dfb7f47be9922312b68a4227fada96buzbee val = EmitConst(imm_value, mir_graph_->reg_location_[i]); 19178d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogers val->setName(mir_graph_->GetSSAName(i)); 1918862a76027076c341c26aa6cd4a30a7cdd6dc2143buzbee llvm_values_.Insert(val); 19192cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } else { 19202cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee // Recover previously-created argument values 19214c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::Value* arg_val = arg_iter++; 1922862a76027076c341c26aa6cd4a30a7cdd6dc2143buzbee llvm_values_.Insert(arg_val); 19232cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 19242cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee } 19252cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 192656c717860df2d71d66fb77aa77f29dd346e559d3buzbee PreOrderDfsIterator iter2(mir_graph_); 1927311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee for (BasicBlock* bb = iter2.Next(); bb != NULL; bb = iter2.Next()) { 19281fd3346740dfb7f47be9922312b68a4227fada96buzbee BlockBitcodeConversion(bb); 1929311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee } 19302cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 19314be777b5efccbffddd6227d30ab1f658403e18cfbuzbee /* 19324be777b5efccbffddd6227d30ab1f658403e18cfbuzbee * In a few rare cases of verification failure, the verifier will 19334be777b5efccbffddd6227d30ab1f658403e18cfbuzbee * replace one or more Dalvik opcodes with the special 19344be777b5efccbffddd6227d30ab1f658403e18cfbuzbee * throw-verification-failure opcode. This can leave the SSA graph 19354be777b5efccbffddd6227d30ab1f658403e18cfbuzbee * in an invalid state, as definitions may be lost, while uses retained. 19364be777b5efccbffddd6227d30ab1f658403e18cfbuzbee * To work around this problem, we insert placeholder definitions for 19374be777b5efccbffddd6227d30ab1f658403e18cfbuzbee * all Dalvik SSA regs in the "placeholder" block. Here, after 19384be777b5efccbffddd6227d30ab1f658403e18cfbuzbee * bitcode conversion is complete, we examine those placeholder definitions 19394be777b5efccbffddd6227d30ab1f658403e18cfbuzbee * and delete any with no references (which normally is all of them). 19404be777b5efccbffddd6227d30ab1f658403e18cfbuzbee * 19414be777b5efccbffddd6227d30ab1f658403e18cfbuzbee * If any definitions remain, we link the placeholder block into the 19424be777b5efccbffddd6227d30ab1f658403e18cfbuzbee * CFG. Otherwise, it is deleted. 19434be777b5efccbffddd6227d30ab1f658403e18cfbuzbee */ 19441fd3346740dfb7f47be9922312b68a4227fada96buzbee for (::llvm::BasicBlock::iterator it = placeholder_bb_->begin(), 19451fd3346740dfb7f47be9922312b68a4227fada96buzbee it_end = placeholder_bb_->end(); it != it_end;) { 19464c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::Instruction* inst = ::llvm::dyn_cast< ::llvm::Instruction>(it++); 19474be777b5efccbffddd6227d30ab1f658403e18cfbuzbee DCHECK(inst != NULL); 19484c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::Value* val = ::llvm::dyn_cast< ::llvm::Value>(inst); 19494be777b5efccbffddd6227d30ab1f658403e18cfbuzbee DCHECK(val != NULL); 19504be777b5efccbffddd6227d30ab1f658403e18cfbuzbee if (val->getNumUses() == 0) { 19514be777b5efccbffddd6227d30ab1f658403e18cfbuzbee inst->eraseFromParent(); 19524be777b5efccbffddd6227d30ab1f658403e18cfbuzbee } 19534be777b5efccbffddd6227d30ab1f658403e18cfbuzbee } 19541fd3346740dfb7f47be9922312b68a4227fada96buzbee SetDexOffset(0); 19551fd3346740dfb7f47be9922312b68a4227fada96buzbee if (placeholder_bb_->empty()) { 19561fd3346740dfb7f47be9922312b68a4227fada96buzbee placeholder_bb_->eraseFromParent(); 19574be777b5efccbffddd6227d30ab1f658403e18cfbuzbee } else { 19581fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->SetInsertPoint(placeholder_bb_); 19591fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateBr(entry_target_bb_); 19601fd3346740dfb7f47be9922312b68a4227fada96buzbee entry_target_bb_ = placeholder_bb_; 19614be777b5efccbffddd6227d30ab1f658403e18cfbuzbee } 19621fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->SetInsertPoint(entry_bb_); 19631fd3346740dfb7f47be9922312b68a4227fada96buzbee irb_->CreateBr(entry_target_bb_); 19642cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 19651fd3346740dfb7f47be9922312b68a4227fada96buzbee if (cu_->enable_debug & (1 << kDebugVerifyBitcode)) { 19661fd3346740dfb7f47be9922312b68a4227fada96buzbee if (::llvm::verifyFunction(*func_, ::llvm::PrintMessageAction)) { 1967c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee LOG(INFO) << "Bitcode verification FAILED for " 19681fd3346740dfb7f47be9922312b68a4227fada96buzbee << PrettyMethod(cu_->method_idx, *cu_->dex_file) 19691fd3346740dfb7f47be9922312b68a4227fada96buzbee << " of size " << cu_->code_item->insns_size_in_code_units_; 19701fd3346740dfb7f47be9922312b68a4227fada96buzbee cu_->enable_debug |= (1 << kDebugDumpBitcodeFile); 1971c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee } 1972c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee } 19732cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 19741fd3346740dfb7f47be9922312b68a4227fada96buzbee if (cu_->enable_debug & (1 << kDebugDumpBitcodeFile)) { 1975ad8f15e0b13383b2eaa2486b230debeae7a55661buzbee // Write bitcode to file 1976ad8f15e0b13383b2eaa2486b230debeae7a55661buzbee std::string errmsg; 19771fd3346740dfb7f47be9922312b68a4227fada96buzbee std::string fname(PrettyMethod(cu_->method_idx, *cu_->dex_file)); 19781fd3346740dfb7f47be9922312b68a4227fada96buzbee mir_graph_->ReplaceSpecialChars(fname); 19796459e7cb35ca83ffc2f266dddeb83673bc07ecd4buzbee // TODO: make configurable change naming mechanism to avoid fname length issues. 19804f1181fe061d3529f72e1237e7662bf9bc73c6e2buzbee fname = StringPrintf("/sdcard/Bitcode/%s.bc", fname.c_str()); 19812cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 19826459e7cb35ca83ffc2f266dddeb83673bc07ecd4buzbee if (fname.size() > 240) { 19836459e7cb35ca83ffc2f266dddeb83673bc07ecd4buzbee LOG(INFO) << "Warning: bitcode filename too long. Truncated."; 19846459e7cb35ca83ffc2f266dddeb83673bc07ecd4buzbee fname.resize(240); 19856459e7cb35ca83ffc2f266dddeb83673bc07ecd4buzbee } 19866459e7cb35ca83ffc2f266dddeb83673bc07ecd4buzbee 19874c1c283a7410784e9cab309f868248690b788a9cIan Rogers ::llvm::OwningPtr< ::llvm::tool_output_file> out_file( 19884c1c283a7410784e9cab309f868248690b788a9cIan Rogers new ::llvm::tool_output_file(fname.c_str(), errmsg, 198973fbaadee029f310362c9d83a52177f00f2e5d77Stephen Hines ::llvm::sys::fs::F_Binary)); 19902cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 1991ad8f15e0b13383b2eaa2486b230debeae7a55661buzbee if (!errmsg.empty()) { 1992ad8f15e0b13383b2eaa2486b230debeae7a55661buzbee LOG(ERROR) << "Failed to create bitcode output file: " << errmsg; 1993ad8f15e0b13383b2eaa2486b230debeae7a55661buzbee } 19942cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 19951fd3346740dfb7f47be9922312b68a4227fada96buzbee ::llvm::WriteBitcodeToFile(module_, out_file->os()); 1996ad8f15e0b13383b2eaa2486b230debeae7a55661buzbee out_file->keep(); 1997ad8f15e0b13383b2eaa2486b230debeae7a55661buzbee } 19982cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} 19992cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee 20001fd3346740dfb7f47be9922312b68a4227fada96buzbeeBackend* PortableCodeGenerator(CompilationUnit* const cu, MIRGraph* const mir_graph, 2001862a76027076c341c26aa6cd4a30a7cdd6dc2143buzbee ArenaAllocator* const arena, 20021fd3346740dfb7f47be9922312b68a4227fada96buzbee llvm::LlvmCompilationUnit* const llvm_compilation_unit) { 2003862a76027076c341c26aa6cd4a30a7cdd6dc2143buzbee return new MirConverter(cu, mir_graph, arena, llvm_compilation_unit); 20041fd3346740dfb7f47be9922312b68a4227fada96buzbee} 20051fd3346740dfb7f47be9922312b68a4227fada96buzbee 20062cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee} // namespace art 2007