Chromium Code Reviews| 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_ARM) | 6 #if defined(TARGET_ARCH_ARM) |
| 7 | 7 |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/os.h" | 9 #include "vm/os.h" |
| 10 #include "vm/unit_test.h" | 10 #include "vm/unit_test.h" |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 123 | 123 |
| 124 | 124 |
| 125 ASSEMBLER_TEST_RUN(SingleVLoadStore, test) { | 125 ASSEMBLER_TEST_RUN(SingleVLoadStore, test) { |
| 126 EXPECT(test != NULL); | 126 EXPECT(test != NULL); |
| 127 typedef float (*SingleVLoadStore)(); | 127 typedef float (*SingleVLoadStore)(); |
| 128 float res = EXECUTE_TEST_CODE_FLOAT(SingleVLoadStore, test->entry()); | 128 float res = EXECUTE_TEST_CODE_FLOAT(SingleVLoadStore, test->entry()); |
| 129 EXPECT_FLOAT_EQ(2*12.3f, res, 0.001f); | 129 EXPECT_FLOAT_EQ(2*12.3f, res, 0.001f); |
| 130 } | 130 } |
| 131 | 131 |
| 132 | 132 |
| 133 ASSEMBLER_TEST_GENERATE(SingleVShiftLoadStore, assembler) { | |
| 134 __ LoadImmediate(R0, bit_cast<int32_t, float>(12.3f)); | |
| 135 __ mov(R2, ShifterOperand(SP)); | |
| 136 // __ str(R0, Address(SP, (-kWordSize * 32), Address::PreIndex)); | |
|
regis
2013/02/26 23:39:49
// Expressing __str(R0....) as:
...
Otherwise, it
| |
| 137 __ mov(R1, ShifterOperand(kWordSize)); | |
| 138 __ str(R0, Address(SP, R1, LSL, 5, Address::NegPreIndex)); | |
| 139 __ vldrs(S0, Address(R2, (-kWordSize * 32))); | |
| 140 __ vadds(S0, S0, S0); | |
| 141 __ vstrs(S0, Address(R2, (-kWordSize * 32))); | |
| 142 // __ ldr(R0, Address(SP, (kWordSize * 32), Address::PostIndex)); | |
|
regis
2013/02/26 23:39:49
ditto
| |
| 143 __ ldr(R0, Address(SP, R1, LSL, 5, Address::PostIndex)); | |
| 144 __ mov(PC, ShifterOperand(LR)); | |
| 145 } | |
| 146 | |
| 147 | |
| 148 ASSEMBLER_TEST_RUN(SingleVShiftLoadStore, test) { | |
| 149 EXPECT(test != NULL); | |
| 150 typedef float (*SingleVLoadStore)(); | |
| 151 float res = EXECUTE_TEST_CODE_FLOAT(SingleVLoadStore, test->entry()); | |
| 152 EXPECT_FLOAT_EQ(2*12.3f, res, 0.001f); | |
| 153 } | |
| 154 | |
| 155 | |
| 133 ASSEMBLER_TEST_GENERATE(DoubleVLoadStore, assembler) { | 156 ASSEMBLER_TEST_GENERATE(DoubleVLoadStore, assembler) { |
| 134 int64_t value = bit_cast<int64_t, double>(12.3); | 157 int64_t value = bit_cast<int64_t, double>(12.3); |
| 135 __ LoadImmediate(R0, Utils::Low32Bits(value)); | 158 __ LoadImmediate(R0, Utils::Low32Bits(value)); |
| 136 __ LoadImmediate(R1, Utils::High32Bits(value)); | 159 __ LoadImmediate(R1, Utils::High32Bits(value)); |
| 137 __ mov(R2, ShifterOperand(SP)); | 160 __ mov(R2, ShifterOperand(SP)); |
| 138 __ str(R0, Address(SP, (-kWordSize * 30), Address::PreIndex)); | 161 __ str(R0, Address(SP, (-kWordSize * 30), Address::PreIndex)); |
| 139 __ str(R1, Address(R2, (-kWordSize * 29))); | 162 __ str(R1, Address(R2, (-kWordSize * 29))); |
| 140 __ vldrd(D0, Address(R2, (-kWordSize * 30))); | 163 __ vldrd(D0, Address(R2, (-kWordSize * 30))); |
| 141 __ vaddd(D0, D0, D0); | 164 __ vaddd(D0, D0, D0); |
| 142 __ vstrd(D0, Address(R2, (-kWordSize * 30))); | 165 __ vstrd(D0, Address(R2, (-kWordSize * 30))); |
| (...skipping 767 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 910 } | 933 } |
| 911 | 934 |
| 912 | 935 |
| 913 ASSEMBLER_TEST_RUN(Ldm_stm_da, test) { | 936 ASSEMBLER_TEST_RUN(Ldm_stm_da, test) { |
| 914 EXPECT(test != NULL); | 937 EXPECT(test != NULL); |
| 915 typedef int (*Tst)(); | 938 typedef int (*Tst)(); |
| 916 EXPECT_EQ(-52, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | 939 EXPECT_EQ(-52, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); |
| 917 } | 940 } |
| 918 | 941 |
| 919 | 942 |
| 943 ASSEMBLER_TEST_GENERATE(AddressShiftStrLSL1NegOffset, assembler) { | |
| 944 __ mov(R2, ShifterOperand(42)); | |
| 945 __ mov(R1, ShifterOperand(kWordSize)); | |
| 946 __ str(R2, Address(SP, R1, LSL, 1, Address::NegOffset)); | |
| 947 __ ldr(R0, Address(SP, (-kWordSize * 2), Address::Offset)); | |
| 948 __ mov(PC, ShifterOperand(LR)); | |
| 949 } | |
| 950 | |
| 951 | |
| 952 ASSEMBLER_TEST_RUN(AddressShiftStrLSL1NegOffset, test) { | |
| 953 EXPECT(test != NULL); | |
| 954 typedef int (*Tst)(); | |
| 955 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | |
| 956 } | |
| 957 | |
| 958 | |
| 959 ASSEMBLER_TEST_GENERATE(AddressShiftLdrLSL5NegOffset, assembler) { | |
| 960 __ mov(R2, ShifterOperand(42)); | |
| 961 __ mov(R1, ShifterOperand(kWordSize)); | |
| 962 __ str(R2, Address(SP, (-kWordSize * 32), Address::Offset)); | |
| 963 __ ldr(R0, Address(SP, R1, LSL, 5, Address::NegOffset)); | |
| 964 __ mov(PC, ShifterOperand(LR)); | |
| 965 } | |
| 966 | |
| 967 | |
| 968 ASSEMBLER_TEST_RUN(AddressShiftLdrLSL5NegOffset, test) { | |
| 969 EXPECT(test != NULL); | |
| 970 typedef int (*Tst)(); | |
| 971 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | |
| 972 } | |
| 973 | |
| 974 | |
| 975 ASSEMBLER_TEST_GENERATE(AddressShiftStrLRS1NegOffset, assembler) { | |
| 976 __ mov(R2, ShifterOperand(42)); | |
| 977 __ mov(R1, ShifterOperand(kWordSize * 2)); | |
| 978 __ str(R2, Address(SP, R1, LSR, 1, Address::NegOffset)); | |
| 979 __ ldr(R0, Address(SP, -kWordSize, Address::Offset)); | |
| 980 __ mov(PC, ShifterOperand(LR)); | |
| 981 } | |
| 982 | |
| 983 | |
| 984 ASSEMBLER_TEST_RUN(AddressShiftStrLRS1NegOffset, test) { | |
| 985 EXPECT(test != NULL); | |
| 986 typedef int (*Tst)(); | |
| 987 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | |
| 988 } | |
| 989 | |
| 990 | |
| 991 ASSEMBLER_TEST_GENERATE(AddressShiftLdrLRS1NegOffset, assembler) { | |
| 992 __ mov(R2, ShifterOperand(42)); | |
| 993 __ mov(R1, ShifterOperand(kWordSize * 2)); | |
| 994 __ str(R2, Address(SP, -kWordSize, Address::Offset)); | |
| 995 __ ldr(R0, Address(SP, R1, LSR, 1, Address::NegOffset)); | |
| 996 __ mov(PC, ShifterOperand(LR)); | |
| 997 } | |
| 998 | |
| 999 | |
| 1000 ASSEMBLER_TEST_RUN(AddressShiftLdrLRS1NegOffset, test) { | |
| 1001 EXPECT(test != NULL); | |
| 1002 typedef int (*Tst)(); | |
| 1003 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | |
| 1004 } | |
| 1005 | |
| 1006 | |
| 1007 ASSEMBLER_TEST_GENERATE(AddressShiftStrLSLNegPreIndex, assembler) { | |
| 1008 __ mov(R2, ShifterOperand(42)); | |
| 1009 __ mov(R1, ShifterOperand(kWordSize)); | |
| 1010 __ mov(R3, ShifterOperand(SP)); | |
| 1011 __ str(R2, Address(SP, R1, LSL, 5, Address::NegPreIndex)); | |
| 1012 __ ldr(R0, Address(R3, (-kWordSize * 32), Address::Offset)); | |
| 1013 __ mov(SP, ShifterOperand(R3)); | |
| 1014 __ mov(PC, ShifterOperand(LR)); | |
| 1015 } | |
| 1016 | |
| 1017 | |
| 1018 ASSEMBLER_TEST_RUN(AddressShiftStrLSLNegPreIndex, test) { | |
| 1019 EXPECT(test != NULL); | |
| 1020 typedef int (*Tst)(); | |
| 1021 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | |
| 1022 } | |
| 1023 | |
| 1024 | |
| 1025 ASSEMBLER_TEST_GENERATE(AddressShiftLdrLSLNegPreIndex, assembler) { | |
| 1026 __ mov(R2, ShifterOperand(42)); | |
| 1027 __ mov(R1, ShifterOperand(kWordSize)); | |
| 1028 __ str(R2, Address(SP, (-kWordSize * 32), Address::PreIndex)); | |
| 1029 __ ldr(R0, Address(SP, R1, LSL, 5, Address::PostIndex)); | |
| 1030 __ mov(PC, ShifterOperand(LR)); | |
| 1031 } | |
| 1032 | |
| 1033 | |
| 1034 ASSEMBLER_TEST_RUN(AddressShiftLdrLSLNegPreIndex, test) { | |
| 1035 EXPECT(test != NULL); | |
| 1036 typedef int (*Tst)(); | |
| 1037 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); | |
| 1038 } | |
| 1039 | |
| 1040 | |
| 920 } // namespace dart | 1041 } // namespace dart |
| 921 | 1042 |
| 922 #endif // defined TARGET_ARCH_ARM | 1043 #endif // defined TARGET_ARCH_ARM |
| OLD | NEW |