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_MIPS) | 6 #if defined(TARGET_ARCH_MIPS) |
| 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" |
| 11 #include "vm/virtual_memory.h" | 11 #include "vm/virtual_memory.h" |
| 12 | 12 |
| 13 namespace dart { | 13 namespace dart { |
| 14 | 14 |
| 15 #define __ assembler-> | 15 #define __ assembler-> |
| 16 | 16 |
| 17 | 17 |
| 18 ASSEMBLER_TEST_GENERATE(Addi, assembler) { | |
| 19 __ addi(V0, ZR, Immediate(42)); | |
| 20 __ jr(RA); | |
| 21 } | |
| 22 | |
| 23 | |
| 24 ASSEMBLER_TEST_RUN(Addi, test) { | |
| 25 typedef int (*SimpleCode)(); | |
| 26 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 27 } | |
| 28 | |
| 29 | |
| 30 ASSEMBLER_TEST_GENERATE(Addi_overflow, assembler) { | |
| 31 __ LoadImmediate(V0, 0x7fffffff); | |
| 32 __ addi(V0, V0, Immediate(1)); // V0 not set on overflow | |
|
Ivan Posva
2013/03/11 06:03:27
See comment below.
| |
| 33 __ jr(RA); | |
| 34 } | |
| 35 | |
| 36 | |
| 37 ASSEMBLER_TEST_RUN(Addi_overflow, test) { | |
| 38 typedef int (*SimpleCode)(); | |
| 39 EXPECT_EQ(static_cast<int32_t>(0x7fffffff), | |
|
Ivan Posva
2013/03/11 06:03:27
Shouldn't this execute a trap?
zra
2013/03/11 15:46:03
It should execute a trap, yes. Is there any way to
| |
| 40 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 41 } | |
| 42 | |
| 43 | |
| 44 ASSEMBLER_TEST_GENERATE(Addiu, assembler) { | |
| 45 __ addiu(V0, ZR, Immediate(42)); | |
| 46 __ jr(RA); | |
| 47 } | |
| 48 | |
| 49 | |
| 50 ASSEMBLER_TEST_RUN(Addiu, test) { | |
| 51 typedef int (*SimpleCode)(); | |
| 52 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 53 } | |
| 54 | |
| 55 | |
| 56 ASSEMBLER_TEST_GENERATE(Addiu_overflow, assembler) { | |
| 57 __ LoadImmediate(V0, 0x7fffffff); | |
| 58 __ addiu(V0, V0, Immediate(1)); // V0 is set on overflow | |
|
Ivan Posva
2013/03/11 06:03:27
V0 is set to which value?
Probably it would be cle
zra
2013/03/11 15:46:03
Done.
| |
| 59 __ jr(RA); | |
| 60 } | |
| 61 | |
| 62 | |
| 63 ASSEMBLER_TEST_RUN(Addiu_overflow, test) { | |
| 64 typedef int (*SimpleCode)(); | |
| 65 EXPECT_EQ(static_cast<int32_t>(0x80000000), | |
| 66 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 67 } | |
| 68 | |
| 69 | |
| 70 ASSEMBLER_TEST_GENERATE(Addu, assembler) { | |
| 71 __ addi(R2, ZR, Immediate(21)); | |
| 72 __ addi(R3, ZR, Immediate(21)); | |
| 73 __ addu(V0, R2, R3); | |
| 74 __ jr(RA); | |
| 75 } | |
| 76 | |
| 77 | |
| 78 ASSEMBLER_TEST_RUN(Addu, test) { | |
| 79 typedef int (*SimpleCode)(); | |
| 80 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 81 } | |
| 82 | |
| 83 | |
| 84 ASSEMBLER_TEST_GENERATE(Addu_overflow, assembler) { | |
| 85 __ LoadImmediate(R2, 0x7fffffff); | |
| 86 __ addi(R3, R0, Immediate(1)); | |
| 87 __ addu(V0, R2, R3); | |
| 88 __ jr(RA); | |
| 89 } | |
| 90 | |
| 91 | |
| 92 ASSEMBLER_TEST_RUN(Addu_overflow, test) { | |
| 93 typedef int (*SimpleCode)(); | |
| 94 EXPECT_EQ(static_cast<int32_t>(0x80000000), | |
| 95 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 96 } | |
| 97 | |
| 98 | |
| 99 ASSEMBLER_TEST_GENERATE(And, assembler) { | |
| 100 __ addi(R2, ZR, Immediate(42)); | |
| 101 __ addi(R3, ZR, Immediate(2)); | |
| 102 __ and_(V0, R2, R3); | |
| 103 __ jr(RA); | |
| 104 } | |
| 105 | |
| 106 | |
| 107 ASSEMBLER_TEST_RUN(And, test) { | |
| 108 typedef int (*SimpleCode)(); | |
| 109 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 110 } | |
| 111 | |
| 112 | |
| 113 ASSEMBLER_TEST_GENERATE(Andi, assembler) { | |
| 114 __ addi(R1, ZR, Immediate(42)); | |
| 115 __ andi(V0, R1, Immediate(2)); | |
| 116 __ jr(RA); | |
| 117 } | |
| 118 | |
| 119 | |
| 120 ASSEMBLER_TEST_RUN(Andi, test) { | |
| 121 typedef int (*SimpleCode)(); | |
| 122 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 123 } | |
| 124 | |
| 125 | |
| 126 ASSEMBLER_TEST_GENERATE(Clo, assembler) { | |
| 127 __ addi(R1, ZR, Immediate(0xffff)); | |
|
Ivan Posva
2013/03/11 06:03:27
It would be much clearer if you passed a -1 here.
zra
2013/03/11 15:46:03
Done.
| |
| 128 __ clo(V0, R1); | |
| 129 __ jr(RA); | |
| 130 } | |
| 131 | |
| 132 | |
| 133 ASSEMBLER_TEST_RUN(Clo, test) { | |
| 134 typedef int (*SimpleCode)(); | |
| 135 EXPECT_EQ(32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 136 } | |
| 137 | |
| 138 | |
| 139 ASSEMBLER_TEST_GENERATE(Clz, assembler) { | |
| 140 __ addi(R1, ZR, Immediate(0x7fff)); | |
| 141 __ clz(V0, R1); | |
| 142 __ jr(RA); | |
| 143 } | |
| 144 | |
| 145 | |
| 146 ASSEMBLER_TEST_RUN(Clz, test) { | |
| 147 typedef int (*SimpleCode)(); | |
| 148 EXPECT_EQ(17, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 149 } | |
| 150 | |
| 151 | |
| 152 ASSEMBLER_TEST_GENERATE(Divu, assembler) { | |
| 153 __ addi(R1, ZR, Immediate(27)); | |
| 154 __ addi(R2, ZR, Immediate(9)); | |
| 155 __ divu(R1, R2); | |
| 156 __ mflo(V0); | |
| 157 __ jr(RA); | |
| 158 } | |
| 159 | |
| 160 | |
| 161 ASSEMBLER_TEST_RUN(Divu, test) { | |
| 162 typedef int (*SimpleCode)(); | |
| 163 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 164 } | |
| 165 | |
| 166 | |
| 167 ASSEMBLER_TEST_GENERATE(Div, assembler) { | |
| 168 __ addi(R1, ZR, Immediate(27)); | |
| 169 __ addi(R2, ZR, Immediate(9)); | |
| 170 __ div(R1, R2); | |
| 171 __ mflo(V0); | |
| 172 __ jr(RA); | |
| 173 } | |
| 174 | |
| 175 | |
| 176 ASSEMBLER_TEST_RUN(Div, test) { | |
| 177 typedef int (*SimpleCode)(); | |
| 178 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 179 } | |
| 180 | |
| 181 | |
| 182 ASSEMBLER_TEST_GENERATE(Divu_zero, assembler) { | |
| 183 __ addi(R1, ZR, Immediate(27)); | |
| 184 __ addi(R2, ZR, Immediate(0)); | |
| 185 __ divu(R1, R2); | |
| 186 __ mflo(V0); | |
| 187 __ jr(RA); | |
| 188 } | |
| 189 | |
| 190 | |
| 191 ASSEMBLER_TEST_RUN(Divu_zero, test) { | |
| 192 typedef int (*SimpleCode)(); | |
| 193 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 194 } | |
| 195 | |
| 196 | |
| 197 ASSEMBLER_TEST_GENERATE(Div_zero, assembler) { | |
| 198 __ addi(R1, ZR, Immediate(27)); | |
| 199 __ addi(R2, ZR, Immediate(0)); | |
| 200 __ div(R1, R2); | |
| 201 __ mflo(V0); | |
| 202 __ jr(RA); | |
| 203 } | |
| 204 | |
| 205 | |
| 206 ASSEMBLER_TEST_RUN(Div_zero, test) { | |
| 207 typedef int (*SimpleCode)(); | |
| 208 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 209 } | |
| 210 | |
| 211 | |
| 212 ASSEMBLER_TEST_GENERATE(Divu_corner, assembler) { | |
| 213 __ LoadImmediate(R1, 0x80000000); | |
| 214 __ LoadImmediate(R2, 0xffffffff); | |
| 215 __ divu(R1, R2); | |
| 216 __ mflo(V0); | |
| 217 __ jr(RA); | |
| 218 } | |
| 219 | |
| 220 | |
| 221 ASSEMBLER_TEST_RUN(Divu_corner, test) { | |
| 222 typedef int (*SimpleCode)(); | |
| 223 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 224 } | |
| 225 | |
| 226 | |
| 227 ASSEMBLER_TEST_GENERATE(Div_corner, assembler) { | |
| 228 __ LoadImmediate(R1, 0x80000000); | |
| 229 __ LoadImmediate(R2, 0xffffffff); | |
| 230 __ div(R1, R2); | |
| 231 __ mflo(V0); | |
| 232 __ jr(RA); | |
| 233 } | |
| 234 | |
| 235 | |
| 236 ASSEMBLER_TEST_RUN(Div_corner, test) { | |
| 237 typedef int (*SimpleCode)(); | |
| 238 EXPECT_EQ(static_cast<int32_t>(0x80000000), | |
| 239 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 240 } | |
| 241 | |
| 242 | |
| 243 ASSEMBLER_TEST_GENERATE(Lui, assembler) { | |
| 244 __ lui(V0, Immediate(0x2a)); | |
| 245 __ jr(RA); | |
| 246 } | |
| 247 | |
| 248 | |
| 249 ASSEMBLER_TEST_RUN(Lui, test) { | |
| 250 typedef int (*SimpleCode)(); | |
| 251 EXPECT_EQ(42 << 16, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 252 } | |
| 253 | |
| 254 | |
| 18 ASSEMBLER_TEST_GENERATE(Simple, assembler) { | 255 ASSEMBLER_TEST_GENERATE(Simple, assembler) { |
| 19 __ jr(RA); | 256 __ jr(RA); |
| 20 __ delay_slot()->ori(V0, ZR, Immediate(42)); | 257 __ delay_slot()->ori(V0, ZR, Immediate(42)); |
| 21 } | 258 } |
| 22 | 259 |
| 23 | 260 |
| 24 ASSEMBLER_TEST_RUN(Simple, test) { | 261 ASSEMBLER_TEST_RUN(Simple, test) { |
| 25 typedef int (*SimpleCode)(); | 262 typedef int (*SimpleCode)(); |
| 26 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 263 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 27 } | 264 } |
| 28 | 265 |
| 29 } // namespace dart | 266 } // namespace dart |
| 30 | 267 |
| 31 #endif // defined TARGET_ARCH_MIPS | 268 #endif // defined TARGET_ARCH_MIPS |
| OLD | NEW |