From cd2de0c1c7f1051a2f7bdb0e827dd6057f3bafcd Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Thu, 6 Nov 2014 15:59:38 +0000 Subject: Fix failures after div support. - We need to special case divide by -1 because of x86. - Disable div test on arm64, which does not support div yet. Change-Id: I07e137cb555a958b02a6c4070f296503b7e30bae --- compiler/optimizing/codegen_test.cc | 4 ++++ compiler/optimizing/nodes.h | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletion(-) (limited to 'compiler') 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); -- cgit v1.2.3-59-g8ed1b