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