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

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

Powered by Google App Engine
This is Rietveld 408576698