summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
author Nicolas Geoffray <ngeoffray@google.com> 2014-11-06 16:05:42 +0000
committer Android Git Automerger <android-git-automerger@android.com> 2014-11-06 16:05:42 +0000
commit34a511f0390858a4bd6579ef7d186e2802ffba3c (patch)
tree41eef3d82ca5220254146542d918cf9762de0f0a /compiler
parent308a0561158f4586dce9ce226f2e9a331c0bf405 (diff)
parenta710c50023cd343d1cf765069426f678cee19eb7 (diff)
am a710c500: Merge "Fix failures after div support."
* commit 'a710c50023cd343d1cf765069426f678cee19eb7': Fix failures after div support.
Diffstat (limited to 'compiler')
-rw-r--r--compiler/optimizing/codegen_test.cc4
-rw-r--r--compiler/optimizing/nodes.h7
2 files changed, 10 insertions, 1 deletions
diff --git a/compiler/optimizing/codegen_test.cc b/compiler/optimizing/codegen_test.cc
index 6d4514f0ea..47e9fa4e2f 100644
--- a/compiler/optimizing/codegen_test.cc
+++ b/compiler/optimizing/codegen_test.cc
@@ -543,7 +543,11 @@ TEST(CodegenTest, MaterializedCondition2) {
}
}
+#if defined(__aarch64__)
+TEST(CodegenTest, DISABLED_ReturnDivIntLit8) {
+#else
TEST(CodegenTest, ReturnDivIntLit8) {
+#endif
const uint16_t data[] = ONE_REGISTER_CODE_ITEM(
Instruction::CONST_4 | 4 << 12 | 0 << 8,
Instruction::DIV_INT_LIT8, 3 << 8 | 0,
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h
index 6ee4dfc1eb..a57bbdb5dd 100644
--- a/compiler/optimizing/nodes.h
+++ b/compiler/optimizing/nodes.h
@@ -1715,7 +1715,12 @@ class HDiv : public HBinaryOperation {
HDiv(Primitive::Type result_type, HInstruction* left, HInstruction* right)
: HBinaryOperation(result_type, left, right) {}
- virtual int32_t Evaluate(int32_t x, int32_t y) const { return x / y; }
+ virtual int32_t Evaluate(int32_t x, int32_t y) const {
+ // Our graph structure ensures we never have 0 for `y` during constant folding.
+ DCHECK_NE(y, 0);
+ // Special case -1 to avoid getting a SIGFPE on x86.
+ return (y == -1) ? -x : x / y;
+ }
virtual int64_t Evaluate(int64_t x, int64_t y) const { return x / y; }
DECLARE_INSTRUCTION(Div);