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

Side by Side Diff: runtime/vm/assembler_mips.h

Issue 12837009: Adds MIPS SPECIAL instructions to simulator, assembler, debugger. (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 | « no previous file | runtime/vm/assembler_mips_test.cc » ('j') | runtime/vm/assembler_mips_test.cc » ('J')
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 #ifndef VM_ASSEMBLER_MIPS_H_ 5 #ifndef VM_ASSEMBLER_MIPS_H_
6 #define VM_ASSEMBLER_MIPS_H_ 6 #define VM_ASSEMBLER_MIPS_H_
7 7
8 #ifndef VM_ASSEMBLER_H_ 8 #ifndef VM_ASSEMBLER_H_
9 #error Do not include assembler_mips.h directly; use assembler.h instead. 9 #error Do not include assembler_mips.h directly; use assembler.h instead.
10 #endif 10 #endif
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 Assembler* delay_slot() { 217 Assembler* delay_slot() {
218 ASSERT(delay_slot_available_); 218 ASSERT(delay_slot_available_);
219 ASSERT(buffer_.Load<int32_t>(buffer_.GetPosition() - sizeof(int32_t)) == 219 ASSERT(buffer_.Load<int32_t>(buffer_.GetPosition() - sizeof(int32_t)) ==
220 Instr::kNopInstruction); 220 Instr::kNopInstruction);
221 buffer_.Remit<int32_t>(); 221 buffer_.Remit<int32_t>();
222 delay_slot_available_ = false; 222 delay_slot_available_ = false;
223 in_delay_slot_ = true; 223 in_delay_slot_ = true;
224 return this; 224 return this;
225 } 225 }
226 226
227 // CPU instructions. 227 // CPU instructions in alphabetical order.
228 void addiu(Register rt, Register rs, const Immediate& imm) { 228 void addiu(Register rt, Register rs, const Immediate& imm) {
229 ASSERT(Utils::IsInt(16, imm.value())); 229 ASSERT(Utils::IsInt(16, imm.value()));
230 uint16_t imm_value = static_cast<uint16_t>(imm.value()); 230 uint16_t imm_value = static_cast<uint16_t>(imm.value());
231 EmitIType(ADDIU, rs, rt, imm_value); 231 EmitIType(ADDIU, rs, rt, imm_value);
232 } 232 }
233 233
234 void addu(Register rd, Register rs, Register rt) { 234 void addu(Register rd, Register rs, Register rt) {
235 EmitRType(SPECIAL, rs, rt, rd, 0, ADDU); 235 EmitRType(SPECIAL, rs, rt, rd, 0, ADDU);
236 } 236 }
237 237
(...skipping 23 matching lines...) Expand all
261 } 261 }
262 262
263 void div(Register rs, Register rt) { 263 void div(Register rs, Register rt) {
264 EmitRType(SPECIAL, rs, rt, R0, 0, DIV); 264 EmitRType(SPECIAL, rs, rt, R0, 0, DIV);
265 } 265 }
266 266
267 void divu(Register rs, Register rt) { 267 void divu(Register rs, Register rt) {
268 EmitRType(SPECIAL, rs, rt, R0, 0, DIVU); 268 EmitRType(SPECIAL, rs, rt, R0, 0, DIVU);
269 } 269 }
270 270
271 void jalr(Register rs) {
272 ASSERT(!in_delay_slot_); // Jump within a delay slot is not supported.
273 EmitRType(SPECIAL, rs, R0, RA, 0, JALR);
274 Emit(Instr::kNopInstruction); // Branch delay NOP.
Ivan Posva 2013/03/20 01:54:51 How about EmitBranchDelayNop() which expands to: E
zra 2013/03/20 15:53:50 Done.
275 delay_slot_available_ = true;
276 }
Ivan Posva 2013/03/20 01:54:51 jalr(Register rs, Register rd)
zra 2013/03/20 15:53:50 Done.
277
278 void jr(Register rs) {
279 ASSERT(!in_delay_slot_); // Jump within a delay slot is not supported.
280 EmitRType(SPECIAL, rs, R0, R0, 0, JR);
281 Emit(Instr::kNopInstruction); // Branch delay NOP.
282 delay_slot_available_ = true;
283 }
271 284
272 void lb(Register rt, const Address& addr) { 285 void lb(Register rt, const Address& addr) {
273 EmitLoadStore(LB, rt, addr); 286 EmitLoadStore(LB, rt, addr);
274 } 287 }
275 288
276 void lbu(Register rt, const Address& addr) { 289 void lbu(Register rt, const Address& addr) {
277 EmitLoadStore(LBU, rt, addr); 290 EmitLoadStore(LBU, rt, addr);
278 } 291 }
279 292
280 void lh(Register rt, const Address& addr) { 293 void lh(Register rt, const Address& addr) {
(...skipping 15 matching lines...) Expand all
296 } 309 }
297 310
298 void mfhi(Register rd) { 311 void mfhi(Register rd) {
299 EmitRType(SPECIAL, R0, R0, rd, 0, MFHI); 312 EmitRType(SPECIAL, R0, R0, rd, 0, MFHI);
300 } 313 }
301 314
302 void mflo(Register rd) { 315 void mflo(Register rd) {
303 EmitRType(SPECIAL, R0, R0, rd, 0, MFLO); 316 EmitRType(SPECIAL, R0, R0, rd, 0, MFLO);
304 } 317 }
305 318
319 void movn(Register rd, Register rs, Register rt) {
320 EmitRType(SPECIAL, rs, rt, rd, 0, MOVN);
321 }
322
323 void movz(Register rd, Register rs, Register rt) {
324 EmitRType(SPECIAL, rs, rt, rd, 0, MOVZ);
325 }
326
327 void mult(Register rs, Register rt) {
328 EmitRType(SPECIAL, rs, rt, R0, 0, MULT);
329 }
330
331 void multu(Register rs, Register rt) {
332 EmitRType(SPECIAL, rs, rt, R0, 0, MULTU);
333 }
334
335 void nor(Register rd, Register rs, Register rt) {
336 EmitRType(SPECIAL, rs, rt, rd, 0, NOR);
337 }
338
339 void or_(Register rd, Register rs, Register rt) {
340 EmitRType(SPECIAL, rs, rt, rd, 0, OR);
341 }
342
306 void ori(Register rt, Register rs, const Immediate& imm) { 343 void ori(Register rt, Register rs, const Immediate& imm) {
307 ASSERT(Utils::IsUint(16, imm.value())); 344 ASSERT(Utils::IsUint(16, imm.value()));
308 uint16_t imm_value = static_cast<uint16_t>(imm.value()); 345 uint16_t imm_value = static_cast<uint16_t>(imm.value());
309 EmitIType(ORI, rs, rt, imm_value); 346 EmitIType(ORI, rs, rt, imm_value);
310 } 347 }
311 348
312 void jr(Register rs) {
313 ASSERT(!in_delay_slot_); // Jump within a delay slot is not supported.
314 EmitRType(SPECIAL, rs, R0, R0, 0, JR);
315 Emit(Instr::kNopInstruction); // Branch delay NOP.
316 delay_slot_available_ = true;
317 }
318
319 void sb(Register rt, const Address& addr) { 349 void sb(Register rt, const Address& addr) {
320 EmitLoadStore(SB, rt, addr); 350 EmitLoadStore(SB, rt, addr);
321 } 351 }
322 352
323 void sh(Register rt, const Address& addr) { 353 void sh(Register rt, const Address& addr) {
324 EmitLoadStore(SH, rt, addr); 354 EmitLoadStore(SH, rt, addr);
325 } 355 }
326 356
357 void sll(Register rd, Register rt, int sa) {
358 EmitRType(SPECIAL, R0, rt, rd, sa, SLL);
359 }
360
361 void sllv(Register rd, Register rt, Register rs) {
362 EmitRType(SPECIAL, rs, rt, rd, 0, SLLV);
363 }
364
365 void slt(Register rd, Register rs, Register rt) {
366 EmitRType(SPECIAL, rs, rt, rd, 0, SLT);
367 }
368
369 void sltu(Register rd, Register rs, Register rt) {
370 EmitRType(SPECIAL, rs, rt, rd, 0, SLTU);
371 }
372
373 void sra(Register rd, Register rt, int sa) {
374 EmitRType(SPECIAL, R0, rt, rd, sa, SRA);
375 }
376
377 void srav(Register rd, Register rt, Register rs) {
378 EmitRType(SPECIAL, rs, rt, rd, 0, SRAV);
379 }
380
381 void srl(Register rd, Register rt, int sa) {
382 EmitRType(SPECIAL, R0, rt, rd, sa, SRL);
383 }
384
385 void srlv(Register rd, Register rt, Register rs) {
386 EmitRType(SPECIAL, rs, rt, rd, 0, SRLV);
387 }
388
389 void sub(Register rd, Register rs, Register rt) {
390 EmitRType(SPECIAL, rs, rt, rd, 0, SUB);
391 }
392
393 void subu(Register rd, Register rs, Register rt) {
394 EmitRType(SPECIAL, rs, rt, rd, 0, SUBU);
395 }
396
327 void sw(Register rt, const Address& addr) { 397 void sw(Register rt, const Address& addr) {
328 EmitLoadStore(SW, rt, addr); 398 EmitLoadStore(SW, rt, addr);
329 } 399 }
330 400
331 void sll(Register rd, Register rt, int sa) { 401 void xor_(Register rd, Register rs, Register rt) {
332 EmitRType(SPECIAL, R0, rt, rd, sa, SLL); 402 EmitRType(SPECIAL, rs, rt, rd, 0, XOR);
333 } 403 }
334 404
335 // Macros. 405 // Macros in alphabetical order.
336 void LoadImmediate(Register rd, int32_t value) { 406 void LoadImmediate(Register rd, int32_t value) {
337 lui(rd, Immediate((value >> 16) & 0xffff)); 407 if (Utils::IsInt(16, value)) {
338 ori(rd, rd, Immediate(value & 0xffff)); 408 addiu(rd, ZR, Immediate(value));
409 } else {
410 lui(rd, Immediate((value >> 16) & 0xffff));
411 ori(rd, rd, Immediate(value & 0xffff));
412 }
413 }
414
415 void Mov(Register rd, Register rs) {
Ivan Posva 2013/03/20 01:54:51 Move
zra 2013/03/20 15:53:50 Done.
416 or_(rd, rs, ZR);
339 } 417 }
340 418
341 private: 419 private:
342 AssemblerBuffer buffer_; 420 AssemblerBuffer buffer_;
343 GrowableObjectArray& object_pool_; // Objects and patchable jump targets. 421 GrowableObjectArray& object_pool_; // Objects and patchable jump targets.
344 int prologue_offset_; 422 int prologue_offset_;
345 423
346 bool delay_slot_available_; 424 bool delay_slot_available_;
347 bool in_delay_slot_; 425 bool in_delay_slot_;
348 426
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 func << kFunctionShift); 497 func << kFunctionShift);
420 } 498 }
421 499
422 DISALLOW_ALLOCATION(); 500 DISALLOW_ALLOCATION();
423 DISALLOW_COPY_AND_ASSIGN(Assembler); 501 DISALLOW_COPY_AND_ASSIGN(Assembler);
424 }; 502 };
425 503
426 } // namespace dart 504 } // namespace dart
427 505
428 #endif // VM_ASSEMBLER_MIPS_H_ 506 #endif // VM_ASSEMBLER_MIPS_H_
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/assembler_mips_test.cc » ('j') | runtime/vm/assembler_mips_test.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698