Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(177)

Side by Side Diff: runtime/vm/assembler_arm_test.cc

Issue 12321149: Implements shifted offset register addressing mode for arm. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« runtime/vm/assembler_arm.h ('K') | « runtime/vm/assembler_arm.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« runtime/vm/assembler_arm.h ('K') | « runtime/vm/assembler_arm.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698