| OLD | NEW | 
|    1 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file |    1 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file | 
|    2 // for details. All rights reserved. Use of this source code is governed by a |    2 // for details. All rights reserved. Use of this source code is governed by a | 
|    3 // BSD-style license that can be found in the LICENSE file. |    3 // BSD-style license that can be found in the LICENSE file. | 
|    4  |    4  | 
|    5 #include "vm/globals.h" |    5 #include "vm/globals.h" | 
|    6 #if defined(TARGET_ARCH_IA32) |    6 #if defined(TARGET_ARCH_IA32) | 
|    7  |    7  | 
|    8 #include "vm/assembler.h" |    8 #include "vm/assembler.h" | 
|    9 #include "vm/instructions.h" |    9 #include "vm/instructions.h" | 
|   10 #include "vm/stub_code.h" |   10 #include "vm/stub_code.h" | 
|   11 #include "vm/unit_test.h" |   11 #include "vm/unit_test.h" | 
|   12  |   12  | 
|   13 namespace dart { |   13 namespace dart { | 
|   14  |   14  | 
|   15 #define __ assembler-> |   15 #define __ assembler-> | 
|   16  |   16  | 
|   17 ASSEMBLER_TEST_GENERATE(NotAny, assembler) { |  | 
|   18   __ nop(); |  | 
|   19   __ ret(); |  | 
|   20 } |  | 
|   21  |  | 
|   22 ASSEMBLER_TEST_RUN(NotAny, entry) { |  | 
|   23   ICLoadReceiver load(entry); |  | 
|   24   EXPECT(!load.IsValid()); |  | 
|   25   JumpIfZero jump(entry); |  | 
|   26   EXPECT(!jump.IsValid()); |  | 
|   27   CmpEaxWithImmediate cmp(entry); |  | 
|   28   EXPECT(!cmp.IsValid()); |  | 
|   29   TestEaxIsSmi test(entry); |  | 
|   30   EXPECT(!test.IsValid()); |  | 
|   31   ICCheckReceiverClass check_class(entry); |  | 
|   32   EXPECT(!check_class.IsValid()); |  | 
|   33 } |  | 
|   34  |  | 
|   35  |  | 
|   36 ASSEMBLER_TEST_GENERATE(ICLoadReceiver, assembler) { |  | 
|   37   __ movl(EAX, FieldAddress(EDX, Array::data_offset())); |  | 
|   38   __ movl(EAX, Address(ESP, EAX, TIMES_2, 0)); |  | 
|   39   __ ret(); |  | 
|   40 } |  | 
|   41  |  | 
|   42 ASSEMBLER_TEST_RUN(ICLoadReceiver, entry) { |  | 
|   43   ICLoadReceiver load(entry); |  | 
|   44   EXPECT(load.IsValid()); |  | 
|   45 } |  | 
|   46  |  | 
|   47  |  | 
|   48 ASSEMBLER_TEST_GENERATE(JumpIfZero, assembler) { |  | 
|   49   __ j(ZERO, &StubCode::MegamorphicLookupLabel()); |  | 
|   50   __ ret(); |  | 
|   51 } |  | 
|   52  |  | 
|   53 ASSEMBLER_TEST_RUN(JumpIfZero, entry) { |  | 
|   54   JumpIfZero jump(entry); |  | 
|   55   EXPECT(jump.IsValid()); |  | 
|   56   EXPECT_EQ(StubCode::MegamorphicLookupLabel().address(), jump.TargetAddress()); |  | 
|   57 } |  | 
|   58  |  | 
|   59  |  | 
|   60 ASSEMBLER_TEST_GENERATE(CmpEaxWithImmediate, assembler) { |  | 
|   61   const Immediate raw_null = |  | 
|   62       Immediate(reinterpret_cast<intptr_t>(Object::null())); |  | 
|   63   __ cmpl(EAX, raw_null); |  | 
|   64   __ ret(); |  | 
|   65 } |  | 
|   66  |  | 
|   67 ASSEMBLER_TEST_RUN(CmpEaxWithImmediate, entry) { |  | 
|   68   CmpEaxWithImmediate cmp(entry); |  | 
|   69   EXPECT(cmp.IsValid()); |  | 
|   70   const Immediate raw_null = |  | 
|   71       Immediate(reinterpret_cast<intptr_t>(Object::null())); |  | 
|   72   EXPECT_EQ(raw_null.value(), cmp.immediate()->value()); |  | 
|   73 } |  | 
|   74  |  | 
|   75  |  | 
|   76 ASSEMBLER_TEST_GENERATE(TestEaxIsSmi, assembler) { |  | 
|   77   __ testl(EAX, Immediate(kSmiTagMask)); |  | 
|   78   __ j(ZERO, &StubCode::MegamorphicLookupLabel()); |  | 
|   79   __ ret(); |  | 
|   80 } |  | 
|   81  |  | 
|   82 ASSEMBLER_TEST_RUN(TestEaxIsSmi, entry) { |  | 
|   83   TestEaxIsSmi test(entry); |  | 
|   84   EXPECT(test.IsValid()); |  | 
|   85   EXPECT_EQ(StubCode::MegamorphicLookupLabel().address(), test.TargetAddress()); |  | 
|   86 } |  | 
|   87  |  | 
|   88  |  | 
|   89 ASSEMBLER_TEST_GENERATE(ICCheckReceiverClass, assembler) { |  | 
|   90   const Class& test_class = |  | 
|   91       Class::ZoneHandle(Isolate::Current()->object_store()->double_class()); |  | 
|   92   __ CompareObject(EBX, test_class); |  | 
|   93   __ j(ZERO, &StubCode::MegamorphicLookupLabel()); |  | 
|   94   __ ret(); |  | 
|   95 } |  | 
|   96  |  | 
|   97 ASSEMBLER_TEST_RUN(ICCheckReceiverClass, entry) { |  | 
|   98   ICCheckReceiverClass class_check(entry); |  | 
|   99   EXPECT(class_check.IsValid()); |  | 
|  100   EXPECT_EQ(Isolate::Current()->object_store()->double_class(), |  | 
|  101             class_check.TestClass()); |  | 
|  102   EXPECT_EQ(StubCode::MegamorphicLookupLabel().address(), |  | 
|  103             class_check.TargetAddress()); |  | 
|  104 } |  | 
|  105  |  | 
|  106  |  | 
|  107 ASSEMBLER_TEST_GENERATE(LoadObjectClass, assembler) { |  | 
|  108   __ movl(EBX, FieldAddress(EAX, Object::class_offset())); |  | 
|  109   __ ret(); |  | 
|  110 } |  | 
|  111  |  | 
|  112 ASSEMBLER_TEST_RUN(LoadObjectClass, entry) { |  | 
|  113   LoadObjectClass load(entry); |  | 
|  114   EXPECT(load.IsValid()); |  | 
|  115 } |  | 
|  116  |  | 
|  117  |  | 
|  118 ASSEMBLER_TEST_GENERATE(Call, assembler) { |   17 ASSEMBLER_TEST_GENERATE(Call, assembler) { | 
|  119   __ call(&StubCode::MegamorphicLookupLabel()); |   18   __ call(&StubCode::MegamorphicLookupLabel()); | 
|  120   __ ret(); |   19   __ ret(); | 
|  121 } |   20 } | 
|  122  |   21  | 
|  123  |   22  | 
|  124 ASSEMBLER_TEST_RUN(Call, entry) { |   23 ASSEMBLER_TEST_RUN(Call, entry) { | 
|  125   Call call(entry); |   24   Call call(entry); | 
|  126   EXPECT_EQ(StubCode::MegamorphicLookupLabel().address(), call.TargetAddress()); |   25   EXPECT_EQ(StubCode::MegamorphicLookupLabel().address(), call.TargetAddress()); | 
|  127 } |   26 } | 
|  128  |   27  | 
|  129  |   28  | 
|  130 ASSEMBLER_TEST_GENERATE(Jump, assembler) { |   29 ASSEMBLER_TEST_GENERATE(Jump, assembler) { | 
|  131   __ jmp(&StubCode::MegamorphicLookupLabel()); |   30   __ jmp(&StubCode::MegamorphicLookupLabel()); | 
|  132   __ jmp(&StubCode::CallInstanceFunctionLabel()); |   31   __ jmp(&StubCode::OptimizeInvokedFunctionLabel()); | 
|  133   __ ret(); |   32   __ ret(); | 
|  134 } |   33 } | 
|  135  |   34  | 
|  136  |   35  | 
|  137 ASSEMBLER_TEST_RUN(Jump, entry) { |   36 ASSEMBLER_TEST_RUN(Jump, entry) { | 
|  138   Jump jump1(entry); |   37   Jump jump1(entry); | 
|  139   EXPECT_EQ(StubCode::MegamorphicLookupLabel().address(), |   38   EXPECT_EQ(StubCode::MegamorphicLookupLabel().address(), | 
|  140             jump1.TargetAddress()); |   39             jump1.TargetAddress()); | 
|  141   Jump jump2(entry + jump1.pattern_length_in_bytes()); |   40   Jump jump2(entry + jump1.pattern_length_in_bytes()); | 
|  142   EXPECT_EQ(StubCode::CallInstanceFunctionLabel().address(), |   41   EXPECT_EQ(StubCode::OptimizeInvokedFunctionLabel().address(), | 
|  143             jump2.TargetAddress()); |   42             jump2.TargetAddress()); | 
|  144   uword target1 = jump1.TargetAddress(); |   43   uword target1 = jump1.TargetAddress(); | 
|  145   uword target2 = jump2.TargetAddress(); |   44   uword target2 = jump2.TargetAddress(); | 
|  146   jump1.SetTargetAddress(target2); |   45   jump1.SetTargetAddress(target2); | 
|  147   jump2.SetTargetAddress(target1); |   46   jump2.SetTargetAddress(target1); | 
|  148   EXPECT_EQ(StubCode::CallInstanceFunctionLabel().address(), |   47   EXPECT_EQ(StubCode::OptimizeInvokedFunctionLabel().address(), | 
|  149             jump1.TargetAddress()); |   48             jump1.TargetAddress()); | 
|  150   EXPECT_EQ(StubCode::MegamorphicLookupLabel().address(), |   49   EXPECT_EQ(StubCode::MegamorphicLookupLabel().address(), | 
|  151             jump2.TargetAddress()); |   50             jump2.TargetAddress()); | 
|  152 } |   51 } | 
|  153  |   52  | 
|  154 }  // namespace dart |   53 }  // namespace dart | 
|  155  |   54  | 
|  156 #endif  // defined TARGET_ARCH_IA32 |   55 #endif  // defined TARGET_ARCH_IA32 | 
| OLD | NEW |