| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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_DBC) | 6 #if defined(TARGET_ARCH_DBC) |
| 7 | 7 |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/stack_frame.h" | 9 #include "vm/stack_frame.h" |
| 10 #include "vm/unit_test.h" | 10 #include "vm/unit_test.h" |
| 11 | 11 |
| 12 namespace dart { | 12 namespace dart { |
| 13 | 13 |
| 14 static RawObject* ExecuteTest(const Code& code) { | 14 static RawObject* ExecuteTest(const Code& code) { |
| 15 Thread* thread = Thread::Current(); | 15 Thread* thread = Thread::Current(); |
| 16 TransitionToGenerated transition(thread); | 16 TransitionToGenerated transition(thread); |
| 17 const intptr_t kTypeArgsLen = 0; | 17 const intptr_t kTypeArgsLen = 0; |
| 18 const intptr_t kNumArgs = 0; | 18 const intptr_t kNumArgs = 0; |
| 19 return Simulator::Current()->Call( | 19 return Simulator::Current()->Call( |
| 20 code, Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs)), | 20 code, Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs)), |
| 21 Array::Handle(Array::New(0)), thread); | 21 Array::Handle(Array::New(0)), thread); |
| 22 } | 22 } |
| 23 | 23 |
| 24 | |
| 25 #define EXECUTE_TEST_CODE_INTPTR(code) \ | 24 #define EXECUTE_TEST_CODE_INTPTR(code) \ |
| 26 Smi::Value(Smi::RawCast(ExecuteTest(code))) | 25 Smi::Value(Smi::RawCast(ExecuteTest(code))) |
| 27 #define EXECUTE_TEST_CODE_BOOL(code) \ | 26 #define EXECUTE_TEST_CODE_BOOL(code) \ |
| 28 (Bool::RawCast(ExecuteTest(code)) == Bool::True().raw()) | 27 (Bool::RawCast(ExecuteTest(code)) == Bool::True().raw()) |
| 29 #define EXECUTE_TEST_CODE_OBJECT(code) Object::Handle(ExecuteTest(code)) | 28 #define EXECUTE_TEST_CODE_OBJECT(code) Object::Handle(ExecuteTest(code)) |
| 30 #define EXECUTE_TEST_CODE_DOUBLE(code) \ | 29 #define EXECUTE_TEST_CODE_DOUBLE(code) \ |
| 31 bit_cast<double, RawObject*>(ExecuteTest(code)) | 30 bit_cast<double, RawObject*>(ExecuteTest(code)) |
| 32 | 31 |
| 33 #define __ assembler-> | 32 #define __ assembler-> |
| 34 | 33 |
| 35 | |
| 36 static RawClass* CreateDummyClass(const String& class_name, | 34 static RawClass* CreateDummyClass(const String& class_name, |
| 37 const Script& script) { | 35 const Script& script) { |
| 38 const Class& cls = Class::Handle(Class::New( | 36 const Class& cls = Class::Handle(Class::New( |
| 39 Library::Handle(), class_name, script, TokenPosition::kNoSource)); | 37 Library::Handle(), class_name, script, TokenPosition::kNoSource)); |
| 40 cls.set_is_synthesized_class(); // Dummy class for testing. | 38 cls.set_is_synthesized_class(); // Dummy class for testing. |
| 41 return cls.raw(); | 39 return cls.raw(); |
| 42 } | 40 } |
| 43 | 41 |
| 44 | |
| 45 static RawLibrary* CreateDummyLibrary(const String& library_name) { | 42 static RawLibrary* CreateDummyLibrary(const String& library_name) { |
| 46 return Library::New(library_name); | 43 return Library::New(library_name); |
| 47 } | 44 } |
| 48 | 45 |
| 49 | |
| 50 static RawFunction* CreateFunction(const char* name) { | 46 static RawFunction* CreateFunction(const char* name) { |
| 51 Thread* thread = Thread::Current(); | 47 Thread* thread = Thread::Current(); |
| 52 const String& class_name = String::Handle(Symbols::New(thread, "ownerClass")); | 48 const String& class_name = String::Handle(Symbols::New(thread, "ownerClass")); |
| 53 const String& lib_name = String::Handle(Symbols::New(thread, "ownerLibrary")); | 49 const String& lib_name = String::Handle(Symbols::New(thread, "ownerLibrary")); |
| 54 const Script& script = Script::Handle(); | 50 const Script& script = Script::Handle(); |
| 55 const Class& owner_class = | 51 const Class& owner_class = |
| 56 Class::Handle(CreateDummyClass(class_name, script)); | 52 Class::Handle(CreateDummyClass(class_name, script)); |
| 57 const Library& owner_library = Library::Handle(CreateDummyLibrary(lib_name)); | 53 const Library& owner_library = Library::Handle(CreateDummyLibrary(lib_name)); |
| 58 owner_class.set_library(owner_library); | 54 owner_class.set_library(owner_library); |
| 59 const String& function_name = String::ZoneHandle(Symbols::New(thread, name)); | 55 const String& function_name = String::ZoneHandle(Symbols::New(thread, name)); |
| 60 return Function::New(function_name, RawFunction::kRegularFunction, true, | 56 return Function::New(function_name, RawFunction::kRegularFunction, true, |
| 61 false, false, false, false, owner_class, | 57 false, false, false, false, owner_class, |
| 62 TokenPosition::kMinSource); | 58 TokenPosition::kMinSource); |
| 63 } | 59 } |
| 64 | 60 |
| 65 | |
| 66 static void GenerateDummyCode(Assembler* assembler, const Object& result) { | 61 static void GenerateDummyCode(Assembler* assembler, const Object& result) { |
| 67 __ PushConstant(result); | 62 __ PushConstant(result); |
| 68 __ ReturnTOS(); | 63 __ ReturnTOS(); |
| 69 } | 64 } |
| 70 | 65 |
| 71 | |
| 72 static void MakeDummyInstanceCall(Assembler* assembler, const Object& result) { | 66 static void MakeDummyInstanceCall(Assembler* assembler, const Object& result) { |
| 73 // Make a dummy function. | 67 // Make a dummy function. |
| 74 Assembler _assembler_; | 68 Assembler _assembler_; |
| 75 GenerateDummyCode(&_assembler_, result); | 69 GenerateDummyCode(&_assembler_, result); |
| 76 const char* dummy_function_name = "dummy_instance_function"; | 70 const char* dummy_function_name = "dummy_instance_function"; |
| 77 const Function& dummy_instance_function = | 71 const Function& dummy_instance_function = |
| 78 Function::Handle(CreateFunction(dummy_function_name)); | 72 Function::Handle(CreateFunction(dummy_function_name)); |
| 79 Code& code = | 73 Code& code = |
| 80 Code::Handle(Code::FinalizeCode(dummy_instance_function, &_assembler_)); | 74 Code::Handle(Code::FinalizeCode(dummy_instance_function, &_assembler_)); |
| 81 dummy_instance_function.AttachCode(code); | 75 dummy_instance_function.AttachCode(code); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 99 // For the non-Smi tests. | 93 // For the non-Smi tests. |
| 100 cids[0] = kBigintCid; | 94 cids[0] = kBigintCid; |
| 101 ic_data.AddCheck(cids, dummy_instance_function); | 95 ic_data.AddCheck(cids, dummy_instance_function); |
| 102 ICData* call_ic_data = &ICData::ZoneHandle(ic_data.Original()); | 96 ICData* call_ic_data = &ICData::ZoneHandle(ic_data.Original()); |
| 103 | 97 |
| 104 // Generate the instance call. | 98 // Generate the instance call. |
| 105 const intptr_t call_ic_data_kidx = __ AddConstant(*call_ic_data); | 99 const intptr_t call_ic_data_kidx = __ AddConstant(*call_ic_data); |
| 106 __ InstanceCall2(2, call_ic_data_kidx); | 100 __ InstanceCall2(2, call_ic_data_kidx); |
| 107 } | 101 } |
| 108 | 102 |
| 109 | |
| 110 ASSEMBLER_TEST_GENERATE(Simple, assembler) { | 103 ASSEMBLER_TEST_GENERATE(Simple, assembler) { |
| 111 __ PushConstant(Smi::Handle(Smi::New(42))); | 104 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 112 __ ReturnTOS(); | 105 __ ReturnTOS(); |
| 113 } | 106 } |
| 114 | 107 |
| 115 | |
| 116 ASSEMBLER_TEST_RUN(Simple, test) { | 108 ASSEMBLER_TEST_RUN(Simple, test) { |
| 117 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 109 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 118 } | 110 } |
| 119 | 111 |
| 120 | |
| 121 ASSEMBLER_TEST_GENERATE(Nop, assembler) { | 112 ASSEMBLER_TEST_GENERATE(Nop, assembler) { |
| 122 __ PushConstant(Smi::Handle(Smi::New(42))); | 113 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 123 __ Nop(0); | 114 __ Nop(0); |
| 124 __ Nop(0); | 115 __ Nop(0); |
| 125 __ Nop(0); | 116 __ Nop(0); |
| 126 __ Nop(0); | 117 __ Nop(0); |
| 127 __ Nop(0); | 118 __ Nop(0); |
| 128 __ ReturnTOS(); | 119 __ ReturnTOS(); |
| 129 } | 120 } |
| 130 | 121 |
| 131 | |
| 132 ASSEMBLER_TEST_RUN(Nop, test) { | 122 ASSEMBLER_TEST_RUN(Nop, test) { |
| 133 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 123 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 134 } | 124 } |
| 135 | 125 |
| 136 | |
| 137 // Called from assembler_test.cc. | 126 // Called from assembler_test.cc. |
| 138 // FP[-kParamEndSlotFromFp - 1]: growable array | 127 // FP[-kParamEndSlotFromFp - 1]: growable array |
| 139 // FP[-kParamEndSlotFromFp - 2]: value | 128 // FP[-kParamEndSlotFromFp - 2]: value |
| 140 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { | 129 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { |
| 141 __ Frame(2); | 130 __ Frame(2); |
| 142 __ Move(0, -kParamEndSlotFromFp - 1); | 131 __ Move(0, -kParamEndSlotFromFp - 1); |
| 143 __ Move(1, -kParamEndSlotFromFp - 2); | 132 __ Move(1, -kParamEndSlotFromFp - 2); |
| 144 __ StoreField(0, GrowableObjectArray::data_offset() / kWordSize, 1); | 133 __ StoreField(0, GrowableObjectArray::data_offset() / kWordSize, 1); |
| 145 __ Return(0); | 134 __ Return(0); |
| 146 } | 135 } |
| 147 | 136 |
| 148 | |
| 149 // - OneByteStringFromCharCode rA, rX | 137 // - OneByteStringFromCharCode rA, rX |
| 150 // | 138 // |
| 151 // Load the one-character symbol with the char code given by the Smi | 139 // Load the one-character symbol with the char code given by the Smi |
| 152 // in FP[rX] into FP[rA]. | 140 // in FP[rX] into FP[rA]. |
| 153 ASSEMBLER_TEST_GENERATE(OneByteStringFromCharCode, assembler) { | 141 ASSEMBLER_TEST_GENERATE(OneByteStringFromCharCode, assembler) { |
| 154 __ Frame(2); | 142 __ Frame(2); |
| 155 __ LoadConstant(0, Smi::ZoneHandle(Smi::New(65))); | 143 __ LoadConstant(0, Smi::ZoneHandle(Smi::New(65))); |
| 156 __ OneByteStringFromCharCode(1, 0); | 144 __ OneByteStringFromCharCode(1, 0); |
| 157 __ Return(1); | 145 __ Return(1); |
| 158 } | 146 } |
| 159 | 147 |
| 160 | |
| 161 ASSEMBLER_TEST_RUN(OneByteStringFromCharCode, test) { | 148 ASSEMBLER_TEST_RUN(OneByteStringFromCharCode, test) { |
| 162 EXPECT_EQ(Symbols::New(Thread::Current(), "A"), | 149 EXPECT_EQ(Symbols::New(Thread::Current(), "A"), |
| 163 EXECUTE_TEST_CODE_OBJECT(test->code()).raw()); | 150 EXECUTE_TEST_CODE_OBJECT(test->code()).raw()); |
| 164 } | 151 } |
| 165 | 152 |
| 166 | |
| 167 // - StringToCharCode rA, rX | 153 // - StringToCharCode rA, rX |
| 168 // | 154 // |
| 169 // Load and smi-encode the single char code of the string in FP[rX] into | 155 // Load and smi-encode the single char code of the string in FP[rX] into |
| 170 // FP[rA]. If the string's length is not 1, load smi -1 instead. | 156 // FP[rA]. If the string's length is not 1, load smi -1 instead. |
| 171 // | 157 // |
| 172 ASSEMBLER_TEST_GENERATE(StringToCharCode, assembler) { | 158 ASSEMBLER_TEST_GENERATE(StringToCharCode, assembler) { |
| 173 __ Frame(2); | 159 __ Frame(2); |
| 174 __ LoadConstant(0, String::ZoneHandle(String::New("A", Heap::kOld))); | 160 __ LoadConstant(0, String::ZoneHandle(String::New("A", Heap::kOld))); |
| 175 __ StringToCharCode(1, 0); | 161 __ StringToCharCode(1, 0); |
| 176 __ Return(1); | 162 __ Return(1); |
| 177 } | 163 } |
| 178 | 164 |
| 179 | |
| 180 ASSEMBLER_TEST_RUN(StringToCharCode, test) { | 165 ASSEMBLER_TEST_RUN(StringToCharCode, test) { |
| 181 EXPECT_EQ(65, EXECUTE_TEST_CODE_INTPTR(test->code())); | 166 EXPECT_EQ(65, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 182 } | 167 } |
| 183 | 168 |
| 184 | |
| 185 ASSEMBLER_TEST_GENERATE(StringToCharCodeIllegalLength, assembler) { | 169 ASSEMBLER_TEST_GENERATE(StringToCharCodeIllegalLength, assembler) { |
| 186 __ Frame(2); | 170 __ Frame(2); |
| 187 __ LoadConstant(0, String::ZoneHandle(String::New("AAA", Heap::kOld))); | 171 __ LoadConstant(0, String::ZoneHandle(String::New("AAA", Heap::kOld))); |
| 188 __ StringToCharCode(1, 0); | 172 __ StringToCharCode(1, 0); |
| 189 __ Return(1); | 173 __ Return(1); |
| 190 } | 174 } |
| 191 | 175 |
| 192 | |
| 193 ASSEMBLER_TEST_RUN(StringToCharCodeIllegalLength, test) { | 176 ASSEMBLER_TEST_RUN(StringToCharCodeIllegalLength, test) { |
| 194 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INTPTR(test->code())); | 177 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 195 } | 178 } |
| 196 | 179 |
| 197 | |
| 198 // - AddTOS; SubTOS; MulTOS; BitOrTOS; BitAndTOS; EqualTOS; LessThanTOS; | 180 // - AddTOS; SubTOS; MulTOS; BitOrTOS; BitAndTOS; EqualTOS; LessThanTOS; |
| 199 // GreaterThanTOS; | 181 // GreaterThanTOS; |
| 200 // | 182 // |
| 201 // Smi fast-path for a corresponding method. Checks if SP[0] and SP[-1] are | 183 // Smi fast-path for a corresponding method. Checks if SP[0] and SP[-1] are |
| 202 // both smis and result of SP[0] <op> SP[-1] is a smi - if this is true | 184 // both smis and result of SP[0] <op> SP[-1] is a smi - if this is true |
| 203 // then pops operands and pushes result on the stack and skips the next | 185 // then pops operands and pushes result on the stack and skips the next |
| 204 // instruction (which implements a slow path fallback). | 186 // instruction (which implements a slow path fallback). |
| 205 ASSEMBLER_TEST_GENERATE(AddTOS, assembler) { | 187 ASSEMBLER_TEST_GENERATE(AddTOS, assembler) { |
| 206 __ PushConstant(Smi::Handle(Smi::New(-42))); | 188 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 207 __ PushConstant(Smi::Handle(Smi::New(84))); | 189 __ PushConstant(Smi::Handle(Smi::New(84))); |
| 208 __ AddTOS(); | 190 __ AddTOS(); |
| 209 // Should be skipped. | 191 // Should be skipped. |
| 210 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); | 192 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 211 __ ReturnTOS(); | 193 __ ReturnTOS(); |
| 212 } | 194 } |
| 213 | 195 |
| 214 | |
| 215 ASSEMBLER_TEST_RUN(AddTOS, test) { | 196 ASSEMBLER_TEST_RUN(AddTOS, test) { |
| 216 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 197 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 217 } | 198 } |
| 218 | 199 |
| 219 | |
| 220 ASSEMBLER_TEST_GENERATE(AddTOSOverflow, assembler) { | 200 ASSEMBLER_TEST_GENERATE(AddTOSOverflow, assembler) { |
| 221 __ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue))); | 201 __ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue))); |
| 222 __ PushConstant(Smi::Handle(Smi::New(1))); | 202 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 223 __ AddTOS(); | 203 __ AddTOS(); |
| 224 // Shouldn't be skipped. | 204 // Shouldn't be skipped. |
| 225 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); | 205 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| 226 __ ReturnTOS(); | 206 __ ReturnTOS(); |
| 227 } | 207 } |
| 228 | 208 |
| 229 | |
| 230 ASSEMBLER_TEST_RUN(AddTOSOverflow, test) { | 209 ASSEMBLER_TEST_RUN(AddTOSOverflow, test) { |
| 231 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 210 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 232 } | 211 } |
| 233 | 212 |
| 234 | |
| 235 ASSEMBLER_TEST_GENERATE(AddTOSNonSmi, assembler) { | 213 ASSEMBLER_TEST_GENERATE(AddTOSNonSmi, assembler) { |
| 236 const String& numstr = | 214 const String& numstr = |
| 237 String::Handle(String::New("98765432198765432100", Heap::kOld)); | 215 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 238 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); | 216 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 239 __ PushConstant(Smi::Handle(Smi::New(1))); | 217 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 240 __ AddTOS(); | 218 __ AddTOS(); |
| 241 // Shouldn't be skipped. | 219 // Shouldn't be skipped. |
| 242 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); | 220 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| 243 __ ReturnTOS(); | 221 __ ReturnTOS(); |
| 244 } | 222 } |
| 245 | 223 |
| 246 | |
| 247 ASSEMBLER_TEST_RUN(AddTOSNonSmi, test) { | 224 ASSEMBLER_TEST_RUN(AddTOSNonSmi, test) { |
| 248 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 225 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 249 } | 226 } |
| 250 | 227 |
| 251 | |
| 252 ASSEMBLER_TEST_GENERATE(SubTOS, assembler) { | 228 ASSEMBLER_TEST_GENERATE(SubTOS, assembler) { |
| 253 __ PushConstant(Smi::Handle(Smi::New(30))); | 229 __ PushConstant(Smi::Handle(Smi::New(30))); |
| 254 __ PushConstant(Smi::Handle(Smi::New(-12))); | 230 __ PushConstant(Smi::Handle(Smi::New(-12))); |
| 255 __ SubTOS(); | 231 __ SubTOS(); |
| 256 // Should be skipped. | 232 // Should be skipped. |
| 257 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); | 233 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 258 __ ReturnTOS(); | 234 __ ReturnTOS(); |
| 259 } | 235 } |
| 260 | 236 |
| 261 | |
| 262 ASSEMBLER_TEST_RUN(SubTOS, test) { | 237 ASSEMBLER_TEST_RUN(SubTOS, test) { |
| 263 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 238 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 264 } | 239 } |
| 265 | 240 |
| 266 | |
| 267 ASSEMBLER_TEST_GENERATE(SubTOSOverflow, assembler) { | 241 ASSEMBLER_TEST_GENERATE(SubTOSOverflow, assembler) { |
| 268 __ PushConstant(Smi::Handle(Smi::New(Smi::kMinValue))); | 242 __ PushConstant(Smi::Handle(Smi::New(Smi::kMinValue))); |
| 269 __ PushConstant(Smi::Handle(Smi::New(1))); | 243 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 270 __ SubTOS(); | 244 __ SubTOS(); |
| 271 // Shouldn't be skipped. | 245 // Shouldn't be skipped. |
| 272 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); | 246 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| 273 __ ReturnTOS(); | 247 __ ReturnTOS(); |
| 274 } | 248 } |
| 275 | 249 |
| 276 | |
| 277 ASSEMBLER_TEST_RUN(SubTOSOverflow, test) { | 250 ASSEMBLER_TEST_RUN(SubTOSOverflow, test) { |
| 278 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 251 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 279 } | 252 } |
| 280 | 253 |
| 281 | |
| 282 ASSEMBLER_TEST_GENERATE(SubTOSNonSmi, assembler) { | 254 ASSEMBLER_TEST_GENERATE(SubTOSNonSmi, assembler) { |
| 283 const String& numstr = | 255 const String& numstr = |
| 284 String::Handle(String::New("98765432198765432100", Heap::kOld)); | 256 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 285 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); | 257 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 286 __ PushConstant(Smi::Handle(Smi::New(1))); | 258 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 287 __ SubTOS(); | 259 __ SubTOS(); |
| 288 // Shouldn't be skipped. | 260 // Shouldn't be skipped. |
| 289 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); | 261 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| 290 __ ReturnTOS(); | 262 __ ReturnTOS(); |
| 291 } | 263 } |
| 292 | 264 |
| 293 | |
| 294 ASSEMBLER_TEST_RUN(SubTOSNonSmi, test) { | 265 ASSEMBLER_TEST_RUN(SubTOSNonSmi, test) { |
| 295 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 266 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 296 } | 267 } |
| 297 | 268 |
| 298 | |
| 299 ASSEMBLER_TEST_GENERATE(MulTOS, assembler) { | 269 ASSEMBLER_TEST_GENERATE(MulTOS, assembler) { |
| 300 __ PushConstant(Smi::Handle(Smi::New(-6))); | 270 __ PushConstant(Smi::Handle(Smi::New(-6))); |
| 301 __ PushConstant(Smi::Handle(Smi::New(-7))); | 271 __ PushConstant(Smi::Handle(Smi::New(-7))); |
| 302 __ MulTOS(); | 272 __ MulTOS(); |
| 303 // Should be skipped. | 273 // Should be skipped. |
| 304 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); | 274 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 305 __ ReturnTOS(); | 275 __ ReturnTOS(); |
| 306 } | 276 } |
| 307 | 277 |
| 308 | |
| 309 ASSEMBLER_TEST_RUN(MulTOS, test) { | 278 ASSEMBLER_TEST_RUN(MulTOS, test) { |
| 310 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 279 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 311 } | 280 } |
| 312 | 281 |
| 313 | |
| 314 ASSEMBLER_TEST_GENERATE(MulTOSOverflow, assembler) { | 282 ASSEMBLER_TEST_GENERATE(MulTOSOverflow, assembler) { |
| 315 __ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue))); | 283 __ PushConstant(Smi::Handle(Smi::New(Smi::kMaxValue))); |
| 316 __ PushConstant(Smi::Handle(Smi::New(-8))); | 284 __ PushConstant(Smi::Handle(Smi::New(-8))); |
| 317 __ MulTOS(); | 285 __ MulTOS(); |
| 318 // Shouldn't be skipped. | 286 // Shouldn't be skipped. |
| 319 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); | 287 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| 320 __ ReturnTOS(); | 288 __ ReturnTOS(); |
| 321 } | 289 } |
| 322 | 290 |
| 323 | |
| 324 ASSEMBLER_TEST_RUN(MulTOSOverflow, test) { | 291 ASSEMBLER_TEST_RUN(MulTOSOverflow, test) { |
| 325 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 292 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 326 } | 293 } |
| 327 | 294 |
| 328 | |
| 329 ASSEMBLER_TEST_GENERATE(MulTOSNonSmi, assembler) { | 295 ASSEMBLER_TEST_GENERATE(MulTOSNonSmi, assembler) { |
| 330 const String& numstr = | 296 const String& numstr = |
| 331 String::Handle(String::New("98765432198765432100", Heap::kOld)); | 297 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 332 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); | 298 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 333 __ PushConstant(Smi::Handle(Smi::New(1))); | 299 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 334 __ MulTOS(); | 300 __ MulTOS(); |
| 335 // Shouldn't be skipped. | 301 // Shouldn't be skipped. |
| 336 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); | 302 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| 337 __ ReturnTOS(); | 303 __ ReturnTOS(); |
| 338 } | 304 } |
| 339 | 305 |
| 340 | |
| 341 ASSEMBLER_TEST_RUN(MulTOSNonSmi, test) { | 306 ASSEMBLER_TEST_RUN(MulTOSNonSmi, test) { |
| 342 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 307 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 343 } | 308 } |
| 344 | 309 |
| 345 | |
| 346 ASSEMBLER_TEST_GENERATE(BitOrTOS, assembler) { | 310 ASSEMBLER_TEST_GENERATE(BitOrTOS, assembler) { |
| 347 __ PushConstant(Smi::Handle(Smi::New(0x22))); | 311 __ PushConstant(Smi::Handle(Smi::New(0x22))); |
| 348 __ PushConstant(Smi::Handle(Smi::New(0x08))); | 312 __ PushConstant(Smi::Handle(Smi::New(0x08))); |
| 349 __ BitOrTOS(); | 313 __ BitOrTOS(); |
| 350 // Should be skipped. | 314 // Should be skipped. |
| 351 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); | 315 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 352 __ ReturnTOS(); | 316 __ ReturnTOS(); |
| 353 } | 317 } |
| 354 | 318 |
| 355 | |
| 356 ASSEMBLER_TEST_RUN(BitOrTOS, test) { | 319 ASSEMBLER_TEST_RUN(BitOrTOS, test) { |
| 357 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 320 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 358 } | 321 } |
| 359 | 322 |
| 360 | |
| 361 ASSEMBLER_TEST_GENERATE(BitOrTOSNonSmi, assembler) { | 323 ASSEMBLER_TEST_GENERATE(BitOrTOSNonSmi, assembler) { |
| 362 const String& numstr = | 324 const String& numstr = |
| 363 String::Handle(String::New("98765432198765432100", Heap::kOld)); | 325 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 364 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); | 326 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 365 __ PushConstant(Smi::Handle(Smi::New(0x08))); | 327 __ PushConstant(Smi::Handle(Smi::New(0x08))); |
| 366 __ BitOrTOS(); | 328 __ BitOrTOS(); |
| 367 // Shouldn't be skipped. | 329 // Shouldn't be skipped. |
| 368 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); | 330 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| 369 __ ReturnTOS(); | 331 __ ReturnTOS(); |
| 370 } | 332 } |
| 371 | 333 |
| 372 | |
| 373 ASSEMBLER_TEST_RUN(BitOrTOSNonSmi, test) { | 334 ASSEMBLER_TEST_RUN(BitOrTOSNonSmi, test) { |
| 374 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 335 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 375 } | 336 } |
| 376 | 337 |
| 377 | |
| 378 ASSEMBLER_TEST_GENERATE(BitAndTOS, assembler) { | 338 ASSEMBLER_TEST_GENERATE(BitAndTOS, assembler) { |
| 379 __ PushConstant(Smi::Handle(Smi::New(0x2a))); | 339 __ PushConstant(Smi::Handle(Smi::New(0x2a))); |
| 380 __ PushConstant(Smi::Handle(Smi::New(0xaa))); | 340 __ PushConstant(Smi::Handle(Smi::New(0xaa))); |
| 381 __ BitAndTOS(); | 341 __ BitAndTOS(); |
| 382 // Should be skipped. | 342 // Should be skipped. |
| 383 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); | 343 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 384 __ ReturnTOS(); | 344 __ ReturnTOS(); |
| 385 } | 345 } |
| 386 | 346 |
| 387 | |
| 388 ASSEMBLER_TEST_RUN(BitAndTOS, test) { | 347 ASSEMBLER_TEST_RUN(BitAndTOS, test) { |
| 389 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 348 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 390 } | 349 } |
| 391 | 350 |
| 392 | |
| 393 ASSEMBLER_TEST_GENERATE(BitAndTOSNonSmi, assembler) { | 351 ASSEMBLER_TEST_GENERATE(BitAndTOSNonSmi, assembler) { |
| 394 const String& numstr = | 352 const String& numstr = |
| 395 String::Handle(String::New("98765432198765432100", Heap::kOld)); | 353 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 396 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); | 354 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 397 __ PushConstant(Smi::Handle(Smi::New(0x08))); | 355 __ PushConstant(Smi::Handle(Smi::New(0x08))); |
| 398 __ BitAndTOS(); | 356 __ BitAndTOS(); |
| 399 // Shouldn't be skipped. | 357 // Shouldn't be skipped. |
| 400 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); | 358 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(42))); |
| 401 __ ReturnTOS(); | 359 __ ReturnTOS(); |
| 402 } | 360 } |
| 403 | 361 |
| 404 | |
| 405 ASSEMBLER_TEST_RUN(BitAndTOSNonSmi, test) { | 362 ASSEMBLER_TEST_RUN(BitAndTOSNonSmi, test) { |
| 406 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 363 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 407 } | 364 } |
| 408 | 365 |
| 409 | |
| 410 ASSEMBLER_TEST_GENERATE(EqualTOSTrue, assembler) { | 366 ASSEMBLER_TEST_GENERATE(EqualTOSTrue, assembler) { |
| 411 __ PushConstant(Smi::Handle(Smi::New(42))); | 367 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 412 __ PushConstant(Smi::Handle(Smi::New(42))); | 368 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 413 __ EqualTOS(); | 369 __ EqualTOS(); |
| 414 // Should be skipped. | 370 // Should be skipped. |
| 415 MakeDummyInstanceCall(assembler, Bool::False()); | 371 MakeDummyInstanceCall(assembler, Bool::False()); |
| 416 __ ReturnTOS(); | 372 __ ReturnTOS(); |
| 417 } | 373 } |
| 418 | 374 |
| 419 | |
| 420 ASSEMBLER_TEST_RUN(EqualTOSTrue, test) { | 375 ASSEMBLER_TEST_RUN(EqualTOSTrue, test) { |
| 421 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); | 376 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 422 } | 377 } |
| 423 | 378 |
| 424 | |
| 425 ASSEMBLER_TEST_GENERATE(EqualTOSFalse, assembler) { | 379 ASSEMBLER_TEST_GENERATE(EqualTOSFalse, assembler) { |
| 426 __ PushConstant(Smi::Handle(Smi::New(42))); | 380 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 427 __ PushConstant(Smi::Handle(Smi::New(-42))); | 381 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 428 __ EqualTOS(); | 382 __ EqualTOS(); |
| 429 // Should be skipped. | 383 // Should be skipped. |
| 430 MakeDummyInstanceCall(assembler, Bool::True()); | 384 MakeDummyInstanceCall(assembler, Bool::True()); |
| 431 __ ReturnTOS(); | 385 __ ReturnTOS(); |
| 432 } | 386 } |
| 433 | 387 |
| 434 | |
| 435 ASSEMBLER_TEST_RUN(EqualTOSFalse, test) { | 388 ASSEMBLER_TEST_RUN(EqualTOSFalse, test) { |
| 436 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); | 389 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); |
| 437 } | 390 } |
| 438 | 391 |
| 439 | |
| 440 ASSEMBLER_TEST_GENERATE(EqualTOSNonSmi, assembler) { | 392 ASSEMBLER_TEST_GENERATE(EqualTOSNonSmi, assembler) { |
| 441 const String& numstr = | 393 const String& numstr = |
| 442 String::Handle(String::New("98765432198765432100", Heap::kOld)); | 394 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 443 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); | 395 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 444 __ PushConstant(Smi::Handle(Smi::New(-42))); | 396 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 445 __ EqualTOS(); | 397 __ EqualTOS(); |
| 446 // Shouldn't be skipped. | 398 // Shouldn't be skipped. |
| 447 MakeDummyInstanceCall(assembler, Bool::True()); | 399 MakeDummyInstanceCall(assembler, Bool::True()); |
| 448 __ ReturnTOS(); | 400 __ ReturnTOS(); |
| 449 } | 401 } |
| 450 | 402 |
| 451 | |
| 452 ASSEMBLER_TEST_RUN(EqualTOSNonSmi, test) { | 403 ASSEMBLER_TEST_RUN(EqualTOSNonSmi, test) { |
| 453 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); | 404 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 454 } | 405 } |
| 455 | 406 |
| 456 | |
| 457 ASSEMBLER_TEST_GENERATE(LessThanTOSTrue, assembler) { | 407 ASSEMBLER_TEST_GENERATE(LessThanTOSTrue, assembler) { |
| 458 __ PushConstant(Smi::Handle(Smi::New(-42))); | 408 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 459 __ PushConstant(Smi::Handle(Smi::New(42))); | 409 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 460 __ LessThanTOS(); | 410 __ LessThanTOS(); |
| 461 // Should be skipped. | 411 // Should be skipped. |
| 462 MakeDummyInstanceCall(assembler, Bool::False()); | 412 MakeDummyInstanceCall(assembler, Bool::False()); |
| 463 __ ReturnTOS(); | 413 __ ReturnTOS(); |
| 464 } | 414 } |
| 465 | 415 |
| 466 | |
| 467 ASSEMBLER_TEST_RUN(LessThanTOSTrue, test) { | 416 ASSEMBLER_TEST_RUN(LessThanTOSTrue, test) { |
| 468 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); | 417 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 469 } | 418 } |
| 470 | 419 |
| 471 | |
| 472 ASSEMBLER_TEST_GENERATE(LessThanTOSFalse, assembler) { | 420 ASSEMBLER_TEST_GENERATE(LessThanTOSFalse, assembler) { |
| 473 __ PushConstant(Smi::Handle(Smi::New(42))); | 421 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 474 __ PushConstant(Smi::Handle(Smi::New(-42))); | 422 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 475 __ LessThanTOS(); | 423 __ LessThanTOS(); |
| 476 // Should be skipped. | 424 // Should be skipped. |
| 477 MakeDummyInstanceCall(assembler, Bool::False()); | 425 MakeDummyInstanceCall(assembler, Bool::False()); |
| 478 __ ReturnTOS(); | 426 __ ReturnTOS(); |
| 479 } | 427 } |
| 480 | 428 |
| 481 | |
| 482 ASSEMBLER_TEST_RUN(LessThanTOSFalse, test) { | 429 ASSEMBLER_TEST_RUN(LessThanTOSFalse, test) { |
| 483 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); | 430 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); |
| 484 } | 431 } |
| 485 | 432 |
| 486 | |
| 487 ASSEMBLER_TEST_GENERATE(LessThanTOSNonSmi, assembler) { | 433 ASSEMBLER_TEST_GENERATE(LessThanTOSNonSmi, assembler) { |
| 488 const String& numstr = | 434 const String& numstr = |
| 489 String::Handle(String::New("98765432198765432100", Heap::kOld)); | 435 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 490 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); | 436 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 491 __ PushConstant(Smi::Handle(Smi::New(-42))); | 437 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 492 __ LessThanTOS(); | 438 __ LessThanTOS(); |
| 493 // Shouldn't be skipped. | 439 // Shouldn't be skipped. |
| 494 MakeDummyInstanceCall(assembler, Bool::True()); | 440 MakeDummyInstanceCall(assembler, Bool::True()); |
| 495 __ ReturnTOS(); | 441 __ ReturnTOS(); |
| 496 } | 442 } |
| 497 | 443 |
| 498 | |
| 499 ASSEMBLER_TEST_RUN(LessThanTOSNonSmi, test) { | 444 ASSEMBLER_TEST_RUN(LessThanTOSNonSmi, test) { |
| 500 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); | 445 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 501 } | 446 } |
| 502 | 447 |
| 503 | |
| 504 ASSEMBLER_TEST_GENERATE(GreaterThanTOSTrue, assembler) { | 448 ASSEMBLER_TEST_GENERATE(GreaterThanTOSTrue, assembler) { |
| 505 __ PushConstant(Smi::Handle(Smi::New(42))); | 449 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 506 __ PushConstant(Smi::Handle(Smi::New(-42))); | 450 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 507 __ GreaterThanTOS(); | 451 __ GreaterThanTOS(); |
| 508 // Should be skipped. | 452 // Should be skipped. |
| 509 MakeDummyInstanceCall(assembler, Bool::False()); | 453 MakeDummyInstanceCall(assembler, Bool::False()); |
| 510 __ ReturnTOS(); | 454 __ ReturnTOS(); |
| 511 } | 455 } |
| 512 | 456 |
| 513 | |
| 514 ASSEMBLER_TEST_RUN(GreaterThanTOSTrue, test) { | 457 ASSEMBLER_TEST_RUN(GreaterThanTOSTrue, test) { |
| 515 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); | 458 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 516 } | 459 } |
| 517 | 460 |
| 518 | |
| 519 ASSEMBLER_TEST_GENERATE(GreaterThanTOSFalse, assembler) { | 461 ASSEMBLER_TEST_GENERATE(GreaterThanTOSFalse, assembler) { |
| 520 __ PushConstant(Smi::Handle(Smi::New(-42))); | 462 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 521 __ PushConstant(Smi::Handle(Smi::New(42))); | 463 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 522 __ GreaterThanTOS(); | 464 __ GreaterThanTOS(); |
| 523 // Should be skipped. | 465 // Should be skipped. |
| 524 MakeDummyInstanceCall(assembler, Bool::False()); | 466 MakeDummyInstanceCall(assembler, Bool::False()); |
| 525 __ ReturnTOS(); | 467 __ ReturnTOS(); |
| 526 } | 468 } |
| 527 | 469 |
| 528 | |
| 529 ASSEMBLER_TEST_RUN(GreaterThanTOSFalse, test) { | 470 ASSEMBLER_TEST_RUN(GreaterThanTOSFalse, test) { |
| 530 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); | 471 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); |
| 531 } | 472 } |
| 532 | 473 |
| 533 | |
| 534 ASSEMBLER_TEST_GENERATE(GreaterThanTOSNonSmi, assembler) { | 474 ASSEMBLER_TEST_GENERATE(GreaterThanTOSNonSmi, assembler) { |
| 535 const String& numstr = | 475 const String& numstr = |
| 536 String::Handle(String::New("98765432198765432100", Heap::kOld)); | 476 String::Handle(String::New("98765432198765432100", Heap::kOld)); |
| 537 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); | 477 __ PushConstant(Integer::Handle(Integer::New(numstr, Heap::kOld))); |
| 538 __ PushConstant(Smi::Handle(Smi::New(-42))); | 478 __ PushConstant(Smi::Handle(Smi::New(-42))); |
| 539 __ GreaterThanTOS(); | 479 __ GreaterThanTOS(); |
| 540 // Shouldn't be skipped. | 480 // Shouldn't be skipped. |
| 541 MakeDummyInstanceCall(assembler, Bool::True()); | 481 MakeDummyInstanceCall(assembler, Bool::True()); |
| 542 __ ReturnTOS(); | 482 __ ReturnTOS(); |
| 543 } | 483 } |
| 544 | 484 |
| 545 | |
| 546 ASSEMBLER_TEST_RUN(GreaterThanTOSNonSmi, test) { | 485 ASSEMBLER_TEST_RUN(GreaterThanTOSNonSmi, test) { |
| 547 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); | 486 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 548 } | 487 } |
| 549 | 488 |
| 550 | |
| 551 // - Add, Sub, Mul, Div, Mod, Shl, Shr rA, rB, rC | 489 // - Add, Sub, Mul, Div, Mod, Shl, Shr rA, rB, rC |
| 552 // | 490 // |
| 553 // Arithmetic operations on Smis. FP[rA] <- FP[rB] op FP[rC]. | 491 // Arithmetic operations on Smis. FP[rA] <- FP[rB] op FP[rC]. |
| 554 // If these instructions can trigger a deoptimization, the following | 492 // If these instructions can trigger a deoptimization, the following |
| 555 // instruction should be Deopt. If no deoptimization should be triggered, | 493 // instruction should be Deopt. If no deoptimization should be triggered, |
| 556 // the immediately following instruction is skipped. | 494 // the immediately following instruction is skipped. |
| 557 ASSEMBLER_TEST_GENERATE(AddNoOverflow, assembler) { | 495 ASSEMBLER_TEST_GENERATE(AddNoOverflow, assembler) { |
| 558 __ Frame(3); | 496 __ Frame(3); |
| 559 __ LoadConstant(0, Smi::Handle(Smi::New(20))); | 497 __ LoadConstant(0, Smi::Handle(Smi::New(20))); |
| 560 __ LoadConstant(1, Smi::Handle(Smi::New(22))); | 498 __ LoadConstant(1, Smi::Handle(Smi::New(22))); |
| 561 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 499 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 562 __ Add(2, 0, 1); | 500 __ Add(2, 0, 1); |
| 563 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); | 501 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); |
| 564 __ Return(2); | 502 __ Return(2); |
| 565 } | 503 } |
| 566 | 504 |
| 567 | |
| 568 ASSEMBLER_TEST_RUN(AddNoOverflow, test) { | 505 ASSEMBLER_TEST_RUN(AddNoOverflow, test) { |
| 569 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 506 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 570 } | 507 } |
| 571 | 508 |
| 572 | |
| 573 ASSEMBLER_TEST_GENERATE(AddOverflow, assembler) { | 509 ASSEMBLER_TEST_GENERATE(AddOverflow, assembler) { |
| 574 __ Frame(3); | 510 __ Frame(3); |
| 575 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMaxValue))); | 511 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMaxValue))); |
| 576 __ LoadConstant(1, Smi::Handle(Smi::New(1))); | 512 __ LoadConstant(1, Smi::Handle(Smi::New(1))); |
| 577 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 513 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 578 __ Add(2, 0, 1); | 514 __ Add(2, 0, 1); |
| 579 __ LoadConstant(2, Smi::Handle(Smi::New(42))); | 515 __ LoadConstant(2, Smi::Handle(Smi::New(42))); |
| 580 __ Return(2); | 516 __ Return(2); |
| 581 } | 517 } |
| 582 | 518 |
| 583 | |
| 584 ASSEMBLER_TEST_RUN(AddOverflow, test) { | 519 ASSEMBLER_TEST_RUN(AddOverflow, test) { |
| 585 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 520 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 586 } | 521 } |
| 587 | 522 |
| 588 | |
| 589 ASSEMBLER_TEST_GENERATE(SubNoOverflow, assembler) { | 523 ASSEMBLER_TEST_GENERATE(SubNoOverflow, assembler) { |
| 590 __ Frame(3); | 524 __ Frame(3); |
| 591 __ LoadConstant(0, Smi::Handle(Smi::New(64))); | 525 __ LoadConstant(0, Smi::Handle(Smi::New(64))); |
| 592 __ LoadConstant(1, Smi::Handle(Smi::New(22))); | 526 __ LoadConstant(1, Smi::Handle(Smi::New(22))); |
| 593 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 527 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 594 __ Sub(2, 0, 1); | 528 __ Sub(2, 0, 1); |
| 595 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); | 529 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); |
| 596 __ Return(2); | 530 __ Return(2); |
| 597 } | 531 } |
| 598 | 532 |
| 599 | |
| 600 ASSEMBLER_TEST_RUN(SubNoOverflow, test) { | 533 ASSEMBLER_TEST_RUN(SubNoOverflow, test) { |
| 601 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 534 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 602 } | 535 } |
| 603 | 536 |
| 604 | |
| 605 ASSEMBLER_TEST_GENERATE(SubOverflow, assembler) { | 537 ASSEMBLER_TEST_GENERATE(SubOverflow, assembler) { |
| 606 __ Frame(3); | 538 __ Frame(3); |
| 607 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMinValue))); | 539 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMinValue))); |
| 608 __ LoadConstant(1, Smi::Handle(Smi::New(1))); | 540 __ LoadConstant(1, Smi::Handle(Smi::New(1))); |
| 609 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 541 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 610 __ Sub(2, 0, 1); | 542 __ Sub(2, 0, 1); |
| 611 __ LoadConstant(2, Smi::Handle(Smi::New(42))); | 543 __ LoadConstant(2, Smi::Handle(Smi::New(42))); |
| 612 __ Return(2); | 544 __ Return(2); |
| 613 } | 545 } |
| 614 | 546 |
| 615 | |
| 616 ASSEMBLER_TEST_RUN(SubOverflow, test) { | 547 ASSEMBLER_TEST_RUN(SubOverflow, test) { |
| 617 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 548 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 618 } | 549 } |
| 619 | 550 |
| 620 | |
| 621 ASSEMBLER_TEST_GENERATE(MulNoOverflow, assembler) { | 551 ASSEMBLER_TEST_GENERATE(MulNoOverflow, assembler) { |
| 622 __ Frame(3); | 552 __ Frame(3); |
| 623 __ LoadConstant(0, Smi::Handle(Smi::New(-6))); | 553 __ LoadConstant(0, Smi::Handle(Smi::New(-6))); |
| 624 __ LoadConstant(1, Smi::Handle(Smi::New(-7))); | 554 __ LoadConstant(1, Smi::Handle(Smi::New(-7))); |
| 625 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 555 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 626 __ Mul(2, 0, 1); | 556 __ Mul(2, 0, 1); |
| 627 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); | 557 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); |
| 628 __ Return(2); | 558 __ Return(2); |
| 629 } | 559 } |
| 630 | 560 |
| 631 | |
| 632 ASSEMBLER_TEST_RUN(MulNoOverflow, test) { | 561 ASSEMBLER_TEST_RUN(MulNoOverflow, test) { |
| 633 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 562 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 634 } | 563 } |
| 635 | 564 |
| 636 | |
| 637 ASSEMBLER_TEST_GENERATE(MulOverflow, assembler) { | 565 ASSEMBLER_TEST_GENERATE(MulOverflow, assembler) { |
| 638 __ Frame(3); | 566 __ Frame(3); |
| 639 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMaxValue))); | 567 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMaxValue))); |
| 640 __ LoadConstant(1, Smi::Handle(Smi::New(-8))); | 568 __ LoadConstant(1, Smi::Handle(Smi::New(-8))); |
| 641 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 569 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 642 __ Mul(2, 0, 1); | 570 __ Mul(2, 0, 1); |
| 643 __ LoadConstant(2, Smi::Handle(Smi::New(42))); | 571 __ LoadConstant(2, Smi::Handle(Smi::New(42))); |
| 644 __ Return(2); | 572 __ Return(2); |
| 645 } | 573 } |
| 646 | 574 |
| 647 | |
| 648 ASSEMBLER_TEST_RUN(MulOverflow, test) { | 575 ASSEMBLER_TEST_RUN(MulOverflow, test) { |
| 649 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 576 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 650 } | 577 } |
| 651 | 578 |
| 652 | |
| 653 ASSEMBLER_TEST_GENERATE(DivNoDeopt, assembler) { | 579 ASSEMBLER_TEST_GENERATE(DivNoDeopt, assembler) { |
| 654 __ Frame(3); | 580 __ Frame(3); |
| 655 __ LoadConstant(0, Smi::Handle(Smi::New(27))); | 581 __ LoadConstant(0, Smi::Handle(Smi::New(27))); |
| 656 __ LoadConstant(1, Smi::Handle(Smi::New(3))); | 582 __ LoadConstant(1, Smi::Handle(Smi::New(3))); |
| 657 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 583 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 658 __ Div(2, 0, 1); | 584 __ Div(2, 0, 1); |
| 659 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); | 585 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); |
| 660 __ Return(2); | 586 __ Return(2); |
| 661 } | 587 } |
| 662 | 588 |
| 663 | |
| 664 ASSEMBLER_TEST_RUN(DivNoDeopt, test) { | 589 ASSEMBLER_TEST_RUN(DivNoDeopt, test) { |
| 665 EXPECT_EQ(9, EXECUTE_TEST_CODE_INTPTR(test->code())); | 590 EXPECT_EQ(9, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 666 } | 591 } |
| 667 | 592 |
| 668 | |
| 669 ASSEMBLER_TEST_GENERATE(DivZero, assembler) { | 593 ASSEMBLER_TEST_GENERATE(DivZero, assembler) { |
| 670 __ Frame(3); | 594 __ Frame(3); |
| 671 __ LoadConstant(0, Smi::Handle(Smi::New(3))); | 595 __ LoadConstant(0, Smi::Handle(Smi::New(3))); |
| 672 __ LoadConstant(1, Smi::Handle(Smi::New(0))); | 596 __ LoadConstant(1, Smi::Handle(Smi::New(0))); |
| 673 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 597 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 674 __ Div(2, 0, 1); | 598 __ Div(2, 0, 1); |
| 675 __ LoadConstant(2, Smi::Handle(Smi::New(42))); | 599 __ LoadConstant(2, Smi::Handle(Smi::New(42))); |
| 676 __ Return(2); | 600 __ Return(2); |
| 677 } | 601 } |
| 678 | 602 |
| 679 | |
| 680 ASSEMBLER_TEST_RUN(DivZero, test) { | 603 ASSEMBLER_TEST_RUN(DivZero, test) { |
| 681 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 604 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 682 } | 605 } |
| 683 | 606 |
| 684 | |
| 685 ASSEMBLER_TEST_GENERATE(DivCornerCase, assembler) { | 607 ASSEMBLER_TEST_GENERATE(DivCornerCase, assembler) { |
| 686 __ Frame(3); | 608 __ Frame(3); |
| 687 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMinValue))); | 609 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMinValue))); |
| 688 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 610 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 689 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 611 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 690 __ Div(2, 0, 1); | 612 __ Div(2, 0, 1); |
| 691 __ LoadConstant(2, Smi::Handle(Smi::New(42))); | 613 __ LoadConstant(2, Smi::Handle(Smi::New(42))); |
| 692 __ Return(2); | 614 __ Return(2); |
| 693 } | 615 } |
| 694 | 616 |
| 695 | |
| 696 ASSEMBLER_TEST_RUN(DivCornerCase, test) { | 617 ASSEMBLER_TEST_RUN(DivCornerCase, test) { |
| 697 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 618 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 698 } | 619 } |
| 699 | 620 |
| 700 | |
| 701 ASSEMBLER_TEST_GENERATE(ModPosPos, assembler) { | 621 ASSEMBLER_TEST_GENERATE(ModPosPos, assembler) { |
| 702 __ Frame(3); | 622 __ Frame(3); |
| 703 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 623 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 704 __ LoadConstant(1, Smi::Handle(Smi::New(4))); | 624 __ LoadConstant(1, Smi::Handle(Smi::New(4))); |
| 705 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 625 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 706 __ Mod(2, 0, 1); | 626 __ Mod(2, 0, 1); |
| 707 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); | 627 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); |
| 708 __ Return(2); | 628 __ Return(2); |
| 709 } | 629 } |
| 710 | 630 |
| 711 | |
| 712 ASSEMBLER_TEST_RUN(ModPosPos, test) { | 631 ASSEMBLER_TEST_RUN(ModPosPos, test) { |
| 713 EXPECT_EQ(2, EXECUTE_TEST_CODE_INTPTR(test->code())); | 632 EXPECT_EQ(2, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 714 } | 633 } |
| 715 | 634 |
| 716 | |
| 717 ASSEMBLER_TEST_GENERATE(ModNegPos, assembler) { | 635 ASSEMBLER_TEST_GENERATE(ModNegPos, assembler) { |
| 718 __ Frame(3); | 636 __ Frame(3); |
| 719 __ LoadConstant(0, Smi::Handle(Smi::New(-42))); | 637 __ LoadConstant(0, Smi::Handle(Smi::New(-42))); |
| 720 __ LoadConstant(1, Smi::Handle(Smi::New(4))); | 638 __ LoadConstant(1, Smi::Handle(Smi::New(4))); |
| 721 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 639 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 722 __ Mod(2, 0, 1); | 640 __ Mod(2, 0, 1); |
| 723 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); | 641 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); |
| 724 __ Return(2); | 642 __ Return(2); |
| 725 } | 643 } |
| 726 | 644 |
| 727 | |
| 728 ASSEMBLER_TEST_RUN(ModNegPos, test) { | 645 ASSEMBLER_TEST_RUN(ModNegPos, test) { |
| 729 EXPECT_EQ(2, EXECUTE_TEST_CODE_INTPTR(test->code())); | 646 EXPECT_EQ(2, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 730 } | 647 } |
| 731 | 648 |
| 732 | |
| 733 ASSEMBLER_TEST_GENERATE(ModPosNeg, assembler) { | 649 ASSEMBLER_TEST_GENERATE(ModPosNeg, assembler) { |
| 734 __ Frame(3); | 650 __ Frame(3); |
| 735 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 651 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 736 __ LoadConstant(1, Smi::Handle(Smi::New(-4))); | 652 __ LoadConstant(1, Smi::Handle(Smi::New(-4))); |
| 737 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 653 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 738 __ Mod(2, 0, 1); | 654 __ Mod(2, 0, 1); |
| 739 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); | 655 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); |
| 740 __ Return(2); | 656 __ Return(2); |
| 741 } | 657 } |
| 742 | 658 |
| 743 | |
| 744 ASSEMBLER_TEST_RUN(ModPosNeg, test) { | 659 ASSEMBLER_TEST_RUN(ModPosNeg, test) { |
| 745 EXPECT_EQ(2, EXECUTE_TEST_CODE_INTPTR(test->code())); | 660 EXPECT_EQ(2, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 746 } | 661 } |
| 747 | 662 |
| 748 | |
| 749 ASSEMBLER_TEST_GENERATE(ModZero, assembler) { | 663 ASSEMBLER_TEST_GENERATE(ModZero, assembler) { |
| 750 __ Frame(3); | 664 __ Frame(3); |
| 751 __ LoadConstant(0, Smi::Handle(Smi::New(3))); | 665 __ LoadConstant(0, Smi::Handle(Smi::New(3))); |
| 752 __ LoadConstant(1, Smi::Handle(Smi::New(0))); | 666 __ LoadConstant(1, Smi::Handle(Smi::New(0))); |
| 753 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 667 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 754 __ Mod(2, 0, 1); | 668 __ Mod(2, 0, 1); |
| 755 __ LoadConstant(2, Smi::Handle(Smi::New(42))); | 669 __ LoadConstant(2, Smi::Handle(Smi::New(42))); |
| 756 __ Return(2); | 670 __ Return(2); |
| 757 } | 671 } |
| 758 | 672 |
| 759 | |
| 760 ASSEMBLER_TEST_RUN(ModZero, test) { | 673 ASSEMBLER_TEST_RUN(ModZero, test) { |
| 761 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 674 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 762 } | 675 } |
| 763 | 676 |
| 764 | |
| 765 ASSEMBLER_TEST_GENERATE(ShlNoDeopt, assembler) { | 677 ASSEMBLER_TEST_GENERATE(ShlNoDeopt, assembler) { |
| 766 __ Frame(3); | 678 __ Frame(3); |
| 767 __ LoadConstant(0, Smi::Handle(Smi::New(21))); | 679 __ LoadConstant(0, Smi::Handle(Smi::New(21))); |
| 768 __ LoadConstant(1, Smi::Handle(Smi::New(1))); | 680 __ LoadConstant(1, Smi::Handle(Smi::New(1))); |
| 769 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 681 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 770 __ Shl(2, 0, 1); | 682 __ Shl(2, 0, 1); |
| 771 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); | 683 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); |
| 772 __ Return(2); | 684 __ Return(2); |
| 773 } | 685 } |
| 774 | 686 |
| 775 | |
| 776 ASSEMBLER_TEST_RUN(ShlNoDeopt, test) { | 687 ASSEMBLER_TEST_RUN(ShlNoDeopt, test) { |
| 777 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 688 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 778 } | 689 } |
| 779 | 690 |
| 780 | |
| 781 ASSEMBLER_TEST_GENERATE(ShlOverflow, assembler) { | 691 ASSEMBLER_TEST_GENERATE(ShlOverflow, assembler) { |
| 782 __ Frame(3); | 692 __ Frame(3); |
| 783 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMaxValue))); | 693 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMaxValue))); |
| 784 __ LoadConstant(1, Smi::Handle(Smi::New(1))); | 694 __ LoadConstant(1, Smi::Handle(Smi::New(1))); |
| 785 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 695 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 786 __ Shl(2, 0, 1); | 696 __ Shl(2, 0, 1); |
| 787 __ LoadConstant(2, Smi::Handle(Smi::New(42))); | 697 __ LoadConstant(2, Smi::Handle(Smi::New(42))); |
| 788 __ Return(2); | 698 __ Return(2); |
| 789 } | 699 } |
| 790 | 700 |
| 791 | |
| 792 ASSEMBLER_TEST_RUN(ShlOverflow, test) { | 701 ASSEMBLER_TEST_RUN(ShlOverflow, test) { |
| 793 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 702 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 794 } | 703 } |
| 795 | 704 |
| 796 | |
| 797 ASSEMBLER_TEST_GENERATE(ShlNegShift, assembler) { | 705 ASSEMBLER_TEST_GENERATE(ShlNegShift, assembler) { |
| 798 __ Frame(3); | 706 __ Frame(3); |
| 799 __ LoadConstant(0, Smi::Handle(Smi::New(21))); | 707 __ LoadConstant(0, Smi::Handle(Smi::New(21))); |
| 800 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 708 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 801 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 709 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 802 __ Shl(2, 0, 1); | 710 __ Shl(2, 0, 1); |
| 803 __ LoadConstant(2, Smi::Handle(Smi::New(42))); | 711 __ LoadConstant(2, Smi::Handle(Smi::New(42))); |
| 804 __ Return(2); | 712 __ Return(2); |
| 805 } | 713 } |
| 806 | 714 |
| 807 | |
| 808 ASSEMBLER_TEST_RUN(ShlNegShift, test) { | 715 ASSEMBLER_TEST_RUN(ShlNegShift, test) { |
| 809 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 716 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 810 } | 717 } |
| 811 | 718 |
| 812 | |
| 813 ASSEMBLER_TEST_GENERATE(ShrNoDeopt, assembler) { | 719 ASSEMBLER_TEST_GENERATE(ShrNoDeopt, assembler) { |
| 814 __ Frame(3); | 720 __ Frame(3); |
| 815 __ LoadConstant(0, Smi::Handle(Smi::New(84))); | 721 __ LoadConstant(0, Smi::Handle(Smi::New(84))); |
| 816 __ LoadConstant(1, Smi::Handle(Smi::New(1))); | 722 __ LoadConstant(1, Smi::Handle(Smi::New(1))); |
| 817 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 723 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 818 __ Shr(2, 0, 1); | 724 __ Shr(2, 0, 1); |
| 819 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); | 725 __ LoadConstant(2, Smi::Handle(Smi::New(-42))); |
| 820 __ Return(2); | 726 __ Return(2); |
| 821 } | 727 } |
| 822 | 728 |
| 823 | |
| 824 ASSEMBLER_TEST_RUN(ShrNoDeopt, test) { | 729 ASSEMBLER_TEST_RUN(ShrNoDeopt, test) { |
| 825 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 730 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 826 } | 731 } |
| 827 | 732 |
| 828 | |
| 829 ASSEMBLER_TEST_GENERATE(ShrNegShift, assembler) { | 733 ASSEMBLER_TEST_GENERATE(ShrNegShift, assembler) { |
| 830 __ Frame(3); | 734 __ Frame(3); |
| 831 __ LoadConstant(0, Smi::Handle(Smi::New(21))); | 735 __ LoadConstant(0, Smi::Handle(Smi::New(21))); |
| 832 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 736 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 833 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 737 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 834 __ Shr(2, 0, 1); | 738 __ Shr(2, 0, 1); |
| 835 __ LoadConstant(2, Smi::Handle(Smi::New(42))); | 739 __ LoadConstant(2, Smi::Handle(Smi::New(42))); |
| 836 __ Return(2); | 740 __ Return(2); |
| 837 } | 741 } |
| 838 | 742 |
| 839 | |
| 840 ASSEMBLER_TEST_RUN(ShrNegShift, test) { | 743 ASSEMBLER_TEST_RUN(ShrNegShift, test) { |
| 841 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 744 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 842 } | 745 } |
| 843 | 746 |
| 844 | |
| 845 // - Neg rA , rD | 747 // - Neg rA , rD |
| 846 // | 748 // |
| 847 // FP[rA] <- -FP[rD]. Assumes FP[rD] is a Smi. If there is no overflow the | 749 // FP[rA] <- -FP[rD]. Assumes FP[rD] is a Smi. If there is no overflow the |
| 848 // immediately following instruction is skipped. | 750 // immediately following instruction is skipped. |
| 849 ASSEMBLER_TEST_GENERATE(NegPos, assembler) { | 751 ASSEMBLER_TEST_GENERATE(NegPos, assembler) { |
| 850 __ Frame(2); | 752 __ Frame(2); |
| 851 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 753 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 852 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 754 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 853 __ Neg(1, 0); | 755 __ Neg(1, 0); |
| 854 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 756 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 855 __ Return(1); | 757 __ Return(1); |
| 856 } | 758 } |
| 857 | 759 |
| 858 | |
| 859 ASSEMBLER_TEST_RUN(NegPos, test) { | 760 ASSEMBLER_TEST_RUN(NegPos, test) { |
| 860 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 761 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 861 } | 762 } |
| 862 | 763 |
| 863 | |
| 864 ASSEMBLER_TEST_GENERATE(NegNeg, assembler) { | 764 ASSEMBLER_TEST_GENERATE(NegNeg, assembler) { |
| 865 __ Frame(2); | 765 __ Frame(2); |
| 866 __ LoadConstant(0, Smi::Handle(Smi::New(-42))); | 766 __ LoadConstant(0, Smi::Handle(Smi::New(-42))); |
| 867 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 767 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 868 __ Neg(1, 0); | 768 __ Neg(1, 0); |
| 869 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 769 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 870 __ Return(1); | 770 __ Return(1); |
| 871 } | 771 } |
| 872 | 772 |
| 873 | |
| 874 ASSEMBLER_TEST_RUN(NegNeg, test) { | 773 ASSEMBLER_TEST_RUN(NegNeg, test) { |
| 875 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 774 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 876 } | 775 } |
| 877 | 776 |
| 878 | |
| 879 ASSEMBLER_TEST_GENERATE(NegOverflow, assembler) { | 777 ASSEMBLER_TEST_GENERATE(NegOverflow, assembler) { |
| 880 __ Frame(2); | 778 __ Frame(2); |
| 881 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMinValue))); | 779 __ LoadConstant(0, Smi::Handle(Smi::New(Smi::kMinValue))); |
| 882 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 780 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 883 __ Neg(1, 0); | 781 __ Neg(1, 0); |
| 884 __ LoadConstant(1, Smi::Handle(Smi::New(42))); | 782 __ LoadConstant(1, Smi::Handle(Smi::New(42))); |
| 885 __ Return(1); | 783 __ Return(1); |
| 886 } | 784 } |
| 887 | 785 |
| 888 | |
| 889 ASSEMBLER_TEST_RUN(NegOverflow, test) { | 786 ASSEMBLER_TEST_RUN(NegOverflow, test) { |
| 890 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 787 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 891 } | 788 } |
| 892 | 789 |
| 893 | |
| 894 // - BitOr, BitAnd, BitXor rA, rB, rC | 790 // - BitOr, BitAnd, BitXor rA, rB, rC |
| 895 // | 791 // |
| 896 // FP[rA] <- FP[rB] op FP[rC] | 792 // FP[rA] <- FP[rB] op FP[rC] |
| 897 ASSEMBLER_TEST_GENERATE(BitOr, assembler) { | 793 ASSEMBLER_TEST_GENERATE(BitOr, assembler) { |
| 898 __ Frame(3); | 794 __ Frame(3); |
| 899 __ LoadConstant(0, Smi::Handle(Smi::New(0x2))); | 795 __ LoadConstant(0, Smi::Handle(Smi::New(0x2))); |
| 900 __ LoadConstant(1, Smi::Handle(Smi::New(0x28))); | 796 __ LoadConstant(1, Smi::Handle(Smi::New(0x28))); |
| 901 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 797 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 902 __ BitOr(2, 0, 1); | 798 __ BitOr(2, 0, 1); |
| 903 __ Return(2); | 799 __ Return(2); |
| 904 } | 800 } |
| 905 | 801 |
| 906 | |
| 907 ASSEMBLER_TEST_RUN(BitOr, test) { | 802 ASSEMBLER_TEST_RUN(BitOr, test) { |
| 908 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 803 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 909 } | 804 } |
| 910 | 805 |
| 911 | |
| 912 ASSEMBLER_TEST_GENERATE(BitAnd, assembler) { | 806 ASSEMBLER_TEST_GENERATE(BitAnd, assembler) { |
| 913 __ Frame(3); | 807 __ Frame(3); |
| 914 __ LoadConstant(0, Smi::Handle(Smi::New(0x2b))); | 808 __ LoadConstant(0, Smi::Handle(Smi::New(0x2b))); |
| 915 __ LoadConstant(1, Smi::Handle(Smi::New(0x6a))); | 809 __ LoadConstant(1, Smi::Handle(Smi::New(0x6a))); |
| 916 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 810 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 917 __ BitAnd(2, 0, 1); | 811 __ BitAnd(2, 0, 1); |
| 918 __ Return(2); | 812 __ Return(2); |
| 919 } | 813 } |
| 920 | 814 |
| 921 | |
| 922 ASSEMBLER_TEST_RUN(BitAnd, test) { | 815 ASSEMBLER_TEST_RUN(BitAnd, test) { |
| 923 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 816 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 924 } | 817 } |
| 925 | 818 |
| 926 | |
| 927 ASSEMBLER_TEST_GENERATE(BitXor, assembler) { | 819 ASSEMBLER_TEST_GENERATE(BitXor, assembler) { |
| 928 __ Frame(3); | 820 __ Frame(3); |
| 929 __ LoadConstant(0, Smi::Handle(Smi::New(0x37))); | 821 __ LoadConstant(0, Smi::Handle(Smi::New(0x37))); |
| 930 __ LoadConstant(1, Smi::Handle(Smi::New(0x1d))); | 822 __ LoadConstant(1, Smi::Handle(Smi::New(0x1d))); |
| 931 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); | 823 __ LoadConstant(2, Smi::Handle(Smi::New(-1))); |
| 932 __ BitXor(2, 0, 1); | 824 __ BitXor(2, 0, 1); |
| 933 __ Return(2); | 825 __ Return(2); |
| 934 } | 826 } |
| 935 | 827 |
| 936 | |
| 937 ASSEMBLER_TEST_RUN(BitXor, test) { | 828 ASSEMBLER_TEST_RUN(BitXor, test) { |
| 938 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 829 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 939 } | 830 } |
| 940 | 831 |
| 941 | |
| 942 // - BitNot rA, rD | 832 // - BitNot rA, rD |
| 943 // | 833 // |
| 944 // FP[rA] <- ~FP[rD]. As above, assumes FP[rD] is a Smi. | 834 // FP[rA] <- ~FP[rD]. As above, assumes FP[rD] is a Smi. |
| 945 ASSEMBLER_TEST_GENERATE(BitNot, assembler) { | 835 ASSEMBLER_TEST_GENERATE(BitNot, assembler) { |
| 946 __ Frame(2); | 836 __ Frame(2); |
| 947 __ LoadConstant(0, Smi::Handle(Smi::New(~42))); | 837 __ LoadConstant(0, Smi::Handle(Smi::New(~42))); |
| 948 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 838 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 949 __ BitNot(1, 0); | 839 __ BitNot(1, 0); |
| 950 __ Return(1); | 840 __ Return(1); |
| 951 } | 841 } |
| 952 | 842 |
| 953 | |
| 954 ASSEMBLER_TEST_RUN(BitNot, test) { | 843 ASSEMBLER_TEST_RUN(BitNot, test) { |
| 955 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 844 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 956 } | 845 } |
| 957 | 846 |
| 958 // - IfNeStrictTOS; IfEqStrictTOS; IfNeStrictNumTOS; IfEqStrictNumTOS | 847 // - IfNeStrictTOS; IfEqStrictTOS; IfNeStrictNumTOS; IfEqStrictNumTOS |
| 959 // | 848 // |
| 960 // Skips the next instruction unless the given condition holds. 'Num' | 849 // Skips the next instruction unless the given condition holds. 'Num' |
| 961 // variants perform number check while non-Num variants just compare | 850 // variants perform number check while non-Num variants just compare |
| 962 // RawObject pointers. | 851 // RawObject pointers. |
| 963 // | 852 // |
| 964 // Used to implement conditional jump: | 853 // Used to implement conditional jump: |
| 965 // | 854 // |
| 966 // IfNeStrictTOS | 855 // IfNeStrictTOS |
| 967 // Jump T ;; jump if not equal | 856 // Jump T ;; jump if not equal |
| 968 ASSEMBLER_TEST_GENERATE(IfNeStrictTOSTaken, assembler) { | 857 ASSEMBLER_TEST_GENERATE(IfNeStrictTOSTaken, assembler) { |
| 969 Label branch_taken; | 858 Label branch_taken; |
| 970 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld)); | 859 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld)); |
| 971 const Array& array2 = Array::Handle(Array::New(2, Heap::kOld)); | 860 const Array& array2 = Array::Handle(Array::New(2, Heap::kOld)); |
| 972 __ PushConstant(array1); | 861 __ PushConstant(array1); |
| 973 __ PushConstant(array2); | 862 __ PushConstant(array2); |
| 974 __ IfNeStrictTOS(); | 863 __ IfNeStrictTOS(); |
| 975 __ Jump(&branch_taken); | 864 __ Jump(&branch_taken); |
| 976 __ PushConstant(Smi::Handle(Smi::New(0))); | 865 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 977 __ ReturnTOS(); | 866 __ ReturnTOS(); |
| 978 __ Bind(&branch_taken); | 867 __ Bind(&branch_taken); |
| 979 __ PushConstant(Smi::Handle(Smi::New(42))); | 868 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 980 __ ReturnTOS(); | 869 __ ReturnTOS(); |
| 981 } | 870 } |
| 982 | 871 |
| 983 | |
| 984 ASSEMBLER_TEST_RUN(IfNeStrictTOSTaken, test) { | 872 ASSEMBLER_TEST_RUN(IfNeStrictTOSTaken, test) { |
| 985 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 873 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 986 } | 874 } |
| 987 | 875 |
| 988 | |
| 989 ASSEMBLER_TEST_GENERATE(IfNeStrictTOSNotTaken, assembler) { | 876 ASSEMBLER_TEST_GENERATE(IfNeStrictTOSNotTaken, assembler) { |
| 990 Label branch_taken; | 877 Label branch_taken; |
| 991 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld)); | 878 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld)); |
| 992 __ PushConstant(array1); | 879 __ PushConstant(array1); |
| 993 __ PushConstant(array1); | 880 __ PushConstant(array1); |
| 994 __ IfNeStrictTOS(); | 881 __ IfNeStrictTOS(); |
| 995 __ Jump(&branch_taken); | 882 __ Jump(&branch_taken); |
| 996 __ PushConstant(Smi::Handle(Smi::New(42))); | 883 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 997 __ ReturnTOS(); | 884 __ ReturnTOS(); |
| 998 __ Bind(&branch_taken); | 885 __ Bind(&branch_taken); |
| 999 __ PushConstant(Smi::Handle(Smi::New(0))); | 886 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 1000 __ ReturnTOS(); | 887 __ ReturnTOS(); |
| 1001 } | 888 } |
| 1002 | 889 |
| 1003 ASSEMBLER_TEST_RUN(IfNeStrictTOSNotTaken, test) { | 890 ASSEMBLER_TEST_RUN(IfNeStrictTOSNotTaken, test) { |
| 1004 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 891 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1005 } | 892 } |
| 1006 | 893 |
| 1007 | |
| 1008 // TODO(zra): Also add tests that use Mint, Bignum. | 894 // TODO(zra): Also add tests that use Mint, Bignum. |
| 1009 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSTaken, assembler) { | 895 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSTaken, assembler) { |
| 1010 Label branch_taken; | 896 Label branch_taken; |
| 1011 __ PushConstant(Smi::Handle(Smi::New(-1))); | 897 __ PushConstant(Smi::Handle(Smi::New(-1))); |
| 1012 __ PushConstant(Smi::Handle(Smi::New(1))); | 898 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 1013 __ IfNeStrictNumTOS(); | 899 __ IfNeStrictNumTOS(); |
| 1014 __ Jump(&branch_taken); | 900 __ Jump(&branch_taken); |
| 1015 __ PushConstant(Smi::Handle(Smi::New(0))); | 901 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 1016 __ ReturnTOS(); | 902 __ ReturnTOS(); |
| 1017 __ Bind(&branch_taken); | 903 __ Bind(&branch_taken); |
| 1018 __ PushConstant(Smi::Handle(Smi::New(42))); | 904 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 1019 __ ReturnTOS(); | 905 __ ReturnTOS(); |
| 1020 } | 906 } |
| 1021 | 907 |
| 1022 | |
| 1023 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSTaken, test) { | 908 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSTaken, test) { |
| 1024 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 909 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1025 } | 910 } |
| 1026 | 911 |
| 1027 | |
| 1028 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSNotTaken, assembler) { | 912 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSNotTaken, assembler) { |
| 1029 Label branch_taken; | 913 Label branch_taken; |
| 1030 __ PushConstant(Smi::Handle(Smi::New(1))); | 914 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 1031 __ PushConstant(Smi::Handle(Smi::New(1))); | 915 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 1032 __ IfNeStrictNumTOS(); | 916 __ IfNeStrictNumTOS(); |
| 1033 __ Jump(&branch_taken); | 917 __ Jump(&branch_taken); |
| 1034 __ PushConstant(Smi::Handle(Smi::New(42))); | 918 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 1035 __ ReturnTOS(); | 919 __ ReturnTOS(); |
| 1036 __ Bind(&branch_taken); | 920 __ Bind(&branch_taken); |
| 1037 __ PushConstant(Smi::Handle(Smi::New(0))); | 921 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 1038 __ ReturnTOS(); | 922 __ ReturnTOS(); |
| 1039 } | 923 } |
| 1040 | 924 |
| 1041 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSNotTaken, test) { | 925 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSNotTaken, test) { |
| 1042 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 926 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1043 } | 927 } |
| 1044 | 928 |
| 1045 | |
| 1046 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSTakenDouble, assembler) { | 929 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSTakenDouble, assembler) { |
| 1047 Label branch_taken; | 930 Label branch_taken; |
| 1048 __ PushConstant(Double::Handle(Double::New(-1.0, Heap::kOld))); | 931 __ PushConstant(Double::Handle(Double::New(-1.0, Heap::kOld))); |
| 1049 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); | 932 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); |
| 1050 __ IfNeStrictNumTOS(); | 933 __ IfNeStrictNumTOS(); |
| 1051 __ Jump(&branch_taken); | 934 __ Jump(&branch_taken); |
| 1052 __ PushConstant(Smi::Handle(Smi::New(0))); | 935 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 1053 __ ReturnTOS(); | 936 __ ReturnTOS(); |
| 1054 __ Bind(&branch_taken); | 937 __ Bind(&branch_taken); |
| 1055 __ PushConstant(Smi::Handle(Smi::New(42))); | 938 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 1056 __ ReturnTOS(); | 939 __ ReturnTOS(); |
| 1057 } | 940 } |
| 1058 | 941 |
| 1059 | |
| 1060 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSTakenDouble, test) { | 942 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSTakenDouble, test) { |
| 1061 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 943 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1062 } | 944 } |
| 1063 | 945 |
| 1064 | |
| 1065 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSNotTakenDouble, assembler) { | 946 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSNotTakenDouble, assembler) { |
| 1066 Label branch_taken; | 947 Label branch_taken; |
| 1067 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); | 948 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); |
| 1068 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); | 949 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); |
| 1069 __ IfNeStrictNumTOS(); | 950 __ IfNeStrictNumTOS(); |
| 1070 __ Jump(&branch_taken); | 951 __ Jump(&branch_taken); |
| 1071 __ PushConstant(Smi::Handle(Smi::New(42))); | 952 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 1072 __ ReturnTOS(); | 953 __ ReturnTOS(); |
| 1073 __ Bind(&branch_taken); | 954 __ Bind(&branch_taken); |
| 1074 __ PushConstant(Smi::Handle(Smi::New(0))); | 955 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 1075 __ ReturnTOS(); | 956 __ ReturnTOS(); |
| 1076 } | 957 } |
| 1077 | 958 |
| 1078 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSNotTakenDouble, test) { | 959 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSNotTakenDouble, test) { |
| 1079 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 960 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1080 } | 961 } |
| 1081 | 962 |
| 1082 | |
| 1083 ASSEMBLER_TEST_GENERATE(IfEqStrictTOSTaken, assembler) { | 963 ASSEMBLER_TEST_GENERATE(IfEqStrictTOSTaken, assembler) { |
| 1084 Label branch_taken; | 964 Label branch_taken; |
| 1085 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld)); | 965 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld)); |
| 1086 __ PushConstant(array1); | 966 __ PushConstant(array1); |
| 1087 __ PushConstant(array1); | 967 __ PushConstant(array1); |
| 1088 __ IfEqStrictTOS(); | 968 __ IfEqStrictTOS(); |
| 1089 __ Jump(&branch_taken); | 969 __ Jump(&branch_taken); |
| 1090 __ PushConstant(Smi::Handle(Smi::New(0))); | 970 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 1091 __ ReturnTOS(); | 971 __ ReturnTOS(); |
| 1092 __ Bind(&branch_taken); | 972 __ Bind(&branch_taken); |
| 1093 __ PushConstant(Smi::Handle(Smi::New(42))); | 973 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 1094 __ ReturnTOS(); | 974 __ ReturnTOS(); |
| 1095 } | 975 } |
| 1096 | 976 |
| 1097 | |
| 1098 ASSEMBLER_TEST_RUN(IfEqStrictTOSTaken, test) { | 977 ASSEMBLER_TEST_RUN(IfEqStrictTOSTaken, test) { |
| 1099 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 978 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1100 } | 979 } |
| 1101 | 980 |
| 1102 | |
| 1103 ASSEMBLER_TEST_GENERATE(IfEqStrictTOSNotTaken, assembler) { | 981 ASSEMBLER_TEST_GENERATE(IfEqStrictTOSNotTaken, assembler) { |
| 1104 Label branch_taken; | 982 Label branch_taken; |
| 1105 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld)); | 983 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld)); |
| 1106 const Array& array2 = Array::Handle(Array::New(2, Heap::kOld)); | 984 const Array& array2 = Array::Handle(Array::New(2, Heap::kOld)); |
| 1107 __ PushConstant(array1); | 985 __ PushConstant(array1); |
| 1108 __ PushConstant(array2); | 986 __ PushConstant(array2); |
| 1109 __ IfEqStrictTOS(); | 987 __ IfEqStrictTOS(); |
| 1110 __ Jump(&branch_taken); | 988 __ Jump(&branch_taken); |
| 1111 __ PushConstant(Smi::Handle(Smi::New(42))); | 989 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 1112 __ ReturnTOS(); | 990 __ ReturnTOS(); |
| 1113 __ Bind(&branch_taken); | 991 __ Bind(&branch_taken); |
| 1114 __ PushConstant(Smi::Handle(Smi::New(0))); | 992 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 1115 __ ReturnTOS(); | 993 __ ReturnTOS(); |
| 1116 } | 994 } |
| 1117 | 995 |
| 1118 ASSEMBLER_TEST_RUN(IfEqStrictTOSNotTaken, test) { | 996 ASSEMBLER_TEST_RUN(IfEqStrictTOSNotTaken, test) { |
| 1119 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 997 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1120 } | 998 } |
| 1121 | 999 |
| 1122 | |
| 1123 // TODO(zra): Also add tests that use Mint, Bignum. | 1000 // TODO(zra): Also add tests that use Mint, Bignum. |
| 1124 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSTaken, assembler) { | 1001 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSTaken, assembler) { |
| 1125 Label branch_taken; | 1002 Label branch_taken; |
| 1126 __ PushConstant(Smi::Handle(Smi::New(1))); | 1003 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 1127 __ PushConstant(Smi::Handle(Smi::New(1))); | 1004 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 1128 __ IfEqStrictNumTOS(); | 1005 __ IfEqStrictNumTOS(); |
| 1129 __ Jump(&branch_taken); | 1006 __ Jump(&branch_taken); |
| 1130 __ PushConstant(Smi::Handle(Smi::New(0))); | 1007 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 1131 __ ReturnTOS(); | 1008 __ ReturnTOS(); |
| 1132 __ Bind(&branch_taken); | 1009 __ Bind(&branch_taken); |
| 1133 __ PushConstant(Smi::Handle(Smi::New(42))); | 1010 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 1134 __ ReturnTOS(); | 1011 __ ReturnTOS(); |
| 1135 } | 1012 } |
| 1136 | 1013 |
| 1137 | |
| 1138 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSTaken, test) { | 1014 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSTaken, test) { |
| 1139 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1015 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1140 } | 1016 } |
| 1141 | 1017 |
| 1142 | |
| 1143 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSNotTaken, assembler) { | 1018 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSNotTaken, assembler) { |
| 1144 Label branch_taken; | 1019 Label branch_taken; |
| 1145 __ PushConstant(Smi::Handle(Smi::New(-1))); | 1020 __ PushConstant(Smi::Handle(Smi::New(-1))); |
| 1146 __ PushConstant(Smi::Handle(Smi::New(1))); | 1021 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 1147 __ IfEqStrictNumTOS(); | 1022 __ IfEqStrictNumTOS(); |
| 1148 __ Jump(&branch_taken); | 1023 __ Jump(&branch_taken); |
| 1149 __ PushConstant(Smi::Handle(Smi::New(42))); | 1024 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 1150 __ ReturnTOS(); | 1025 __ ReturnTOS(); |
| 1151 __ Bind(&branch_taken); | 1026 __ Bind(&branch_taken); |
| 1152 __ PushConstant(Smi::Handle(Smi::New(0))); | 1027 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 1153 __ ReturnTOS(); | 1028 __ ReturnTOS(); |
| 1154 } | 1029 } |
| 1155 | 1030 |
| 1156 | |
| 1157 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSNotTaken, test) { | 1031 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSNotTaken, test) { |
| 1158 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1032 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1159 } | 1033 } |
| 1160 | 1034 |
| 1161 | |
| 1162 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSTakenDouble, assembler) { | 1035 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSTakenDouble, assembler) { |
| 1163 Label branch_taken; | 1036 Label branch_taken; |
| 1164 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); | 1037 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); |
| 1165 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); | 1038 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); |
| 1166 __ IfEqStrictNumTOS(); | 1039 __ IfEqStrictNumTOS(); |
| 1167 __ Jump(&branch_taken); | 1040 __ Jump(&branch_taken); |
| 1168 __ PushConstant(Smi::Handle(Smi::New(0))); | 1041 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 1169 __ ReturnTOS(); | 1042 __ ReturnTOS(); |
| 1170 __ Bind(&branch_taken); | 1043 __ Bind(&branch_taken); |
| 1171 __ PushConstant(Smi::Handle(Smi::New(42))); | 1044 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 1172 __ ReturnTOS(); | 1045 __ ReturnTOS(); |
| 1173 } | 1046 } |
| 1174 | 1047 |
| 1175 | |
| 1176 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSTakenDouble, test) { | 1048 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSTakenDouble, test) { |
| 1177 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1049 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1178 } | 1050 } |
| 1179 | 1051 |
| 1180 | |
| 1181 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSNotTakenDouble, assembler) { | 1052 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSNotTakenDouble, assembler) { |
| 1182 Label branch_taken; | 1053 Label branch_taken; |
| 1183 __ PushConstant(Double::Handle(Double::New(-1.0, Heap::kOld))); | 1054 __ PushConstant(Double::Handle(Double::New(-1.0, Heap::kOld))); |
| 1184 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); | 1055 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld))); |
| 1185 __ IfEqStrictNumTOS(); | 1056 __ IfEqStrictNumTOS(); |
| 1186 __ Jump(&branch_taken); | 1057 __ Jump(&branch_taken); |
| 1187 __ PushConstant(Smi::Handle(Smi::New(42))); | 1058 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 1188 __ ReturnTOS(); | 1059 __ ReturnTOS(); |
| 1189 __ Bind(&branch_taken); | 1060 __ Bind(&branch_taken); |
| 1190 __ PushConstant(Smi::Handle(Smi::New(0))); | 1061 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 1191 __ ReturnTOS(); | 1062 __ ReturnTOS(); |
| 1192 } | 1063 } |
| 1193 | 1064 |
| 1194 | |
| 1195 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSNotTakenDouble, test) { | 1065 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSNotTakenDouble, test) { |
| 1196 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1066 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1197 } | 1067 } |
| 1198 | 1068 |
| 1199 | |
| 1200 // - BooleanNegateTOS | 1069 // - BooleanNegateTOS |
| 1201 // | 1070 // |
| 1202 // SP[0] = !SP[0] | 1071 // SP[0] = !SP[0] |
| 1203 ASSEMBLER_TEST_GENERATE(BooleanNegateTOSTrue, assembler) { | 1072 ASSEMBLER_TEST_GENERATE(BooleanNegateTOSTrue, assembler) { |
| 1204 __ PushConstant(Bool::True()); | 1073 __ PushConstant(Bool::True()); |
| 1205 __ BooleanNegateTOS(); | 1074 __ BooleanNegateTOS(); |
| 1206 __ ReturnTOS(); | 1075 __ ReturnTOS(); |
| 1207 } | 1076 } |
| 1208 | 1077 |
| 1209 | |
| 1210 ASSEMBLER_TEST_RUN(BooleanNegateTOSTrue, test) { | 1078 ASSEMBLER_TEST_RUN(BooleanNegateTOSTrue, test) { |
| 1211 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); | 1079 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); |
| 1212 } | 1080 } |
| 1213 | 1081 |
| 1214 | |
| 1215 ASSEMBLER_TEST_GENERATE(BooleanNegateTOSFalse, assembler) { | 1082 ASSEMBLER_TEST_GENERATE(BooleanNegateTOSFalse, assembler) { |
| 1216 __ PushConstant(Bool::False()); | 1083 __ PushConstant(Bool::False()); |
| 1217 __ BooleanNegateTOS(); | 1084 __ BooleanNegateTOS(); |
| 1218 __ ReturnTOS(); | 1085 __ ReturnTOS(); |
| 1219 } | 1086 } |
| 1220 | 1087 |
| 1221 | |
| 1222 ASSEMBLER_TEST_RUN(BooleanNegateTOSFalse, test) { | 1088 ASSEMBLER_TEST_RUN(BooleanNegateTOSFalse, test) { |
| 1223 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); | 1089 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 1224 } | 1090 } |
| 1225 | 1091 |
| 1226 | |
| 1227 // - AssertBoolean A | 1092 // - AssertBoolean A |
| 1228 // | 1093 // |
| 1229 // Assert that TOS is a boolean (A = 1) or that TOS is not null (A = 0). | 1094 // Assert that TOS is a boolean (A = 1) or that TOS is not null (A = 0). |
| 1230 ASSEMBLER_TEST_GENERATE(AssertBooleanTrue, assembler) { | 1095 ASSEMBLER_TEST_GENERATE(AssertBooleanTrue, assembler) { |
| 1231 __ PushConstant(Bool::True()); | 1096 __ PushConstant(Bool::True()); |
| 1232 __ AssertBoolean(1); | 1097 __ AssertBoolean(1); |
| 1233 __ ReturnTOS(); | 1098 __ ReturnTOS(); |
| 1234 } | 1099 } |
| 1235 | 1100 |
| 1236 | |
| 1237 ASSEMBLER_TEST_RUN(AssertBooleanTrue, test) { | 1101 ASSEMBLER_TEST_RUN(AssertBooleanTrue, test) { |
| 1238 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); | 1102 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 1239 } | 1103 } |
| 1240 | 1104 |
| 1241 | |
| 1242 ASSEMBLER_TEST_GENERATE(AssertBooleanFalse, assembler) { | 1105 ASSEMBLER_TEST_GENERATE(AssertBooleanFalse, assembler) { |
| 1243 __ PushConstant(Bool::False()); | 1106 __ PushConstant(Bool::False()); |
| 1244 __ AssertBoolean(1); | 1107 __ AssertBoolean(1); |
| 1245 __ ReturnTOS(); | 1108 __ ReturnTOS(); |
| 1246 } | 1109 } |
| 1247 | 1110 |
| 1248 | |
| 1249 ASSEMBLER_TEST_RUN(AssertBooleanFalse, test) { | 1111 ASSEMBLER_TEST_RUN(AssertBooleanFalse, test) { |
| 1250 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); | 1112 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); |
| 1251 } | 1113 } |
| 1252 | 1114 |
| 1253 | |
| 1254 ASSEMBLER_TEST_GENERATE(AssertBooleanNotNull, assembler) { | 1115 ASSEMBLER_TEST_GENERATE(AssertBooleanNotNull, assembler) { |
| 1255 __ PushConstant(Bool::True()); | 1116 __ PushConstant(Bool::True()); |
| 1256 __ AssertBoolean(0); | 1117 __ AssertBoolean(0); |
| 1257 __ ReturnTOS(); | 1118 __ ReturnTOS(); |
| 1258 } | 1119 } |
| 1259 | 1120 |
| 1260 | |
| 1261 ASSEMBLER_TEST_RUN(AssertBooleanNotNull, test) { | 1121 ASSEMBLER_TEST_RUN(AssertBooleanNotNull, test) { |
| 1262 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); | 1122 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 1263 } | 1123 } |
| 1264 | 1124 |
| 1265 | |
| 1266 ASSEMBLER_TEST_GENERATE(AssertBooleanFail1, assembler) { | 1125 ASSEMBLER_TEST_GENERATE(AssertBooleanFail1, assembler) { |
| 1267 __ PushConstant(Smi::Handle(Smi::New(37))); | 1126 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1268 __ AssertBoolean(1); | 1127 __ AssertBoolean(1); |
| 1269 __ ReturnTOS(); | 1128 __ ReturnTOS(); |
| 1270 } | 1129 } |
| 1271 | 1130 |
| 1272 | |
| 1273 ASSEMBLER_TEST_RUN(AssertBooleanFail1, test) { | 1131 ASSEMBLER_TEST_RUN(AssertBooleanFail1, test) { |
| 1274 EXPECT(EXECUTE_TEST_CODE_OBJECT(test->code()).IsError()); | 1132 EXPECT(EXECUTE_TEST_CODE_OBJECT(test->code()).IsError()); |
| 1275 } | 1133 } |
| 1276 | 1134 |
| 1277 | |
| 1278 ASSEMBLER_TEST_GENERATE(AssertBooleanFail2, assembler) { | 1135 ASSEMBLER_TEST_GENERATE(AssertBooleanFail2, assembler) { |
| 1279 __ PushConstant(Object::null_object()); | 1136 __ PushConstant(Object::null_object()); |
| 1280 __ AssertBoolean(0); | 1137 __ AssertBoolean(0); |
| 1281 __ ReturnTOS(); | 1138 __ ReturnTOS(); |
| 1282 } | 1139 } |
| 1283 | 1140 |
| 1284 | |
| 1285 ASSEMBLER_TEST_RUN(AssertBooleanFail2, test) { | 1141 ASSEMBLER_TEST_RUN(AssertBooleanFail2, test) { |
| 1286 EXPECT(EXECUTE_TEST_CODE_OBJECT(test->code()).IsError()); | 1142 EXPECT(EXECUTE_TEST_CODE_OBJECT(test->code()).IsError()); |
| 1287 } | 1143 } |
| 1288 | 1144 |
| 1289 | |
| 1290 // - Drop1; DropR n; Drop n | 1145 // - Drop1; DropR n; Drop n |
| 1291 // | 1146 // |
| 1292 // Drop 1 or n values from the stack, if instruction is DropR push the first | 1147 // Drop 1 or n values from the stack, if instruction is DropR push the first |
| 1293 // dropped value to the stack; | 1148 // dropped value to the stack; |
| 1294 ASSEMBLER_TEST_GENERATE(Drop1, assembler) { | 1149 ASSEMBLER_TEST_GENERATE(Drop1, assembler) { |
| 1295 __ PushConstant(Smi::Handle(Smi::New(0))); | 1150 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 1296 __ PushConstant(Smi::Handle(Smi::New(42))); | 1151 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 1297 __ PushConstant(Smi::Handle(Smi::New(37))); | 1152 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1298 __ Drop1(); | 1153 __ Drop1(); |
| 1299 __ ReturnTOS(); | 1154 __ ReturnTOS(); |
| 1300 } | 1155 } |
| 1301 | 1156 |
| 1302 | |
| 1303 ASSEMBLER_TEST_RUN(Drop1, test) { | 1157 ASSEMBLER_TEST_RUN(Drop1, test) { |
| 1304 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1158 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1305 } | 1159 } |
| 1306 | 1160 |
| 1307 | |
| 1308 ASSEMBLER_TEST_GENERATE(Drop, assembler) { | 1161 ASSEMBLER_TEST_GENERATE(Drop, assembler) { |
| 1309 __ PushConstant(Smi::Handle(Smi::New(0))); | 1162 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 1310 __ PushConstant(Smi::Handle(Smi::New(42))); | 1163 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 1311 __ PushConstant(Smi::Handle(Smi::New(37))); | 1164 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1312 __ PushConstant(Smi::Handle(Smi::New(37))); | 1165 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1313 __ PushConstant(Smi::Handle(Smi::New(37))); | 1166 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1314 __ PushConstant(Smi::Handle(Smi::New(37))); | 1167 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1315 __ PushConstant(Smi::Handle(Smi::New(37))); | 1168 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1316 __ PushConstant(Smi::Handle(Smi::New(37))); | 1169 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1317 __ PushConstant(Smi::Handle(Smi::New(37))); | 1170 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1318 __ PushConstant(Smi::Handle(Smi::New(37))); | 1171 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1319 __ PushConstant(Smi::Handle(Smi::New(37))); | 1172 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1320 __ PushConstant(Smi::Handle(Smi::New(37))); | 1173 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1321 __ PushConstant(Smi::Handle(Smi::New(37))); | 1174 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1322 __ Drop(11); | 1175 __ Drop(11); |
| 1323 __ ReturnTOS(); | 1176 __ ReturnTOS(); |
| 1324 } | 1177 } |
| 1325 | 1178 |
| 1326 | |
| 1327 ASSEMBLER_TEST_RUN(Drop, test) { | 1179 ASSEMBLER_TEST_RUN(Drop, test) { |
| 1328 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1180 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1329 } | 1181 } |
| 1330 | 1182 |
| 1331 | |
| 1332 ASSEMBLER_TEST_GENERATE(DropR, assembler) { | 1183 ASSEMBLER_TEST_GENERATE(DropR, assembler) { |
| 1333 __ PushConstant(Smi::Handle(Smi::New(0))); | 1184 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 1334 __ PushConstant(Smi::Handle(Smi::New(1))); | 1185 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 1335 __ PushConstant(Smi::Handle(Smi::New(37))); | 1186 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1336 __ PushConstant(Smi::Handle(Smi::New(37))); | 1187 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1337 __ PushConstant(Smi::Handle(Smi::New(37))); | 1188 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1338 __ PushConstant(Smi::Handle(Smi::New(37))); | 1189 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1339 __ PushConstant(Smi::Handle(Smi::New(37))); | 1190 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1340 __ PushConstant(Smi::Handle(Smi::New(37))); | 1191 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1341 __ PushConstant(Smi::Handle(Smi::New(37))); | 1192 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1342 __ PushConstant(Smi::Handle(Smi::New(37))); | 1193 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1343 __ PushConstant(Smi::Handle(Smi::New(37))); | 1194 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1344 __ PushConstant(Smi::Handle(Smi::New(37))); | 1195 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1345 __ PushConstant(Smi::Handle(Smi::New(37))); | 1196 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1346 __ PushConstant(Smi::Handle(Smi::New(41))); | 1197 __ PushConstant(Smi::Handle(Smi::New(41))); |
| 1347 __ DropR(11); | 1198 __ DropR(11); |
| 1348 __ AddTOS(); | 1199 __ AddTOS(); |
| 1349 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); | 1200 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 1350 __ ReturnTOS(); | 1201 __ ReturnTOS(); |
| 1351 } | 1202 } |
| 1352 | 1203 |
| 1353 | |
| 1354 ASSEMBLER_TEST_RUN(DropR, test) { | 1204 ASSEMBLER_TEST_RUN(DropR, test) { |
| 1355 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1205 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1356 } | 1206 } |
| 1357 | 1207 |
| 1358 | |
| 1359 // - Frame D | 1208 // - Frame D |
| 1360 // | 1209 // |
| 1361 // Reserve and initialize with null space for D local variables. | 1210 // Reserve and initialize with null space for D local variables. |
| 1362 ASSEMBLER_TEST_GENERATE(FrameInitialized1, assembler) { | 1211 ASSEMBLER_TEST_GENERATE(FrameInitialized1, assembler) { |
| 1363 __ Frame(1); | 1212 __ Frame(1); |
| 1364 __ ReturnTOS(); | 1213 __ ReturnTOS(); |
| 1365 } | 1214 } |
| 1366 | 1215 |
| 1367 | |
| 1368 ASSEMBLER_TEST_RUN(FrameInitialized1, test) { | 1216 ASSEMBLER_TEST_RUN(FrameInitialized1, test) { |
| 1369 EXPECT(EXECUTE_TEST_CODE_OBJECT(test->code()).IsNull()); | 1217 EXPECT(EXECUTE_TEST_CODE_OBJECT(test->code()).IsNull()); |
| 1370 } | 1218 } |
| 1371 | 1219 |
| 1372 | |
| 1373 ASSEMBLER_TEST_GENERATE(FrameInitialized, assembler) { | 1220 ASSEMBLER_TEST_GENERATE(FrameInitialized, assembler) { |
| 1374 Label error; | 1221 Label error; |
| 1375 __ PushConstant(Smi::Handle(Smi::New(42))); | 1222 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 1376 __ Frame(4); | 1223 __ Frame(4); |
| 1377 __ PushConstant(Object::null_object()); | 1224 __ PushConstant(Object::null_object()); |
| 1378 __ IfNeStrictTOS(); | 1225 __ IfNeStrictTOS(); |
| 1379 __ Jump(&error); | 1226 __ Jump(&error); |
| 1380 __ PushConstant(Object::null_object()); | 1227 __ PushConstant(Object::null_object()); |
| 1381 __ IfNeStrictTOS(); | 1228 __ IfNeStrictTOS(); |
| 1382 __ Jump(&error); | 1229 __ Jump(&error); |
| 1383 __ PushConstant(Object::null_object()); | 1230 __ PushConstant(Object::null_object()); |
| 1384 __ IfNeStrictTOS(); | 1231 __ IfNeStrictTOS(); |
| 1385 __ Jump(&error); | 1232 __ Jump(&error); |
| 1386 __ PushConstant(Object::null_object()); | 1233 __ PushConstant(Object::null_object()); |
| 1387 __ IfNeStrictTOS(); | 1234 __ IfNeStrictTOS(); |
| 1388 __ Jump(&error); | 1235 __ Jump(&error); |
| 1389 __ ReturnTOS(); | 1236 __ ReturnTOS(); |
| 1390 | 1237 |
| 1391 // If a frame slot was not initialized to null. | 1238 // If a frame slot was not initialized to null. |
| 1392 __ Bind(&error); | 1239 __ Bind(&error); |
| 1393 __ PushConstant(Smi::Handle(Smi::New(0))); | 1240 __ PushConstant(Smi::Handle(Smi::New(0))); |
| 1394 __ ReturnTOS(); | 1241 __ ReturnTOS(); |
| 1395 } | 1242 } |
| 1396 | 1243 |
| 1397 | |
| 1398 ASSEMBLER_TEST_RUN(FrameInitialized, test) { | 1244 ASSEMBLER_TEST_RUN(FrameInitialized, test) { |
| 1399 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1245 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1400 } | 1246 } |
| 1401 | 1247 |
| 1402 | |
| 1403 // - StoreLocal rX; PopLocal rX | 1248 // - StoreLocal rX; PopLocal rX |
| 1404 // | 1249 // |
| 1405 // Store top of the stack into FP[rX] and pop it if needed. | 1250 // Store top of the stack into FP[rX] and pop it if needed. |
| 1406 // | 1251 // |
| 1407 // - Push rX | 1252 // - Push rX |
| 1408 // | 1253 // |
| 1409 // Push FP[rX] to the stack. | 1254 // Push FP[rX] to the stack. |
| 1410 ASSEMBLER_TEST_GENERATE(StoreLocalPush, assembler) { | 1255 ASSEMBLER_TEST_GENERATE(StoreLocalPush, assembler) { |
| 1411 __ Frame(1); | 1256 __ Frame(1); |
| 1412 __ PushConstant(Smi::Handle(Smi::New(37))); | 1257 __ PushConstant(Smi::Handle(Smi::New(37))); |
| 1413 __ PushConstant(Smi::Handle(Smi::New(21))); | 1258 __ PushConstant(Smi::Handle(Smi::New(21))); |
| 1414 __ StoreLocal(0); | 1259 __ StoreLocal(0); |
| 1415 __ Push(0); | 1260 __ Push(0); |
| 1416 __ AddTOS(); | 1261 __ AddTOS(); |
| 1417 // Should be skipped. | 1262 // Should be skipped. |
| 1418 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); | 1263 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 1419 __ ReturnTOS(); | 1264 __ ReturnTOS(); |
| 1420 } | 1265 } |
| 1421 | 1266 |
| 1422 | |
| 1423 ASSEMBLER_TEST_RUN(StoreLocalPush, test) { | 1267 ASSEMBLER_TEST_RUN(StoreLocalPush, test) { |
| 1424 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1268 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1425 } | 1269 } |
| 1426 | 1270 |
| 1427 | |
| 1428 ASSEMBLER_TEST_GENERATE(PopLocalPush, assembler) { | 1271 ASSEMBLER_TEST_GENERATE(PopLocalPush, assembler) { |
| 1429 __ Frame(1); | 1272 __ Frame(1); |
| 1430 __ PushConstant(Smi::Handle(Smi::New(21))); | 1273 __ PushConstant(Smi::Handle(Smi::New(21))); |
| 1431 __ PopLocal(0); | 1274 __ PopLocal(0); |
| 1432 __ Push(0); | 1275 __ Push(0); |
| 1433 __ Push(0); | 1276 __ Push(0); |
| 1434 __ AddTOS(); | 1277 __ AddTOS(); |
| 1435 // Should be skipped. | 1278 // Should be skipped. |
| 1436 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); | 1279 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 1437 __ ReturnTOS(); | 1280 __ ReturnTOS(); |
| 1438 } | 1281 } |
| 1439 | 1282 |
| 1440 | |
| 1441 ASSEMBLER_TEST_RUN(PopLocalPush, test) { | 1283 ASSEMBLER_TEST_RUN(PopLocalPush, test) { |
| 1442 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1284 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1443 } | 1285 } |
| 1444 | 1286 |
| 1445 | |
| 1446 ASSEMBLER_TEST_GENERATE(LoadConstantPush, assembler) { | 1287 ASSEMBLER_TEST_GENERATE(LoadConstantPush, assembler) { |
| 1447 __ Frame(1); | 1288 __ Frame(1); |
| 1448 __ LoadConstant(0, Smi::Handle(Smi::New(21))); | 1289 __ LoadConstant(0, Smi::Handle(Smi::New(21))); |
| 1449 __ Push(0); | 1290 __ Push(0); |
| 1450 __ Push(0); | 1291 __ Push(0); |
| 1451 __ AddTOS(); | 1292 __ AddTOS(); |
| 1452 // Should be skipped. | 1293 // Should be skipped. |
| 1453 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); | 1294 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 1454 __ ReturnTOS(); | 1295 __ ReturnTOS(); |
| 1455 } | 1296 } |
| 1456 | 1297 |
| 1457 | |
| 1458 ASSEMBLER_TEST_RUN(LoadConstantPush, test) { | 1298 ASSEMBLER_TEST_RUN(LoadConstantPush, test) { |
| 1459 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1299 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1460 } | 1300 } |
| 1461 | 1301 |
| 1462 | |
| 1463 // - Move rA, rX | 1302 // - Move rA, rX |
| 1464 // | 1303 // |
| 1465 // FP[rA] <- FP[rX] | 1304 // FP[rA] <- FP[rX] |
| 1466 // Note: rX is signed so it can be used to address parameters which are | 1305 // Note: rX is signed so it can be used to address parameters which are |
| 1467 // at negative indices with respect to FP. | 1306 // at negative indices with respect to FP. |
| 1468 ASSEMBLER_TEST_GENERATE(MoveLocalLocal, assembler) { | 1307 ASSEMBLER_TEST_GENERATE(MoveLocalLocal, assembler) { |
| 1469 __ Frame(2); | 1308 __ Frame(2); |
| 1470 __ PushConstant(Smi::Handle(Smi::New(21))); | 1309 __ PushConstant(Smi::Handle(Smi::New(21))); |
| 1471 __ PopLocal(0); | 1310 __ PopLocal(0); |
| 1472 __ Move(1, 0); | 1311 __ Move(1, 0); |
| 1473 __ Push(0); | 1312 __ Push(0); |
| 1474 __ Push(1); | 1313 __ Push(1); |
| 1475 __ AddTOS(); | 1314 __ AddTOS(); |
| 1476 // Should be skipped. | 1315 // Should be skipped. |
| 1477 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); | 1316 MakeDummyInstanceCall(assembler, Smi::Handle(Smi::New(0))); |
| 1478 __ ReturnTOS(); | 1317 __ ReturnTOS(); |
| 1479 } | 1318 } |
| 1480 | 1319 |
| 1481 | |
| 1482 ASSEMBLER_TEST_RUN(MoveLocalLocal, test) { | 1320 ASSEMBLER_TEST_RUN(MoveLocalLocal, test) { |
| 1483 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1321 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1484 } | 1322 } |
| 1485 | 1323 |
| 1486 | |
| 1487 // - Return R; ReturnTOS | 1324 // - Return R; ReturnTOS |
| 1488 // | 1325 // |
| 1489 // Return to the caller using either a value from the given register or a | 1326 // Return to the caller using either a value from the given register or a |
| 1490 // value from the top-of-stack as a result. | 1327 // value from the top-of-stack as a result. |
| 1491 ASSEMBLER_TEST_GENERATE(Return1, assembler) { | 1328 ASSEMBLER_TEST_GENERATE(Return1, assembler) { |
| 1492 __ Frame(1); | 1329 __ Frame(1); |
| 1493 __ PushConstant(Smi::Handle(Smi::New(42))); | 1330 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 1494 __ StoreLocal(0); | 1331 __ StoreLocal(0); |
| 1495 __ Return(0); | 1332 __ Return(0); |
| 1496 } | 1333 } |
| 1497 | 1334 |
| 1498 | |
| 1499 ASSEMBLER_TEST_RUN(Return1, test) { | 1335 ASSEMBLER_TEST_RUN(Return1, test) { |
| 1500 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1336 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1501 } | 1337 } |
| 1502 | 1338 |
| 1503 | |
| 1504 ASSEMBLER_TEST_GENERATE(Return2, assembler) { | 1339 ASSEMBLER_TEST_GENERATE(Return2, assembler) { |
| 1505 __ Frame(2); | 1340 __ Frame(2); |
| 1506 __ PushConstant(Smi::Handle(Smi::New(42))); | 1341 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 1507 __ StoreLocal(1); | 1342 __ StoreLocal(1); |
| 1508 __ Return(1); | 1343 __ Return(1); |
| 1509 } | 1344 } |
| 1510 | 1345 |
| 1511 | |
| 1512 ASSEMBLER_TEST_RUN(Return2, test) { | 1346 ASSEMBLER_TEST_RUN(Return2, test) { |
| 1513 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1347 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1514 } | 1348 } |
| 1515 | 1349 |
| 1516 | |
| 1517 ASSEMBLER_TEST_GENERATE(Loop, assembler) { | 1350 ASSEMBLER_TEST_GENERATE(Loop, assembler) { |
| 1518 __ Frame(2); | 1351 __ Frame(2); |
| 1519 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1352 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 1520 __ LoadConstant(1, Smi::Handle(Smi::New(0))); | 1353 __ LoadConstant(1, Smi::Handle(Smi::New(0))); |
| 1521 | 1354 |
| 1522 Label loop_entry, error; | 1355 Label loop_entry, error; |
| 1523 __ Bind(&loop_entry); | 1356 __ Bind(&loop_entry); |
| 1524 // Add 1 to FP[1]. | 1357 // Add 1 to FP[1]. |
| 1525 __ PushConstant(Smi::Handle(Smi::New(1))); | 1358 __ PushConstant(Smi::Handle(Smi::New(1))); |
| 1526 __ Push(1); | 1359 __ Push(1); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1542 __ IfNeStrictNumTOS(); | 1375 __ IfNeStrictNumTOS(); |
| 1543 __ Jump(&loop_entry); | 1376 __ Jump(&loop_entry); |
| 1544 | 1377 |
| 1545 __ Return(1); | 1378 __ Return(1); |
| 1546 | 1379 |
| 1547 __ Bind(&error); | 1380 __ Bind(&error); |
| 1548 __ LoadConstant(1, Smi::Handle(Smi::New(-42))); | 1381 __ LoadConstant(1, Smi::Handle(Smi::New(-42))); |
| 1549 __ Return(1); | 1382 __ Return(1); |
| 1550 } | 1383 } |
| 1551 | 1384 |
| 1552 | |
| 1553 ASSEMBLER_TEST_RUN(Loop, test) { | 1385 ASSEMBLER_TEST_RUN(Loop, test) { |
| 1554 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1386 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1555 } | 1387 } |
| 1556 | 1388 |
| 1557 | |
| 1558 // - LoadClassIdTOS, LoadClassId rA, D | 1389 // - LoadClassIdTOS, LoadClassId rA, D |
| 1559 // | 1390 // |
| 1560 // LoadClassIdTOS loads the class id from the object at SP[0] and stores it | 1391 // LoadClassIdTOS loads the class id from the object at SP[0] and stores it |
| 1561 // to SP[0]. LoadClassId loads the class id from FP[rA] and stores it to | 1392 // to SP[0]. LoadClassId loads the class id from FP[rA] and stores it to |
| 1562 // FP[D]. | 1393 // FP[D]. |
| 1563 ASSEMBLER_TEST_GENERATE(LoadClassIdTOS, assembler) { | 1394 ASSEMBLER_TEST_GENERATE(LoadClassIdTOS, assembler) { |
| 1564 __ PushConstant(Smi::Handle(Smi::New(42))); | 1395 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 1565 __ LoadClassIdTOS(); | 1396 __ LoadClassIdTOS(); |
| 1566 __ ReturnTOS(); | 1397 __ ReturnTOS(); |
| 1567 } | 1398 } |
| 1568 | 1399 |
| 1569 | |
| 1570 ASSEMBLER_TEST_RUN(LoadClassIdTOS, test) { | 1400 ASSEMBLER_TEST_RUN(LoadClassIdTOS, test) { |
| 1571 EXPECT_EQ(kSmiCid, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1401 EXPECT_EQ(kSmiCid, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1572 } | 1402 } |
| 1573 | 1403 |
| 1574 | |
| 1575 ASSEMBLER_TEST_GENERATE(LoadClassId, assembler) { | 1404 ASSEMBLER_TEST_GENERATE(LoadClassId, assembler) { |
| 1576 __ Frame(2); | 1405 __ Frame(2); |
| 1577 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1406 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 1578 __ LoadClassId(1, 0); | 1407 __ LoadClassId(1, 0); |
| 1579 __ Return(1); | 1408 __ Return(1); |
| 1580 } | 1409 } |
| 1581 | 1410 |
| 1582 | |
| 1583 ASSEMBLER_TEST_RUN(LoadClassId, test) { | 1411 ASSEMBLER_TEST_RUN(LoadClassId, test) { |
| 1584 EXPECT_EQ(kSmiCid, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1412 EXPECT_EQ(kSmiCid, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1585 } | 1413 } |
| 1586 | 1414 |
| 1587 | |
| 1588 // - CreateArrayTOS | 1415 // - CreateArrayTOS |
| 1589 // | 1416 // |
| 1590 // Allocate array of length SP[0] with type arguments SP[-1]. | 1417 // Allocate array of length SP[0] with type arguments SP[-1]. |
| 1591 ASSEMBLER_TEST_GENERATE(CreateArrayTOS, assembler) { | 1418 ASSEMBLER_TEST_GENERATE(CreateArrayTOS, assembler) { |
| 1592 __ PushConstant(Object::null_object()); | 1419 __ PushConstant(Object::null_object()); |
| 1593 __ PushConstant(Smi::Handle(Smi::New(10))); | 1420 __ PushConstant(Smi::Handle(Smi::New(10))); |
| 1594 __ CreateArrayTOS(); | 1421 __ CreateArrayTOS(); |
| 1595 __ ReturnTOS(); | 1422 __ ReturnTOS(); |
| 1596 } | 1423 } |
| 1597 | 1424 |
| 1598 | |
| 1599 ASSEMBLER_TEST_RUN(CreateArrayTOS, test) { | 1425 ASSEMBLER_TEST_RUN(CreateArrayTOS, test) { |
| 1600 const Object& obj = EXECUTE_TEST_CODE_OBJECT(test->code()); | 1426 const Object& obj = EXECUTE_TEST_CODE_OBJECT(test->code()); |
| 1601 EXPECT(obj.IsArray()); | 1427 EXPECT(obj.IsArray()); |
| 1602 Array& array = Array::Handle(); | 1428 Array& array = Array::Handle(); |
| 1603 array ^= obj.raw(); | 1429 array ^= obj.raw(); |
| 1604 EXPECT_EQ(10, array.Length()); | 1430 EXPECT_EQ(10, array.Length()); |
| 1605 } | 1431 } |
| 1606 | 1432 |
| 1607 | |
| 1608 // - TestSmi rA, rD | 1433 // - TestSmi rA, rD |
| 1609 // | 1434 // |
| 1610 // If FP[rA] & FP[rD] != 0, then skip the next instruction. FP[rA] and FP[rD] | 1435 // If FP[rA] & FP[rD] != 0, then skip the next instruction. FP[rA] and FP[rD] |
| 1611 // must be Smis. | 1436 // must be Smis. |
| 1612 ASSEMBLER_TEST_GENERATE(TestSmiTrue, assembler) { | 1437 ASSEMBLER_TEST_GENERATE(TestSmiTrue, assembler) { |
| 1613 Label branch_taken; | 1438 Label branch_taken; |
| 1614 __ Frame(2); | 1439 __ Frame(2); |
| 1615 __ LoadConstant(0, Smi::Handle(Smi::New(7))); | 1440 __ LoadConstant(0, Smi::Handle(Smi::New(7))); |
| 1616 __ LoadConstant(1, Smi::Handle(Smi::New(3))); | 1441 __ LoadConstant(1, Smi::Handle(Smi::New(3))); |
| 1617 __ TestSmi(0, 1); | 1442 __ TestSmi(0, 1); |
| 1618 __ Jump(&branch_taken); | 1443 __ Jump(&branch_taken); |
| 1619 __ PushConstant(Bool::True()); | 1444 __ PushConstant(Bool::True()); |
| 1620 __ ReturnTOS(); | 1445 __ ReturnTOS(); |
| 1621 __ Bind(&branch_taken); | 1446 __ Bind(&branch_taken); |
| 1622 __ PushConstant(Bool::False()); | 1447 __ PushConstant(Bool::False()); |
| 1623 __ ReturnTOS(); | 1448 __ ReturnTOS(); |
| 1624 } | 1449 } |
| 1625 | 1450 |
| 1626 | |
| 1627 ASSEMBLER_TEST_RUN(TestSmiTrue, test) { | 1451 ASSEMBLER_TEST_RUN(TestSmiTrue, test) { |
| 1628 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); | 1452 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 1629 } | 1453 } |
| 1630 | 1454 |
| 1631 | |
| 1632 ASSEMBLER_TEST_GENERATE(TestSmiFalse, assembler) { | 1455 ASSEMBLER_TEST_GENERATE(TestSmiFalse, assembler) { |
| 1633 Label branch_taken; | 1456 Label branch_taken; |
| 1634 __ Frame(2); | 1457 __ Frame(2); |
| 1635 __ LoadConstant(0, Smi::Handle(Smi::New(8))); | 1458 __ LoadConstant(0, Smi::Handle(Smi::New(8))); |
| 1636 __ LoadConstant(1, Smi::Handle(Smi::New(4))); | 1459 __ LoadConstant(1, Smi::Handle(Smi::New(4))); |
| 1637 __ TestSmi(0, 1); | 1460 __ TestSmi(0, 1); |
| 1638 __ Jump(&branch_taken); | 1461 __ Jump(&branch_taken); |
| 1639 __ PushConstant(Bool::True()); | 1462 __ PushConstant(Bool::True()); |
| 1640 __ ReturnTOS(); | 1463 __ ReturnTOS(); |
| 1641 __ Bind(&branch_taken); | 1464 __ Bind(&branch_taken); |
| 1642 __ PushConstant(Bool::False()); | 1465 __ PushConstant(Bool::False()); |
| 1643 __ ReturnTOS(); | 1466 __ ReturnTOS(); |
| 1644 } | 1467 } |
| 1645 | 1468 |
| 1646 | |
| 1647 ASSEMBLER_TEST_RUN(TestSmiFalse, test) { | 1469 ASSEMBLER_TEST_RUN(TestSmiFalse, test) { |
| 1648 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); | 1470 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code())); |
| 1649 } | 1471 } |
| 1650 | 1472 |
| 1651 | |
| 1652 // - TestCids rA, D | 1473 // - TestCids rA, D |
| 1653 // | 1474 // |
| 1654 // The next D instructions must be Nops whose D field encodes a class id. If | 1475 // The next D instructions must be Nops whose D field encodes a class id. If |
| 1655 // the class id of FP[rA] matches, jump to PC + N + 1 if the matching Nop's | 1476 // the class id of FP[rA] matches, jump to PC + N + 1 if the matching Nop's |
| 1656 // A != 0 or PC + N + 2 if the matching Nop's A = 0. If no match is found, | 1477 // A != 0 or PC + N + 2 if the matching Nop's A = 0. If no match is found, |
| 1657 // jump to PC + N. | 1478 // jump to PC + N. |
| 1658 ASSEMBLER_TEST_GENERATE(TestCidsTrue, assembler) { | 1479 ASSEMBLER_TEST_GENERATE(TestCidsTrue, assembler) { |
| 1659 Label true_branch, no_match_branch; | 1480 Label true_branch, no_match_branch; |
| 1660 __ Frame(2); | 1481 __ Frame(2); |
| 1661 __ LoadConstant(0, Object::Handle(String::New("Hi", Heap::kOld))); | 1482 __ LoadConstant(0, Object::Handle(String::New("Hi", Heap::kOld))); |
| 1662 const intptr_t num_cases = 2; | 1483 const intptr_t num_cases = 2; |
| 1663 __ TestCids(0, num_cases); | 1484 __ TestCids(0, num_cases); |
| 1664 __ Nop(0, static_cast<uint16_t>(kSmiCid)); // Smi => false | 1485 __ Nop(0, static_cast<uint16_t>(kSmiCid)); // Smi => false |
| 1665 __ Nop(1, static_cast<uint16_t>(kOneByteStringCid)); // String => true | 1486 __ Nop(1, static_cast<uint16_t>(kOneByteStringCid)); // String => true |
| 1666 __ Jump(&no_match_branch); | 1487 __ Jump(&no_match_branch); |
| 1667 __ Jump(&true_branch); | 1488 __ Jump(&true_branch); |
| 1668 __ LoadConstant(1, Smi::Handle(Smi::New(0))); // false branch | 1489 __ LoadConstant(1, Smi::Handle(Smi::New(0))); // false branch |
| 1669 __ Return(1); | 1490 __ Return(1); |
| 1670 __ Bind(&true_branch); | 1491 __ Bind(&true_branch); |
| 1671 __ LoadConstant(1, Smi::Handle(Smi::New(1))); | 1492 __ LoadConstant(1, Smi::Handle(Smi::New(1))); |
| 1672 __ Return(1); | 1493 __ Return(1); |
| 1673 __ Bind(&no_match_branch); | 1494 __ Bind(&no_match_branch); |
| 1674 __ LoadConstant(1, Smi::Handle(Smi::New(2))); | 1495 __ LoadConstant(1, Smi::Handle(Smi::New(2))); |
| 1675 __ Return(1); | 1496 __ Return(1); |
| 1676 } | 1497 } |
| 1677 | 1498 |
| 1678 | |
| 1679 ASSEMBLER_TEST_RUN(TestCidsTrue, test) { | 1499 ASSEMBLER_TEST_RUN(TestCidsTrue, test) { |
| 1680 EXPECT_EQ(1, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1500 EXPECT_EQ(1, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1681 } | 1501 } |
| 1682 | 1502 |
| 1683 | |
| 1684 ASSEMBLER_TEST_GENERATE(TestCidsFalse, assembler) { | 1503 ASSEMBLER_TEST_GENERATE(TestCidsFalse, assembler) { |
| 1685 Label true_branch, no_match_branch; | 1504 Label true_branch, no_match_branch; |
| 1686 __ Frame(2); | 1505 __ Frame(2); |
| 1687 __ LoadConstant(0, Object::Handle(Smi::New(42))); | 1506 __ LoadConstant(0, Object::Handle(Smi::New(42))); |
| 1688 const intptr_t num_cases = 2; | 1507 const intptr_t num_cases = 2; |
| 1689 __ TestCids(0, num_cases); | 1508 __ TestCids(0, num_cases); |
| 1690 __ Nop(0, static_cast<uint16_t>(kSmiCid)); // Smi => false | 1509 __ Nop(0, static_cast<uint16_t>(kSmiCid)); // Smi => false |
| 1691 __ Nop(1, static_cast<uint16_t>(kOneByteStringCid)); // String => true | 1510 __ Nop(1, static_cast<uint16_t>(kOneByteStringCid)); // String => true |
| 1692 __ Jump(&no_match_branch); | 1511 __ Jump(&no_match_branch); |
| 1693 __ Jump(&true_branch); | 1512 __ Jump(&true_branch); |
| 1694 __ LoadConstant(1, Smi::Handle(Smi::New(0))); // false branch | 1513 __ LoadConstant(1, Smi::Handle(Smi::New(0))); // false branch |
| 1695 __ Return(1); | 1514 __ Return(1); |
| 1696 __ Bind(&true_branch); | 1515 __ Bind(&true_branch); |
| 1697 __ LoadConstant(1, Smi::Handle(Smi::New(1))); | 1516 __ LoadConstant(1, Smi::Handle(Smi::New(1))); |
| 1698 __ Return(1); | 1517 __ Return(1); |
| 1699 __ Bind(&no_match_branch); | 1518 __ Bind(&no_match_branch); |
| 1700 __ LoadConstant(1, Smi::Handle(Smi::New(2))); | 1519 __ LoadConstant(1, Smi::Handle(Smi::New(2))); |
| 1701 __ Return(1); | 1520 __ Return(1); |
| 1702 } | 1521 } |
| 1703 | 1522 |
| 1704 | |
| 1705 ASSEMBLER_TEST_RUN(TestCidsFalse, test) { | 1523 ASSEMBLER_TEST_RUN(TestCidsFalse, test) { |
| 1706 EXPECT_EQ(0, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1524 EXPECT_EQ(0, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1707 } | 1525 } |
| 1708 | 1526 |
| 1709 | |
| 1710 ASSEMBLER_TEST_GENERATE(TestCidsNoMatch, assembler) { | 1527 ASSEMBLER_TEST_GENERATE(TestCidsNoMatch, assembler) { |
| 1711 Label true_branch, no_match_branch; | 1528 Label true_branch, no_match_branch; |
| 1712 __ Frame(2); | 1529 __ Frame(2); |
| 1713 __ LoadConstant(0, Object::Handle(Array::New(1, Heap::kOld))); | 1530 __ LoadConstant(0, Object::Handle(Array::New(1, Heap::kOld))); |
| 1714 const intptr_t num_cases = 2; | 1531 const intptr_t num_cases = 2; |
| 1715 __ TestCids(0, num_cases); | 1532 __ TestCids(0, num_cases); |
| 1716 __ Nop(0, static_cast<uint16_t>(kSmiCid)); // Smi => false | 1533 __ Nop(0, static_cast<uint16_t>(kSmiCid)); // Smi => false |
| 1717 __ Nop(1, static_cast<uint16_t>(kOneByteStringCid)); // String => true | 1534 __ Nop(1, static_cast<uint16_t>(kOneByteStringCid)); // String => true |
| 1718 __ Jump(&no_match_branch); | 1535 __ Jump(&no_match_branch); |
| 1719 __ Jump(&true_branch); | 1536 __ Jump(&true_branch); |
| 1720 __ LoadConstant(1, Smi::Handle(Smi::New(0))); // false branch | 1537 __ LoadConstant(1, Smi::Handle(Smi::New(0))); // false branch |
| 1721 __ Return(1); | 1538 __ Return(1); |
| 1722 __ Bind(&true_branch); | 1539 __ Bind(&true_branch); |
| 1723 __ LoadConstant(1, Smi::Handle(Smi::New(1))); | 1540 __ LoadConstant(1, Smi::Handle(Smi::New(1))); |
| 1724 __ Return(1); | 1541 __ Return(1); |
| 1725 __ Bind(&no_match_branch); | 1542 __ Bind(&no_match_branch); |
| 1726 __ LoadConstant(1, Smi::Handle(Smi::New(2))); | 1543 __ LoadConstant(1, Smi::Handle(Smi::New(2))); |
| 1727 __ Return(1); | 1544 __ Return(1); |
| 1728 } | 1545 } |
| 1729 | 1546 |
| 1730 | |
| 1731 ASSEMBLER_TEST_RUN(TestCidsNoMatch, test) { | 1547 ASSEMBLER_TEST_RUN(TestCidsNoMatch, test) { |
| 1732 EXPECT_EQ(2, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1548 EXPECT_EQ(2, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1733 } | 1549 } |
| 1734 | 1550 |
| 1735 | |
| 1736 // - CheckSmi rA | 1551 // - CheckSmi rA |
| 1737 // | 1552 // |
| 1738 // If FP[rA] is a Smi, then skip the next instruction. | 1553 // If FP[rA] is a Smi, then skip the next instruction. |
| 1739 ASSEMBLER_TEST_GENERATE(CheckSmiPass, assembler) { | 1554 ASSEMBLER_TEST_GENERATE(CheckSmiPass, assembler) { |
| 1740 __ Frame(1); | 1555 __ Frame(1); |
| 1741 __ PushConstant(Smi::Handle(Smi::New(42))); | 1556 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 1742 __ LoadConstant(0, Smi::Handle(Smi::New(0))); | 1557 __ LoadConstant(0, Smi::Handle(Smi::New(0))); |
| 1743 __ CheckSmi(0); | 1558 __ CheckSmi(0); |
| 1744 __ PushConstant(Smi::Handle(Smi::New(-1))); | 1559 __ PushConstant(Smi::Handle(Smi::New(-1))); |
| 1745 __ ReturnTOS(); | 1560 __ ReturnTOS(); |
| 1746 } | 1561 } |
| 1747 | 1562 |
| 1748 | |
| 1749 ASSEMBLER_TEST_RUN(CheckSmiPass, test) { | 1563 ASSEMBLER_TEST_RUN(CheckSmiPass, test) { |
| 1750 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1564 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1751 } | 1565 } |
| 1752 | 1566 |
| 1753 | |
| 1754 ASSEMBLER_TEST_GENERATE(CheckSmiFail, assembler) { | 1567 ASSEMBLER_TEST_GENERATE(CheckSmiFail, assembler) { |
| 1755 __ Frame(1); | 1568 __ Frame(1); |
| 1756 __ PushConstant(Smi::Handle(Smi::New(-1))); | 1569 __ PushConstant(Smi::Handle(Smi::New(-1))); |
| 1757 __ LoadConstant(0, Bool::True()); | 1570 __ LoadConstant(0, Bool::True()); |
| 1758 __ CheckSmi(0); | 1571 __ CheckSmi(0); |
| 1759 __ PushConstant(Smi::Handle(Smi::New(42))); | 1572 __ PushConstant(Smi::Handle(Smi::New(42))); |
| 1760 __ ReturnTOS(); | 1573 __ ReturnTOS(); |
| 1761 } | 1574 } |
| 1762 | 1575 |
| 1763 | |
| 1764 ASSEMBLER_TEST_RUN(CheckSmiFail, test) { | 1576 ASSEMBLER_TEST_RUN(CheckSmiFail, test) { |
| 1765 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1577 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1766 } | 1578 } |
| 1767 | 1579 |
| 1768 | |
| 1769 // - CheckClassId rA, D | 1580 // - CheckClassId rA, D |
| 1770 // | 1581 // |
| 1771 // If the object at FP[rA]'s class id matches the class id in PP[D], then | 1582 // If the object at FP[rA]'s class id matches the class id in PP[D], then |
| 1772 // skip the following instruction. | 1583 // skip the following instruction. |
| 1773 ASSEMBLER_TEST_GENERATE(CheckClassIdSmiPass, assembler) { | 1584 ASSEMBLER_TEST_GENERATE(CheckClassIdSmiPass, assembler) { |
| 1774 __ Frame(2); | 1585 __ Frame(2); |
| 1775 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1586 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 1776 __ LoadClassId(1, 0); | 1587 __ LoadClassId(1, 0); |
| 1777 __ CheckClassId(1, kSmiCid); | 1588 __ CheckClassId(1, kSmiCid); |
| 1778 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1589 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 1779 __ Return(0); | 1590 __ Return(0); |
| 1780 } | 1591 } |
| 1781 | 1592 |
| 1782 | |
| 1783 ASSEMBLER_TEST_RUN(CheckClassIdSmiPass, test) { | 1593 ASSEMBLER_TEST_RUN(CheckClassIdSmiPass, test) { |
| 1784 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1594 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1785 } | 1595 } |
| 1786 | 1596 |
| 1787 | |
| 1788 ASSEMBLER_TEST_GENERATE(CheckClassIdNonSmiPass, assembler) { | 1597 ASSEMBLER_TEST_GENERATE(CheckClassIdNonSmiPass, assembler) { |
| 1789 __ Frame(2); | 1598 __ Frame(2); |
| 1790 __ LoadConstant(0, Bool::True()); | 1599 __ LoadConstant(0, Bool::True()); |
| 1791 __ LoadClassId(1, 0); | 1600 __ LoadClassId(1, 0); |
| 1792 __ CheckClassId(1, kBoolCid); | 1601 __ CheckClassId(1, kBoolCid); |
| 1793 __ LoadConstant(0, Bool::False()); | 1602 __ LoadConstant(0, Bool::False()); |
| 1794 __ Return(0); | 1603 __ Return(0); |
| 1795 } | 1604 } |
| 1796 | 1605 |
| 1797 | |
| 1798 ASSEMBLER_TEST_RUN(CheckClassIdNonSmiPass, test) { | 1606 ASSEMBLER_TEST_RUN(CheckClassIdNonSmiPass, test) { |
| 1799 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); | 1607 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code())); |
| 1800 } | 1608 } |
| 1801 | 1609 |
| 1802 | |
| 1803 ASSEMBLER_TEST_GENERATE(CheckClassIdFail, assembler) { | 1610 ASSEMBLER_TEST_GENERATE(CheckClassIdFail, assembler) { |
| 1804 __ Frame(2); | 1611 __ Frame(2); |
| 1805 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1612 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 1806 __ LoadClassId(1, 0); | 1613 __ LoadClassId(1, 0); |
| 1807 __ CheckClassId(1, kBoolCid); | 1614 __ CheckClassId(1, kBoolCid); |
| 1808 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1615 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 1809 __ Return(0); | 1616 __ Return(0); |
| 1810 } | 1617 } |
| 1811 | 1618 |
| 1812 | |
| 1813 ASSEMBLER_TEST_RUN(CheckClassIdFail, test) { | 1619 ASSEMBLER_TEST_RUN(CheckClassIdFail, test) { |
| 1814 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1620 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1815 } | 1621 } |
| 1816 | 1622 |
| 1817 | |
| 1818 // - If<Cond>Null rA | 1623 // - If<Cond>Null rA |
| 1819 // | 1624 // |
| 1820 // Cond is Eq or Ne. Skips the next instruction unless the given condition | 1625 // Cond is Eq or Ne. Skips the next instruction unless the given condition |
| 1821 // holds. | 1626 // holds. |
| 1822 ASSEMBLER_TEST_GENERATE(IfEqNullNotNull, assembler) { | 1627 ASSEMBLER_TEST_GENERATE(IfEqNullNotNull, assembler) { |
| 1823 __ Frame(2); | 1628 __ Frame(2); |
| 1824 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1629 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 1825 __ LoadConstant(1, Smi::Handle(Smi::New(42))); | 1630 __ LoadConstant(1, Smi::Handle(Smi::New(42))); |
| 1826 __ IfEqNull(0); | 1631 __ IfEqNull(0); |
| 1827 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 1632 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 1828 __ Return(1); | 1633 __ Return(1); |
| 1829 } | 1634 } |
| 1830 | 1635 |
| 1831 | |
| 1832 ASSEMBLER_TEST_RUN(IfEqNullNotNull, test) { | 1636 ASSEMBLER_TEST_RUN(IfEqNullNotNull, test) { |
| 1833 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1637 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1834 } | 1638 } |
| 1835 | 1639 |
| 1836 | |
| 1837 ASSEMBLER_TEST_GENERATE(IfEqNullIsNull, assembler) { | 1640 ASSEMBLER_TEST_GENERATE(IfEqNullIsNull, assembler) { |
| 1838 __ Frame(2); | 1641 __ Frame(2); |
| 1839 __ LoadConstant(0, Object::null_object()); | 1642 __ LoadConstant(0, Object::null_object()); |
| 1840 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 1643 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 1841 __ IfEqNull(0); | 1644 __ IfEqNull(0); |
| 1842 __ LoadConstant(1, Smi::Handle(Smi::New(42))); | 1645 __ LoadConstant(1, Smi::Handle(Smi::New(42))); |
| 1843 __ Return(1); | 1646 __ Return(1); |
| 1844 } | 1647 } |
| 1845 | 1648 |
| 1846 | |
| 1847 ASSEMBLER_TEST_RUN(IfEqNullIsNull, test) { | 1649 ASSEMBLER_TEST_RUN(IfEqNullIsNull, test) { |
| 1848 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1650 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1849 } | 1651 } |
| 1850 | 1652 |
| 1851 | |
| 1852 ASSEMBLER_TEST_GENERATE(IfNeNullIsNull, assembler) { | 1653 ASSEMBLER_TEST_GENERATE(IfNeNullIsNull, assembler) { |
| 1853 __ Frame(2); | 1654 __ Frame(2); |
| 1854 __ LoadConstant(0, Object::null_object()); | 1655 __ LoadConstant(0, Object::null_object()); |
| 1855 __ LoadConstant(1, Smi::Handle(Smi::New(42))); | 1656 __ LoadConstant(1, Smi::Handle(Smi::New(42))); |
| 1856 __ IfNeNull(0); | 1657 __ IfNeNull(0); |
| 1857 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 1658 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 1858 __ Return(1); | 1659 __ Return(1); |
| 1859 } | 1660 } |
| 1860 | 1661 |
| 1861 | |
| 1862 ASSEMBLER_TEST_RUN(IfNeNullIsNull, test) { | 1662 ASSEMBLER_TEST_RUN(IfNeNullIsNull, test) { |
| 1863 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1663 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1864 } | 1664 } |
| 1865 | 1665 |
| 1866 | |
| 1867 ASSEMBLER_TEST_GENERATE(IfNeNullNotNull, assembler) { | 1666 ASSEMBLER_TEST_GENERATE(IfNeNullNotNull, assembler) { |
| 1868 __ Frame(2); | 1667 __ Frame(2); |
| 1869 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1668 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 1870 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 1669 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 1871 __ IfNeNull(0); | 1670 __ IfNeNull(0); |
| 1872 __ LoadConstant(1, Smi::Handle(Smi::New(42))); | 1671 __ LoadConstant(1, Smi::Handle(Smi::New(42))); |
| 1873 __ Return(1); | 1672 __ Return(1); |
| 1874 } | 1673 } |
| 1875 | 1674 |
| 1876 | |
| 1877 ASSEMBLER_TEST_RUN(IfNeNullNotNull, test) { | 1675 ASSEMBLER_TEST_RUN(IfNeNullNotNull, test) { |
| 1878 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1676 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1879 } | 1677 } |
| 1880 | 1678 |
| 1881 // - If<Cond> rA, rD | 1679 // - If<Cond> rA, rD |
| 1882 // | 1680 // |
| 1883 // Cond is Le, Lt, Ge, Gt, unsigned variants ULe, ULt, UGe, UGt, and | 1681 // Cond is Le, Lt, Ge, Gt, unsigned variants ULe, ULt, UGe, UGt, and |
| 1884 // unboxed double variants DEq, DNe, DLe, DLt, DGe, DGt. | 1682 // unboxed double variants DEq, DNe, DLe, DLt, DGe, DGt. |
| 1885 // Skips the next instruction unless FP[rA] <Cond> FP[rD]. Assumes that | 1683 // Skips the next instruction unless FP[rA] <Cond> FP[rD]. Assumes that |
| 1886 // FP[rA] and FP[rD] are Smis or unboxed doubles as indicated by <Cond>. | 1684 // FP[rA] and FP[rD] are Smis or unboxed doubles as indicated by <Cond>. |
| 1887 ASSEMBLER_TEST_GENERATE(IfLeTrue, assembler) { | 1685 ASSEMBLER_TEST_GENERATE(IfLeTrue, assembler) { |
| 1888 __ Frame(3); | 1686 __ Frame(3); |
| 1889 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1687 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 1890 __ LoadConstant(1, Smi::Handle(Smi::New(-5))); | 1688 __ LoadConstant(1, Smi::Handle(Smi::New(-5))); |
| 1891 __ LoadConstant(2, Smi::Handle(Smi::New(100))); | 1689 __ LoadConstant(2, Smi::Handle(Smi::New(100))); |
| 1892 __ IfLe(1, 2); | 1690 __ IfLe(1, 2); |
| 1893 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1691 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 1894 __ Return(0); | 1692 __ Return(0); |
| 1895 } | 1693 } |
| 1896 | 1694 |
| 1897 | |
| 1898 ASSEMBLER_TEST_RUN(IfLeTrue, test) { | 1695 ASSEMBLER_TEST_RUN(IfLeTrue, test) { |
| 1899 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1696 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1900 } | 1697 } |
| 1901 | 1698 |
| 1902 | |
| 1903 ASSEMBLER_TEST_GENERATE(IfLeFalse, assembler) { | 1699 ASSEMBLER_TEST_GENERATE(IfLeFalse, assembler) { |
| 1904 __ Frame(3); | 1700 __ Frame(3); |
| 1905 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1701 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 1906 __ LoadConstant(1, Smi::Handle(Smi::New(100))); | 1702 __ LoadConstant(1, Smi::Handle(Smi::New(100))); |
| 1907 __ LoadConstant(2, Smi::Handle(Smi::New(-5))); | 1703 __ LoadConstant(2, Smi::Handle(Smi::New(-5))); |
| 1908 __ IfLe(1, 2); | 1704 __ IfLe(1, 2); |
| 1909 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1705 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 1910 __ Return(0); | 1706 __ Return(0); |
| 1911 } | 1707 } |
| 1912 | 1708 |
| 1913 | |
| 1914 ASSEMBLER_TEST_RUN(IfLeFalse, test) { | 1709 ASSEMBLER_TEST_RUN(IfLeFalse, test) { |
| 1915 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1710 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1916 } | 1711 } |
| 1917 | 1712 |
| 1918 | |
| 1919 ASSEMBLER_TEST_GENERATE(IfLtTrue, assembler) { | 1713 ASSEMBLER_TEST_GENERATE(IfLtTrue, assembler) { |
| 1920 __ Frame(3); | 1714 __ Frame(3); |
| 1921 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1715 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 1922 __ LoadConstant(1, Smi::Handle(Smi::New(-5))); | 1716 __ LoadConstant(1, Smi::Handle(Smi::New(-5))); |
| 1923 __ LoadConstant(2, Smi::Handle(Smi::New(100))); | 1717 __ LoadConstant(2, Smi::Handle(Smi::New(100))); |
| 1924 __ IfLt(1, 2); | 1718 __ IfLt(1, 2); |
| 1925 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1719 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 1926 __ Return(0); | 1720 __ Return(0); |
| 1927 } | 1721 } |
| 1928 | 1722 |
| 1929 | |
| 1930 ASSEMBLER_TEST_RUN(IfLtTrue, test) { | 1723 ASSEMBLER_TEST_RUN(IfLtTrue, test) { |
| 1931 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1724 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1932 } | 1725 } |
| 1933 | 1726 |
| 1934 | |
| 1935 ASSEMBLER_TEST_GENERATE(IfLtFalse, assembler) { | 1727 ASSEMBLER_TEST_GENERATE(IfLtFalse, assembler) { |
| 1936 __ Frame(3); | 1728 __ Frame(3); |
| 1937 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1729 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 1938 __ LoadConstant(1, Smi::Handle(Smi::New(100))); | 1730 __ LoadConstant(1, Smi::Handle(Smi::New(100))); |
| 1939 __ LoadConstant(2, Smi::Handle(Smi::New(-5))); | 1731 __ LoadConstant(2, Smi::Handle(Smi::New(-5))); |
| 1940 __ IfLt(1, 2); | 1732 __ IfLt(1, 2); |
| 1941 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1733 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 1942 __ Return(0); | 1734 __ Return(0); |
| 1943 } | 1735 } |
| 1944 | 1736 |
| 1945 | |
| 1946 ASSEMBLER_TEST_RUN(IfLtFalse, test) { | 1737 ASSEMBLER_TEST_RUN(IfLtFalse, test) { |
| 1947 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1738 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1948 } | 1739 } |
| 1949 | 1740 |
| 1950 | |
| 1951 ASSEMBLER_TEST_GENERATE(IfGeTrue, assembler) { | 1741 ASSEMBLER_TEST_GENERATE(IfGeTrue, assembler) { |
| 1952 __ Frame(3); | 1742 __ Frame(3); |
| 1953 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1743 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 1954 __ LoadConstant(1, Smi::Handle(Smi::New(100))); | 1744 __ LoadConstant(1, Smi::Handle(Smi::New(100))); |
| 1955 __ LoadConstant(2, Smi::Handle(Smi::New(-5))); | 1745 __ LoadConstant(2, Smi::Handle(Smi::New(-5))); |
| 1956 __ IfGe(1, 2); | 1746 __ IfGe(1, 2); |
| 1957 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1747 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 1958 __ Return(0); | 1748 __ Return(0); |
| 1959 } | 1749 } |
| 1960 | 1750 |
| 1961 | |
| 1962 ASSEMBLER_TEST_RUN(IfGeTrue, test) { | 1751 ASSEMBLER_TEST_RUN(IfGeTrue, test) { |
| 1963 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1752 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1964 } | 1753 } |
| 1965 | 1754 |
| 1966 | |
| 1967 ASSEMBLER_TEST_GENERATE(IfGeFalse, assembler) { | 1755 ASSEMBLER_TEST_GENERATE(IfGeFalse, assembler) { |
| 1968 __ Frame(3); | 1756 __ Frame(3); |
| 1969 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1757 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 1970 __ LoadConstant(1, Smi::Handle(Smi::New(-5))); | 1758 __ LoadConstant(1, Smi::Handle(Smi::New(-5))); |
| 1971 __ LoadConstant(2, Smi::Handle(Smi::New(100))); | 1759 __ LoadConstant(2, Smi::Handle(Smi::New(100))); |
| 1972 __ IfGe(1, 2); | 1760 __ IfGe(1, 2); |
| 1973 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1761 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 1974 __ Return(0); | 1762 __ Return(0); |
| 1975 } | 1763 } |
| 1976 | 1764 |
| 1977 | |
| 1978 ASSEMBLER_TEST_RUN(IfGeFalse, test) { | 1765 ASSEMBLER_TEST_RUN(IfGeFalse, test) { |
| 1979 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1766 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1980 } | 1767 } |
| 1981 | 1768 |
| 1982 | |
| 1983 ASSEMBLER_TEST_GENERATE(IfGtTrue, assembler) { | 1769 ASSEMBLER_TEST_GENERATE(IfGtTrue, assembler) { |
| 1984 __ Frame(3); | 1770 __ Frame(3); |
| 1985 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1771 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 1986 __ LoadConstant(1, Smi::Handle(Smi::New(100))); | 1772 __ LoadConstant(1, Smi::Handle(Smi::New(100))); |
| 1987 __ LoadConstant(2, Smi::Handle(Smi::New(-5))); | 1773 __ LoadConstant(2, Smi::Handle(Smi::New(-5))); |
| 1988 __ IfGt(1, 2); | 1774 __ IfGt(1, 2); |
| 1989 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1775 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 1990 __ Return(0); | 1776 __ Return(0); |
| 1991 } | 1777 } |
| 1992 | 1778 |
| 1993 | |
| 1994 ASSEMBLER_TEST_RUN(IfGtTrue, test) { | 1779 ASSEMBLER_TEST_RUN(IfGtTrue, test) { |
| 1995 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1780 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 1996 } | 1781 } |
| 1997 | 1782 |
| 1998 | |
| 1999 ASSEMBLER_TEST_GENERATE(IfGtFalse, assembler) { | 1783 ASSEMBLER_TEST_GENERATE(IfGtFalse, assembler) { |
| 2000 __ Frame(3); | 1784 __ Frame(3); |
| 2001 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1785 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2002 __ LoadConstant(1, Smi::Handle(Smi::New(-5))); | 1786 __ LoadConstant(1, Smi::Handle(Smi::New(-5))); |
| 2003 __ LoadConstant(2, Smi::Handle(Smi::New(100))); | 1787 __ LoadConstant(2, Smi::Handle(Smi::New(100))); |
| 2004 __ IfGt(1, 2); | 1788 __ IfGt(1, 2); |
| 2005 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1789 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2006 __ Return(0); | 1790 __ Return(0); |
| 2007 } | 1791 } |
| 2008 | 1792 |
| 2009 | |
| 2010 ASSEMBLER_TEST_RUN(IfGtFalse, test) { | 1793 ASSEMBLER_TEST_RUN(IfGtFalse, test) { |
| 2011 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1794 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2012 } | 1795 } |
| 2013 | 1796 |
| 2014 | |
| 2015 #if defined(ARCH_IS_64_BIT) | 1797 #if defined(ARCH_IS_64_BIT) |
| 2016 ASSEMBLER_TEST_GENERATE(IfDNeTrue, assembler) { | 1798 ASSEMBLER_TEST_GENERATE(IfDNeTrue, assembler) { |
| 2017 __ Frame(3); | 1799 __ Frame(3); |
| 2018 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1800 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2019 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); | 1801 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); |
| 2020 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); | 1802 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); |
| 2021 __ UnboxDouble(1, 1); | 1803 __ UnboxDouble(1, 1); |
| 2022 __ UnboxDouble(2, 2); | 1804 __ UnboxDouble(2, 2); |
| 2023 __ IfDNe(1, 2); | 1805 __ IfDNe(1, 2); |
| 2024 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1806 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2025 __ Return(0); | 1807 __ Return(0); |
| 2026 } | 1808 } |
| 2027 | 1809 |
| 2028 | |
| 2029 ASSEMBLER_TEST_RUN(IfDNeTrue, test) { | 1810 ASSEMBLER_TEST_RUN(IfDNeTrue, test) { |
| 2030 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1811 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2031 } | 1812 } |
| 2032 | 1813 |
| 2033 | |
| 2034 ASSEMBLER_TEST_GENERATE(IfDNeFalse, assembler) { | 1814 ASSEMBLER_TEST_GENERATE(IfDNeFalse, assembler) { |
| 2035 __ Frame(3); | 1815 __ Frame(3); |
| 2036 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1816 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2037 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); | 1817 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); |
| 2038 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld))); | 1818 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld))); |
| 2039 __ UnboxDouble(1, 1); | 1819 __ UnboxDouble(1, 1); |
| 2040 __ UnboxDouble(2, 2); | 1820 __ UnboxDouble(2, 2); |
| 2041 __ IfDNe(1, 2); | 1821 __ IfDNe(1, 2); |
| 2042 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1822 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2043 __ Return(0); | 1823 __ Return(0); |
| 2044 } | 1824 } |
| 2045 | 1825 |
| 2046 | |
| 2047 ASSEMBLER_TEST_RUN(IfDNeFalse, test) { | 1826 ASSEMBLER_TEST_RUN(IfDNeFalse, test) { |
| 2048 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1827 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2049 } | 1828 } |
| 2050 | 1829 |
| 2051 | |
| 2052 ASSEMBLER_TEST_GENERATE(IfDNeNan, assembler) { | 1830 ASSEMBLER_TEST_GENERATE(IfDNeNan, assembler) { |
| 2053 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL); | 1831 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL); |
| 2054 __ Frame(3); | 1832 __ Frame(3); |
| 2055 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1833 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2056 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld))); | 1834 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld))); |
| 2057 __ LoadConstant(2, Double::Handle(Double::New(not_a_number, Heap::kOld))); | 1835 __ LoadConstant(2, Double::Handle(Double::New(not_a_number, Heap::kOld))); |
| 2058 __ UnboxDouble(1, 1); | 1836 __ UnboxDouble(1, 1); |
| 2059 __ UnboxDouble(2, 2); | 1837 __ UnboxDouble(2, 2); |
| 2060 __ IfDNe(1, 2); | 1838 __ IfDNe(1, 2); |
| 2061 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1839 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2062 __ Return(0); | 1840 __ Return(0); |
| 2063 } | 1841 } |
| 2064 | 1842 |
| 2065 | |
| 2066 ASSEMBLER_TEST_RUN(IfDNeNan, test) { | 1843 ASSEMBLER_TEST_RUN(IfDNeNan, test) { |
| 2067 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1844 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2068 } | 1845 } |
| 2069 | 1846 |
| 2070 | |
| 2071 ASSEMBLER_TEST_GENERATE(IfDEqTrue, assembler) { | 1847 ASSEMBLER_TEST_GENERATE(IfDEqTrue, assembler) { |
| 2072 __ Frame(3); | 1848 __ Frame(3); |
| 2073 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1849 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2074 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); | 1850 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); |
| 2075 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld))); | 1851 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld))); |
| 2076 __ UnboxDouble(1, 1); | 1852 __ UnboxDouble(1, 1); |
| 2077 __ UnboxDouble(2, 2); | 1853 __ UnboxDouble(2, 2); |
| 2078 __ IfDEq(1, 2); | 1854 __ IfDEq(1, 2); |
| 2079 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1855 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2080 __ Return(0); | 1856 __ Return(0); |
| 2081 } | 1857 } |
| 2082 | 1858 |
| 2083 | |
| 2084 ASSEMBLER_TEST_RUN(IfDEqTrue, test) { | 1859 ASSEMBLER_TEST_RUN(IfDEqTrue, test) { |
| 2085 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1860 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2086 } | 1861 } |
| 2087 | 1862 |
| 2088 | |
| 2089 ASSEMBLER_TEST_GENERATE(IfDEqFalse, assembler) { | 1863 ASSEMBLER_TEST_GENERATE(IfDEqFalse, assembler) { |
| 2090 __ Frame(3); | 1864 __ Frame(3); |
| 2091 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1865 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2092 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); | 1866 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); |
| 2093 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); | 1867 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); |
| 2094 __ UnboxDouble(1, 1); | 1868 __ UnboxDouble(1, 1); |
| 2095 __ UnboxDouble(2, 2); | 1869 __ UnboxDouble(2, 2); |
| 2096 __ IfDEq(1, 2); | 1870 __ IfDEq(1, 2); |
| 2097 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1871 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2098 __ Return(0); | 1872 __ Return(0); |
| 2099 } | 1873 } |
| 2100 | 1874 |
| 2101 | |
| 2102 ASSEMBLER_TEST_RUN(IfDEqFalse, test) { | 1875 ASSEMBLER_TEST_RUN(IfDEqFalse, test) { |
| 2103 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1876 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2104 } | 1877 } |
| 2105 | 1878 |
| 2106 | |
| 2107 ASSEMBLER_TEST_GENERATE(IfDEqNan, assembler) { | 1879 ASSEMBLER_TEST_GENERATE(IfDEqNan, assembler) { |
| 2108 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL); | 1880 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL); |
| 2109 __ Frame(3); | 1881 __ Frame(3); |
| 2110 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1882 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2111 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld))); | 1883 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld))); |
| 2112 __ LoadConstant(2, Double::Handle(Double::New(not_a_number, Heap::kOld))); | 1884 __ LoadConstant(2, Double::Handle(Double::New(not_a_number, Heap::kOld))); |
| 2113 __ UnboxDouble(1, 1); | 1885 __ UnboxDouble(1, 1); |
| 2114 __ UnboxDouble(2, 2); | 1886 __ UnboxDouble(2, 2); |
| 2115 __ IfDEq(1, 2); | 1887 __ IfDEq(1, 2); |
| 2116 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1888 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2117 __ Return(0); | 1889 __ Return(0); |
| 2118 } | 1890 } |
| 2119 | 1891 |
| 2120 | |
| 2121 ASSEMBLER_TEST_RUN(IfDEqNan, test) { | 1892 ASSEMBLER_TEST_RUN(IfDEqNan, test) { |
| 2122 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1893 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2123 } | 1894 } |
| 2124 | 1895 |
| 2125 | |
| 2126 ASSEMBLER_TEST_GENERATE(IfDLeTrue, assembler) { | 1896 ASSEMBLER_TEST_GENERATE(IfDLeTrue, assembler) { |
| 2127 __ Frame(3); | 1897 __ Frame(3); |
| 2128 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1898 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2129 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); | 1899 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); |
| 2130 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); | 1900 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); |
| 2131 __ UnboxDouble(1, 1); | 1901 __ UnboxDouble(1, 1); |
| 2132 __ UnboxDouble(2, 2); | 1902 __ UnboxDouble(2, 2); |
| 2133 __ IfDLe(1, 2); | 1903 __ IfDLe(1, 2); |
| 2134 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1904 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2135 __ Return(0); | 1905 __ Return(0); |
| 2136 } | 1906 } |
| 2137 | 1907 |
| 2138 | |
| 2139 ASSEMBLER_TEST_RUN(IfDLeTrue, test) { | 1908 ASSEMBLER_TEST_RUN(IfDLeTrue, test) { |
| 2140 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1909 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2141 } | 1910 } |
| 2142 | 1911 |
| 2143 | |
| 2144 ASSEMBLER_TEST_GENERATE(IfDLeFalse, assembler) { | 1912 ASSEMBLER_TEST_GENERATE(IfDLeFalse, assembler) { |
| 2145 __ Frame(3); | 1913 __ Frame(3); |
| 2146 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1914 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2147 __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld))); | 1915 __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld))); |
| 2148 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld))); | 1916 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld))); |
| 2149 __ UnboxDouble(1, 1); | 1917 __ UnboxDouble(1, 1); |
| 2150 __ UnboxDouble(2, 2); | 1918 __ UnboxDouble(2, 2); |
| 2151 __ IfDLe(1, 2); | 1919 __ IfDLe(1, 2); |
| 2152 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1920 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2153 __ Return(0); | 1921 __ Return(0); |
| 2154 } | 1922 } |
| 2155 | 1923 |
| 2156 | |
| 2157 ASSEMBLER_TEST_RUN(IfDLeFalse, test) { | 1924 ASSEMBLER_TEST_RUN(IfDLeFalse, test) { |
| 2158 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1925 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2159 } | 1926 } |
| 2160 | 1927 |
| 2161 | |
| 2162 ASSEMBLER_TEST_GENERATE(IfDLeNan, assembler) { | 1928 ASSEMBLER_TEST_GENERATE(IfDLeNan, assembler) { |
| 2163 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL); | 1929 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL); |
| 2164 __ Frame(3); | 1930 __ Frame(3); |
| 2165 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1931 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2166 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld))); | 1932 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld))); |
| 2167 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); | 1933 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); |
| 2168 __ UnboxDouble(1, 1); | 1934 __ UnboxDouble(1, 1); |
| 2169 __ UnboxDouble(2, 2); | 1935 __ UnboxDouble(2, 2); |
| 2170 __ IfDLe(1, 2); | 1936 __ IfDLe(1, 2); |
| 2171 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1937 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2172 __ Return(0); | 1938 __ Return(0); |
| 2173 } | 1939 } |
| 2174 | 1940 |
| 2175 | |
| 2176 ASSEMBLER_TEST_RUN(IfDLeNan, test) { | 1941 ASSEMBLER_TEST_RUN(IfDLeNan, test) { |
| 2177 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1942 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2178 } | 1943 } |
| 2179 | 1944 |
| 2180 | |
| 2181 ASSEMBLER_TEST_GENERATE(IfDLtTrue, assembler) { | 1945 ASSEMBLER_TEST_GENERATE(IfDLtTrue, assembler) { |
| 2182 __ Frame(3); | 1946 __ Frame(3); |
| 2183 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1947 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2184 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); | 1948 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); |
| 2185 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); | 1949 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); |
| 2186 __ UnboxDouble(1, 1); | 1950 __ UnboxDouble(1, 1); |
| 2187 __ UnboxDouble(2, 2); | 1951 __ UnboxDouble(2, 2); |
| 2188 __ IfDLt(1, 2); | 1952 __ IfDLt(1, 2); |
| 2189 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1953 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2190 __ Return(0); | 1954 __ Return(0); |
| 2191 } | 1955 } |
| 2192 | 1956 |
| 2193 | |
| 2194 ASSEMBLER_TEST_RUN(IfDLtTrue, test) { | 1957 ASSEMBLER_TEST_RUN(IfDLtTrue, test) { |
| 2195 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1958 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2196 } | 1959 } |
| 2197 | 1960 |
| 2198 | |
| 2199 ASSEMBLER_TEST_GENERATE(IfDLtFalse, assembler) { | 1961 ASSEMBLER_TEST_GENERATE(IfDLtFalse, assembler) { |
| 2200 __ Frame(3); | 1962 __ Frame(3); |
| 2201 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1963 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2202 __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld))); | 1964 __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld))); |
| 2203 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld))); | 1965 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld))); |
| 2204 __ UnboxDouble(1, 1); | 1966 __ UnboxDouble(1, 1); |
| 2205 __ UnboxDouble(2, 2); | 1967 __ UnboxDouble(2, 2); |
| 2206 __ IfDLt(1, 2); | 1968 __ IfDLt(1, 2); |
| 2207 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1969 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2208 __ Return(0); | 1970 __ Return(0); |
| 2209 } | 1971 } |
| 2210 | 1972 |
| 2211 | |
| 2212 ASSEMBLER_TEST_RUN(IfDLtFalse, test) { | 1973 ASSEMBLER_TEST_RUN(IfDLtFalse, test) { |
| 2213 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1974 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2214 } | 1975 } |
| 2215 | 1976 |
| 2216 | |
| 2217 ASSEMBLER_TEST_GENERATE(IfDLtNan, assembler) { | 1977 ASSEMBLER_TEST_GENERATE(IfDLtNan, assembler) { |
| 2218 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL); | 1978 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL); |
| 2219 __ Frame(3); | 1979 __ Frame(3); |
| 2220 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 1980 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2221 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld))); | 1981 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld))); |
| 2222 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); | 1982 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); |
| 2223 __ UnboxDouble(1, 1); | 1983 __ UnboxDouble(1, 1); |
| 2224 __ UnboxDouble(2, 2); | 1984 __ UnboxDouble(2, 2); |
| 2225 __ IfDLt(1, 2); | 1985 __ IfDLt(1, 2); |
| 2226 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1986 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2227 __ Return(0); | 1987 __ Return(0); |
| 2228 } | 1988 } |
| 2229 | 1989 |
| 2230 | |
| 2231 ASSEMBLER_TEST_RUN(IfDLtNan, test) { | 1990 ASSEMBLER_TEST_RUN(IfDLtNan, test) { |
| 2232 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 1991 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2233 } | 1992 } |
| 2234 | 1993 |
| 2235 | |
| 2236 ASSEMBLER_TEST_GENERATE(IfDGeTrue, assembler) { | 1994 ASSEMBLER_TEST_GENERATE(IfDGeTrue, assembler) { |
| 2237 __ Frame(3); | 1995 __ Frame(3); |
| 2238 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 1996 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2239 __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld))); | 1997 __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld))); |
| 2240 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld))); | 1998 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld))); |
| 2241 __ UnboxDouble(1, 1); | 1999 __ UnboxDouble(1, 1); |
| 2242 __ UnboxDouble(2, 2); | 2000 __ UnboxDouble(2, 2); |
| 2243 __ IfDGe(1, 2); | 2001 __ IfDGe(1, 2); |
| 2244 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2002 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2245 __ Return(0); | 2003 __ Return(0); |
| 2246 } | 2004 } |
| 2247 | 2005 |
| 2248 | |
| 2249 ASSEMBLER_TEST_RUN(IfDGeTrue, test) { | 2006 ASSEMBLER_TEST_RUN(IfDGeTrue, test) { |
| 2250 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2007 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2251 } | 2008 } |
| 2252 | 2009 |
| 2253 | |
| 2254 ASSEMBLER_TEST_GENERATE(IfDGeFalse, assembler) { | 2010 ASSEMBLER_TEST_GENERATE(IfDGeFalse, assembler) { |
| 2255 __ Frame(3); | 2011 __ Frame(3); |
| 2256 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2012 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2257 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); | 2013 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); |
| 2258 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); | 2014 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); |
| 2259 __ UnboxDouble(1, 1); | 2015 __ UnboxDouble(1, 1); |
| 2260 __ UnboxDouble(2, 2); | 2016 __ UnboxDouble(2, 2); |
| 2261 __ IfDGe(1, 2); | 2017 __ IfDGe(1, 2); |
| 2262 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 2018 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2263 __ Return(0); | 2019 __ Return(0); |
| 2264 } | 2020 } |
| 2265 | 2021 |
| 2266 | |
| 2267 ASSEMBLER_TEST_RUN(IfDGeFalse, test) { | 2022 ASSEMBLER_TEST_RUN(IfDGeFalse, test) { |
| 2268 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2023 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2269 } | 2024 } |
| 2270 | 2025 |
| 2271 | |
| 2272 ASSEMBLER_TEST_GENERATE(IfDGeNan, assembler) { | 2026 ASSEMBLER_TEST_GENERATE(IfDGeNan, assembler) { |
| 2273 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL); | 2027 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL); |
| 2274 __ Frame(3); | 2028 __ Frame(3); |
| 2275 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2029 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2276 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld))); | 2030 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld))); |
| 2277 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); | 2031 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); |
| 2278 __ UnboxDouble(1, 1); | 2032 __ UnboxDouble(1, 1); |
| 2279 __ UnboxDouble(2, 2); | 2033 __ UnboxDouble(2, 2); |
| 2280 __ IfDGe(1, 2); | 2034 __ IfDGe(1, 2); |
| 2281 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 2035 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2282 __ Return(0); | 2036 __ Return(0); |
| 2283 } | 2037 } |
| 2284 | 2038 |
| 2285 | |
| 2286 ASSEMBLER_TEST_RUN(IfDGeNan, test) { | 2039 ASSEMBLER_TEST_RUN(IfDGeNan, test) { |
| 2287 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2040 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2288 } | 2041 } |
| 2289 | 2042 |
| 2290 | |
| 2291 ASSEMBLER_TEST_GENERATE(IfDGtTrue, assembler) { | 2043 ASSEMBLER_TEST_GENERATE(IfDGtTrue, assembler) { |
| 2292 __ Frame(3); | 2044 __ Frame(3); |
| 2293 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 2045 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2294 __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld))); | 2046 __ LoadConstant(1, Double::Handle(Double::New(100.0, Heap::kOld))); |
| 2295 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld))); | 2047 __ LoadConstant(2, Double::Handle(Double::New(-5.0, Heap::kOld))); |
| 2296 __ UnboxDouble(1, 1); | 2048 __ UnboxDouble(1, 1); |
| 2297 __ UnboxDouble(2, 2); | 2049 __ UnboxDouble(2, 2); |
| 2298 __ IfDGt(1, 2); | 2050 __ IfDGt(1, 2); |
| 2299 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2051 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2300 __ Return(0); | 2052 __ Return(0); |
| 2301 } | 2053 } |
| 2302 | 2054 |
| 2303 | |
| 2304 ASSEMBLER_TEST_RUN(IfDGtTrue, test) { | 2055 ASSEMBLER_TEST_RUN(IfDGtTrue, test) { |
| 2305 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2056 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2306 } | 2057 } |
| 2307 | 2058 |
| 2308 | |
| 2309 ASSEMBLER_TEST_GENERATE(IfDGtFalse, assembler) { | 2059 ASSEMBLER_TEST_GENERATE(IfDGtFalse, assembler) { |
| 2310 __ Frame(3); | 2060 __ Frame(3); |
| 2311 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2061 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2312 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); | 2062 __ LoadConstant(1, Double::Handle(Double::New(-5.0, Heap::kOld))); |
| 2313 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); | 2063 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); |
| 2314 __ UnboxDouble(1, 1); | 2064 __ UnboxDouble(1, 1); |
| 2315 __ UnboxDouble(2, 2); | 2065 __ UnboxDouble(2, 2); |
| 2316 __ IfDGt(1, 2); | 2066 __ IfDGt(1, 2); |
| 2317 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 2067 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2318 __ Return(0); | 2068 __ Return(0); |
| 2319 } | 2069 } |
| 2320 | 2070 |
| 2321 | |
| 2322 ASSEMBLER_TEST_RUN(IfDGtFalse, test) { | 2071 ASSEMBLER_TEST_RUN(IfDGtFalse, test) { |
| 2323 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2072 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2324 } | 2073 } |
| 2325 | 2074 |
| 2326 | |
| 2327 ASSEMBLER_TEST_GENERATE(IfDGtNan, assembler) { | 2075 ASSEMBLER_TEST_GENERATE(IfDGtNan, assembler) { |
| 2328 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL); | 2076 const double not_a_number = bit_cast<double, intptr_t>(0x7FF8000000000000LL); |
| 2329 __ Frame(3); | 2077 __ Frame(3); |
| 2330 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2078 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2331 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld))); | 2079 __ LoadConstant(1, Double::Handle(Double::New(not_a_number, Heap::kOld))); |
| 2332 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); | 2080 __ LoadConstant(2, Double::Handle(Double::New(100.0, Heap::kOld))); |
| 2333 __ UnboxDouble(1, 1); | 2081 __ UnboxDouble(1, 1); |
| 2334 __ UnboxDouble(2, 2); | 2082 __ UnboxDouble(2, 2); |
| 2335 __ IfDGt(1, 2); | 2083 __ IfDGt(1, 2); |
| 2336 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 2084 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2337 __ Return(0); | 2085 __ Return(0); |
| 2338 } | 2086 } |
| 2339 | 2087 |
| 2340 | |
| 2341 ASSEMBLER_TEST_RUN(IfDGtNan, test) { | 2088 ASSEMBLER_TEST_RUN(IfDGtNan, test) { |
| 2342 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2089 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2343 } | 2090 } |
| 2344 #endif // defined(ARCH_IS_64_BIT) | 2091 #endif // defined(ARCH_IS_64_BIT) |
| 2345 | 2092 |
| 2346 | |
| 2347 ASSEMBLER_TEST_GENERATE(IfULeTrue, assembler) { | 2093 ASSEMBLER_TEST_GENERATE(IfULeTrue, assembler) { |
| 2348 __ Frame(3); | 2094 __ Frame(3); |
| 2349 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 2095 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2350 __ LoadConstant(1, Smi::Handle(Smi::New(5))); | 2096 __ LoadConstant(1, Smi::Handle(Smi::New(5))); |
| 2351 __ LoadConstant(2, Smi::Handle(Smi::New(100))); | 2097 __ LoadConstant(2, Smi::Handle(Smi::New(100))); |
| 2352 __ IfULe(1, 2); | 2098 __ IfULe(1, 2); |
| 2353 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2099 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2354 __ Return(0); | 2100 __ Return(0); |
| 2355 } | 2101 } |
| 2356 | 2102 |
| 2357 | |
| 2358 ASSEMBLER_TEST_RUN(IfULeTrue, test) { | 2103 ASSEMBLER_TEST_RUN(IfULeTrue, test) { |
| 2359 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2104 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2360 } | 2105 } |
| 2361 | 2106 |
| 2362 | |
| 2363 ASSEMBLER_TEST_GENERATE(IfULeFalse, assembler) { | 2107 ASSEMBLER_TEST_GENERATE(IfULeFalse, assembler) { |
| 2364 __ Frame(3); | 2108 __ Frame(3); |
| 2365 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2109 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2366 __ LoadConstant(1, Smi::Handle(Smi::New(100))); | 2110 __ LoadConstant(1, Smi::Handle(Smi::New(100))); |
| 2367 __ LoadConstant(2, Smi::Handle(Smi::New(5))); | 2111 __ LoadConstant(2, Smi::Handle(Smi::New(5))); |
| 2368 __ IfULe(1, 2); | 2112 __ IfULe(1, 2); |
| 2369 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 2113 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2370 __ Return(0); | 2114 __ Return(0); |
| 2371 } | 2115 } |
| 2372 | 2116 |
| 2373 | |
| 2374 ASSEMBLER_TEST_RUN(IfULeFalse, test) { | 2117 ASSEMBLER_TEST_RUN(IfULeFalse, test) { |
| 2375 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2118 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2376 } | 2119 } |
| 2377 | 2120 |
| 2378 | |
| 2379 ASSEMBLER_TEST_GENERATE(IfULeNegTrue, assembler) { | 2121 ASSEMBLER_TEST_GENERATE(IfULeNegTrue, assembler) { |
| 2380 __ Frame(3); | 2122 __ Frame(3); |
| 2381 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 2123 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2382 __ LoadConstant(1, Smi::Handle(Smi::New(5))); | 2124 __ LoadConstant(1, Smi::Handle(Smi::New(5))); |
| 2383 __ LoadConstant(2, Smi::Handle(Smi::New(-5))); | 2125 __ LoadConstant(2, Smi::Handle(Smi::New(-5))); |
| 2384 __ IfULe(1, 2); | 2126 __ IfULe(1, 2); |
| 2385 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2127 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2386 __ Return(0); | 2128 __ Return(0); |
| 2387 } | 2129 } |
| 2388 | 2130 |
| 2389 | |
| 2390 ASSEMBLER_TEST_RUN(IfULeNegTrue, test) { | 2131 ASSEMBLER_TEST_RUN(IfULeNegTrue, test) { |
| 2391 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2132 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2392 } | 2133 } |
| 2393 | 2134 |
| 2394 | |
| 2395 ASSEMBLER_TEST_GENERATE(IfULtTrue, assembler) { | 2135 ASSEMBLER_TEST_GENERATE(IfULtTrue, assembler) { |
| 2396 __ Frame(3); | 2136 __ Frame(3); |
| 2397 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 2137 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2398 __ LoadConstant(1, Smi::Handle(Smi::New(5))); | 2138 __ LoadConstant(1, Smi::Handle(Smi::New(5))); |
| 2399 __ LoadConstant(2, Smi::Handle(Smi::New(100))); | 2139 __ LoadConstant(2, Smi::Handle(Smi::New(100))); |
| 2400 __ IfULt(1, 2); | 2140 __ IfULt(1, 2); |
| 2401 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2141 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2402 __ Return(0); | 2142 __ Return(0); |
| 2403 } | 2143 } |
| 2404 | 2144 |
| 2405 | |
| 2406 ASSEMBLER_TEST_RUN(IfULtTrue, test) { | 2145 ASSEMBLER_TEST_RUN(IfULtTrue, test) { |
| 2407 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2146 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2408 } | 2147 } |
| 2409 | 2148 |
| 2410 | |
| 2411 ASSEMBLER_TEST_GENERATE(IfULtFalse, assembler) { | 2149 ASSEMBLER_TEST_GENERATE(IfULtFalse, assembler) { |
| 2412 __ Frame(3); | 2150 __ Frame(3); |
| 2413 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2151 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2414 __ LoadConstant(1, Smi::Handle(Smi::New(100))); | 2152 __ LoadConstant(1, Smi::Handle(Smi::New(100))); |
| 2415 __ LoadConstant(2, Smi::Handle(Smi::New(5))); | 2153 __ LoadConstant(2, Smi::Handle(Smi::New(5))); |
| 2416 __ IfULt(1, 2); | 2154 __ IfULt(1, 2); |
| 2417 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 2155 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2418 __ Return(0); | 2156 __ Return(0); |
| 2419 } | 2157 } |
| 2420 | 2158 |
| 2421 | |
| 2422 ASSEMBLER_TEST_RUN(IfULtFalse, test) { | 2159 ASSEMBLER_TEST_RUN(IfULtFalse, test) { |
| 2423 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2160 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2424 } | 2161 } |
| 2425 | 2162 |
| 2426 | |
| 2427 ASSEMBLER_TEST_GENERATE(IfUGeTrue, assembler) { | 2163 ASSEMBLER_TEST_GENERATE(IfUGeTrue, assembler) { |
| 2428 __ Frame(3); | 2164 __ Frame(3); |
| 2429 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 2165 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2430 __ LoadConstant(1, Smi::Handle(Smi::New(100))); | 2166 __ LoadConstant(1, Smi::Handle(Smi::New(100))); |
| 2431 __ LoadConstant(2, Smi::Handle(Smi::New(5))); | 2167 __ LoadConstant(2, Smi::Handle(Smi::New(5))); |
| 2432 __ IfUGe(1, 2); | 2168 __ IfUGe(1, 2); |
| 2433 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2169 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2434 __ Return(0); | 2170 __ Return(0); |
| 2435 } | 2171 } |
| 2436 | 2172 |
| 2437 | |
| 2438 ASSEMBLER_TEST_RUN(IfUGeTrue, test) { | 2173 ASSEMBLER_TEST_RUN(IfUGeTrue, test) { |
| 2439 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2174 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2440 } | 2175 } |
| 2441 | 2176 |
| 2442 | |
| 2443 ASSEMBLER_TEST_GENERATE(IfUGeFalse, assembler) { | 2177 ASSEMBLER_TEST_GENERATE(IfUGeFalse, assembler) { |
| 2444 __ Frame(3); | 2178 __ Frame(3); |
| 2445 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2179 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2446 __ LoadConstant(1, Smi::Handle(Smi::New(5))); | 2180 __ LoadConstant(1, Smi::Handle(Smi::New(5))); |
| 2447 __ LoadConstant(2, Smi::Handle(Smi::New(100))); | 2181 __ LoadConstant(2, Smi::Handle(Smi::New(100))); |
| 2448 __ IfUGe(1, 2); | 2182 __ IfUGe(1, 2); |
| 2449 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 2183 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2450 __ Return(0); | 2184 __ Return(0); |
| 2451 } | 2185 } |
| 2452 | 2186 |
| 2453 | |
| 2454 ASSEMBLER_TEST_RUN(IfUGeFalse, test) { | 2187 ASSEMBLER_TEST_RUN(IfUGeFalse, test) { |
| 2455 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2188 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2456 } | 2189 } |
| 2457 | 2190 |
| 2458 | |
| 2459 ASSEMBLER_TEST_GENERATE(IfUGtTrue, assembler) { | 2191 ASSEMBLER_TEST_GENERATE(IfUGtTrue, assembler) { |
| 2460 __ Frame(3); | 2192 __ Frame(3); |
| 2461 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 2193 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2462 __ LoadConstant(1, Smi::Handle(Smi::New(100))); | 2194 __ LoadConstant(1, Smi::Handle(Smi::New(100))); |
| 2463 __ LoadConstant(2, Smi::Handle(Smi::New(5))); | 2195 __ LoadConstant(2, Smi::Handle(Smi::New(5))); |
| 2464 __ IfUGt(1, 2); | 2196 __ IfUGt(1, 2); |
| 2465 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2197 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2466 __ Return(0); | 2198 __ Return(0); |
| 2467 } | 2199 } |
| 2468 | 2200 |
| 2469 | |
| 2470 ASSEMBLER_TEST_RUN(IfUGtTrue, test) { | 2201 ASSEMBLER_TEST_RUN(IfUGtTrue, test) { |
| 2471 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2202 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2472 } | 2203 } |
| 2473 | 2204 |
| 2474 | |
| 2475 ASSEMBLER_TEST_GENERATE(IfUGtFalse, assembler) { | 2205 ASSEMBLER_TEST_GENERATE(IfUGtFalse, assembler) { |
| 2476 __ Frame(3); | 2206 __ Frame(3); |
| 2477 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2207 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2478 __ LoadConstant(1, Smi::Handle(Smi::New(5))); | 2208 __ LoadConstant(1, Smi::Handle(Smi::New(5))); |
| 2479 __ LoadConstant(2, Smi::Handle(Smi::New(100))); | 2209 __ LoadConstant(2, Smi::Handle(Smi::New(100))); |
| 2480 __ IfUGt(1, 2); | 2210 __ IfUGt(1, 2); |
| 2481 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); | 2211 __ LoadConstant(0, Smi::Handle(Smi::New(-1))); |
| 2482 __ Return(0); | 2212 __ Return(0); |
| 2483 } | 2213 } |
| 2484 | 2214 |
| 2485 | |
| 2486 ASSEMBLER_TEST_RUN(IfUGtFalse, test) { | 2215 ASSEMBLER_TEST_RUN(IfUGtFalse, test) { |
| 2487 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2216 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2488 } | 2217 } |
| 2489 | 2218 |
| 2490 | |
| 2491 // - Min, Max rA, rB, rC | 2219 // - Min, Max rA, rB, rC |
| 2492 // | 2220 // |
| 2493 // FP[rA] <- {min, max}(FP[rB], FP[rC]). Assumes that FP[rB], and FP[rC] are | 2221 // FP[rA] <- {min, max}(FP[rB], FP[rC]). Assumes that FP[rB], and FP[rC] are |
| 2494 // Smis. | 2222 // Smis. |
| 2495 ASSEMBLER_TEST_GENERATE(Min, assembler) { | 2223 ASSEMBLER_TEST_GENERATE(Min, assembler) { |
| 2496 __ Frame(3); | 2224 __ Frame(3); |
| 2497 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2225 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2498 __ LoadConstant(1, Smi::Handle(Smi::New(500))); | 2226 __ LoadConstant(1, Smi::Handle(Smi::New(500))); |
| 2499 __ Min(2, 0, 1); | 2227 __ Min(2, 0, 1); |
| 2500 __ Return(2); | 2228 __ Return(2); |
| 2501 } | 2229 } |
| 2502 | 2230 |
| 2503 | |
| 2504 ASSEMBLER_TEST_RUN(Min, test) { | 2231 ASSEMBLER_TEST_RUN(Min, test) { |
| 2505 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2232 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2506 } | 2233 } |
| 2507 | 2234 |
| 2508 | |
| 2509 ASSEMBLER_TEST_GENERATE(Max, assembler) { | 2235 ASSEMBLER_TEST_GENERATE(Max, assembler) { |
| 2510 __ Frame(3); | 2236 __ Frame(3); |
| 2511 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2237 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2512 __ LoadConstant(1, Smi::Handle(Smi::New(5))); | 2238 __ LoadConstant(1, Smi::Handle(Smi::New(5))); |
| 2513 __ Max(2, 0, 1); | 2239 __ Max(2, 0, 1); |
| 2514 __ Return(2); | 2240 __ Return(2); |
| 2515 } | 2241 } |
| 2516 | 2242 |
| 2517 | |
| 2518 ASSEMBLER_TEST_RUN(Max, test) { | 2243 ASSEMBLER_TEST_RUN(Max, test) { |
| 2519 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2244 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2520 } | 2245 } |
| 2521 | 2246 |
| 2522 | |
| 2523 #if defined(ARCH_IS_64_BIT) | 2247 #if defined(ARCH_IS_64_BIT) |
| 2524 // - UnboxDouble rA, rD | 2248 // - UnboxDouble rA, rD |
| 2525 // | 2249 // |
| 2526 // Unbox the double in FP[rD] into FP[rA]. Assumes FP[rD] is a double. | 2250 // Unbox the double in FP[rD] into FP[rA]. Assumes FP[rD] is a double. |
| 2527 // | 2251 // |
| 2528 // - CheckedUnboxDouble rA, rD | 2252 // - CheckedUnboxDouble rA, rD |
| 2529 // | 2253 // |
| 2530 // Unboxes FP[rD] into FP[rA] and skips the following instruction unless | 2254 // Unboxes FP[rD] into FP[rA] and skips the following instruction unless |
| 2531 // FP[rD] is not a double or a Smi. When FP[rD] is a Smi, converts it to a | 2255 // FP[rD] is not a double or a Smi. When FP[rD] is a Smi, converts it to a |
| 2532 // double. | 2256 // double. |
| 2533 ASSEMBLER_TEST_GENERATE(Unbox, assembler) { | 2257 ASSEMBLER_TEST_GENERATE(Unbox, assembler) { |
| 2534 __ Frame(2); | 2258 __ Frame(2); |
| 2535 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld))); | 2259 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld))); |
| 2536 __ UnboxDouble(1, 0); | 2260 __ UnboxDouble(1, 0); |
| 2537 __ Return(1); | 2261 __ Return(1); |
| 2538 } | 2262 } |
| 2539 | 2263 |
| 2540 | |
| 2541 ASSEMBLER_TEST_RUN(Unbox, test) { | 2264 ASSEMBLER_TEST_RUN(Unbox, test) { |
| 2542 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); | 2265 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); |
| 2543 } | 2266 } |
| 2544 | 2267 |
| 2545 | |
| 2546 ASSEMBLER_TEST_GENERATE(CheckedUnboxDouble, assembler) { | 2268 ASSEMBLER_TEST_GENERATE(CheckedUnboxDouble, assembler) { |
| 2547 __ Frame(2); | 2269 __ Frame(2); |
| 2548 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld))); | 2270 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld))); |
| 2549 __ CheckedUnboxDouble(1, 0); | 2271 __ CheckedUnboxDouble(1, 0); |
| 2550 __ LoadConstant(1, Smi::Handle(Smi::New(0))); | 2272 __ LoadConstant(1, Smi::Handle(Smi::New(0))); |
| 2551 __ Return(1); | 2273 __ Return(1); |
| 2552 } | 2274 } |
| 2553 | 2275 |
| 2554 | |
| 2555 ASSEMBLER_TEST_RUN(CheckedUnboxDouble, test) { | 2276 ASSEMBLER_TEST_RUN(CheckedUnboxDouble, test) { |
| 2556 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); | 2277 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); |
| 2557 } | 2278 } |
| 2558 | 2279 |
| 2559 | |
| 2560 ASSEMBLER_TEST_GENERATE(CheckedUnboxSmi, assembler) { | 2280 ASSEMBLER_TEST_GENERATE(CheckedUnboxSmi, assembler) { |
| 2561 __ Frame(2); | 2281 __ Frame(2); |
| 2562 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2282 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2563 __ CheckedUnboxDouble(1, 0); | 2283 __ CheckedUnboxDouble(1, 0); |
| 2564 __ LoadConstant(1, Smi::Handle(Smi::New(0))); | 2284 __ LoadConstant(1, Smi::Handle(Smi::New(0))); |
| 2565 __ Return(1); | 2285 __ Return(1); |
| 2566 } | 2286 } |
| 2567 | 2287 |
| 2568 | |
| 2569 ASSEMBLER_TEST_RUN(CheckedUnboxSmi, test) { | 2288 ASSEMBLER_TEST_RUN(CheckedUnboxSmi, test) { |
| 2570 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); | 2289 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); |
| 2571 } | 2290 } |
| 2572 | 2291 |
| 2573 | |
| 2574 ASSEMBLER_TEST_GENERATE(CheckedUnboxFail, assembler) { | 2292 ASSEMBLER_TEST_GENERATE(CheckedUnboxFail, assembler) { |
| 2575 __ Frame(2); | 2293 __ Frame(2); |
| 2576 __ LoadConstant(0, Bool::True()); | 2294 __ LoadConstant(0, Bool::True()); |
| 2577 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 2295 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 2578 __ CheckedUnboxDouble(1, 0); | 2296 __ CheckedUnboxDouble(1, 0); |
| 2579 __ LoadConstant(1, Smi::Handle(Smi::New(42))); | 2297 __ LoadConstant(1, Smi::Handle(Smi::New(42))); |
| 2580 __ Return(1); | 2298 __ Return(1); |
| 2581 } | 2299 } |
| 2582 | 2300 |
| 2583 | |
| 2584 ASSEMBLER_TEST_RUN(CheckedUnboxFail, test) { | 2301 ASSEMBLER_TEST_RUN(CheckedUnboxFail, test) { |
| 2585 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2302 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2586 } | 2303 } |
| 2587 | 2304 |
| 2588 | |
| 2589 // - DAdd, DSub, DMul, DDiv rA, rB, rC | 2305 // - DAdd, DSub, DMul, DDiv rA, rB, rC |
| 2590 // | 2306 // |
| 2591 // Arithmetic operations on unboxed doubles. FP[rA] <- FP[rB] op FP[rC]. | 2307 // Arithmetic operations on unboxed doubles. FP[rA] <- FP[rB] op FP[rC]. |
| 2592 ASSEMBLER_TEST_GENERATE(DAdd, assembler) { | 2308 ASSEMBLER_TEST_GENERATE(DAdd, assembler) { |
| 2593 __ Frame(3); | 2309 __ Frame(3); |
| 2594 __ LoadConstant(0, Double::Handle(Double::New(41.0, Heap::kOld))); | 2310 __ LoadConstant(0, Double::Handle(Double::New(41.0, Heap::kOld))); |
| 2595 __ LoadConstant(1, Double::Handle(Double::New(1.0, Heap::kOld))); | 2311 __ LoadConstant(1, Double::Handle(Double::New(1.0, Heap::kOld))); |
| 2596 __ UnboxDouble(0, 0); | 2312 __ UnboxDouble(0, 0); |
| 2597 __ UnboxDouble(1, 1); | 2313 __ UnboxDouble(1, 1); |
| 2598 __ DAdd(2, 1, 0); | 2314 __ DAdd(2, 1, 0); |
| 2599 __ Return(2); | 2315 __ Return(2); |
| 2600 } | 2316 } |
| 2601 | 2317 |
| 2602 | |
| 2603 ASSEMBLER_TEST_RUN(DAdd, test) { | 2318 ASSEMBLER_TEST_RUN(DAdd, test) { |
| 2604 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); | 2319 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); |
| 2605 } | 2320 } |
| 2606 | 2321 |
| 2607 | |
| 2608 ASSEMBLER_TEST_GENERATE(DSub, assembler) { | 2322 ASSEMBLER_TEST_GENERATE(DSub, assembler) { |
| 2609 __ Frame(3); | 2323 __ Frame(3); |
| 2610 __ LoadConstant(0, Double::Handle(Double::New(1.0, Heap::kOld))); | 2324 __ LoadConstant(0, Double::Handle(Double::New(1.0, Heap::kOld))); |
| 2611 __ LoadConstant(1, Double::Handle(Double::New(43.0, Heap::kOld))); | 2325 __ LoadConstant(1, Double::Handle(Double::New(43.0, Heap::kOld))); |
| 2612 __ UnboxDouble(0, 0); | 2326 __ UnboxDouble(0, 0); |
| 2613 __ UnboxDouble(1, 1); | 2327 __ UnboxDouble(1, 1); |
| 2614 __ DSub(2, 1, 0); | 2328 __ DSub(2, 1, 0); |
| 2615 __ Return(2); | 2329 __ Return(2); |
| 2616 } | 2330 } |
| 2617 | 2331 |
| 2618 | |
| 2619 ASSEMBLER_TEST_RUN(DSub, test) { | 2332 ASSEMBLER_TEST_RUN(DSub, test) { |
| 2620 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); | 2333 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); |
| 2621 } | 2334 } |
| 2622 | 2335 |
| 2623 | |
| 2624 ASSEMBLER_TEST_GENERATE(DMul, assembler) { | 2336 ASSEMBLER_TEST_GENERATE(DMul, assembler) { |
| 2625 __ Frame(3); | 2337 __ Frame(3); |
| 2626 __ LoadConstant(0, Double::Handle(Double::New(6.0, Heap::kOld))); | 2338 __ LoadConstant(0, Double::Handle(Double::New(6.0, Heap::kOld))); |
| 2627 __ LoadConstant(1, Double::Handle(Double::New(7.0, Heap::kOld))); | 2339 __ LoadConstant(1, Double::Handle(Double::New(7.0, Heap::kOld))); |
| 2628 __ UnboxDouble(0, 0); | 2340 __ UnboxDouble(0, 0); |
| 2629 __ UnboxDouble(1, 1); | 2341 __ UnboxDouble(1, 1); |
| 2630 __ DMul(2, 1, 0); | 2342 __ DMul(2, 1, 0); |
| 2631 __ Return(2); | 2343 __ Return(2); |
| 2632 } | 2344 } |
| 2633 | 2345 |
| 2634 | |
| 2635 ASSEMBLER_TEST_RUN(DMul, test) { | 2346 ASSEMBLER_TEST_RUN(DMul, test) { |
| 2636 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); | 2347 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); |
| 2637 } | 2348 } |
| 2638 | 2349 |
| 2639 | |
| 2640 ASSEMBLER_TEST_GENERATE(DDiv, assembler) { | 2350 ASSEMBLER_TEST_GENERATE(DDiv, assembler) { |
| 2641 __ Frame(3); | 2351 __ Frame(3); |
| 2642 __ LoadConstant(0, Double::Handle(Double::New(2.0, Heap::kOld))); | 2352 __ LoadConstant(0, Double::Handle(Double::New(2.0, Heap::kOld))); |
| 2643 __ LoadConstant(1, Double::Handle(Double::New(84.0, Heap::kOld))); | 2353 __ LoadConstant(1, Double::Handle(Double::New(84.0, Heap::kOld))); |
| 2644 __ UnboxDouble(0, 0); | 2354 __ UnboxDouble(0, 0); |
| 2645 __ UnboxDouble(1, 1); | 2355 __ UnboxDouble(1, 1); |
| 2646 __ DDiv(2, 1, 0); | 2356 __ DDiv(2, 1, 0); |
| 2647 __ Return(2); | 2357 __ Return(2); |
| 2648 } | 2358 } |
| 2649 | 2359 |
| 2650 | |
| 2651 ASSEMBLER_TEST_RUN(DDiv, test) { | 2360 ASSEMBLER_TEST_RUN(DDiv, test) { |
| 2652 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); | 2361 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); |
| 2653 } | 2362 } |
| 2654 | 2363 |
| 2655 | |
| 2656 ASSEMBLER_TEST_GENERATE(DNeg, assembler) { | 2364 ASSEMBLER_TEST_GENERATE(DNeg, assembler) { |
| 2657 __ Frame(2); | 2365 __ Frame(2); |
| 2658 __ LoadConstant(0, Double::Handle(Double::New(-42.0, Heap::kOld))); | 2366 __ LoadConstant(0, Double::Handle(Double::New(-42.0, Heap::kOld))); |
| 2659 __ UnboxDouble(0, 0); | 2367 __ UnboxDouble(0, 0); |
| 2660 __ DNeg(1, 0); | 2368 __ DNeg(1, 0); |
| 2661 __ Return(1); | 2369 __ Return(1); |
| 2662 } | 2370 } |
| 2663 | 2371 |
| 2664 | |
| 2665 ASSEMBLER_TEST_RUN(DNeg, test) { | 2372 ASSEMBLER_TEST_RUN(DNeg, test) { |
| 2666 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); | 2373 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); |
| 2667 } | 2374 } |
| 2668 | 2375 |
| 2669 | |
| 2670 ASSEMBLER_TEST_GENERATE(DSqrt, assembler) { | 2376 ASSEMBLER_TEST_GENERATE(DSqrt, assembler) { |
| 2671 __ Frame(2); | 2377 __ Frame(2); |
| 2672 __ LoadConstant(0, Double::Handle(Double::New(36.0, Heap::kOld))); | 2378 __ LoadConstant(0, Double::Handle(Double::New(36.0, Heap::kOld))); |
| 2673 __ UnboxDouble(0, 0); | 2379 __ UnboxDouble(0, 0); |
| 2674 __ DSqrt(1, 0); | 2380 __ DSqrt(1, 0); |
| 2675 __ Return(1); | 2381 __ Return(1); |
| 2676 } | 2382 } |
| 2677 | 2383 |
| 2678 | |
| 2679 ASSEMBLER_TEST_RUN(DSqrt, test) { | 2384 ASSEMBLER_TEST_RUN(DSqrt, test) { |
| 2680 EXPECT_EQ(6.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); | 2385 EXPECT_EQ(6.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); |
| 2681 } | 2386 } |
| 2682 | 2387 |
| 2683 | |
| 2684 // - SmiToDouble rA, rD | 2388 // - SmiToDouble rA, rD |
| 2685 // | 2389 // |
| 2686 // Convert the Smi in FP[rD] to an unboxed double in FP[rA]. | 2390 // Convert the Smi in FP[rD] to an unboxed double in FP[rA]. |
| 2687 // | 2391 // |
| 2688 // - DoubleToSmi rA, rD | 2392 // - DoubleToSmi rA, rD |
| 2689 // | 2393 // |
| 2690 // If the unboxed double in FP[rD] can be converted to a Smi in FP[rA], then | 2394 // If the unboxed double in FP[rD] can be converted to a Smi in FP[rA], then |
| 2691 // this instruction does so, and skips the following instruction. Otherwise, | 2395 // this instruction does so, and skips the following instruction. Otherwise, |
| 2692 // the following instruction is not skipped. | 2396 // the following instruction is not skipped. |
| 2693 ASSEMBLER_TEST_GENERATE(SmiToDouble, assembler) { | 2397 ASSEMBLER_TEST_GENERATE(SmiToDouble, assembler) { |
| 2694 __ Frame(2); | 2398 __ Frame(2); |
| 2695 __ LoadConstant(0, Smi::Handle(Smi::New(42))); | 2399 __ LoadConstant(0, Smi::Handle(Smi::New(42))); |
| 2696 __ SmiToDouble(1, 0); | 2400 __ SmiToDouble(1, 0); |
| 2697 __ Return(1); | 2401 __ Return(1); |
| 2698 } | 2402 } |
| 2699 | 2403 |
| 2700 | |
| 2701 ASSEMBLER_TEST_RUN(SmiToDouble, test) { | 2404 ASSEMBLER_TEST_RUN(SmiToDouble, test) { |
| 2702 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); | 2405 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); |
| 2703 } | 2406 } |
| 2704 | 2407 |
| 2705 | |
| 2706 ASSEMBLER_TEST_GENERATE(DoubleToSmi, assembler) { | 2408 ASSEMBLER_TEST_GENERATE(DoubleToSmi, assembler) { |
| 2707 __ Frame(2); | 2409 __ Frame(2); |
| 2708 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld))); | 2410 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld))); |
| 2709 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 2411 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 2710 __ UnboxDouble(0, 0); | 2412 __ UnboxDouble(0, 0); |
| 2711 __ DoubleToSmi(1, 0); | 2413 __ DoubleToSmi(1, 0); |
| 2712 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 2414 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 2713 __ Return(1); | 2415 __ Return(1); |
| 2714 } | 2416 } |
| 2715 | 2417 |
| 2716 | |
| 2717 ASSEMBLER_TEST_RUN(DoubleToSmi, test) { | 2418 ASSEMBLER_TEST_RUN(DoubleToSmi, test) { |
| 2718 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2419 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2719 } | 2420 } |
| 2720 | 2421 |
| 2721 | |
| 2722 ASSEMBLER_TEST_GENERATE(DoubleToSmiNearMax, assembler) { | 2422 ASSEMBLER_TEST_GENERATE(DoubleToSmiNearMax, assembler) { |
| 2723 const double m = static_cast<double>(Smi::kMaxValue - 1000); | 2423 const double m = static_cast<double>(Smi::kMaxValue - 1000); |
| 2724 __ Frame(2); | 2424 __ Frame(2); |
| 2725 __ LoadConstant(0, Double::Handle(Double::New(m, Heap::kOld))); | 2425 __ LoadConstant(0, Double::Handle(Double::New(m, Heap::kOld))); |
| 2726 __ LoadConstant(1, Smi::Handle(Smi::New(42))); | 2426 __ LoadConstant(1, Smi::Handle(Smi::New(42))); |
| 2727 __ UnboxDouble(0, 0); | 2427 __ UnboxDouble(0, 0); |
| 2728 __ DoubleToSmi(0, 0); | 2428 __ DoubleToSmi(0, 0); |
| 2729 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 2429 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 2730 __ Return(1); | 2430 __ Return(1); |
| 2731 } | 2431 } |
| 2732 | 2432 |
| 2733 | |
| 2734 ASSEMBLER_TEST_RUN(DoubleToSmiNearMax, test) { | 2433 ASSEMBLER_TEST_RUN(DoubleToSmiNearMax, test) { |
| 2735 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2434 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2736 } | 2435 } |
| 2737 | 2436 |
| 2738 | |
| 2739 ASSEMBLER_TEST_GENERATE(DoubleToSmiNearMin, assembler) { | 2437 ASSEMBLER_TEST_GENERATE(DoubleToSmiNearMin, assembler) { |
| 2740 const double m = static_cast<double>(Smi::kMinValue); | 2438 const double m = static_cast<double>(Smi::kMinValue); |
| 2741 __ Frame(2); | 2439 __ Frame(2); |
| 2742 __ LoadConstant(0, Double::Handle(Double::New(m, Heap::kOld))); | 2440 __ LoadConstant(0, Double::Handle(Double::New(m, Heap::kOld))); |
| 2743 __ LoadConstant(1, Smi::Handle(Smi::New(42))); | 2441 __ LoadConstant(1, Smi::Handle(Smi::New(42))); |
| 2744 __ UnboxDouble(0, 0); | 2442 __ UnboxDouble(0, 0); |
| 2745 __ DoubleToSmi(0, 0); | 2443 __ DoubleToSmi(0, 0); |
| 2746 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 2444 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 2747 __ Return(1); | 2445 __ Return(1); |
| 2748 } | 2446 } |
| 2749 | 2447 |
| 2750 | |
| 2751 ASSEMBLER_TEST_RUN(DoubleToSmiNearMin, test) { | 2448 ASSEMBLER_TEST_RUN(DoubleToSmiNearMin, test) { |
| 2752 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2449 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2753 } | 2450 } |
| 2754 | 2451 |
| 2755 | |
| 2756 ASSEMBLER_TEST_GENERATE(DoubleToSmiFailPos, assembler) { | 2452 ASSEMBLER_TEST_GENERATE(DoubleToSmiFailPos, assembler) { |
| 2757 const double pos_overflow = static_cast<double>(Smi::kMaxValue + 1); | 2453 const double pos_overflow = static_cast<double>(Smi::kMaxValue + 1); |
| 2758 __ Frame(2); | 2454 __ Frame(2); |
| 2759 __ LoadConstant(0, Double::Handle(Double::New(pos_overflow, Heap::kOld))); | 2455 __ LoadConstant(0, Double::Handle(Double::New(pos_overflow, Heap::kOld))); |
| 2760 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 2456 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 2761 __ UnboxDouble(0, 0); | 2457 __ UnboxDouble(0, 0); |
| 2762 __ DoubleToSmi(1, 0); | 2458 __ DoubleToSmi(1, 0); |
| 2763 __ LoadConstant(1, Smi::Handle(Smi::New(42))); | 2459 __ LoadConstant(1, Smi::Handle(Smi::New(42))); |
| 2764 __ Return(1); | 2460 __ Return(1); |
| 2765 } | 2461 } |
| 2766 | 2462 |
| 2767 | |
| 2768 ASSEMBLER_TEST_RUN(DoubleToSmiFailPos, test) { | 2463 ASSEMBLER_TEST_RUN(DoubleToSmiFailPos, test) { |
| 2769 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2464 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2770 } | 2465 } |
| 2771 | 2466 |
| 2772 | |
| 2773 ASSEMBLER_TEST_GENERATE(DoubleToSmiFailNeg, assembler) { | 2467 ASSEMBLER_TEST_GENERATE(DoubleToSmiFailNeg, assembler) { |
| 2774 const double neg_overflow = static_cast<double>(Smi::kMinValue - 1000); | 2468 const double neg_overflow = static_cast<double>(Smi::kMinValue - 1000); |
| 2775 __ Frame(2); | 2469 __ Frame(2); |
| 2776 __ LoadConstant(0, Double::Handle(Double::New(neg_overflow, Heap::kOld))); | 2470 __ LoadConstant(0, Double::Handle(Double::New(neg_overflow, Heap::kOld))); |
| 2777 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); | 2471 __ LoadConstant(1, Smi::Handle(Smi::New(-1))); |
| 2778 __ UnboxDouble(0, 0); | 2472 __ UnboxDouble(0, 0); |
| 2779 __ DoubleToSmi(1, 0); | 2473 __ DoubleToSmi(1, 0); |
| 2780 __ LoadConstant(1, Smi::Handle(Smi::New(42))); | 2474 __ LoadConstant(1, Smi::Handle(Smi::New(42))); |
| 2781 __ Return(1); | 2475 __ Return(1); |
| 2782 } | 2476 } |
| 2783 | 2477 |
| 2784 | |
| 2785 ASSEMBLER_TEST_RUN(DoubleToSmiFailNeg, test) { | 2478 ASSEMBLER_TEST_RUN(DoubleToSmiFailNeg, test) { |
| 2786 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); | 2479 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code())); |
| 2787 } | 2480 } |
| 2788 | 2481 |
| 2789 | |
| 2790 ASSEMBLER_TEST_GENERATE(DMin, assembler) { | 2482 ASSEMBLER_TEST_GENERATE(DMin, assembler) { |
| 2791 __ Frame(3); | 2483 __ Frame(3); |
| 2792 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld))); | 2484 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld))); |
| 2793 __ LoadConstant(1, Double::Handle(Double::New(500.0, Heap::kOld))); | 2485 __ LoadConstant(1, Double::Handle(Double::New(500.0, Heap::kOld))); |
| 2794 __ UnboxDouble(0, 0); | 2486 __ UnboxDouble(0, 0); |
| 2795 __ UnboxDouble(1, 1); | 2487 __ UnboxDouble(1, 1); |
| 2796 __ DMin(2, 0, 1); | 2488 __ DMin(2, 0, 1); |
| 2797 __ Return(2); | 2489 __ Return(2); |
| 2798 } | 2490 } |
| 2799 | 2491 |
| 2800 | |
| 2801 ASSEMBLER_TEST_RUN(DMin, test) { | 2492 ASSEMBLER_TEST_RUN(DMin, test) { |
| 2802 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); | 2493 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); |
| 2803 } | 2494 } |
| 2804 | 2495 |
| 2805 | |
| 2806 ASSEMBLER_TEST_GENERATE(DMax, assembler) { | 2496 ASSEMBLER_TEST_GENERATE(DMax, assembler) { |
| 2807 __ Frame(3); | 2497 __ Frame(3); |
| 2808 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld))); | 2498 __ LoadConstant(0, Double::Handle(Double::New(42.0, Heap::kOld))); |
| 2809 __ LoadConstant(1, Double::Handle(Double::New(5.0, Heap::kOld))); | 2499 __ LoadConstant(1, Double::Handle(Double::New(5.0, Heap::kOld))); |
| 2810 __ UnboxDouble(0, 0); | 2500 __ UnboxDouble(0, 0); |
| 2811 __ UnboxDouble(1, 1); | 2501 __ UnboxDouble(1, 1); |
| 2812 __ DMax(2, 0, 1); | 2502 __ DMax(2, 0, 1); |
| 2813 __ Return(2); | 2503 __ Return(2); |
| 2814 } | 2504 } |
| 2815 | 2505 |
| 2816 | |
| 2817 ASSEMBLER_TEST_RUN(DMax, test) { | 2506 ASSEMBLER_TEST_RUN(DMax, test) { |
| 2818 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); | 2507 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(test->code())); |
| 2819 } | 2508 } |
| 2820 | 2509 |
| 2821 #endif // defined(ARCH_IS_64_BIT) | 2510 #endif // defined(ARCH_IS_64_BIT) |
| 2822 | 2511 |
| 2823 } // namespace dart | 2512 } // namespace dart |
| 2824 | 2513 |
| 2825 #endif // defined(TARGET_ARCH_DBC) | 2514 #endif // defined(TARGET_ARCH_DBC) |
| OLD | NEW |