| 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 |