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

Side by Side Diff: src/DartARM32/assembler_arm.h

Issue 1402403002: Handle stack spills in ARM integrated assembler. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix nits. Created 5 years, 2 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
« no previous file with comments | « no previous file | src/DartARM32/assembler_arm.cc » ('j') | 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 // This is forked from Dart revision df52deea9f25690eb8b66c5995da92b70f7ac1fe 5 // This is forked from Dart revision df52deea9f25690eb8b66c5995da92b70f7ac1fe
6 // Please update the (git) revision if we merge changes from Dart. 6 // Please update the (git) revision if we merge changes from Dart.
7 // https://code.google.com/p/dart/wiki/GettingTheSource 7 // https://code.google.com/p/dart/wiki/GettingTheSource
8 8
9 #ifndef VM_ASSEMBLER_ARM_H_ 9 #ifndef VM_ASSEMBLER_ARM_H_
10 #define VM_ASSEMBLER_ARM_H_ 10 #define VM_ASSEMBLER_ARM_H_
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 } 133 }
134 134
135 // Data-processing operands - Immediate. 135 // Data-processing operands - Immediate.
136 explicit Operand(uint32_t immediate) { 136 explicit Operand(uint32_t immediate) {
137 ASSERT(immediate < (1 << kImmed8Bits)); 137 ASSERT(immediate < (1 << kImmed8Bits));
138 type_ = 1; 138 type_ = 1;
139 encoding_ = immediate; 139 encoding_ = immediate;
140 } 140 }
141 141
142 #if 0 142 #if 0
143 // Moved to decode in IceAssemblerARM32.cpp 143 // Moved to decodeOperand() in IceAssemblerARM32.cpp
144 // Data-processing operands - Rotated immediate. 144 // Data-processing operands - Rotated immediate.
145 Operand(uint32_t rotate, uint32_t immed8) { 145 Operand(uint32_t rotate, uint32_t immed8) {
146 ASSERT((rotate < (1 << kRotateBits)) && (immed8 < (1 << kImmed8Bits))); 146 ASSERT((rotate < (1 << kRotateBits)) && (immed8 < (1 << kImmed8Bits)));
147 type_ = 1; 147 type_ = 1;
148 encoding_ = (rotate << kRotateShift) | (immed8 << kImmed8Shift); 148 encoding_ = (rotate << kRotateShift) | (immed8 << kImmed8Shift);
149 } 149 }
150 #endif 150 #endif
151 151
152 #if 0 152 #if 0
153 // Moved to decode in IceAssemblerARM32.cpp 153 // Moved to decodeOperand() in IceAssemblerARM32.cpp
154 // Data-processing operands - Register. 154 // Data-processing operands - Register.
155 explicit Operand(Register rm) { 155 explicit Operand(Register rm) {
156 type_ = 0; 156 type_ = 0;
157 encoding_ = static_cast<uint32_t>(rm); 157 encoding_ = static_cast<uint32_t>(rm);
158 } 158 }
159 #endif 159 #endif
160 160
161 // Data-processing operands - Logical shift/rotate by immediate. 161 // Data-processing operands - Logical shift/rotate by immediate.
162 Operand(Register rm, Shift shift, uint32_t shift_imm) { 162 Operand(Register rm, Shift shift, uint32_t shift_imm) {
163 ASSERT(shift_imm < (1 << kShiftImmBits)); 163 ASSERT(shift_imm < (1 << kShiftImmBits));
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 Address& operator=(const Address& other) { 270 Address& operator=(const Address& other) {
271 encoding_ = other.encoding_; 271 encoding_ = other.encoding_;
272 kind_ = other.kind_; 272 kind_ = other.kind_;
273 return *this; 273 return *this;
274 } 274 }
275 275
276 bool Equals(const Address& other) const { 276 bool Equals(const Address& other) const {
277 return (encoding_ == other.encoding_) && (kind_ == other.kind_); 277 return (encoding_ == other.encoding_) && (kind_ == other.kind_);
278 } 278 }
279 279
280 #if 0
281 // Moved to decodeImmRegOffset() in IceAssemblerARM32.cpp.
282 // Used to model stack offsets.
280 explicit Address(Register rn, int32_t offset = 0, Mode am = Offset) { 283 explicit Address(Register rn, int32_t offset = 0, Mode am = Offset) {
281 ASSERT(Utils::IsAbsoluteUint(12, offset)); 284 ASSERT(Utils::IsAbsoluteUint(12, offset));
282 kind_ = Immediate; 285 kind_ = Immediate;
283 if (offset < 0) { 286 if (offset < 0) {
284 encoding_ = (am ^ (1 << kUShift)) | -offset; // Flip U to adjust sign. 287 encoding_ = (am ^ (1 << kUShift)) | -offset; // Flip U to adjust sign.
285 } else { 288 } else {
286 encoding_ = am | offset; 289 encoding_ = am | offset;
287 } 290 }
288 encoding_ |= static_cast<uint32_t>(rn) << kRnShift; 291 encoding_ |= static_cast<uint32_t>(rn) << kRnShift;
289 } 292 }
293 #endif
290 294
291 // There is no register offset mode unless Mode is Offset, in which case the 295 // There is no register offset mode unless Mode is Offset, in which case the
292 // shifted register case below should be used. 296 // shifted register case below should be used.
293 Address(Register rn, Register r, Mode am); 297 Address(Register rn, Register r, Mode am);
294 298
295 Address(Register rn, Register rm, 299 Address(Register rn, Register rm,
296 Shift shift = LSL, uint32_t shift_imm = 0, Mode am = Offset) { 300 Shift shift = LSL, uint32_t shift_imm = 0, Mode am = Offset) {
297 Operand o(rm, shift, shift_imm); 301 Operand o(rm, shift, shift_imm);
298 302
299 if ((shift == LSL) && (shift_imm == 0)) { 303 if ((shift == LSL) && (shift_imm == 0)) {
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 437
434 static const char* RegisterName(Register reg); 438 static const char* RegisterName(Register reg);
435 439
436 static const char* FpuRegisterName(FpuRegister reg); 440 static const char* FpuRegisterName(FpuRegister reg);
437 441
438 // Data-processing instructions. 442 // Data-processing instructions.
439 void and_(Register rd, Register rn, Operand o, Condition cond = AL); 443 void and_(Register rd, Register rn, Operand o, Condition cond = AL);
440 444
441 void eor(Register rd, Register rn, Operand o, Condition cond = AL); 445 void eor(Register rd, Register rn, Operand o, Condition cond = AL);
442 446
447 #if 0
448 // Moved to ARM32::AssemberARM32::sub()
443 void sub(Register rd, Register rn, Operand o, Condition cond = AL); 449 void sub(Register rd, Register rn, Operand o, Condition cond = AL);
444 void subs(Register rd, Register rn, Operand o, Condition cond = AL); 450 void subs(Register rd, Register rn, Operand o, Condition cond = AL);
451 #endif
445 452
446 void rsb(Register rd, Register rn, Operand o, Condition cond = AL); 453 void rsb(Register rd, Register rn, Operand o, Condition cond = AL);
447 void rsbs(Register rd, Register rn, Operand o, Condition cond = AL); 454 void rsbs(Register rd, Register rn, Operand o, Condition cond = AL);
448 455
449 #if 0 456 #if 0
450 // Moved to IceAssemblerARM32::mov 457 // Moved to ARM32::AssemblerARM32::add()
451 void add(Register rd, Register rn, Operand o, Condition cond = AL); 458 void add(Register rd, Register rn, Operand o, Condition cond = AL);
452 459
453 void adds(Register rd, Register rn, Operand o, Condition cond = AL); 460 void adds(Register rd, Register rn, Operand o, Condition cond = AL);
454 #endif 461 #endif
455 462
456 void adc(Register rd, Register rn, Operand o, Condition cond = AL); 463 void adc(Register rd, Register rn, Operand o, Condition cond = AL);
457 464
458 void adcs(Register rd, Register rn, Operand o, Condition cond = AL); 465 void adcs(Register rd, Register rn, Operand o, Condition cond = AL);
459 466
460 void sbc(Register rd, Register rn, Operand o, Condition cond = AL); 467 void sbc(Register rd, Register rn, Operand o, Condition cond = AL);
461 468
462 void sbcs(Register rd, Register rn, Operand o, Condition cond = AL); 469 void sbcs(Register rd, Register rn, Operand o, Condition cond = AL);
463 470
464 void rsc(Register rd, Register rn, Operand o, Condition cond = AL); 471 void rsc(Register rd, Register rn, Operand o, Condition cond = AL);
465 472
466 void tst(Register rn, Operand o, Condition cond = AL); 473 void tst(Register rn, Operand o, Condition cond = AL);
467 474
468 void teq(Register rn, Operand o, Condition cond = AL); 475 void teq(Register rn, Operand o, Condition cond = AL);
469 476
470 void cmp(Register rn, Operand o, Condition cond = AL); 477 void cmp(Register rn, Operand o, Condition cond = AL);
471 478
472 void cmn(Register rn, Operand o, Condition cond = AL); 479 void cmn(Register rn, Operand o, Condition cond = AL);
473 480
474 void orr(Register rd, Register rn, Operand o, Condition cond = AL); 481 void orr(Register rd, Register rn, Operand o, Condition cond = AL);
475 void orrs(Register rd, Register rn, Operand o, Condition cond = AL); 482 void orrs(Register rd, Register rn, Operand o, Condition cond = AL);
476 483
477 #if 0 484 #if 0
478 // Moved to IceAssemblerARM32::mov 485 // Moved to IceAssemblerARM32::mov()
479 void mov(Register rd, Operand o, Condition cond = AL); 486 void mov(Register rd, Operand o, Condition cond = AL);
480 void movs(Register rd, Operand o, Condition cond = AL); 487 void movs(Register rd, Operand o, Condition cond = AL);
481 #endif 488 #endif
482 489
483 void bic(Register rd, Register rn, Operand o, Condition cond = AL); 490 void bic(Register rd, Register rn, Operand o, Condition cond = AL);
484 void bics(Register rd, Register rn, Operand o, Condition cond = AL); 491 void bics(Register rd, Register rn, Operand o, Condition cond = AL);
485 492
486 void mvn(Register rd, Operand o, Condition cond = AL); 493 void mvn(Register rd, Operand o, Condition cond = AL);
487 void mvns(Register rd, Operand o, Condition cond = AL); 494 void mvns(Register rd, Operand o, Condition cond = AL);
488 495
(...skipping 18 matching lines...) Expand all
507 514
508 // Emulation of this instruction uses IP and the condition codes. Therefore, 515 // Emulation of this instruction uses IP and the condition codes. Therefore,
509 // none of the registers can be IP, and the instruction can only be used 516 // none of the registers can be IP, and the instruction can only be used
510 // unconditionally. 517 // unconditionally.
511 void umaal(Register rd_lo, Register rd_hi, Register rn, Register rm); 518 void umaal(Register rd_lo, Register rd_hi, Register rn, Register rm);
512 519
513 // Division instructions. 520 // Division instructions.
514 void sdiv(Register rd, Register rn, Register rm, Condition cond = AL); 521 void sdiv(Register rd, Register rn, Register rm, Condition cond = AL);
515 void udiv(Register rd, Register rn, Register rm, Condition cond = AL); 522 void udiv(Register rd, Register rn, Register rm, Condition cond = AL);
516 523
524 #if 0
525 // Moved to AssemblerARM32::ldr()
517 // Load/store instructions. 526 // Load/store instructions.
518 void ldr(Register rd, Address ad, Condition cond = AL); 527 void ldr(Register rd, Address ad, Condition cond = AL);
528 // Moved to AssemblerARM32::str()
519 void str(Register rd, Address ad, Condition cond = AL); 529 void str(Register rd, Address ad, Condition cond = AL);
520 530
531 // Moved to AssemblerARM32::ldr()
521 void ldrb(Register rd, Address ad, Condition cond = AL); 532 void ldrb(Register rd, Address ad, Condition cond = AL);
533 // Moved to AssemblerARM32::str()
522 void strb(Register rd, Address ad, Condition cond = AL); 534 void strb(Register rd, Address ad, Condition cond = AL);
535 #endif
523 536
524 void ldrh(Register rd, Address ad, Condition cond = AL); 537 void ldrh(Register rd, Address ad, Condition cond = AL);
525 void strh(Register rd, Address ad, Condition cond = AL); 538 void strh(Register rd, Address ad, Condition cond = AL);
526 539
527 void ldrsb(Register rd, Address ad, Condition cond = AL); 540 void ldrsb(Register rd, Address ad, Condition cond = AL);
528 void ldrsh(Register rd, Address ad, Condition cond = AL); 541 void ldrsh(Register rd, Address ad, Condition cond = AL);
529 542
530 // ldrd and strd actually support the full range of addressing modes, but 543 // ldrd and strd actually support the full range of addressing modes, but
531 // we don't use them, and we need to split them up into two instructions for 544 // we don't use them, and we need to split them up into two instructions for
532 // ARMv5TE, so we only support the base + offset mode. 545 // ARMv5TE, so we only support the base + offset mode.
533 void ldrd(Register rd, Register rn, int32_t offset, Condition cond = AL); 546 void ldrd(Register rd, Register rn, int32_t offset, Condition cond = AL);
534 void strd(Register rd, Register rn, int32_t offset, Condition cond = AL); 547 void strd(Register rd, Register rn, int32_t offset, Condition cond = AL);
535 548
536 void ldm(BlockAddressMode am, Register base, 549 void ldm(BlockAddressMode am, Register base,
537 RegList regs, Condition cond = AL); 550 RegList regs, Condition cond = AL);
538 void stm(BlockAddressMode am, Register base, 551 void stm(BlockAddressMode am, Register base,
539 RegList regs, Condition cond = AL); 552 RegList regs, Condition cond = AL);
540 553
541 void ldrex(Register rd, Register rn, Condition cond = AL); 554 void ldrex(Register rd, Register rn, Condition cond = AL);
542 void strex(Register rd, Register rt, Register rn, Condition cond = AL); 555 void strex(Register rd, Register rt, Register rn, Condition cond = AL);
543 556
544 // Miscellaneous instructions. 557 // Miscellaneous instructions.
545 void clrex(); 558 void clrex();
546 void nop(Condition cond = AL); 559 void nop(Condition cond = AL);
547 560
548 #if 0 561 #if 0
549 // Moved to: ARM32::AssemblerARM32. 562 // Moved to: ARM32::AssemblerARM32::bkpt()
550 // Note that gdb sets breakpoints using the undefined instruction 0xe7f001f0. 563 // Note that gdb sets breakpoints using the undefined instruction 0xe7f001f0.
551 void bkpt(uint16_t imm16); 564 void bkpt(uint16_t imm16);
552 565
553 static int32_t BkptEncoding(uint16_t imm16) { 566 static int32_t BkptEncoding(uint16_t imm16) {
554 // bkpt requires that the cond field is AL. 567 // bkpt requires that the cond field is AL.
555 return (AL << kConditionShift) | B24 | B21 | 568 return (AL << kConditionShift) | B24 | B21 |
556 ((imm16 >> 4) << 8) | B6 | B5 | B4 | (imm16 & 0xf); 569 ((imm16 >> 4) << 8) | B6 | B5 | B4 | (imm16 & 0xf);
557 } 570 }
558 #endif 571 #endif
559 572
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
670 void vtbl(DRegister dd, DRegister dn, int length, DRegister dm); 683 void vtbl(DRegister dd, DRegister dn, int length, DRegister dm);
671 684
672 // The words of qd and qm are interleaved with the low words of the result 685 // The words of qd and qm are interleaved with the low words of the result
673 // in qd and the high words in qm. 686 // in qd and the high words in qm.
674 void vzipqw(QRegister qd, QRegister qm); 687 void vzipqw(QRegister qd, QRegister qm);
675 688
676 // Branch instructions. 689 // Branch instructions.
677 void b(Label* label, Condition cond = AL); 690 void b(Label* label, Condition cond = AL);
678 void bl(Label* label, Condition cond = AL); 691 void bl(Label* label, Condition cond = AL);
679 #if 0 692 #if 0
680 // Moved to: ARM32::AssemblerARM32. 693 // Moved to: ARM32::AssemblerARM32::bx()
681 void bx(Register rm, Condition cond = AL); 694 void bx(Register rm, Condition cond = AL);
682 #endif 695 #endif
683 void blx(Register rm, Condition cond = AL); 696 void blx(Register rm, Condition cond = AL);
684 697
685 void Branch(const StubEntry& stub_entry, 698 void Branch(const StubEntry& stub_entry,
686 Patchability patchable = kNotPatchable, 699 Patchability patchable = kNotPatchable,
687 Register pp = PP, 700 Register pp = PP,
688 Condition cond = AL); 701 Condition cond = AL);
689 702
690 void BranchLink(const StubEntry& stub_entry, 703 void BranchLink(const StubEntry& stub_entry,
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after
1090 1103
1091 bool constant_pool_allowed_; 1104 bool constant_pool_allowed_;
1092 1105
1093 void LoadObjectHelper(Register rd, 1106 void LoadObjectHelper(Register rd,
1094 const Object& object, 1107 const Object& object,
1095 Condition cond, 1108 Condition cond,
1096 bool is_unique, 1109 bool is_unique,
1097 Register pp); 1110 Register pp);
1098 1111
1099 #if 0 1112 #if 0
1100 // Moved to class AssemblerARM32. 1113 // Moved to ARM32::AssemblerARM32::emitType01()
1101 void EmitType01(Condition cond, 1114 void EmitType01(Condition cond,
1102 int type, 1115 int type,
1103 Opcode opcode, 1116 Opcode opcode,
1104 int set_cc, 1117 int set_cc,
1105 Register rn, 1118 Register rn,
1106 Register rd, 1119 Register rd,
1107 Operand o); 1120 Operand o);
1108 #endif 1121 #endif
1109 1122
1110 void EmitType5(Condition cond, int32_t offset, bool link); 1123 void EmitType5(Condition cond, int32_t offset, bool link);
1111 1124
1125 #if 0
1126 // Moved to ARM32::AssemberARM32::emitMemOp()
1112 void EmitMemOp(Condition cond, 1127 void EmitMemOp(Condition cond,
1113 bool load, 1128 bool load,
1114 bool byte, 1129 bool byte,
1115 Register rd, 1130 Register rd,
1116 Address ad); 1131 Address ad);
1132 #endif
1117 1133
1118 void EmitMemOpAddressMode3(Condition cond, 1134 void EmitMemOpAddressMode3(Condition cond,
1119 int32_t mode, 1135 int32_t mode,
1120 Register rd, 1136 Register rd,
1121 Address ad); 1137 Address ad);
1122 1138
1123 void EmitMultiMemOp(Condition cond, 1139 void EmitMultiMemOp(Condition cond,
1124 BlockAddressMode am, 1140 BlockAddressMode am,
1125 bool load, 1141 bool load,
1126 Register base, 1142 Register base,
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1227 Register new_value, 1243 Register new_value,
1228 FieldContent old_content); 1244 FieldContent old_content);
1229 1245
1230 DISALLOW_ALLOCATION(); 1246 DISALLOW_ALLOCATION();
1231 DISALLOW_COPY_AND_ASSIGN(Assembler); 1247 DISALLOW_COPY_AND_ASSIGN(Assembler);
1232 }; 1248 };
1233 1249
1234 } // namespace dart 1250 } // namespace dart
1235 1251
1236 #endif // VM_ASSEMBLER_ARM_H_ 1252 #endif // VM_ASSEMBLER_ARM_H_
OLDNEW
« no previous file with comments | « no previous file | src/DartARM32/assembler_arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698