| 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 | |
| 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), | |
| 40 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 41 } | |
| 42 | |
| 43 | |
| 44 ASSEMBLER_TEST_GENERATE(Addiu, assembler) { | 18 ASSEMBLER_TEST_GENERATE(Addiu, assembler) { |
| 45 __ addiu(V0, ZR, Immediate(42)); | 19 __ addiu(V0, ZR, Immediate(42)); |
| 46 __ jr(RA); | 20 __ jr(RA); |
| 47 } | 21 } |
| 48 | 22 |
| 49 | 23 |
| 50 ASSEMBLER_TEST_RUN(Addiu, test) { | 24 ASSEMBLER_TEST_RUN(Addiu, test) { |
| 51 typedef int (*SimpleCode)(); | 25 typedef int (*SimpleCode)(); |
| 52 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 26 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 53 } | 27 } |
| 54 | 28 |
| 55 | 29 |
| 56 ASSEMBLER_TEST_GENERATE(Addiu_overflow, assembler) { | 30 ASSEMBLER_TEST_GENERATE(Addiu_overflow, assembler) { |
| 57 __ LoadImmediate(V0, 0x7fffffff); | 31 __ LoadImmediate(V0, 0x7fffffff); |
| 58 __ addiu(V0, V0, Immediate(1)); // V0 is set on overflow | 32 __ addiu(V0, V0, Immediate(1)); // V0 is modified on overflow. |
| 59 __ jr(RA); | 33 __ jr(RA); |
| 60 } | 34 } |
| 61 | 35 |
| 62 | 36 |
| 63 ASSEMBLER_TEST_RUN(Addiu_overflow, test) { | 37 ASSEMBLER_TEST_RUN(Addiu_overflow, test) { |
| 64 typedef int (*SimpleCode)(); | 38 typedef int (*SimpleCode)(); |
| 65 EXPECT_EQ(static_cast<int32_t>(0x80000000), | 39 EXPECT_EQ(static_cast<int32_t>(0x80000000), |
| 66 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 40 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 67 } | 41 } |
| 68 | 42 |
| 69 | 43 |
| 70 ASSEMBLER_TEST_GENERATE(Addu, assembler) { | 44 ASSEMBLER_TEST_GENERATE(Addu, assembler) { |
| 71 __ addi(R2, ZR, Immediate(21)); | 45 __ addiu(R2, ZR, Immediate(21)); |
| 72 __ addi(R3, ZR, Immediate(21)); | 46 __ addiu(R3, ZR, Immediate(21)); |
| 73 __ addu(V0, R2, R3); | 47 __ addu(V0, R2, R3); |
| 74 __ jr(RA); | 48 __ jr(RA); |
| 75 } | 49 } |
| 76 | 50 |
| 77 | 51 |
| 78 ASSEMBLER_TEST_RUN(Addu, test) { | 52 ASSEMBLER_TEST_RUN(Addu, test) { |
| 79 typedef int (*SimpleCode)(); | 53 typedef int (*SimpleCode)(); |
| 80 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 54 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 81 } | 55 } |
| 82 | 56 |
| 83 | 57 |
| 84 ASSEMBLER_TEST_GENERATE(Addu_overflow, assembler) { | 58 ASSEMBLER_TEST_GENERATE(Addu_overflow, assembler) { |
| 85 __ LoadImmediate(R2, 0x7fffffff); | 59 __ LoadImmediate(R2, 0x7fffffff); |
| 86 __ addi(R3, R0, Immediate(1)); | 60 __ addiu(R3, R0, Immediate(1)); |
| 87 __ addu(V0, R2, R3); | 61 __ addu(V0, R2, R3); |
| 88 __ jr(RA); | 62 __ jr(RA); |
| 89 } | 63 } |
| 90 | 64 |
| 91 | 65 |
| 92 ASSEMBLER_TEST_RUN(Addu_overflow, test) { | 66 ASSEMBLER_TEST_RUN(Addu_overflow, test) { |
| 93 typedef int (*SimpleCode)(); | 67 typedef int (*SimpleCode)(); |
| 94 EXPECT_EQ(static_cast<int32_t>(0x80000000), | 68 EXPECT_EQ(static_cast<int32_t>(0x80000000), |
| 95 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 69 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 96 } | 70 } |
| 97 | 71 |
| 98 | 72 |
| 99 ASSEMBLER_TEST_GENERATE(And, assembler) { | 73 ASSEMBLER_TEST_GENERATE(And, assembler) { |
| 100 __ addi(R2, ZR, Immediate(42)); | 74 __ addiu(R2, ZR, Immediate(42)); |
| 101 __ addi(R3, ZR, Immediate(2)); | 75 __ addiu(R3, ZR, Immediate(2)); |
| 102 __ and_(V0, R2, R3); | 76 __ and_(V0, R2, R3); |
| 103 __ jr(RA); | 77 __ jr(RA); |
| 104 } | 78 } |
| 105 | 79 |
| 106 | 80 |
| 107 ASSEMBLER_TEST_RUN(And, test) { | 81 ASSEMBLER_TEST_RUN(And, test) { |
| 108 typedef int (*SimpleCode)(); | 82 typedef int (*SimpleCode)(); |
| 109 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 83 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 110 } | 84 } |
| 111 | 85 |
| 112 | 86 |
| 113 ASSEMBLER_TEST_GENERATE(Andi, assembler) { | 87 ASSEMBLER_TEST_GENERATE(Andi, assembler) { |
| 114 __ addi(R1, ZR, Immediate(42)); | 88 __ addiu(R1, ZR, Immediate(42)); |
| 115 __ andi(V0, R1, Immediate(2)); | 89 __ andi(V0, R1, Immediate(2)); |
| 116 __ jr(RA); | 90 __ jr(RA); |
| 117 } | 91 } |
| 118 | 92 |
| 119 | 93 |
| 120 ASSEMBLER_TEST_RUN(Andi, test) { | 94 ASSEMBLER_TEST_RUN(Andi, test) { |
| 121 typedef int (*SimpleCode)(); | 95 typedef int (*SimpleCode)(); |
| 122 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 96 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 123 } | 97 } |
| 124 | 98 |
| 125 | 99 |
| 126 ASSEMBLER_TEST_GENERATE(Clo, assembler) { | 100 ASSEMBLER_TEST_GENERATE(Clo, assembler) { |
| 127 __ addi(R1, ZR, Immediate(0xffff)); | 101 __ addiu(R1, ZR, Immediate(-1)); |
| 128 __ clo(V0, R1); | 102 __ clo(V0, R1); |
| 129 __ jr(RA); | 103 __ jr(RA); |
| 130 } | 104 } |
| 131 | 105 |
| 132 | 106 |
| 133 ASSEMBLER_TEST_RUN(Clo, test) { | 107 ASSEMBLER_TEST_RUN(Clo, test) { |
| 134 typedef int (*SimpleCode)(); | 108 typedef int (*SimpleCode)(); |
| 135 EXPECT_EQ(32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 109 EXPECT_EQ(32, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 136 } | 110 } |
| 137 | 111 |
| 138 | 112 |
| 139 ASSEMBLER_TEST_GENERATE(Clz, assembler) { | 113 ASSEMBLER_TEST_GENERATE(Clz, assembler) { |
| 140 __ addi(R1, ZR, Immediate(0x7fff)); | 114 __ addiu(R1, ZR, Immediate(0x7fff)); |
| 141 __ clz(V0, R1); | 115 __ clz(V0, R1); |
| 142 __ jr(RA); | 116 __ jr(RA); |
| 143 } | 117 } |
| 144 | 118 |
| 145 | 119 |
| 146 ASSEMBLER_TEST_RUN(Clz, test) { | 120 ASSEMBLER_TEST_RUN(Clz, test) { |
| 147 typedef int (*SimpleCode)(); | 121 typedef int (*SimpleCode)(); |
| 148 EXPECT_EQ(17, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 122 EXPECT_EQ(17, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 149 } | 123 } |
| 150 | 124 |
| 151 | 125 |
| 152 ASSEMBLER_TEST_GENERATE(Divu, assembler) { | 126 ASSEMBLER_TEST_GENERATE(Divu, assembler) { |
| 153 __ addi(R1, ZR, Immediate(27)); | 127 __ addiu(R1, ZR, Immediate(27)); |
| 154 __ addi(R2, ZR, Immediate(9)); | 128 __ addiu(R2, ZR, Immediate(9)); |
| 155 __ divu(R1, R2); | 129 __ divu(R1, R2); |
| 156 __ mflo(V0); | 130 __ mflo(V0); |
| 157 __ jr(RA); | 131 __ jr(RA); |
| 158 } | 132 } |
| 159 | 133 |
| 160 | 134 |
| 161 ASSEMBLER_TEST_RUN(Divu, test) { | 135 ASSEMBLER_TEST_RUN(Divu, test) { |
| 162 typedef int (*SimpleCode)(); | 136 typedef int (*SimpleCode)(); |
| 163 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 137 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 164 } | 138 } |
| 165 | 139 |
| 166 | 140 |
| 167 ASSEMBLER_TEST_GENERATE(Div, assembler) { | 141 ASSEMBLER_TEST_GENERATE(Div, assembler) { |
| 168 __ addi(R1, ZR, Immediate(27)); | 142 __ addiu(R1, ZR, Immediate(27)); |
| 169 __ addi(R2, ZR, Immediate(9)); | 143 __ addiu(R2, ZR, Immediate(9)); |
| 170 __ div(R1, R2); | 144 __ div(R1, R2); |
| 171 __ mflo(V0); | 145 __ mflo(V0); |
| 172 __ jr(RA); | 146 __ jr(RA); |
| 173 } | 147 } |
| 174 | 148 |
| 175 | 149 |
| 176 ASSEMBLER_TEST_RUN(Div, test) { | 150 ASSEMBLER_TEST_RUN(Div, test) { |
| 177 typedef int (*SimpleCode)(); | 151 typedef int (*SimpleCode)(); |
| 178 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 152 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 179 } | 153 } |
| 180 | 154 |
| 181 | 155 |
| 182 ASSEMBLER_TEST_GENERATE(Divu_zero, assembler) { | 156 ASSEMBLER_TEST_GENERATE(Divu_zero, assembler) { |
| 183 __ addi(R1, ZR, Immediate(27)); | 157 __ addiu(R1, ZR, Immediate(27)); |
| 184 __ addi(R2, ZR, Immediate(0)); | 158 __ addiu(R2, ZR, Immediate(0)); |
| 185 __ divu(R1, R2); | 159 __ divu(R1, R2); |
| 186 __ mflo(V0); | 160 __ mflo(V0); |
| 187 __ jr(RA); | 161 __ jr(RA); |
| 188 } | 162 } |
| 189 | 163 |
| 190 | 164 |
| 191 ASSEMBLER_TEST_RUN(Divu_zero, test) { | 165 ASSEMBLER_TEST_RUN(Divu_zero, test) { |
| 192 typedef int (*SimpleCode)(); | 166 typedef int (*SimpleCode)(); |
| 193 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 167 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 194 } | 168 } |
| 195 | 169 |
| 196 | 170 |
| 197 ASSEMBLER_TEST_GENERATE(Div_zero, assembler) { | 171 ASSEMBLER_TEST_GENERATE(Div_zero, assembler) { |
| 198 __ addi(R1, ZR, Immediate(27)); | 172 __ addiu(R1, ZR, Immediate(27)); |
| 199 __ addi(R2, ZR, Immediate(0)); | 173 __ addiu(R2, ZR, Immediate(0)); |
| 200 __ div(R1, R2); | 174 __ div(R1, R2); |
| 201 __ mflo(V0); | 175 __ mflo(V0); |
| 202 __ jr(RA); | 176 __ jr(RA); |
| 203 } | 177 } |
| 204 | 178 |
| 205 | 179 |
| 206 ASSEMBLER_TEST_RUN(Div_zero, test) { | 180 ASSEMBLER_TEST_RUN(Div_zero, test) { |
| 207 typedef int (*SimpleCode)(); | 181 typedef int (*SimpleCode)(); |
| 208 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 182 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 209 } | 183 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 233 } | 207 } |
| 234 | 208 |
| 235 | 209 |
| 236 ASSEMBLER_TEST_RUN(Div_corner, test) { | 210 ASSEMBLER_TEST_RUN(Div_corner, test) { |
| 237 typedef int (*SimpleCode)(); | 211 typedef int (*SimpleCode)(); |
| 238 EXPECT_EQ(static_cast<int32_t>(0x80000000), | 212 EXPECT_EQ(static_cast<int32_t>(0x80000000), |
| 239 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 213 EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 240 } | 214 } |
| 241 | 215 |
| 242 | 216 |
| 217 ASSEMBLER_TEST_GENERATE(Lb, assembler) { |
| 218 __ addiu(SP, SP, Immediate(-kWordSize * 30)); |
| 219 __ LoadImmediate(R1, 0xff); |
| 220 __ sb(R1, Address(SP)); |
| 221 __ lb(V0, Address(SP)); |
| 222 __ addiu(SP, SP, Immediate(kWordSize * 30)); |
| 223 __ jr(RA); |
| 224 } |
| 225 |
| 226 |
| 227 ASSEMBLER_TEST_RUN(Lb, test) { |
| 228 typedef int (*SimpleCode)(); |
| 229 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 230 } |
| 231 |
| 232 |
| 233 ASSEMBLER_TEST_GENERATE(Lb_offset, assembler) { |
| 234 __ addiu(SP, SP, Immediate(-kWordSize * 30)); |
| 235 __ LoadImmediate(R1, 0xff); |
| 236 __ sb(R1, Address(SP, 1)); |
| 237 __ lb(V0, Address(SP, 1)); |
| 238 __ addiu(SP, SP, Immediate(kWordSize * 30)); |
| 239 __ jr(RA); |
| 240 } |
| 241 |
| 242 |
| 243 ASSEMBLER_TEST_RUN(Lb_offset, test) { |
| 244 typedef int (*SimpleCode)(); |
| 245 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 246 } |
| 247 |
| 248 |
| 249 ASSEMBLER_TEST_GENERATE(Lbu, assembler) { |
| 250 __ addiu(SP, SP, Immediate(-kWordSize * 30)); |
| 251 __ LoadImmediate(R1, 0xff); |
| 252 __ sb(R1, Address(SP)); |
| 253 __ lbu(V0, Address(SP)); |
| 254 __ addiu(SP, SP, Immediate(kWordSize * 30)); |
| 255 __ jr(RA); |
| 256 } |
| 257 |
| 258 |
| 259 ASSEMBLER_TEST_RUN(Lbu, test) { |
| 260 typedef int (*SimpleCode)(); |
| 261 EXPECT_EQ(255, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 262 } |
| 263 |
| 264 |
| 265 ASSEMBLER_TEST_GENERATE(Lh, assembler) { |
| 266 __ addiu(SP, SP, Immediate(-kWordSize * 30)); |
| 267 __ LoadImmediate(R1, 0xffff); |
| 268 __ sh(R1, Address(SP)); |
| 269 __ lh(V0, Address(SP)); |
| 270 __ addiu(SP, SP, Immediate(kWordSize * 30)); |
| 271 __ jr(RA); |
| 272 } |
| 273 |
| 274 |
| 275 ASSEMBLER_TEST_RUN(Lh, test) { |
| 276 typedef int (*SimpleCode)(); |
| 277 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 278 } |
| 279 |
| 280 |
| 281 ASSEMBLER_TEST_GENERATE(Lhu, assembler) { |
| 282 __ addiu(SP, SP, Immediate(-kWordSize * 30)); |
| 283 __ LoadImmediate(R1, 0xffff); |
| 284 __ sh(R1, Address(SP)); |
| 285 __ lhu(V0, Address(SP)); |
| 286 __ addiu(SP, SP, Immediate(kWordSize * 30)); |
| 287 __ jr(RA); |
| 288 } |
| 289 |
| 290 |
| 291 ASSEMBLER_TEST_RUN(Lhu, test) { |
| 292 typedef int (*SimpleCode)(); |
| 293 EXPECT_EQ(65535, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 294 } |
| 295 |
| 296 |
| 297 ASSEMBLER_TEST_GENERATE(Lw, assembler) { |
| 298 __ addiu(SP, SP, Immediate(-kWordSize * 30)); |
| 299 __ LoadImmediate(R1, -1); |
| 300 __ sw(R1, Address(SP)); |
| 301 __ lw(V0, Address(SP)); |
| 302 __ addiu(SP, SP, Immediate(kWordSize * 30)); |
| 303 __ jr(RA); |
| 304 } |
| 305 |
| 306 |
| 307 ASSEMBLER_TEST_RUN(Lw, test) { |
| 308 typedef int (*SimpleCode)(); |
| 309 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 310 } |
| 311 |
| 312 |
| 243 ASSEMBLER_TEST_GENERATE(Lui, assembler) { | 313 ASSEMBLER_TEST_GENERATE(Lui, assembler) { |
| 244 __ lui(V0, Immediate(0x2a)); | 314 __ lui(V0, Immediate(42)); |
| 245 __ jr(RA); | 315 __ jr(RA); |
| 246 } | 316 } |
| 247 | 317 |
| 248 | 318 |
| 249 ASSEMBLER_TEST_RUN(Lui, test) { | 319 ASSEMBLER_TEST_RUN(Lui, test) { |
| 250 typedef int (*SimpleCode)(); | 320 typedef int (*SimpleCode)(); |
| 251 EXPECT_EQ(42 << 16, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 321 EXPECT_EQ(42 << 16, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 252 } | 322 } |
| 253 | 323 |
| 254 | 324 |
| 255 ASSEMBLER_TEST_GENERATE(Simple, assembler) { | 325 ASSEMBLER_TEST_GENERATE(Simple, assembler) { |
| 256 __ jr(RA); | 326 __ jr(RA); |
| 257 __ delay_slot()->ori(V0, ZR, Immediate(42)); | 327 __ delay_slot()->ori(V0, ZR, Immediate(42)); |
| 258 } | 328 } |
| 259 | 329 |
| 260 | 330 |
| 261 ASSEMBLER_TEST_RUN(Simple, test) { | 331 ASSEMBLER_TEST_RUN(Simple, test) { |
| 262 typedef int (*SimpleCode)(); | 332 typedef int (*SimpleCode)(); |
| 263 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 333 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 264 } | 334 } |
| 265 | 335 |
| 266 } // namespace dart | 336 } // namespace dart |
| 267 | 337 |
| 268 #endif // defined TARGET_ARCH_MIPS | 338 #endif // defined TARGET_ARCH_MIPS |
| OLD | NEW |