OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 TEST(MIPS4) { | 346 TEST(MIPS4) { |
347 // Test moves between floating point and integer registers. | 347 // Test moves between floating point and integer registers. |
348 CcTest::InitializeVM(); | 348 CcTest::InitializeVM(); |
349 Isolate* isolate = CcTest::i_isolate(); | 349 Isolate* isolate = CcTest::i_isolate(); |
350 HandleScope scope(isolate); | 350 HandleScope scope(isolate); |
351 | 351 |
352 typedef struct { | 352 typedef struct { |
353 double a; | 353 double a; |
354 double b; | 354 double b; |
355 double c; | 355 double c; |
| 356 double d; |
| 357 int64_t high; |
| 358 int64_t low; |
356 } T; | 359 } T; |
357 T t; | 360 T t; |
358 | 361 |
359 Assembler assm(isolate, NULL, 0); | 362 Assembler assm(isolate, NULL, 0); |
360 Label L, C; | 363 Label L, C; |
361 | 364 |
362 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) ); | 365 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a))); |
363 __ ldc1(f5, MemOperand(a0, OFFSET_OF(T, b)) ); | 366 __ ldc1(f5, MemOperand(a0, OFFSET_OF(T, b))); |
364 | 367 |
365 // Swap f4 and f5, by using 3 integer registers, a4-a6, | 368 // Swap f4 and f5, by using 3 integer registers, a4-a6, |
366 // both two 32-bit chunks, and one 64-bit chunk. | 369 // both two 32-bit chunks, and one 64-bit chunk. |
367 // mXhc1 is mips32/64-r2 only, not r1, | 370 // mXhc1 is mips32/64-r2 only, not r1, |
368 // but we will not support r1 in practice. | 371 // but we will not support r1 in practice. |
369 __ mfc1(a4, f4); | 372 __ mfc1(a4, f4); |
370 __ mfhc1(a5, f4); | 373 __ mfhc1(a5, f4); |
371 __ dmfc1(a6, f5); | 374 __ dmfc1(a6, f5); |
372 | 375 |
373 __ mtc1(a4, f5); | 376 __ mtc1(a4, f5); |
374 __ mthc1(a5, f5); | 377 __ mthc1(a5, f5); |
375 __ dmtc1(a6, f4); | 378 __ dmtc1(a6, f4); |
376 | 379 |
377 // Store the swapped f4 and f5 back to memory. | 380 // Store the swapped f4 and f5 back to memory. |
378 __ sdc1(f4, MemOperand(a0, OFFSET_OF(T, a)) ); | 381 __ sdc1(f4, MemOperand(a0, OFFSET_OF(T, a))); |
379 __ sdc1(f5, MemOperand(a0, OFFSET_OF(T, c)) ); | 382 __ sdc1(f5, MemOperand(a0, OFFSET_OF(T, c))); |
| 383 |
| 384 // Test sign extension of move operations from coprocessor. |
| 385 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, d))); |
| 386 __ mfhc1(a4, f4); |
| 387 __ mfc1(a5, f4); |
| 388 |
| 389 __ sd(a4, MemOperand(a0, OFFSET_OF(T, high))); |
| 390 __ sd(a5, MemOperand(a0, OFFSET_OF(T, low))); |
380 | 391 |
381 __ jr(ra); | 392 __ jr(ra); |
382 __ nop(); | 393 __ nop(); |
383 | 394 |
384 CodeDesc desc; | 395 CodeDesc desc; |
385 assm.GetCode(&desc); | 396 assm.GetCode(&desc); |
386 Handle<Code> code = isolate->factory()->NewCode( | 397 Handle<Code> code = isolate->factory()->NewCode( |
387 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 398 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
388 F3 f = FUNCTION_CAST<F3>(code->entry()); | 399 F3 f = FUNCTION_CAST<F3>(code->entry()); |
389 t.a = 1.5e22; | 400 t.a = 1.5e22; |
390 t.b = 2.75e11; | 401 t.b = 2.75e11; |
391 t.c = 17.17; | 402 t.c = 17.17; |
| 403 t.d = -2.75e11; |
392 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); | 404 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); |
393 USE(dummy); | 405 USE(dummy); |
394 | 406 |
395 CHECK_EQ(2.75e11, t.a); | 407 CHECK_EQ(2.75e11, t.a); |
396 CHECK_EQ(2.75e11, t.b); | 408 CHECK_EQ(2.75e11, t.b); |
397 CHECK_EQ(1.5e22, t.c); | 409 CHECK_EQ(1.5e22, t.c); |
| 410 CHECK_EQ(0xffffffffc25001d1L, t.high); |
| 411 CHECK_EQ(0xffffffffbf800000L, t.low); |
398 } | 412 } |
399 | 413 |
400 | 414 |
401 TEST(MIPS5) { | 415 TEST(MIPS5) { |
402 // Test conversions between doubles and integers. | 416 // Test conversions between doubles and integers. |
403 CcTest::InitializeVM(); | 417 CcTest::InitializeVM(); |
404 Isolate* isolate = CcTest::i_isolate(); | 418 Isolate* isolate = CcTest::i_isolate(); |
405 HandleScope scope(isolate); | 419 HandleScope scope(isolate); |
406 | 420 |
407 typedef struct { | 421 typedef struct { |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
863 int32_t swr_0; | 877 int32_t swr_0; |
864 int32_t swr_1; | 878 int32_t swr_1; |
865 int32_t swr_2; | 879 int32_t swr_2; |
866 int32_t swr_3; | 880 int32_t swr_3; |
867 } T; | 881 } T; |
868 T t; | 882 T t; |
869 | 883 |
870 Assembler assm(isolate, NULL, 0); | 884 Assembler assm(isolate, NULL, 0); |
871 | 885 |
872 // Test all combinations of LWL and vAddr. | 886 // Test all combinations of LWL and vAddr. |
873 __ lw(a4, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 887 __ lw(a4, MemOperand(a0, OFFSET_OF(T, reg_init))); |
874 __ lwl(a4, MemOperand(a0, OFFSET_OF(T, mem_init)) ); | 888 __ lwl(a4, MemOperand(a0, OFFSET_OF(T, mem_init))); |
875 __ sw(a4, MemOperand(a0, OFFSET_OF(T, lwl_0)) ); | 889 __ sw(a4, MemOperand(a0, OFFSET_OF(T, lwl_0))); |
876 | 890 |
877 __ lw(a5, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 891 __ lw(a5, MemOperand(a0, OFFSET_OF(T, reg_init))); |
878 __ lwl(a5, MemOperand(a0, OFFSET_OF(T, mem_init) + 1) ); | 892 __ lwl(a5, MemOperand(a0, OFFSET_OF(T, mem_init) + 1)); |
879 __ sw(a5, MemOperand(a0, OFFSET_OF(T, lwl_1)) ); | 893 __ sw(a5, MemOperand(a0, OFFSET_OF(T, lwl_1))); |
880 | 894 |
881 __ lw(a6, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 895 __ lw(a6, MemOperand(a0, OFFSET_OF(T, reg_init))); |
882 __ lwl(a6, MemOperand(a0, OFFSET_OF(T, mem_init) + 2) ); | 896 __ lwl(a6, MemOperand(a0, OFFSET_OF(T, mem_init) + 2)); |
883 __ sw(a6, MemOperand(a0, OFFSET_OF(T, lwl_2)) ); | 897 __ sw(a6, MemOperand(a0, OFFSET_OF(T, lwl_2))); |
884 | 898 |
885 __ lw(a7, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 899 __ lw(a7, MemOperand(a0, OFFSET_OF(T, reg_init))); |
886 __ lwl(a7, MemOperand(a0, OFFSET_OF(T, mem_init) + 3) ); | 900 __ lwl(a7, MemOperand(a0, OFFSET_OF(T, mem_init) + 3)); |
887 __ sw(a7, MemOperand(a0, OFFSET_OF(T, lwl_3)) ); | 901 __ sw(a7, MemOperand(a0, OFFSET_OF(T, lwl_3))); |
888 | 902 |
889 // Test all combinations of LWR and vAddr. | 903 // Test all combinations of LWR and vAddr. |
890 __ lw(a4, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 904 __ lw(a4, MemOperand(a0, OFFSET_OF(T, reg_init))); |
891 __ lwr(a4, MemOperand(a0, OFFSET_OF(T, mem_init)) ); | 905 __ lwr(a4, MemOperand(a0, OFFSET_OF(T, mem_init))); |
892 __ sw(a4, MemOperand(a0, OFFSET_OF(T, lwr_0)) ); | 906 __ sw(a4, MemOperand(a0, OFFSET_OF(T, lwr_0))); |
893 | 907 |
894 __ lw(a5, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 908 __ lw(a5, MemOperand(a0, OFFSET_OF(T, reg_init))); |
895 __ lwr(a5, MemOperand(a0, OFFSET_OF(T, mem_init) + 1) ); | 909 __ lwr(a5, MemOperand(a0, OFFSET_OF(T, mem_init) + 1)); |
896 __ sw(a5, MemOperand(a0, OFFSET_OF(T, lwr_1)) ); | 910 __ sw(a5, MemOperand(a0, OFFSET_OF(T, lwr_1))); |
897 | 911 |
898 __ lw(a6, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 912 __ lw(a6, MemOperand(a0, OFFSET_OF(T, reg_init))); |
899 __ lwr(a6, MemOperand(a0, OFFSET_OF(T, mem_init) + 2) ); | 913 __ lwr(a6, MemOperand(a0, OFFSET_OF(T, mem_init) + 2)); |
900 __ sw(a6, MemOperand(a0, OFFSET_OF(T, lwr_2)) ); | 914 __ sw(a6, MemOperand(a0, OFFSET_OF(T, lwr_2)) ); |
901 | 915 |
902 __ lw(a7, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 916 __ lw(a7, MemOperand(a0, OFFSET_OF(T, reg_init))); |
903 __ lwr(a7, MemOperand(a0, OFFSET_OF(T, mem_init) + 3) ); | 917 __ lwr(a7, MemOperand(a0, OFFSET_OF(T, mem_init) + 3)); |
904 __ sw(a7, MemOperand(a0, OFFSET_OF(T, lwr_3)) ); | 918 __ sw(a7, MemOperand(a0, OFFSET_OF(T, lwr_3)) ); |
905 | 919 |
906 // Test all combinations of SWL and vAddr. | 920 // Test all combinations of SWL and vAddr. |
907 __ lw(a4, MemOperand(a0, OFFSET_OF(T, mem_init)) ); | 921 __ lw(a4, MemOperand(a0, OFFSET_OF(T, mem_init))); |
908 __ sw(a4, MemOperand(a0, OFFSET_OF(T, swl_0)) ); | 922 __ sw(a4, MemOperand(a0, OFFSET_OF(T, swl_0))); |
909 __ lw(a4, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 923 __ lw(a4, MemOperand(a0, OFFSET_OF(T, reg_init))); |
910 __ swl(a4, MemOperand(a0, OFFSET_OF(T, swl_0)) ); | 924 __ swl(a4, MemOperand(a0, OFFSET_OF(T, swl_0))); |
911 | 925 |
912 __ lw(a5, MemOperand(a0, OFFSET_OF(T, mem_init)) ); | 926 __ lw(a5, MemOperand(a0, OFFSET_OF(T, mem_init))); |
913 __ sw(a5, MemOperand(a0, OFFSET_OF(T, swl_1)) ); | 927 __ sw(a5, MemOperand(a0, OFFSET_OF(T, swl_1))); |
914 __ lw(a5, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 928 __ lw(a5, MemOperand(a0, OFFSET_OF(T, reg_init))); |
915 __ swl(a5, MemOperand(a0, OFFSET_OF(T, swl_1) + 1) ); | 929 __ swl(a5, MemOperand(a0, OFFSET_OF(T, swl_1) + 1)); |
916 | 930 |
917 __ lw(a6, MemOperand(a0, OFFSET_OF(T, mem_init)) ); | 931 __ lw(a6, MemOperand(a0, OFFSET_OF(T, mem_init))); |
918 __ sw(a6, MemOperand(a0, OFFSET_OF(T, swl_2)) ); | 932 __ sw(a6, MemOperand(a0, OFFSET_OF(T, swl_2))); |
919 __ lw(a6, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 933 __ lw(a6, MemOperand(a0, OFFSET_OF(T, reg_init))); |
920 __ swl(a6, MemOperand(a0, OFFSET_OF(T, swl_2) + 2) ); | 934 __ swl(a6, MemOperand(a0, OFFSET_OF(T, swl_2) + 2)); |
921 | 935 |
922 __ lw(a7, MemOperand(a0, OFFSET_OF(T, mem_init)) ); | 936 __ lw(a7, MemOperand(a0, OFFSET_OF(T, mem_init))); |
923 __ sw(a7, MemOperand(a0, OFFSET_OF(T, swl_3)) ); | 937 __ sw(a7, MemOperand(a0, OFFSET_OF(T, swl_3))); |
924 __ lw(a7, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 938 __ lw(a7, MemOperand(a0, OFFSET_OF(T, reg_init))); |
925 __ swl(a7, MemOperand(a0, OFFSET_OF(T, swl_3) + 3) ); | 939 __ swl(a7, MemOperand(a0, OFFSET_OF(T, swl_3) + 3)); |
926 | 940 |
927 // Test all combinations of SWR and vAddr. | 941 // Test all combinations of SWR and vAddr. |
928 __ lw(a4, MemOperand(a0, OFFSET_OF(T, mem_init)) ); | 942 __ lw(a4, MemOperand(a0, OFFSET_OF(T, mem_init))); |
929 __ sw(a4, MemOperand(a0, OFFSET_OF(T, swr_0)) ); | 943 __ sw(a4, MemOperand(a0, OFFSET_OF(T, swr_0))); |
930 __ lw(a4, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 944 __ lw(a4, MemOperand(a0, OFFSET_OF(T, reg_init))); |
931 __ swr(a4, MemOperand(a0, OFFSET_OF(T, swr_0)) ); | 945 __ swr(a4, MemOperand(a0, OFFSET_OF(T, swr_0))); |
932 | 946 |
933 __ lw(a5, MemOperand(a0, OFFSET_OF(T, mem_init)) ); | 947 __ lw(a5, MemOperand(a0, OFFSET_OF(T, mem_init))); |
934 __ sw(a5, MemOperand(a0, OFFSET_OF(T, swr_1)) ); | 948 __ sw(a5, MemOperand(a0, OFFSET_OF(T, swr_1))); |
935 __ lw(a5, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 949 __ lw(a5, MemOperand(a0, OFFSET_OF(T, reg_init))); |
936 __ swr(a5, MemOperand(a0, OFFSET_OF(T, swr_1) + 1) ); | 950 __ swr(a5, MemOperand(a0, OFFSET_OF(T, swr_1) + 1)); |
937 | 951 |
938 __ lw(a6, MemOperand(a0, OFFSET_OF(T, mem_init)) ); | 952 __ lw(a6, MemOperand(a0, OFFSET_OF(T, mem_init))); |
939 __ sw(a6, MemOperand(a0, OFFSET_OF(T, swr_2)) ); | 953 __ sw(a6, MemOperand(a0, OFFSET_OF(T, swr_2))); |
940 __ lw(a6, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 954 __ lw(a6, MemOperand(a0, OFFSET_OF(T, reg_init))); |
941 __ swr(a6, MemOperand(a0, OFFSET_OF(T, swr_2) + 2) ); | 955 __ swr(a6, MemOperand(a0, OFFSET_OF(T, swr_2) + 2)); |
942 | 956 |
943 __ lw(a7, MemOperand(a0, OFFSET_OF(T, mem_init)) ); | 957 __ lw(a7, MemOperand(a0, OFFSET_OF(T, mem_init))); |
944 __ sw(a7, MemOperand(a0, OFFSET_OF(T, swr_3)) ); | 958 __ sw(a7, MemOperand(a0, OFFSET_OF(T, swr_3))); |
945 __ lw(a7, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 959 __ lw(a7, MemOperand(a0, OFFSET_OF(T, reg_init))); |
946 __ swr(a7, MemOperand(a0, OFFSET_OF(T, swr_3) + 3) ); | 960 __ swr(a7, MemOperand(a0, OFFSET_OF(T, swr_3) + 3)); |
947 | 961 |
948 __ jr(ra); | 962 __ jr(ra); |
949 __ nop(); | 963 __ nop(); |
950 | 964 |
951 CodeDesc desc; | 965 CodeDesc desc; |
952 assm.GetCode(&desc); | 966 assm.GetCode(&desc); |
953 Handle<Code> code = isolate->factory()->NewCode( | 967 Handle<Code> code = isolate->factory()->NewCode( |
954 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 968 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
955 F3 f = FUNCTION_CAST<F3>(code->entry()); | 969 F3 f = FUNCTION_CAST<F3>(code->entry()); |
956 t.reg_init = 0xaabbccdd; | 970 t.reg_init = 0xaabbccdd; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
994 int32_t y2; | 1008 int32_t y2; |
995 int32_t y3; | 1009 int32_t y3; |
996 int32_t y4; | 1010 int32_t y4; |
997 } T; | 1011 } T; |
998 T t; | 1012 T t; |
999 | 1013 |
1000 MacroAssembler assm(isolate, NULL, 0); | 1014 MacroAssembler assm(isolate, NULL, 0); |
1001 | 1015 |
1002 __ mov(t2, fp); // Save frame pointer. | 1016 __ mov(t2, fp); // Save frame pointer. |
1003 __ mov(fp, a0); // Access struct T by fp. | 1017 __ mov(fp, a0); // Access struct T by fp. |
1004 __ lw(a4, MemOperand(a0, OFFSET_OF(T, y)) ); | 1018 __ lw(a4, MemOperand(a0, OFFSET_OF(T, y))); |
1005 __ lw(a7, MemOperand(a0, OFFSET_OF(T, y4)) ); | 1019 __ lw(a7, MemOperand(a0, OFFSET_OF(T, y4))); |
1006 | 1020 |
1007 __ addu(a5, a4, a7); | 1021 __ addu(a5, a4, a7); |
1008 __ subu(t0, a4, a7); | 1022 __ subu(t0, a4, a7); |
1009 __ nop(); | 1023 __ nop(); |
1010 __ push(a4); // These instructions disappear after opt. | 1024 __ push(a4); // These instructions disappear after opt. |
1011 __ Pop(); | 1025 __ Pop(); |
1012 __ addu(a4, a4, a4); | 1026 __ addu(a4, a4, a4); |
1013 __ nop(); | 1027 __ nop(); |
1014 __ Pop(); // These instructions disappear after opt. | 1028 __ Pop(); // These instructions disappear after opt. |
1015 __ push(a7); | 1029 __ push(a7); |
1016 __ nop(); | 1030 __ nop(); |
1017 __ push(a7); // These instructions disappear after opt. | 1031 __ push(a7); // These instructions disappear after opt. |
1018 __ pop(a7); | 1032 __ pop(a7); |
1019 __ nop(); | 1033 __ nop(); |
1020 __ push(a7); | 1034 __ push(a7); |
1021 __ pop(t0); | 1035 __ pop(t0); |
1022 __ nop(); | 1036 __ nop(); |
1023 __ sw(a4, MemOperand(fp, OFFSET_OF(T, y)) ); | 1037 __ sw(a4, MemOperand(fp, OFFSET_OF(T, y))); |
1024 __ lw(a4, MemOperand(fp, OFFSET_OF(T, y)) ); | 1038 __ lw(a4, MemOperand(fp, OFFSET_OF(T, y))); |
1025 __ nop(); | 1039 __ nop(); |
1026 __ sw(a4, MemOperand(fp, OFFSET_OF(T, y)) ); | 1040 __ sw(a4, MemOperand(fp, OFFSET_OF(T, y))); |
1027 __ lw(a5, MemOperand(fp, OFFSET_OF(T, y)) ); | 1041 __ lw(a5, MemOperand(fp, OFFSET_OF(T, y))); |
1028 __ nop(); | 1042 __ nop(); |
1029 __ push(a5); | 1043 __ push(a5); |
1030 __ lw(a5, MemOperand(fp, OFFSET_OF(T, y)) ); | 1044 __ lw(a5, MemOperand(fp, OFFSET_OF(T, y))); |
1031 __ pop(a5); | 1045 __ pop(a5); |
1032 __ nop(); | 1046 __ nop(); |
1033 __ push(a5); | 1047 __ push(a5); |
1034 __ lw(a6, MemOperand(fp, OFFSET_OF(T, y)) ); | 1048 __ lw(a6, MemOperand(fp, OFFSET_OF(T, y))); |
1035 __ pop(a5); | 1049 __ pop(a5); |
1036 __ nop(); | 1050 __ nop(); |
1037 __ push(a5); | 1051 __ push(a5); |
1038 __ lw(a6, MemOperand(fp, OFFSET_OF(T, y)) ); | 1052 __ lw(a6, MemOperand(fp, OFFSET_OF(T, y))); |
1039 __ pop(a6); | 1053 __ pop(a6); |
1040 __ nop(); | 1054 __ nop(); |
1041 __ push(a6); | 1055 __ push(a6); |
1042 __ lw(a6, MemOperand(fp, OFFSET_OF(T, y)) ); | 1056 __ lw(a6, MemOperand(fp, OFFSET_OF(T, y))); |
1043 __ pop(a5); | 1057 __ pop(a5); |
1044 __ nop(); | 1058 __ nop(); |
1045 __ push(a5); | 1059 __ push(a5); |
1046 __ lw(a6, MemOperand(fp, OFFSET_OF(T, y)) ); | 1060 __ lw(a6, MemOperand(fp, OFFSET_OF(T, y))); |
1047 __ pop(a7); | 1061 __ pop(a7); |
1048 __ nop(); | 1062 __ nop(); |
1049 | 1063 |
1050 __ mov(fp, t2); | 1064 __ mov(fp, t2); |
1051 __ jr(ra); | 1065 __ jr(ra); |
1052 __ nop(); | 1066 __ nop(); |
1053 | 1067 |
1054 CodeDesc desc; | 1068 CodeDesc desc; |
1055 assm.GetCode(&desc); | 1069 assm.GetCode(&desc); |
1056 Handle<Code> code = isolate->factory()->NewCode( | 1070 Handle<Code> code = isolate->factory()->NewCode( |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1290 int64_t r6; | 1304 int64_t r6; |
1291 uint32_t ui; | 1305 uint32_t ui; |
1292 int32_t si; | 1306 int32_t si; |
1293 } T; | 1307 } T; |
1294 T t; | 1308 T t; |
1295 | 1309 |
1296 Assembler assm(isolate, NULL, 0); | 1310 Assembler assm(isolate, NULL, 0); |
1297 Label L, C; | 1311 Label L, C; |
1298 | 1312 |
1299 // Basic 32-bit word load/store, with un-signed data. | 1313 // Basic 32-bit word load/store, with un-signed data. |
1300 __ lw(a4, MemOperand(a0, OFFSET_OF(T, ui)) ); | 1314 __ lw(a4, MemOperand(a0, OFFSET_OF(T, ui))); |
1301 __ sw(a4, MemOperand(a0, OFFSET_OF(T, r1)) ); | 1315 __ sw(a4, MemOperand(a0, OFFSET_OF(T, r1))); |
1302 | 1316 |
1303 // Check that the data got zero-extended into 64-bit a4. | 1317 // Check that the data got zero-extended into 64-bit a4. |
1304 __ sd(a4, MemOperand(a0, OFFSET_OF(T, r2)) ); | 1318 __ sd(a4, MemOperand(a0, OFFSET_OF(T, r2))); |
1305 | 1319 |
1306 // Basic 32-bit word load/store, with SIGNED data. | 1320 // Basic 32-bit word load/store, with SIGNED data. |
1307 __ lw(a5, MemOperand(a0, OFFSET_OF(T, si)) ); | 1321 __ lw(a5, MemOperand(a0, OFFSET_OF(T, si))); |
1308 __ sw(a5, MemOperand(a0, OFFSET_OF(T, r3)) ); | 1322 __ sw(a5, MemOperand(a0, OFFSET_OF(T, r3))); |
1309 | 1323 |
1310 // Check that the data got sign-extended into 64-bit a4. | 1324 // Check that the data got sign-extended into 64-bit a4. |
1311 __ sd(a5, MemOperand(a0, OFFSET_OF(T, r4)) ); | 1325 __ sd(a5, MemOperand(a0, OFFSET_OF(T, r4))); |
1312 | 1326 |
1313 // 32-bit UNSIGNED word load/store, with SIGNED data. | 1327 // 32-bit UNSIGNED word load/store, with SIGNED data. |
1314 __ lwu(a6, MemOperand(a0, OFFSET_OF(T, si)) ); | 1328 __ lwu(a6, MemOperand(a0, OFFSET_OF(T, si))); |
1315 __ sw(a6, MemOperand(a0, OFFSET_OF(T, r5)) ); | 1329 __ sw(a6, MemOperand(a0, OFFSET_OF(T, r5))); |
1316 | 1330 |
1317 // Check that the data got zero-extended into 64-bit a4. | 1331 // Check that the data got zero-extended into 64-bit a4. |
1318 __ sd(a6, MemOperand(a0, OFFSET_OF(T, r6)) ); | 1332 __ sd(a6, MemOperand(a0, OFFSET_OF(T, r6))); |
1319 | 1333 |
1320 // lh with positive data. | 1334 // lh with positive data. |
1321 __ lh(a5, MemOperand(a0, OFFSET_OF(T, ui)) ); | 1335 __ lh(a5, MemOperand(a0, OFFSET_OF(T, ui))); |
1322 __ sw(a5, MemOperand(a0, OFFSET_OF(T, r2)) ); | 1336 __ sw(a5, MemOperand(a0, OFFSET_OF(T, r2))); |
1323 | 1337 |
1324 // lh with negative data. | 1338 // lh with negative data. |
1325 __ lh(a6, MemOperand(a0, OFFSET_OF(T, si)) ); | 1339 __ lh(a6, MemOperand(a0, OFFSET_OF(T, si))); |
1326 __ sw(a6, MemOperand(a0, OFFSET_OF(T, r3)) ); | 1340 __ sw(a6, MemOperand(a0, OFFSET_OF(T, r3))); |
1327 | 1341 |
1328 // lhu with negative data. | 1342 // lhu with negative data. |
1329 __ lhu(a7, MemOperand(a0, OFFSET_OF(T, si)) ); | 1343 __ lhu(a7, MemOperand(a0, OFFSET_OF(T, si))); |
1330 __ sw(a7, MemOperand(a0, OFFSET_OF(T, r4)) ); | 1344 __ sw(a7, MemOperand(a0, OFFSET_OF(T, r4))); |
1331 | 1345 |
1332 // lb with negative data. | 1346 // lb with negative data. |
1333 __ lb(t0, MemOperand(a0, OFFSET_OF(T, si)) ); | 1347 __ lb(t0, MemOperand(a0, OFFSET_OF(T, si))); |
1334 __ sw(t0, MemOperand(a0, OFFSET_OF(T, r5)) ); | 1348 __ sw(t0, MemOperand(a0, OFFSET_OF(T, r5))); |
1335 | 1349 |
1336 // // sh writes only 1/2 of word. | 1350 // // sh writes only 1/2 of word. |
1337 __ lui(t1, 0x3333); | 1351 __ lui(t1, 0x3333); |
1338 __ ori(t1, t1, 0x3333); | 1352 __ ori(t1, t1, 0x3333); |
1339 __ sw(t1, MemOperand(a0, OFFSET_OF(T, r6)) ); | 1353 __ sw(t1, MemOperand(a0, OFFSET_OF(T, r6))); |
1340 __ lhu(t1, MemOperand(a0, OFFSET_OF(T, si)) ); | 1354 __ lhu(t1, MemOperand(a0, OFFSET_OF(T, si))); |
1341 __ sh(t1, MemOperand(a0, OFFSET_OF(T, r6)) ); | 1355 __ sh(t1, MemOperand(a0, OFFSET_OF(T, r6))); |
1342 | 1356 |
1343 __ jr(ra); | 1357 __ jr(ra); |
1344 __ nop(); | 1358 __ nop(); |
1345 | 1359 |
1346 CodeDesc desc; | 1360 CodeDesc desc; |
1347 assm.GetCode(&desc); | 1361 assm.GetCode(&desc); |
1348 Handle<Code> code = isolate->factory()->NewCode( | 1362 Handle<Code> code = isolate->factory()->NewCode( |
1349 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 1363 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
1350 F3 f = FUNCTION_CAST<F3>(code->entry()); | 1364 F3 f = FUNCTION_CAST<F3>(code->entry()); |
1351 t.ui = 0x44332211; | 1365 t.ui = 0x44332211; |
(...skipping 14 matching lines...) Expand all Loading... |
1366 // Signed data, 32 & 64. | 1380 // Signed data, 32 & 64. |
1367 CHECK_EQ(0x33333333ffffbbccL, t.r3); | 1381 CHECK_EQ(0x33333333ffffbbccL, t.r3); |
1368 CHECK_EQ(0xffffffff0000bbccL, t.r4); | 1382 CHECK_EQ(0xffffffff0000bbccL, t.r4); |
1369 | 1383 |
1370 // Signed data, 32 & 64. | 1384 // Signed data, 32 & 64. |
1371 CHECK_EQ(0x55555555ffffffccL, t.r5); | 1385 CHECK_EQ(0x55555555ffffffccL, t.r5); |
1372 CHECK_EQ(0x000000003333bbccL, t.r6); | 1386 CHECK_EQ(0x000000003333bbccL, t.r6); |
1373 } | 1387 } |
1374 | 1388 |
1375 #undef __ | 1389 #undef __ |
OLD | NEW |