OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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_MIPS) | 6 #if defined(TARGET_ARCH_MIPS) |
7 | 7 |
8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
9 #include "vm/cpu.h" | 9 #include "vm/cpu.h" |
10 #include "vm/os.h" | 10 #include "vm/os.h" |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 ASSEMBLER_TEST_GENERATE(LoadHalfWordUnaligned, assembler) { | 323 ASSEMBLER_TEST_GENERATE(LoadHalfWordUnaligned, assembler) { |
324 __ LoadHalfWordUnaligned(V0, A0, TMP); | 324 __ LoadHalfWordUnaligned(V0, A0, TMP); |
325 __ jr(RA); | 325 __ jr(RA); |
326 } | 326 } |
327 | 327 |
328 | 328 |
329 ASSEMBLER_TEST_RUN(LoadHalfWordUnaligned, test) { | 329 ASSEMBLER_TEST_RUN(LoadHalfWordUnaligned, test) { |
330 EXPECT(test != NULL); | 330 EXPECT(test != NULL); |
331 typedef intptr_t (*LoadHalfWordUnaligned)(intptr_t) DART_UNUSED; | 331 typedef intptr_t (*LoadHalfWordUnaligned)(intptr_t) DART_UNUSED; |
332 uint8_t buffer[4] = { | 332 uint8_t buffer[4] = { |
333 0x89, 0xAB, 0xCD, 0xEF, | 333 0x89, 0xAB, 0xCD, 0xEF, |
334 }; | 334 }; |
335 | 335 |
336 EXPECT_EQ(static_cast<int16_t>(static_cast<uint16_t>(0xAB89)), | 336 EXPECT_EQ( |
337 EXECUTE_TEST_CODE_INTPTR_INTPTR( | 337 static_cast<int16_t>(static_cast<uint16_t>(0xAB89)), |
338 LoadHalfWordUnaligned, | 338 EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadHalfWordUnaligned, test->entry(), |
339 test->entry(), | 339 reinterpret_cast<intptr_t>(&buffer[0]))); |
340 reinterpret_cast<intptr_t>(&buffer[0]))); | 340 EXPECT_EQ( |
341 EXPECT_EQ(static_cast<int16_t>(static_cast<uint16_t>(0xCDAB)), | 341 static_cast<int16_t>(static_cast<uint16_t>(0xCDAB)), |
342 EXECUTE_TEST_CODE_INTPTR_INTPTR( | 342 EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadHalfWordUnaligned, test->entry(), |
343 LoadHalfWordUnaligned, | 343 reinterpret_cast<intptr_t>(&buffer[1]))); |
344 test->entry(), | |
345 reinterpret_cast<intptr_t>(&buffer[1]))); | |
346 } | 344 } |
347 | 345 |
348 | 346 |
349 ASSEMBLER_TEST_GENERATE(LoadHalfWordUnsignedUnaligned, assembler) { | 347 ASSEMBLER_TEST_GENERATE(LoadHalfWordUnsignedUnaligned, assembler) { |
350 __ LoadHalfWordUnsignedUnaligned(V0, A0, TMP); | 348 __ LoadHalfWordUnsignedUnaligned(V0, A0, TMP); |
351 __ jr(RA); | 349 __ jr(RA); |
352 } | 350 } |
353 | 351 |
354 | 352 |
355 ASSEMBLER_TEST_RUN(LoadHalfWordUnsignedUnaligned, test) { | 353 ASSEMBLER_TEST_RUN(LoadHalfWordUnsignedUnaligned, test) { |
356 EXPECT(test != NULL); | 354 EXPECT(test != NULL); |
357 typedef intptr_t (*LoadHalfWordUnsignedUnaligned)(intptr_t) DART_UNUSED; | 355 typedef intptr_t (*LoadHalfWordUnsignedUnaligned)(intptr_t) DART_UNUSED; |
358 uint8_t buffer[4] = { | 356 uint8_t buffer[4] = { |
359 0x89, 0xAB, 0xCD, 0xEF, | 357 0x89, 0xAB, 0xCD, 0xEF, |
360 }; | 358 }; |
361 | 359 |
362 EXPECT_EQ(0xAB89, | 360 EXPECT_EQ(0xAB89, EXECUTE_TEST_CODE_INTPTR_INTPTR( |
363 EXECUTE_TEST_CODE_INTPTR_INTPTR( | 361 LoadHalfWordUnsignedUnaligned, test->entry(), |
364 LoadHalfWordUnsignedUnaligned, | 362 reinterpret_cast<intptr_t>(&buffer[0]))); |
365 test->entry(), | 363 EXPECT_EQ(0xCDAB, EXECUTE_TEST_CODE_INTPTR_INTPTR( |
366 reinterpret_cast<intptr_t>(&buffer[0]))); | 364 LoadHalfWordUnsignedUnaligned, test->entry(), |
367 EXPECT_EQ(0xCDAB, | 365 reinterpret_cast<intptr_t>(&buffer[1]))); |
368 EXECUTE_TEST_CODE_INTPTR_INTPTR( | |
369 LoadHalfWordUnsignedUnaligned, | |
370 test->entry(), | |
371 reinterpret_cast<intptr_t>(&buffer[1]))); | |
372 } | 366 } |
373 | 367 |
374 | 368 |
375 ASSEMBLER_TEST_GENERATE(StoreHalfWordUnaligned, assembler) { | 369 ASSEMBLER_TEST_GENERATE(StoreHalfWordUnaligned, assembler) { |
376 __ LoadImmediate(A1, 0xABCD); | 370 __ LoadImmediate(A1, 0xABCD); |
377 __ StoreWordUnaligned(A1, A0, TMP); | 371 __ StoreWordUnaligned(A1, A0, TMP); |
378 __ mov(V0, A1); | 372 __ mov(V0, A1); |
379 __ jr(RA); | 373 __ jr(RA); |
380 } | 374 } |
381 | 375 |
382 | 376 |
383 ASSEMBLER_TEST_RUN(StoreHalfWordUnaligned, test) { | 377 ASSEMBLER_TEST_RUN(StoreHalfWordUnaligned, test) { |
384 EXPECT(test != NULL); | 378 EXPECT(test != NULL); |
385 typedef intptr_t (*StoreHalfWordUnaligned)(intptr_t) DART_UNUSED; | 379 typedef intptr_t (*StoreHalfWordUnaligned)(intptr_t) DART_UNUSED; |
386 uint8_t buffer[4] = { | 380 uint8_t buffer[4] = { |
387 0, 0, 0, 0, | 381 0, 0, 0, 0, |
388 }; | 382 }; |
389 | 383 |
390 EXPECT_EQ(0xABCD, | 384 EXPECT_EQ(0xABCD, EXECUTE_TEST_CODE_INTPTR_INTPTR( |
391 EXECUTE_TEST_CODE_INTPTR_INTPTR( | 385 StoreHalfWordUnaligned, test->entry(), |
392 StoreHalfWordUnaligned, | 386 reinterpret_cast<intptr_t>(&buffer[0]))); |
393 test->entry(), | |
394 reinterpret_cast<intptr_t>(&buffer[0]))); | |
395 EXPECT_EQ(0xCD, buffer[0]); | 387 EXPECT_EQ(0xCD, buffer[0]); |
396 EXPECT_EQ(0xAB, buffer[1]); | 388 EXPECT_EQ(0xAB, buffer[1]); |
397 EXPECT_EQ(0, buffer[2]); | 389 EXPECT_EQ(0, buffer[2]); |
398 | 390 |
399 EXPECT_EQ(0xABCD, | 391 EXPECT_EQ(0xABCD, EXECUTE_TEST_CODE_INTPTR_INTPTR( |
400 EXECUTE_TEST_CODE_INTPTR_INTPTR( | 392 StoreHalfWordUnaligned, test->entry(), |
401 StoreHalfWordUnaligned, | 393 reinterpret_cast<intptr_t>(&buffer[1]))); |
402 test->entry(), | |
403 reinterpret_cast<intptr_t>(&buffer[1]))); | |
404 EXPECT_EQ(0xCD, buffer[1]); | 394 EXPECT_EQ(0xCD, buffer[1]); |
405 EXPECT_EQ(0xAB, buffer[2]); | 395 EXPECT_EQ(0xAB, buffer[2]); |
406 EXPECT_EQ(0, buffer[3]); | 396 EXPECT_EQ(0, buffer[3]); |
407 } | 397 } |
408 | 398 |
409 | 399 |
410 ASSEMBLER_TEST_GENERATE(LoadWordUnaligned, assembler) { | 400 ASSEMBLER_TEST_GENERATE(LoadWordUnaligned, assembler) { |
411 __ LoadWordUnaligned(V0, A0, TMP); | 401 __ LoadWordUnaligned(V0, A0, TMP); |
412 __ jr(RA); | 402 __ jr(RA); |
413 } | 403 } |
414 | 404 |
415 | 405 |
416 ASSEMBLER_TEST_RUN(LoadWordUnaligned, test) { | 406 ASSEMBLER_TEST_RUN(LoadWordUnaligned, test) { |
417 EXPECT(test != NULL); | 407 EXPECT(test != NULL); |
418 typedef intptr_t (*LoadWordUnaligned)(intptr_t) DART_UNUSED; | 408 typedef intptr_t (*LoadWordUnaligned)(intptr_t) DART_UNUSED; |
419 uint8_t buffer[8] = { | 409 uint8_t buffer[8] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0}; |
420 0x12, 0x34, 0x56, 0x78, | |
421 0x9A, 0xBC, 0xDE, 0xF0 | |
422 }; | |
423 | 410 |
424 EXPECT_EQ(0x78563412, | 411 EXPECT_EQ(0x78563412, EXECUTE_TEST_CODE_INTPTR_INTPTR( |
425 EXECUTE_TEST_CODE_INTPTR_INTPTR( | 412 LoadWordUnaligned, test->entry(), |
426 LoadWordUnaligned, | 413 reinterpret_cast<intptr_t>(&buffer[0]))); |
427 test->entry(), | 414 EXPECT_EQ(0x9A785634, EXECUTE_TEST_CODE_INTPTR_INTPTR( |
428 reinterpret_cast<intptr_t>(&buffer[0]))); | 415 LoadWordUnaligned, test->entry(), |
429 EXPECT_EQ(0x9A785634, | 416 reinterpret_cast<intptr_t>(&buffer[1]))); |
430 EXECUTE_TEST_CODE_INTPTR_INTPTR( | 417 EXPECT_EQ(0xBC9A7856, EXECUTE_TEST_CODE_INTPTR_INTPTR( |
431 LoadWordUnaligned, | 418 LoadWordUnaligned, test->entry(), |
432 test->entry(), | 419 reinterpret_cast<intptr_t>(&buffer[2]))); |
433 reinterpret_cast<intptr_t>(&buffer[1]))); | 420 EXPECT_EQ(0xDEBC9A78, EXECUTE_TEST_CODE_INTPTR_INTPTR( |
434 EXPECT_EQ(0xBC9A7856, | 421 LoadWordUnaligned, test->entry(), |
435 EXECUTE_TEST_CODE_INTPTR_INTPTR( | 422 reinterpret_cast<intptr_t>(&buffer[3]))); |
436 LoadWordUnaligned, | |
437 test->entry(), | |
438 reinterpret_cast<intptr_t>(&buffer[2]))); | |
439 EXPECT_EQ(0xDEBC9A78, | |
440 EXECUTE_TEST_CODE_INTPTR_INTPTR( | |
441 LoadWordUnaligned, | |
442 test->entry(), | |
443 reinterpret_cast<intptr_t>(&buffer[3]))); | |
444 } | 423 } |
445 | 424 |
446 | 425 |
447 ASSEMBLER_TEST_GENERATE(StoreWordUnaligned, assembler) { | 426 ASSEMBLER_TEST_GENERATE(StoreWordUnaligned, assembler) { |
448 __ LoadImmediate(A1, 0x12345678); | 427 __ LoadImmediate(A1, 0x12345678); |
449 __ StoreWordUnaligned(A1, A0, TMP); | 428 __ StoreWordUnaligned(A1, A0, TMP); |
450 __ mov(V0, A1); | 429 __ mov(V0, A1); |
451 __ jr(RA); | 430 __ jr(RA); |
452 } | 431 } |
453 | 432 |
454 | 433 |
455 ASSEMBLER_TEST_RUN(StoreWordUnaligned, test) { | 434 ASSEMBLER_TEST_RUN(StoreWordUnaligned, test) { |
456 EXPECT(test != NULL); | 435 EXPECT(test != NULL); |
457 typedef intptr_t (*StoreWordUnaligned)(intptr_t) DART_UNUSED; | 436 typedef intptr_t (*StoreWordUnaligned)(intptr_t) DART_UNUSED; |
458 uint8_t buffer[8] = { | 437 uint8_t buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; |
459 0, 0, 0, 0, | |
460 0, 0, 0, 0 | |
461 }; | |
462 | 438 |
463 EXPECT_EQ(0x12345678, | 439 EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR( |
464 EXECUTE_TEST_CODE_INTPTR_INTPTR( | 440 StoreWordUnaligned, test->entry(), |
465 StoreWordUnaligned, | 441 reinterpret_cast<intptr_t>(&buffer[0]))); |
466 test->entry(), | |
467 reinterpret_cast<intptr_t>(&buffer[0]))); | |
468 EXPECT_EQ(0x78, buffer[0]); | 442 EXPECT_EQ(0x78, buffer[0]); |
469 EXPECT_EQ(0x56, buffer[1]); | 443 EXPECT_EQ(0x56, buffer[1]); |
470 EXPECT_EQ(0x34, buffer[2]); | 444 EXPECT_EQ(0x34, buffer[2]); |
471 EXPECT_EQ(0x12, buffer[3]); | 445 EXPECT_EQ(0x12, buffer[3]); |
472 | 446 |
473 EXPECT_EQ(0x12345678, | 447 EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR( |
474 EXECUTE_TEST_CODE_INTPTR_INTPTR( | 448 StoreWordUnaligned, test->entry(), |
475 StoreWordUnaligned, | 449 reinterpret_cast<intptr_t>(&buffer[1]))); |
476 test->entry(), | |
477 reinterpret_cast<intptr_t>(&buffer[1]))); | |
478 EXPECT_EQ(0x78, buffer[1]); | 450 EXPECT_EQ(0x78, buffer[1]); |
479 EXPECT_EQ(0x56, buffer[2]); | 451 EXPECT_EQ(0x56, buffer[2]); |
480 EXPECT_EQ(0x34, buffer[3]); | 452 EXPECT_EQ(0x34, buffer[3]); |
481 EXPECT_EQ(0x12, buffer[4]); | 453 EXPECT_EQ(0x12, buffer[4]); |
482 | 454 |
483 EXPECT_EQ(0x12345678, | 455 EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR( |
484 EXECUTE_TEST_CODE_INTPTR_INTPTR( | 456 StoreWordUnaligned, test->entry(), |
485 StoreWordUnaligned, | 457 reinterpret_cast<intptr_t>(&buffer[2]))); |
486 test->entry(), | |
487 reinterpret_cast<intptr_t>(&buffer[2]))); | |
488 EXPECT_EQ(0x78, buffer[2]); | 458 EXPECT_EQ(0x78, buffer[2]); |
489 EXPECT_EQ(0x56, buffer[3]); | 459 EXPECT_EQ(0x56, buffer[3]); |
490 EXPECT_EQ(0x34, buffer[4]); | 460 EXPECT_EQ(0x34, buffer[4]); |
491 EXPECT_EQ(0x12, buffer[5]); | 461 EXPECT_EQ(0x12, buffer[5]); |
492 | 462 |
493 EXPECT_EQ(0x12345678, | 463 EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR( |
494 EXECUTE_TEST_CODE_INTPTR_INTPTR( | 464 StoreWordUnaligned, test->entry(), |
495 StoreWordUnaligned, | 465 reinterpret_cast<intptr_t>(&buffer[3]))); |
496 test->entry(), | |
497 reinterpret_cast<intptr_t>(&buffer[3]))); | |
498 EXPECT_EQ(0x78, buffer[3]); | 466 EXPECT_EQ(0x78, buffer[3]); |
499 EXPECT_EQ(0x56, buffer[4]); | 467 EXPECT_EQ(0x56, buffer[4]); |
500 EXPECT_EQ(0x34, buffer[5]); | 468 EXPECT_EQ(0x34, buffer[5]); |
501 EXPECT_EQ(0x12, buffer[6]); | 469 EXPECT_EQ(0x12, buffer[6]); |
502 } | 470 } |
503 | 471 |
504 | 472 |
505 ASSEMBLER_TEST_GENERATE(Lui, assembler) { | 473 ASSEMBLER_TEST_GENERATE(Lui, assembler) { |
506 __ lui(V0, Immediate(42)); | 474 __ lui(V0, Immediate(42)); |
507 __ jr(RA); | 475 __ jr(RA); |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
811 | 779 |
812 ASSEMBLER_TEST_RUN(Sltu, test) { | 780 ASSEMBLER_TEST_RUN(Sltu, test) { |
813 typedef int (*SimpleCode)() DART_UNUSED; | 781 typedef int (*SimpleCode)() DART_UNUSED; |
814 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 782 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
815 } | 783 } |
816 | 784 |
817 | 785 |
818 ASSEMBLER_TEST_GENERATE(Slti, assembler) { | 786 ASSEMBLER_TEST_GENERATE(Slti, assembler) { |
819 __ LoadImmediate(T1, -2); | 787 __ LoadImmediate(T1, -2); |
820 __ slti(A0, T1, Immediate(-1)); // -2 < -1 -> 1. | 788 __ slti(A0, T1, Immediate(-1)); // -2 < -1 -> 1. |
821 __ slti(A1, T1, Immediate(0)); // -2 < 0 -> 1. | 789 __ slti(A1, T1, Immediate(0)); // -2 < 0 -> 1. |
822 __ and_(V0, A0, A1); | 790 __ and_(V0, A0, A1); |
823 __ jr(RA); | 791 __ jr(RA); |
824 } | 792 } |
825 | 793 |
826 | 794 |
827 ASSEMBLER_TEST_RUN(Slti, test) { | 795 ASSEMBLER_TEST_RUN(Slti, test) { |
828 typedef int (*SimpleCode)() DART_UNUSED; | 796 typedef int (*SimpleCode)() DART_UNUSED; |
829 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 797 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
830 } | 798 } |
831 | 799 |
832 | 800 |
833 ASSEMBLER_TEST_GENERATE(Sltiu, assembler) { | 801 ASSEMBLER_TEST_GENERATE(Sltiu, assembler) { |
834 __ LoadImmediate(T1, -1); | 802 __ LoadImmediate(T1, -1); |
835 __ LoadImmediate(T2, 0x10000); | 803 __ LoadImmediate(T2, 0x10000); |
836 __ sltiu(A0, T1, Immediate(-2)); // 0xffffffffUL < 0xfffffffeUL -> 0. | 804 __ sltiu(A0, T1, Immediate(-2)); // 0xffffffffUL < 0xfffffffeUL -> 0. |
837 __ sltiu(A1, T1, Immediate(0)); // 0xffffffffUL < 0 -> 0. | 805 __ sltiu(A1, T1, Immediate(0)); // 0xffffffffUL < 0 -> 0. |
838 __ sltiu(A2, T2, Immediate(-2)); // 0x10000UL < 0xfffffffeUL -> 1. | 806 __ sltiu(A2, T2, Immediate(-2)); // 0x10000UL < 0xfffffffeUL -> 1. |
839 __ addiu(A2, A2, Immediate(-1)); | 807 __ addiu(A2, A2, Immediate(-1)); |
840 __ or_(V0, A0, A1); | 808 __ or_(V0, A0, A1); |
841 __ or_(V0, V0, A2); | 809 __ or_(V0, V0, A2); |
842 __ jr(RA); | 810 __ jr(RA); |
843 } | 811 } |
844 | 812 |
845 | 813 |
846 ASSEMBLER_TEST_RUN(Sltiu, test) { | 814 ASSEMBLER_TEST_RUN(Sltiu, test) { |
847 typedef int (*SimpleCode)() DART_UNUSED; | 815 typedef int (*SimpleCode)() DART_UNUSED; |
(...skipping 1369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2217 | 2185 |
2218 | 2186 |
2219 ASSEMBLER_TEST_RUN(Cop1TruncWD_Inf, test) { | 2187 ASSEMBLER_TEST_RUN(Cop1TruncWD_Inf, test) { |
2220 typedef int (*SimpleCode)() DART_UNUSED; | 2188 typedef int (*SimpleCode)() DART_UNUSED; |
2221 EXPECT(test != NULL); | 2189 EXPECT(test != NULL); |
2222 EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 2190 EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
2223 } | 2191 } |
2224 | 2192 |
2225 | 2193 |
2226 ASSEMBLER_TEST_GENERATE(Cop1TruncWD_Overflow, assembler) { | 2194 ASSEMBLER_TEST_GENERATE(Cop1TruncWD_Overflow, assembler) { |
2227 __ LoadImmediate(D1, 2.0*kMaxInt32); | 2195 __ LoadImmediate(D1, 2.0 * kMaxInt32); |
2228 __ truncwd(F0, D1); | 2196 __ truncwd(F0, D1); |
2229 __ mfc1(V0, F0); | 2197 __ mfc1(V0, F0); |
2230 __ Ret(); | 2198 __ Ret(); |
2231 } | 2199 } |
2232 | 2200 |
2233 | 2201 |
2234 ASSEMBLER_TEST_RUN(Cop1TruncWD_Overflow, test) { | 2202 ASSEMBLER_TEST_RUN(Cop1TruncWD_Overflow, test) { |
2235 typedef int (*SimpleCode)() DART_UNUSED; | 2203 typedef int (*SimpleCode)() DART_UNUSED; |
2236 EXPECT(test != NULL); | 2204 EXPECT(test != NULL); |
2237 EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 2205 EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
2238 } | 2206 } |
2239 | 2207 |
2240 | 2208 |
2241 ASSEMBLER_TEST_GENERATE(Cop1TruncWD_Underflow, assembler) { | 2209 ASSEMBLER_TEST_GENERATE(Cop1TruncWD_Underflow, assembler) { |
2242 __ LoadImmediate(D1, 2.0*kMinInt32); | 2210 __ LoadImmediate(D1, 2.0 * kMinInt32); |
2243 __ truncwd(F0, D1); | 2211 __ truncwd(F0, D1); |
2244 __ mfc1(V0, F0); | 2212 __ mfc1(V0, F0); |
2245 __ Ret(); | 2213 __ Ret(); |
2246 } | 2214 } |
2247 | 2215 |
2248 | 2216 |
2249 ASSEMBLER_TEST_RUN(Cop1TruncWD_Underflow, test) { | 2217 ASSEMBLER_TEST_RUN(Cop1TruncWD_Underflow, test) { |
2250 typedef int (*SimpleCode)() DART_UNUSED; | 2218 typedef int (*SimpleCode)() DART_UNUSED; |
2251 EXPECT(test != NULL); | 2219 EXPECT(test != NULL); |
2252 EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 2220 EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2305 // RA: return address. | 2273 // RA: return address. |
2306 // A0: value. | 2274 // A0: value. |
2307 // A1: growable array. | 2275 // A1: growable array. |
2308 // A2: current thread. | 2276 // A2: current thread. |
2309 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { | 2277 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { |
2310 __ addiu(SP, SP, Immediate(-3 * kWordSize)); | 2278 __ addiu(SP, SP, Immediate(-3 * kWordSize)); |
2311 __ sw(CODE_REG, Address(SP, 2 * kWordSize)); | 2279 __ sw(CODE_REG, Address(SP, 2 * kWordSize)); |
2312 __ sw(THR, Address(SP, 1 * kWordSize)); | 2280 __ sw(THR, Address(SP, 1 * kWordSize)); |
2313 __ sw(RA, Address(SP, 0 * kWordSize)); | 2281 __ sw(RA, Address(SP, 0 * kWordSize)); |
2314 __ mov(THR, A2); | 2282 __ mov(THR, A2); |
2315 __ StoreIntoObject(A1, | 2283 __ StoreIntoObject(A1, FieldAddress(A1, GrowableObjectArray::data_offset()), |
2316 FieldAddress(A1, GrowableObjectArray::data_offset()), | |
2317 A0); | 2284 A0); |
2318 __ lw(RA, Address(SP, 0 * kWordSize)); | 2285 __ lw(RA, Address(SP, 0 * kWordSize)); |
2319 __ lw(THR, Address(SP, 1 * kWordSize)); | 2286 __ lw(THR, Address(SP, 1 * kWordSize)); |
2320 __ lw(CODE_REG, Address(SP, 2 * kWordSize)); | 2287 __ lw(CODE_REG, Address(SP, 2 * kWordSize)); |
2321 __ addiu(SP, SP, Immediate(3 * kWordSize)); | 2288 __ addiu(SP, SP, Immediate(3 * kWordSize)); |
2322 __ Ret(); | 2289 __ Ret(); |
2323 } | 2290 } |
2324 | 2291 |
2325 | 2292 |
2326 ASSEMBLER_TEST_GENERATE(Semaphore, assembler) { | 2293 ASSEMBLER_TEST_GENERATE(Semaphore, assembler) { |
2327 __ EnterFrame(); | 2294 __ EnterFrame(); |
2328 __ LoadImmediate(T0, 40); | 2295 __ LoadImmediate(T0, 40); |
2329 __ LoadImmediate(T1, 42); | 2296 __ LoadImmediate(T1, 42); |
2330 __ Push(T0); | 2297 __ Push(T0); |
2331 Label retry; | 2298 Label retry; |
2332 __ Bind(&retry); | 2299 __ Bind(&retry); |
2333 __ ll(T0, Address(SP)); | 2300 __ ll(T0, Address(SP)); |
2334 __ mov(T2, T1); | 2301 __ mov(T2, T1); |
2335 __ sc(T2, Address(SP)); // T1 == 1, success | 2302 __ sc(T2, Address(SP)); // T1 == 1, success |
2336 __ LoadImmediate(T3, 1); | 2303 __ LoadImmediate(T3, 1); |
2337 __ bne(T2, T3, &retry); // NE if context switch occurred between ll and sc | 2304 __ bne(T2, T3, &retry); // NE if context switch occurred between ll and sc |
2338 __ Pop(V0); // 42 | 2305 __ Pop(V0); // 42 |
2339 __ LeaveFrameAndReturn(); | 2306 __ LeaveFrameAndReturn(); |
2340 } | 2307 } |
2341 | 2308 |
2342 | 2309 |
2343 ASSEMBLER_TEST_RUN(Semaphore, test) { | 2310 ASSEMBLER_TEST_RUN(Semaphore, test) { |
2344 EXPECT(test != NULL); | 2311 EXPECT(test != NULL); |
2345 typedef int (*Semaphore)() DART_UNUSED; | 2312 typedef int (*Semaphore)() DART_UNUSED; |
2346 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Semaphore, test->entry())); | 2313 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Semaphore, test->entry())); |
2347 } | 2314 } |
2348 | 2315 |
2349 | 2316 |
2350 } // namespace dart | 2317 } // namespace dart |
2351 | 2318 |
2352 #endif // defined TARGET_ARCH_MIPS | 2319 #endif // defined TARGET_ARCH_MIPS |
OLD | NEW |