summaryrefslogtreecommitdiff
path: root/src/compiler_llvm/gbc_expander.cc
diff options
context:
space:
mode:
author Ian Rogers <irogers@google.com> 2013-03-01 19:50:56 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2013-03-01 19:50:57 +0000
commita87f1dc5c1b35d5aa37fd23e83e259dae000b1c2 (patch)
tree1f22d52f1d3b0b8c3cd8a7da94e1e35733221b1e /src/compiler_llvm/gbc_expander.cc
parent2b97c2773723d3f033d3bd23233ff30d2b625bbd (diff)
parent1b2b71f2079bacc26f48b8ce0ebd142b13e63b99 (diff)
Merge "Portable slow-path sets for float/double need bitcast." into dalvik-dev
Diffstat (limited to 'src/compiler_llvm/gbc_expander.cc')
-rw-r--r--src/compiler_llvm/gbc_expander.cc31
1 files changed, 18 insertions, 13 deletions
diff --git a/src/compiler_llvm/gbc_expander.cc b/src/compiler_llvm/gbc_expander.cc
index 014654285e..df83ddcf60 100644
--- a/src/compiler_llvm/gbc_expander.cc
+++ b/src/compiler_llvm/gbc_expander.cc
@@ -1434,6 +1434,9 @@ llvm::Value* GBCExpanderPass::Expand_HLIGet(llvm::CallInst& call_inst,
EmitGuard_ExceptionLandingPad(dex_pc);
+ if (field_jty == kFloat || field_jty == kDouble) {
+ field_value = irb_.CreateBitCast(field_value, irb_.getJType(field_jty));
+ }
} else {
DCHECK_GE(field_offset, 0);
@@ -1451,10 +1454,6 @@ llvm::Value* GBCExpanderPass::Expand_HLIGet(llvm::CallInst& call_inst,
field_value = SignOrZeroExtendCat1Types(field_value, field_jty);
}
- if (field_jty == kFloat || field_jty == kDouble) {
- field_value = irb_.CreateBitCast(field_value, irb_.getJType(field_jty));
- }
-
return field_value;
}
@@ -1466,10 +1465,6 @@ void GBCExpanderPass::Expand_HLIPut(llvm::CallInst& call_inst,
uint32_t field_idx = LV2UInt(call_inst.getArgOperand(3));
int opt_flags = LV2UInt(call_inst.getArgOperand(0));
- if (field_jty == kFloat || field_jty == kDouble) {
- new_value = irb_.CreateBitCast(new_value, irb_.getJType(field_jty));
- }
-
EmitGuard_NullPointerException(dex_pc, object_addr, opt_flags);
int field_offset;
@@ -1480,6 +1475,12 @@ void GBCExpanderPass::Expand_HLIPut(llvm::CallInst& call_inst,
if (!is_fast_path) {
llvm::Function* runtime_func;
+ if (field_jty == kFloat) {
+ new_value = irb_.CreateBitCast(new_value, irb_.getJType(kInt));
+ } else if (field_jty == kDouble) {
+ new_value = irb_.CreateBitCast(new_value, irb_.getJType(kLong));
+ }
+
if (field_jty == kObject) {
runtime_func = irb_.GetRuntime(runtime_support::SetObjectInstance);
} else if (field_jty == kLong || field_jty == kDouble) {
@@ -1695,6 +1696,9 @@ llvm::Value* GBCExpanderPass::Expand_HLSget(llvm::CallInst& call_inst,
EmitGuard_ExceptionLandingPad(dex_pc);
+ if (field_jty == kFloat || field_jty == kDouble) {
+ static_field_value = irb_.CreateBitCast(static_field_value, irb_.getJType(field_jty));
+ }
} else {
DCHECK_GE(field_offset, 0);
@@ -1728,11 +1732,6 @@ llvm::Value* GBCExpanderPass::Expand_HLSget(llvm::CallInst& call_inst,
static_field_value = SignOrZeroExtendCat1Types(static_field_value, field_jty);
}
- if (field_jty == kFloat || field_jty == kDouble) {
- static_field_value =
- irb_.CreateBitCast(static_field_value, irb_.getJType(field_jty));
- }
-
return static_field_value;
}
@@ -1766,6 +1765,12 @@ void GBCExpanderPass::Expand_HLSput(llvm::CallInst& call_inst,
runtime_func = irb_.GetRuntime(runtime_support::Set32Static);
}
+ if (field_jty == kFloat) {
+ new_value = irb_.CreateBitCast(new_value, irb_.getJType(kInt));
+ } else if (field_jty == kDouble) {
+ new_value = irb_.CreateBitCast(new_value, irb_.getJType(kLong));
+ }
+
llvm::Constant* field_idx_value = irb_.getInt32(field_idx);
llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();