Chromium Code Reviews| Index: test/cctest/test-assembler-arm.cc |
| diff --git a/test/cctest/test-assembler-arm.cc b/test/cctest/test-assembler-arm.cc |
| index ed9563d04b7022b532192b5d434d2a3b516f49f2..c7fdae8aec047e63a9dd26cf5f9fd8edaf01c9af 100644 |
| --- a/test/cctest/test-assembler-arm.cc |
| +++ b/test/cctest/test-assembler-arm.cc |
| @@ -25,6 +25,8 @@ |
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| +#include <iostream> // NOLINT(readability/streams) |
| + |
| #include "src/v8.h" |
| #include "test/cctest/cctest.h" |
| @@ -1495,6 +1497,135 @@ TEST(18) { |
| #undef TEST_SDIV |
| +#define TEST_SMMUL(f, x, y) \ |
|
Benedikt Meurer
2014/10/13 18:25:48
Move all the new tests to test/unittests/arm/assem
Benedikt Meurer
2014/10/14 04:49:43
Maybe later...
|
| + do { \ |
| + int32_t actual; \ |
| + Object* dummy = CALL_GENERATED_CODE(f, &actual, x, y, 0, 0); \ |
| + CHECK_EQ(v8::base::bits::SignedMulHigh32(x, y), actual); \ |
| + USE(dummy); \ |
| + } while (0) |
| + |
| + |
| +TEST(19) { |
| + // Test smmul. |
| + CcTest::InitializeVM(); |
| + Isolate* isolate = CcTest::i_isolate(); |
| + HandleScope scope(isolate); |
| + |
| + Assembler assm(isolate, nullptr, 0); |
| + |
| + __ smmul(r1, r1, r2); |
| + __ str(r1, MemOperand(r0)); |
| + __ bx(lr); |
| + |
| + CodeDesc desc; |
| + assm.GetCode(&desc); |
| + Handle<Code> code = isolate->factory()->NewCode( |
| + desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| +#ifdef DEBUG |
| + code->Print(std::cout); |
| +#endif |
| + F3 f = FUNCTION_CAST<F3>(code->entry()); |
| + TEST_SMMUL(f, kMinInt, kMinInt); |
| + TEST_SMMUL(f, kMinInt, -1); |
| + TEST_SMMUL(f, -1, kMinInt); |
| + TEST_SMMUL(f, kMinInt, kMaxInt); |
| + TEST_SMMUL(f, kMaxInt, kMinInt); |
| + TEST_SMMUL(f, 0, 1); |
| + TEST_SMMUL(f, 1, 0); |
| + TEST_SMMUL(f, 42, -1); |
| +} |
| + |
| + |
| +#undef TEST_SMMUL |
| + |
| + |
| +#define TEST_SMMLA(f, x, y, z) \ |
| + do { \ |
| + int32_t actual; \ |
| + Object* dummy = CALL_GENERATED_CODE(f, &actual, x, y, z, 0); \ |
| + CHECK_EQ(v8::base::bits::SignedMulHighAndAdd32(x, y, z), actual); \ |
| + USE(dummy); \ |
| + } while (0) |
| + |
| + |
| +TEST(20) { |
| + // Test smmla. |
| + CcTest::InitializeVM(); |
| + Isolate* isolate = CcTest::i_isolate(); |
| + HandleScope scope(isolate); |
| + |
| + Assembler assm(isolate, nullptr, 0); |
| + |
| + __ smmla(r1, r1, r2, r3); |
| + __ str(r1, MemOperand(r0)); |
| + __ bx(lr); |
| + |
| + CodeDesc desc; |
| + assm.GetCode(&desc); |
| + Handle<Code> code = isolate->factory()->NewCode( |
| + desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| +#ifdef DEBUG |
| + code->Print(std::cout); |
| +#endif |
| + F3 f = FUNCTION_CAST<F3>(code->entry()); |
| + TEST_SMMLA(f, kMinInt, kMinInt, 123456); |
| + TEST_SMMLA(f, kMinInt, -1, 0); |
| + TEST_SMMLA(f, -1, kMinInt, -1); |
| + TEST_SMMLA(f, kMinInt, kMaxInt, 1); |
| + TEST_SMMLA(f, kMaxInt, kMinInt, 0); |
| + TEST_SMMLA(f, 0, 1, kMinInt); |
| + TEST_SMMLA(f, 1, 0, kMaxInt - 1); |
| + TEST_SMMLA(f, 42, -1, 0); |
| +} |
| + |
| + |
| +#undef TEST_SMMLA |
| + |
| + |
| +#define TEST_SMMLS(f, x, y, z) \ |
| + do { \ |
| + int32_t actual; \ |
| + Object* dummy = CALL_GENERATED_CODE(f, &actual, x, y, z, 0); \ |
| + CHECK_EQ(v8::base::bits::SignedMulHighAndSub32(x, y, z), actual); \ |
| + USE(dummy); \ |
| + } while (0) |
| + |
| + |
| +TEST(21) { |
| + // Test smmls. |
| + CcTest::InitializeVM(); |
| + Isolate* isolate = CcTest::i_isolate(); |
| + HandleScope scope(isolate); |
| + |
| + Assembler assm(isolate, nullptr, 0); |
| + |
| + __ smmls(r1, r1, r2, r3); |
| + __ str(r1, MemOperand(r0)); |
| + __ bx(lr); |
| + |
| + CodeDesc desc; |
| + assm.GetCode(&desc); |
| + Handle<Code> code = isolate->factory()->NewCode( |
| + desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| +#ifdef DEBUG |
| + code->Print(std::cout); |
| +#endif |
| + F3 f = FUNCTION_CAST<F3>(code->entry()); |
| + TEST_SMMLS(f, kMinInt, kMinInt, 123456); |
| + TEST_SMMLS(f, kMinInt, -1, 0); |
| + TEST_SMMLS(f, -1, kMinInt, -1); |
| + TEST_SMMLS(f, kMinInt, kMaxInt, 1); |
| + TEST_SMMLS(f, kMaxInt, kMinInt, 0); |
| + TEST_SMMLS(f, 0, 1, kMinInt); |
| + TEST_SMMLS(f, 1, 0, kMaxInt - 1); |
| + TEST_SMMLS(f, 42, -1, 0); |
| +} |
| + |
| + |
| +#undef TEST_SMMLS |
| + |
| + |
| TEST(code_relative_offset) { |
| // Test extracting the offset of a label from the beginning of the code |
| // in a register. |