00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "incls/_precompiled.incl"
00025 #include "incls/_assembler.cpp.incl"
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 class Displacement : public ValueObj {
00048 private:
00049 int _data;
00050
00051 enum Layout {
00052 info_size = IC_Info::number_of_flags,
00053 type_size = 2,
00054 next_size = 32 - (type_size + info_size),
00055
00056 info_pos = 0,
00057 type_pos = info_pos + info_size,
00058 next_pos = type_pos + type_size,
00059
00060 info_mask = (1 << info_size) - 1,
00061 type_mask = (1 << type_size) - 1,
00062 next_mask = (1 << next_size) - 1,
00063 };
00064
00065 enum Type {
00066 call,
00067 absolute_jump,
00068 conditional_jump,
00069 ic_info,
00070 };
00071
00072 void init(Label& L, Type type, int info) {
00073 assert(!L.is_bound(), "label is bound");
00074 int next = 0;
00075 if (L.is_unbound()) {
00076 next = L.pos();
00077 assert(next > 0, "Displacements must be at positions > 0");
00078 }
00079 assert((next & ~next_mask) == 0, "next field too small");
00080 assert((type & ~type_mask) == 0, "type field too small");
00081 assert((info & ~info_mask) == 0, "info field too small");
00082 _data = (next << next_pos) | (type << type_pos) | (info << info_pos);
00083 }
00084
00085 int data() const { return _data; }
00086 int info() const { return ((_data >> info_pos) & info_mask); }
00087 Type type() const { return Type((_data >> type_pos) & type_mask); }
00088 void next(Label & L) const { int n = ((_data >> next_pos) & next_mask); n > 0 ? L.link_to(n) : L.unuse(); }
00089 void link_to(Label& L) { init(L, type(), info()); }
00090
00091 Displacement(int data) { _data = data; }
00092
00093 Displacement(Label& L, Type type, int info) {
00094 init(L, type, info);
00095 }
00096
00097 void print() {
00098 char* s;
00099 switch (type()) {
00100 case call : s = "call"; break;
00101 case absolute_jump : s = "jmp "; break;
00102 case conditional_jump: s = "jcc "; break;
00103 case ic_info : s = "nlr "; break;
00104 default : s = "????"; break;
00105 }
00106 std->print("%s (info = 0x%x)", s, info());
00107 }
00108
00109 friend class Assembler;
00110 friend class MacroAssembler;
00111 };
00112
00113
00114
00115 #define disp_at(L) Displacement(long_at((L).pos()))
00116 #define disp_at_put(L,disp) long_at_put((L).pos(), (disp).data())
00117 #define emit_disp(L,type,info) { Displacement disp((L), (type), (info)); \
00118 L.link_to(offset()); \
00119 emit_long(int(disp.data())); \
00120 }
00121
00122
00123 char* registerNames[nofRegisters] = {"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"};
00124
00125 char* Register::name() const {
00126 return isValid() ? registerNames[_number] : "noreg";
00127 }
00128
00129
00130
00131
00132 Address::Address() {
00133 _base = noreg;
00134 _index = noreg;
00135 _scale = no_scale;
00136 _disp = 0;
00137 _rtype = relocInfo::none;
00138 }
00139
00140
00141 Address::Address(int disp, relocInfo::relocType rtype) {
00142 _base = noreg;
00143 _index = noreg;
00144 _scale = no_scale;
00145 _disp = disp;
00146 _rtype = rtype;
00147 }
00148
00149
00150 Address::Address(Register base, int disp, relocInfo::relocType rtype) {
00151 _base = base;
00152 _index = noreg;
00153 _scale = no_scale;
00154 _disp = disp;
00155 _rtype = rtype;
00156 }
00157
00158
00159 Address::Address(Register base, Register index, ScaleFactor scale, int disp, relocInfo::relocType rtype) {
00160 assert((index == noreg) == (scale == Address::no_scale), "inconsistent address");
00161 _base = base;
00162 _index = index;
00163 _scale = scale;
00164 _disp = disp;
00165 _rtype = rtype;
00166 }
00167
00168
00169
00170
00171 Assembler::Assembler(CodeBuffer* code) {
00172 _code = code;
00173 _code_begin = code->code_begin();
00174 _code_limit = code->code_limit();
00175 _code_pos = code->code_end();
00176 }
00177
00178
00179 void Assembler::finalize() {
00180 if (_unbound_label.is_unbound()) {
00181 bind_to(_unbound_label, _binding_pos);
00182 }
00183 }
00184
00185
00186 inline void Assembler::emit_byte(int x) {
00187 assert(isByte(x), "not a byte");
00188 *(unsigned char*)_code_pos = (unsigned char)x;
00189 _code_pos += sizeof(unsigned char);
00190 code()->set_code_end(_code_pos);
00191 }
00192
00193
00194 inline void Assembler::emit_long(int x) {
00195 *(int*)_code_pos = x;
00196 _code_pos += sizeof(int);
00197 code()->set_code_end(_code_pos);
00198 }
00199
00200
00201 inline void Assembler::emit_data(int data, relocInfo::relocType rtype) {
00202 if (rtype != relocInfo::none) code()->relocate(_code_pos, rtype);
00203 emit_long(data);
00204 }
00205
00206
00207 void Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) {
00208 guarantee(dst.hasByteRegister(), "must have byte register");
00209 assert(isByte(op1) && isByte(op2), "wrong opcode");
00210 assert(isByte(imm8), "not a byte");
00211 assert((op1 & 0x01) == 0, "should be 8bit operation");
00212 emit_byte(op1);
00213 emit_byte(op2 | dst.number());
00214 emit_byte(imm8);
00215 }
00216
00217
00218 void Assembler::emit_arith(int op1, int op2, Register dst, int imm32) {
00219 assert(isByte(op1) && isByte(op2), "wrong opcode");
00220 assert((op1 & 0x01) == 1, "should be 32bit operation");
00221 assert((op1 & 0x02) == 0, "sign-extension bit should not be set");
00222 if (is8bit(imm32)) {
00223 emit_byte(op1 | 0x02);
00224 emit_byte(op2 | dst.number());
00225 emit_byte(imm32 & 0xFF);
00226 } else {
00227 emit_byte(op1);
00228 emit_byte(op2 | dst.number());
00229 emit_long(imm32);
00230 }
00231 }
00232
00233
00234 void Assembler::emit_arith(int op1, int op2, Register dst, oop obj) {
00235 assert(isByte(op1) && isByte(op2), "wrong opcode");
00236 assert((op1 & 0x01) == 1, "should be 32bit operation");
00237 assert((op1 & 0x02) == 0, "sign-extension bit should not be set");
00238 emit_byte(op1);
00239 emit_byte(op2 | dst.number());
00240 emit_data((int)obj, relocInfo::oop_type);
00241 }
00242
00243
00244 void Assembler::emit_arith(int op1, int op2, Register dst, Register src) {
00245 assert(isByte(op1) && isByte(op2), "wrong opcode");
00246 emit_byte(op1);
00247 emit_byte(op2 | dst.number() << 3 | src.number());
00248 }
00249
00250
00251 void Assembler::emit_operand(Register reg, Register base, Register index, Address::ScaleFactor scale, int disp, relocInfo::relocType rtype) {
00252 if (base.isValid()) {
00253 if (index.isValid()) {
00254 assert(scale != Address::no_scale, "inconsistent address");
00255
00256 if (disp == 0 && rtype == relocInfo::none) {
00257
00258
00259 assert(index != esp && base != ebp, "illegal addressing mode");
00260 emit_byte(0x04 | reg.number() << 3);
00261 emit_byte(scale << 6 | index.number() << 3 | base.number());
00262 } else if (is8bit(disp) && rtype == relocInfo::none) {
00263
00264
00265 assert(index != esp, "illegal addressing mode");
00266 emit_byte(0x44 | reg.number() << 3);
00267 emit_byte(scale << 6 | index.number() << 3 | base.number());
00268 emit_byte(disp & 0xFF);
00269 } else {
00270
00271
00272 assert(index != esp, "illegal addressing mode");
00273 emit_byte(0x84 | reg.number() << 3);
00274 emit_byte(scale << 6 | index.number() << 3 | base.number());
00275 emit_data(disp, rtype);
00276 }
00277 } else if (base == esp) {
00278
00279 if (disp == 0 && rtype == relocInfo::none) {
00280
00281
00282 emit_byte(0x04 | reg.number() << 3);
00283 emit_byte(0x24);
00284 } else if (is8bit(disp) && rtype == relocInfo::none) {
00285
00286
00287 emit_byte(0x44 | reg.number() << 3);
00288 emit_byte(0x24);
00289 emit_byte(disp & 0xFF);
00290 } else {
00291
00292
00293 emit_byte(0x84 | reg.number() << 3);
00294 emit_byte(0x24);
00295 emit_data(disp, rtype);
00296 }
00297 } else {
00298
00299 assert(base != esp, "illegal addressing mode");
00300 if (disp == 0 && rtype == relocInfo::none && base != ebp) {
00301
00302
00303 assert(base != ebp, "illegal addressing mode");
00304 emit_byte(0x00 | reg.number() << 3 | base.number());
00305 } else if (is8bit(disp) && rtype == relocInfo::none) {
00306
00307
00308 emit_byte(0x40 | reg.number() << 3 | base.number());
00309 emit_byte(disp & 0xFF);
00310 } else {
00311
00312
00313 emit_byte(0x80 | reg.number() << 3 | base.number());
00314 emit_data(disp, rtype);
00315 }
00316 }
00317 } else {
00318 if (index.isValid()) {
00319 assert(scale != Address::no_scale, "inconsistent address");
00320
00321
00322 assert(index != esp, "illegal addressing mode");
00323 emit_byte(0x04 | reg.number() << 3);
00324 emit_byte(scale << 6 | index.number() << 3 | 0x05);
00325 emit_data(disp, rtype);
00326 } else {
00327
00328
00329 emit_byte(0x05 | reg.number() << 3);
00330 emit_data(disp, rtype);
00331 }
00332 }
00333 }
00334
00335
00336 void Assembler::emit_operand(Register reg, Address adr) {
00337 emit_operand(reg, adr._base, adr._index, adr._scale, adr._disp, adr._rtype);
00338 }
00339
00340
00341 void Assembler::emit_farith(int b1, int b2, int i) {
00342 assert(isByte(b1) && isByte(b2), "wrong opcode");
00343 assert(0 <= i && i < 8, "illegal stack offset");
00344 emit_byte(b1);
00345 emit_byte(b2 + i);
00346 }
00347
00348
00349 void Assembler::pushad() {
00350 emit_byte(0x60);
00351 }
00352
00353
00354 void Assembler::popad() {
00355 emit_byte(0x61);
00356 }
00357
00358
00359 void Assembler::pushl(int imm32) {
00360 emit_byte(0x68);
00361 emit_long(imm32);
00362 }
00363
00364
00365 void Assembler::pushl(oop obj) {
00366 emit_byte(0x68);
00367 emit_data((int)obj, relocInfo::oop_type);
00368 }
00369
00370
00371 void Assembler::pushl(Register src) {
00372 emit_byte(0x50 | src.number());
00373 }
00374
00375
00376 void Assembler::pushl(Address src) {
00377 emit_byte(0xFF);
00378 emit_operand(esi, src);
00379 }
00380
00381
00382 void Assembler::popl(Register dst) {
00383 emit_byte(0x58 | dst.number());
00384 }
00385
00386
00387 void Assembler::popl(Address dst) {
00388 emit_byte(0x8F);
00389 emit_operand(eax, dst);
00390 }
00391
00392
00393 void Assembler::movb(Register dst, Address src) {
00394 guarantee(dst.hasByteRegister(), "must have byte register");
00395 emit_byte(0x8A);
00396 emit_operand(dst, src);
00397 }
00398
00399
00400 void Assembler::movb(Address dst, int imm8) {
00401 emit_byte(0xC6);
00402 emit_operand(eax, dst);
00403 emit_byte(imm8);
00404 }
00405
00406
00407 void Assembler::movb(Address dst, Register src) {
00408 guarantee(src.hasByteRegister(), "must have byte register");
00409 emit_byte(0x88);
00410 emit_operand(src, dst);
00411 }
00412
00413
00414 void Assembler::movw(Register dst, Address src) {
00415 emit_byte(0x66);
00416 emit_byte(0x8B);
00417 emit_operand(dst, src);
00418 }
00419
00420
00421 void Assembler::movw(Address dst, Register src) {
00422 emit_byte(0x66);
00423 emit_byte(0x89);
00424 emit_operand(src, dst);
00425 }
00426
00427
00428 void Assembler::movl(Register dst, int imm32) {
00429 emit_byte(0xB8 | dst.number());
00430 emit_long(imm32);
00431 }
00432
00433
00434 void Assembler::movl(Register dst, oop obj) {
00435 emit_byte(0xB8 | dst.number());
00436 emit_data((int)obj, relocInfo::oop_type);
00437 }
00438
00439
00440 void Assembler::movl(Register dst, Register src) {
00441 emit_byte(0x8B);
00442 emit_byte(0xC0 | (dst.number() << 3) | src.number());
00443 }
00444
00445
00446 void Assembler::movl(Register dst, Address src) {
00447 emit_byte(0x8B);
00448 emit_operand(dst, src);
00449 }
00450
00451
00452 void Assembler::movl(Address dst, int imm32) {
00453 emit_byte(0xC7);
00454 emit_operand(eax, dst);
00455 emit_long(imm32);
00456 }
00457
00458
00459 void Assembler::movl(Address dst, oop obj) {
00460 emit_byte(0xC7);
00461 emit_operand(eax, dst);
00462 emit_data((int)obj, relocInfo::oop_type);
00463 }
00464
00465
00466 void Assembler::movl(Address dst, Register src) {
00467 emit_byte(0x89);
00468 emit_operand(src, dst);
00469 }
00470
00471
00472 void Assembler::movsxb(Register dst, Address src) {
00473 emit_byte(0x0F);
00474 emit_byte(0xBE);
00475 emit_operand(dst, src);
00476 }
00477
00478
00479 void Assembler::movsxb(Register dst, Register src) {
00480 guarantee(src.hasByteRegister(), "must have byte register");
00481 emit_byte(0x0F);
00482 emit_byte(0xBE);
00483 emit_byte(0xC0 | (dst.number() << 3) | src.number());
00484 }
00485
00486
00487 void Assembler::movsxw(Register dst, Address src) {
00488 emit_byte(0x0F);
00489 emit_byte(0xBF);
00490 emit_operand(dst, src);
00491 }
00492
00493
00494 void Assembler::movsxw(Register dst, Register src) {
00495 emit_byte(0x0F);
00496 emit_byte(0xBF);
00497 emit_byte(0xC0 | (dst.number() << 3) | src.number());
00498 }
00499
00500
00501 void Assembler::cmovccl(Condition cc, Register dst, int imm32) {
00502 Unimplemented();
00503 }
00504
00505
00506 void Assembler::cmovccl(Condition cc, Register dst, oop obj) {
00507 Unimplemented();
00508 }
00509
00510
00511 void Assembler::cmovccl(Condition cc, Register dst, Register src) {
00512 Unimplemented();
00513 }
00514
00515
00516 void Assembler::cmovccl(Condition cc, Register dst, Address src) {
00517 Unimplemented();
00518 }
00519
00520
00521 void Assembler::adcl(Register dst, int imm32) {
00522 emit_arith(0x81, 0xD0, dst, imm32);
00523 }
00524
00525
00526 void Assembler::adcl(Register dst, Register src) {
00527 emit_arith(0x13, 0xC0, dst, src);
00528 }
00529
00530
00531 void Assembler::addl(Address dst, int imm32) {
00532 emit_byte(0x81);
00533 emit_operand(eax, dst);
00534 emit_long(imm32);
00535 }
00536
00537
00538 void Assembler::addl(Register dst, int imm32) {
00539 emit_arith(0x81, 0xC0, dst, imm32);
00540 }
00541
00542
00543 void Assembler::addl(Register dst, Register src) {
00544 emit_arith(0x03, 0xC0, dst, src);
00545 }
00546
00547
00548 void Assembler::andl(Register dst, int imm32) {
00549 emit_arith(0x81, 0xE0, dst, imm32);
00550 }
00551
00552
00553 void Assembler::andl(Register dst, Register src) {
00554 emit_arith(0x23, 0xC0, dst, src);
00555 }
00556
00557
00558 void Assembler::cmpl(Address dst, int imm32) {
00559 emit_byte(0x81);
00560 emit_operand(edi, dst);
00561 emit_long(imm32);
00562 }
00563
00564
00565 void Assembler::cmpl(Address dst, oop obj) {
00566 emit_byte(0x81);
00567 emit_operand(edi, dst);
00568 emit_data((int)obj, relocInfo::oop_type);
00569 }
00570
00571
00572 void Assembler::cmpl(Register dst, int imm32) {
00573 emit_arith(0x81, 0xF8, dst, imm32);
00574 }
00575
00576
00577 void Assembler::cmpl(Register dst, oop obj) {
00578 emit_arith(0x81, 0xF8, dst, obj);
00579 }
00580
00581
00582 void Assembler::cmpl(Register dst, Register src) {
00583 emit_arith(0x3B, 0xC0, dst, src);
00584 }
00585
00586
00587 void Assembler::cmpl(Register dst, Address src) {
00588 emit_byte(0x3B);
00589 emit_operand(dst, src);
00590 }
00591
00592
00593 void Assembler::decb(Register dst) {
00594 guarantee(dst.hasByteRegister(), "must have byte register");
00595 emit_byte(0xFE);
00596 emit_byte(0xC8 | dst.number());
00597 }
00598
00599
00600 void Assembler::decl(Register dst) {
00601 emit_byte(0x48 | dst.number());
00602 }
00603
00604
00605 void Assembler::idivl(Register src) {
00606 emit_byte(0xF7);
00607 emit_byte(0xF8 | src.number());
00608 }
00609
00610
00611 void Assembler::imull(Register dst, Register src) {
00612 emit_byte(0x0F);
00613 emit_byte(0xAF);
00614 emit_byte(0xC0 | dst.number() << 3 | src.number());
00615 }
00616
00617
00618 void Assembler::imull(Register dst, Register src, int value) {
00619 if (is8bit(value)) {
00620 emit_byte(0x6B);
00621 emit_byte(0xC0 | dst.number() << 3 | src.number());
00622 emit_byte(value);
00623 } else {
00624 emit_byte(0x69);
00625 emit_byte(0xC0 | dst.number() << 3 | src.number());
00626 emit_long(value);
00627 }
00628 }
00629
00630
00631 void Assembler::incl(Register dst) {
00632 emit_byte(0x40 | dst.number());
00633 }
00634
00635
00636 void Assembler::incl(Address dst) {
00637 emit_byte(0xFF);
00638 emit_operand(eax, dst);
00639 }
00640
00641
00642 void Assembler::leal(Register dst, Address src) {
00643 emit_byte(0x8D);
00644 emit_operand(dst, src);
00645 }
00646
00647
00648 void Assembler::mull(Register src) {
00649 emit_byte(0xF7);
00650 emit_byte(0xE0 | src.number());
00651 }
00652
00653
00654 void Assembler::negl(Register dst) {
00655 emit_byte(0xF7);
00656 emit_byte(0xD8 | dst.number());
00657 }
00658
00659
00660 void Assembler::notl(Register dst) {
00661 emit_byte(0xF7);
00662 emit_byte(0xD0 | dst.number());
00663 }
00664
00665
00666 void Assembler::orl(Register dst, int imm32) {
00667 emit_arith(0x81, 0xC8, dst, imm32);
00668 }
00669
00670
00671 void Assembler::orl(Register dst, Register src) {
00672 emit_arith(0x0B, 0xC0, dst, src);
00673 }
00674
00675
00676
00677 void Assembler::orl(Register dst, Address src) {
00678 emit_byte(0x0B);
00679 emit_operand(dst, src);
00680 }
00681
00682
00683 void Assembler::rcll(Register dst, int imm8) {
00684 assert(isShiftCount(imm8), "illegal shift count");
00685 if (imm8 == 1) {
00686 emit_byte(0xD1);
00687 emit_byte(0xD0 | dst.number());
00688 } else {
00689 emit_byte(0xC1);
00690 emit_byte(0xD0 | dst.number());
00691 emit_byte(imm8);
00692 }
00693 }
00694
00695
00696 void Assembler::sarl(Register dst, int imm8) {
00697 assert(isShiftCount(imm8), "illegal shift count");
00698 if (imm8 == 1) {
00699 emit_byte(0xD1);
00700 emit_byte(0xF8 | dst.number());
00701 } else {
00702 emit_byte(0xC1);
00703 emit_byte(0xF8 | dst.number());
00704 emit_byte(imm8);
00705 }
00706 }
00707
00708
00709 void Assembler::sarl(Register dst) {
00710 emit_byte(0xD3);
00711 emit_byte(0xF8 | dst.number());
00712 }
00713
00714
00715 void Assembler::sbbl(Register dst, int imm32) {
00716 Unimplemented();
00717 }
00718
00719
00720 void Assembler::sbbl(Register dst, Register src) {
00721 emit_arith(0x1B, 0xC0, dst, src);
00722 }
00723
00724
00725 void Assembler::shldl(Register dst, Register src) {
00726 emit_byte(0x0F);
00727 emit_byte(0xA5);
00728 emit_byte(0xC0 | src.number() << 3 | dst.number());
00729 }
00730
00731
00732 void Assembler::shll(Register dst, int imm8) {
00733 assert(isShiftCount(imm8), "illegal shift count");
00734 if (imm8 == 1 ) {
00735 emit_byte(0xD1);
00736 emit_byte(0xE0 | dst.number());
00737 } else {
00738 emit_byte(0xC1);
00739 emit_byte(0xE0 | dst.number());
00740 emit_byte(imm8);
00741 }
00742 }
00743
00744
00745 void Assembler::shll(Register dst) {
00746 emit_byte(0xD3);
00747 emit_byte(0xE0 | dst.number());
00748 }
00749
00750
00751 void Assembler::shrdl(Register dst, Register src) {
00752 emit_byte(0x0F);
00753 emit_byte(0xAD);
00754 emit_byte(0xC0 | src.number() << 3 | dst.number());
00755 }
00756
00757
00758 void Assembler::shrl(Register dst, int imm8) {
00759 assert(isShiftCount(imm8), "illegal shift count");
00760 emit_byte(0xC1);
00761 emit_byte(0xE8 | dst.number());
00762 emit_byte(imm8);
00763 }
00764
00765
00766 void Assembler::shrl(Register dst) {
00767 emit_byte(0xD3);
00768 emit_byte(0xE8 | dst.number());
00769 }
00770
00771
00772 void Assembler::subl(Register dst, int imm32) {
00773 emit_arith(0x81, 0xE8, dst, imm32);
00774 }
00775
00776
00777 void Assembler::subl(Register dst, Register src) {
00778 emit_arith(0x2B, 0xC0, dst, src);
00779 }
00780
00781
00782 void Assembler::testb(Register dst, int imm8) {
00783 guarantee(dst.hasByteRegister(), "must have byte register");
00784 emit_arith_b(0xF6, 0xC0, dst, imm8);
00785 }
00786
00787
00788 void Assembler::testl(Register dst, int imm32) {
00789
00790
00791
00792 if (dst.number() == 0) {
00793 emit_byte(0xA9);
00794 } else {
00795 emit_byte(0xF7);
00796 emit_byte(0xC0 | dst.number());
00797 }
00798 emit_long(imm32);
00799 }
00800
00801
00802 void Assembler::testl(Register dst, Register src) {
00803 emit_arith(0x85, 0xC0, dst, src);
00804 }
00805
00806
00807 void Assembler::xorl(Register dst, int imm32) {
00808 emit_arith(0x81, 0xF0, dst, imm32);
00809 }
00810
00811
00812 void Assembler::xorl(Register dst, Register src) {
00813 emit_arith(0x33, 0xC0, dst, src);
00814 }
00815
00816
00817 void Assembler::hlt() {
00818 emit_byte(0xF4);
00819 }
00820
00821
00822 void Assembler::int3() {
00823 if (EnableInt3) emit_byte(0xCC);
00824 }
00825
00826
00827 void Assembler::nop() {
00828 emit_byte(0x90);
00829 }
00830
00831
00832 void Assembler::ret(int imm16) {
00833 if (imm16 == 0) {
00834 emit_byte(0xC3);
00835 } else {
00836 emit_byte(0xC2);
00837 emit_byte(imm16 & 0xFF);
00838 emit_byte((imm16 >> 8) & 0xFF);
00839 }
00840 }
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857 void Assembler::print(Label& L) {
00858 if (L.is_unused()) {
00859 std->print_cr("undefined label");
00860 } else if (L.is_bound()) {
00861 std->print_cr("bound label to %d", L.pos());
00862 } else if (L.is_unbound()) {
00863 Label l = L;
00864 std->print_cr("unbound label");
00865 while (l.is_unbound()) {
00866 Displacement disp = disp_at(l);
00867 std->print("@ %d ", l.pos());
00868 disp.print();
00869 std->cr();
00870 disp.next(l);
00871 }
00872 } else {
00873 std->print_cr("label in inconsistent state (pos = %d)", L._pos);
00874 }
00875 }
00876
00877
00878 void Assembler::bind_to(Label& L, int pos) {
00879 bool tellRobert = false;
00880
00881 assert(0 <= pos && pos <= offset(), "must have a valid binding position");
00882 while (L.is_unbound()) {
00883 Displacement disp = disp_at(L);
00884 int fixup_pos = L.pos();
00885 int imm32 = 0;
00886 switch (disp.type()) {
00887 case Displacement::call:
00888 { assert(byte_at(fixup_pos - 1) == 0xE8, "call expected");
00889 imm32 = pos - (fixup_pos + sizeof(int));
00890 }
00891 break;
00892 case Displacement::absolute_jump:
00893 { assert(byte_at(fixup_pos - 1) == 0xE9, "jmp expected");
00894 imm32 = pos - (fixup_pos + sizeof(int));
00895 if (imm32 == 0 && EliminateJumpsToJumps) tellRobert = true;
00896 }
00897 break;
00898 case Displacement::conditional_jump:
00899 { assert(byte_at(fixup_pos - 2) == 0x0F, "jcc expected");
00900 assert(byte_at(fixup_pos - 1) == (0x80 | disp.info()), "jcc expected");
00901 imm32 = pos - (fixup_pos + sizeof(int));
00902 }
00903 break;
00904 case Displacement::ic_info:
00905 { assert(byte_at(fixup_pos - 1) == 0xA9, "test eax expected");
00906 int offs = pos - (fixup_pos - IC_Info::info_offset);
00907 assert(((offs << IC_Info::number_of_flags) >> IC_Info::number_of_flags) == offs, "NLR offset out of bounds");
00908 imm32 = (offs << IC_Info::number_of_flags) | disp.info();
00909 }
00910 break;
00911 default:
00912 ShouldNotReachHere();
00913 }
00914 long_at_put(fixup_pos, imm32);
00915 disp.next(L);
00916 }
00917 L.bind_to(pos);
00918
00919 if (tellRobert) {
00920
00921 code()->decode();
00922 }
00923 }
00924
00925
00926 void Assembler::link_to(Label& L, Label& appendix) {
00927 if (appendix.is_unbound()) {
00928 if (L.is_unbound()) {
00929
00930 Label p, q = L;
00931 do { p = q; disp_at(q).next(q); } while (q.is_unbound());
00932 Displacement disp = disp_at(p);
00933 disp.link_to(appendix);
00934 disp_at_put(p, disp);
00935 p.unuse();
00936 } else {
00937
00938 L = appendix;
00939 }
00940 }
00941 appendix.unuse();
00942 }
00943
00944
00945 void Assembler::bind(Label& L) {
00946 assert(!L.is_bound(), "label can only be bound once");
00947 if (EliminateJumpsToJumps) {
00948
00949 if (_unbound_label.is_unbound()) {
00950
00951 if (_binding_pos == offset()) {
00952
00953 link_to(L, _unbound_label);
00954 } else {
00955
00956 assert(_binding_pos < offset(), "assembler error");
00957 bind_to(_unbound_label, _binding_pos);
00958 }
00959 }
00960 assert(!_unbound_label.is_unbound(), "assembler error");
00961
00962 while (L.is_unbound() && (L.pos() + int(sizeof(int)) == offset()) && (disp_at(L).type() == Displacement::absolute_jump)) {
00963
00964 const int long_size = 5;
00965 assert(byte_at(offset() - long_size) == 0xE9, "jmp expected");
00966 if (PrintJumpElimination) std->print_cr("@ %d jump to next eliminated", L.pos());
00967
00968 disp_at(L).next(L);
00969
00970 _code_pos -= long_size;
00971 code()->set_code_end(_code_pos);
00972 }
00973
00974 _unbound_label = L;
00975 _binding_pos = offset();
00976 L.unuse();
00977 }
00978 bind_to(L, offset());
00979 }
00980
00981
00982 void Assembler::merge(Label& L, Label& with) {
00983 Unimplemented();
00984 }
00985
00986
00987 void Assembler::call(Label& L) {
00988 if (L.is_bound()) {
00989 const int long_size = 5;
00990 int offs = L.pos() - offset();
00991 assert(offs <= 0, "assembler error");
00992
00993 emit_byte(0xE8);
00994 emit_long(offs - long_size);
00995 } else {
00996
00997 emit_byte(0xE8);
00998 emit_disp(L, Displacement::call, 0);
00999 }
01000 }
01001
01002
01003 void Assembler::call(char* entry, relocInfo::relocType rtype) {
01004 emit_byte(0xE8);
01005 emit_data((int)entry - ((int)_code_pos + sizeof(long)), rtype);
01006 }
01007
01008
01009 void Assembler::call(Register dst) {
01010 emit_byte(0xFF);
01011 emit_byte(0xD0 | dst.number());
01012 }
01013
01014
01015 void Assembler::call(Address adr) {
01016 emit_byte(0xFF);
01017 emit_operand(edx, adr);
01018 }
01019
01020
01021 void Assembler::jmp(char* entry, relocInfo::relocType rtype) {
01022 emit_byte(0xE9);
01023 emit_data((int)entry - ((int)_code_pos + sizeof(long)), rtype);
01024 }
01025
01026
01027 void Assembler::jmp(Register reg) {
01028 emit_byte(0xFF);
01029 emit_byte(0xE0 | reg.number());
01030 }
01031
01032
01033 void Assembler::jmp(Address adr) {
01034 emit_byte(0xFF);
01035 emit_operand(esp, adr);
01036 }
01037
01038
01039 void Assembler::jmp(Label& L) {
01040 if (L.is_bound()) {
01041 const int short_size = 2;
01042 const int long_size = 5;
01043 int offs = L.pos() - offset();
01044 assert(offs <= 0, "assembler error");
01045 if (isByte(offs - short_size)) {
01046
01047 emit_byte(0xEB);
01048 emit_byte((offs - short_size) & 0xFF);
01049 } else {
01050
01051 emit_byte(0xE9);
01052 emit_long(offs - long_size);
01053 }
01054 } else {
01055 if (EliminateJumpsToJumps && _unbound_label.is_unbound() && _binding_pos == offset()) {
01056
01057 if (PrintJumpElimination) {
01058 std->print_cr("eliminated jumps/calls to %d", _binding_pos);
01059 std->print("from ");
01060 print(_unbound_label);
01061 }
01062 link_to(L, _unbound_label);
01063 }
01064
01065 emit_byte(0xE9);
01066 emit_disp(L, Displacement::absolute_jump, 0);
01067 }
01068 }
01069
01070
01071 void Assembler::jcc(Condition cc, Label& L) {
01072 assert((0 <= cc) && (cc < 16), "illegal cc");
01073 if (L.is_bound()) {
01074 const int short_size = 2;
01075 const int long_size = 6;
01076 int offs = L.pos() - offset();
01077 assert(offs <= 0, "assembler error");
01078 if (isByte(offs - short_size)) {
01079
01080 emit_byte(0x70 | cc);
01081 emit_byte((offs - short_size) & 0xFF);
01082 } else {
01083
01084 emit_byte(0x0F);
01085 emit_byte(0x80 | cc);
01086 emit_long(offs - long_size);
01087 }
01088 } else {
01089
01090
01091
01092 emit_byte(0x0F);
01093 emit_byte(0x80 | cc);
01094 emit_disp(L, Displacement::conditional_jump, cc);
01095 }
01096 }
01097
01098
01099 void Assembler::jcc(Condition cc, char* dst, relocInfo::relocType rtype) {
01100 assert((0 <= cc) && (cc < 16), "illegal cc");
01101
01102 emit_byte(0x0F);
01103 emit_byte(0x80 | cc);
01104 emit_data((int)dst - ((int)_code_pos + sizeof(long)), rtype);
01105 }
01106
01107
01108 void Assembler::ic_info(Label& L, int flags) {
01109 assert((unsigned int)flags >> IC_Info::number_of_flags == 0, "too many flags set");
01110 if (L.is_bound()) {
01111 int offs = L.pos() - offset();
01112 assert(offs <= 0, "assembler error");
01113 assert(((offs << IC_Info::number_of_flags) >> IC_Info::number_of_flags) == offs, "NLR offset out of bounds");
01114 emit_byte(0xA9);
01115 emit_long((offs << IC_Info::number_of_flags) | flags);
01116 } else {
01117 emit_byte(0xA9);
01118 emit_disp(L, Displacement::ic_info, flags);
01119 }
01120 }
01121
01122
01123
01124
01125 void Assembler::fld1() {
01126 emit_byte(0xD9);
01127 emit_byte(0xE8);
01128 }
01129
01130
01131 void Assembler::fldz() {
01132 emit_byte(0xD9);
01133 emit_byte(0xEE);
01134 }
01135
01136
01137 void Assembler::fld_s(Address adr) {
01138 emit_byte(0xD9);
01139 emit_operand(eax, adr);
01140 }
01141
01142
01143 void Assembler::fld_d(Address adr) {
01144 emit_byte(0xDD);
01145 emit_operand(eax, adr);
01146 }
01147
01148
01149 void Assembler::fstp_s(Address adr) {
01150 emit_byte(0xD9);
01151 emit_operand(ebx, adr);
01152 }
01153
01154
01155 void Assembler::fstp_d(Address adr) {
01156 emit_byte(0xDD);
01157 emit_operand(ebx, adr);
01158 }
01159
01160
01161 void Assembler::fild_s(Address adr) {
01162 emit_byte(0xDB);
01163 emit_operand(eax, adr);
01164 }
01165
01166
01167 void Assembler::fild_d(Address adr) {
01168 emit_byte(0xDF);
01169 emit_operand(ebp, adr);
01170 }
01171
01172
01173 void Assembler::fistp_s(Address adr) {
01174 emit_byte(0xDB);
01175 emit_operand(ebx, adr);
01176 }
01177
01178
01179 void Assembler::fistp_d(Address adr) {
01180 emit_byte(0xDF);
01181 emit_operand(edi, adr);
01182 }
01183
01184
01185 void Assembler::fabs() {
01186 emit_byte(0xD9);
01187 emit_byte(0xE1);
01188 }
01189
01190
01191 void Assembler::fchs() {
01192 emit_byte(0xD9);
01193 emit_byte(0xE0);
01194 }
01195
01196
01197 void Assembler::fadd(int i) {
01198 emit_farith(0xDC, 0xC0, i);
01199 }
01200
01201
01202 void Assembler::fsub(int i) {
01203 emit_farith(0xDC, 0xE8, i);
01204 }
01205
01206
01207 void Assembler::fmul(int i) {
01208 emit_farith(0xDC, 0xC8, i);
01209 }
01210
01211
01212 void Assembler::fdiv(int i) {
01213 emit_farith(0xDC, 0xF8, i);
01214 }
01215
01216
01217 void Assembler::faddp(int i) {
01218 emit_farith(0xDE, 0xC0, i);
01219 }
01220
01221
01222 void Assembler::fsubp(int i) {
01223 emit_farith(0xDE, 0xE8, i);
01224 }
01225
01226
01227 void Assembler::fsubrp(int i) {
01228 emit_farith(0xDE, 0xE0, i);
01229 }
01230
01231
01232 void Assembler::fmulp(int i) {
01233 emit_farith(0xDE, 0xC8, i);
01234 }
01235
01236
01237 void Assembler::fdivp(int i) {
01238 emit_farith(0xDE, 0xF8, i);
01239 }
01240
01241
01242
01243 void Assembler::fprem() {
01244 emit_byte(0xD9);
01245 emit_byte(0xF8);
01246 }
01247
01248
01249 void Assembler::fprem1() {
01250 emit_byte(0xD9);
01251 emit_byte(0xF5);
01252 }
01253
01254
01255 void Assembler::fxch(int i) {
01256 emit_farith(0xD9, 0xC8, i);
01257 }
01258
01259
01260 void Assembler::fincstp() {
01261 emit_byte(0xD9);
01262 emit_byte(0xF7);
01263 }
01264
01265
01266 void Assembler::ffree(int i) {
01267 emit_farith(0xDD, 0xC0, i);
01268 }
01269
01270
01271 void Assembler::ftst() {
01272 emit_byte(0xD9);
01273 emit_byte(0xE4);
01274 }
01275
01276
01277 void Assembler::fcompp() {
01278 emit_byte(0xDE);
01279 emit_byte(0xD9);
01280 }
01281
01282
01283 void Assembler::fnstsw_ax() {
01284 emit_byte(0xdF);
01285 emit_byte(0xE0);
01286 }
01287
01288
01289 void Assembler::fwait() {
01290 emit_byte(0x9B);
01291 }
01292
01293
01294
01295
01296 void MacroAssembler::align(int modulus) {
01297 while (offset() % modulus != 0) nop();
01298 }
01299
01300
01301 void MacroAssembler::test(Register dst, int imm8) {
01302 if (!CodeForP6 && dst.hasByteRegister()) {
01303 testb(dst, imm8);
01304 } else {
01305 testl(dst, imm8);
01306 }
01307 }
01308
01309
01310 void MacroAssembler::enter() {
01311 pushl(ebp);
01312 movl(ebp, esp);
01313 }
01314
01315
01316 void MacroAssembler::leave() {
01317 movl(esp, ebp);
01318 popl(ebp);
01319 }
01320
01321
01322
01323
01324 void MacroAssembler::inline_oop(oop o) {
01325 emit_byte(0xA9);
01326 emit_data((int)o, relocInfo::oop_type);
01327 }
01328
01329
01330
01331
01332
01333
01334
01335
01336 void MacroAssembler::set_last_Delta_frame_before_call() {
01337 movl(Address((int)&last_Delta_fp, relocInfo::external_word_type), ebp);
01338 movl(Address((int)&last_Delta_sp, relocInfo::external_word_type), esp);
01339 }
01340
01341
01342 void MacroAssembler::set_last_Delta_frame_after_call() {
01343 addl(esp, oopSize);
01344 set_last_Delta_frame_before_call();
01345 subl(esp, oopSize);
01346 }
01347
01348
01349 void MacroAssembler::reset_last_Delta_frame() {
01350 movl(Address((int)&last_Delta_fp, relocInfo::external_word_type), 0);
01351 }
01352
01353
01354 void MacroAssembler::call_C(Label& L) {
01355 set_last_Delta_frame_before_call();
01356 call(L);
01357 reset_last_Delta_frame();
01358 }
01359
01360
01361 void MacroAssembler::call_C(Label& L, Label& nlrTestPoint) {
01362 set_last_Delta_frame_before_call();
01363 call(L);
01364 Assembler::ic_info(nlrTestPoint, 0);
01365 reset_last_Delta_frame();
01366 }
01367
01368
01369 void MacroAssembler::call_C(char* entry, relocInfo::relocType rtype) {
01370 set_last_Delta_frame_before_call();
01371 call(entry, rtype);
01372 reset_last_Delta_frame();
01373 }
01374
01375
01376 void MacroAssembler::call_C(char* entry, relocInfo::relocType rtype, Label& nlrTestPoint) {
01377 set_last_Delta_frame_before_call();
01378 call(entry, rtype);
01379 Assembler::ic_info(nlrTestPoint, 0);
01380 reset_last_Delta_frame();
01381 }
01382
01383
01384 void MacroAssembler::call_C(Register entry) {
01385 set_last_Delta_frame_before_call();
01386 call(entry);
01387 reset_last_Delta_frame();
01388 }
01389
01390
01391 void MacroAssembler::call_C(Register entry, Label& nlrTestPoint) {
01392 set_last_Delta_frame_before_call();
01393 call(entry);
01394 Assembler::ic_info(nlrTestPoint, 0);
01395 reset_last_Delta_frame();
01396 }
01397
01398
01399
01400
01401
01402
01403
01404
01405
01406
01407
01408
01409
01410
01411
01412
01413
01414
01415
01416
01417
01418
01419 void MacroAssembler::call_C(char* entry, Register arg1) {
01420 Label L1, L2;
01421 jmp(L1);
01422
01423 bind(L2);
01424 pushl(arg1);
01425 call(entry, relocInfo::runtime_call_type);
01426 addl(esp, 1*oopSize);
01427 ret(0);
01428
01429 bind(L1);
01430 call_C(L2);
01431 }
01432
01433
01434 void MacroAssembler::call_C(char* entry, Register arg1, Register arg2) {
01435 Label L1, L2;
01436 jmp(L1);
01437
01438 bind(L2);
01439 pushl(arg2);
01440 pushl(arg1);
01441 call(entry, relocInfo::runtime_call_type);
01442 addl(esp, 2*oopSize);
01443 ret(0);
01444
01445 bind(L1);
01446 call_C(L2);
01447 }
01448
01449
01450 void MacroAssembler::call_C(char* entry, Register arg1, Register arg2, Register arg3) {
01451 Label L1, L2;
01452 jmp(L1);
01453
01454 bind(L2);
01455 pushl(arg3);
01456 pushl(arg2);
01457 pushl(arg1);
01458 call(entry, relocInfo::runtime_call_type);
01459 addl(esp, 3*oopSize);
01460 ret(0);
01461
01462 bind(L1);
01463 call_C(L2);
01464 }
01465
01466
01467 void MacroAssembler::call_C(char* entry, Register arg1, Register arg2, Register arg3, Register arg4) {
01468 Label L1, L2;
01469 jmp(L1);
01470
01471 bind(L2);
01472 pushl(arg4);
01473 pushl(arg3);
01474 pushl(arg2);
01475 pushl(arg1);
01476 call(entry, relocInfo::runtime_call_type);
01477 addl(esp, 4*oopSize);
01478 ret(0);
01479
01480 bind(L1);
01481 call_C(L2);
01482 }
01483
01484
01485 void MacroAssembler::store_check(Register obj, Register tmp) {
01486
01487
01488
01489
01490
01491 assert(obj != tmp, "registers must be different");
01492 movl(tmp, Address((int)&byte_map_base, relocInfo::external_word_type));
01493 shrl(obj, card_shift);
01494 movb(Address(tmp, obj, Address::times_1), 0);
01495 }
01496
01497
01498 void MacroAssembler::fpu_mask_and_cond_for(Condition cc, int& mask, Condition& cond) {
01499 switch (cc) {
01500 case equal : mask = 0x4000; cond = notZero; break;
01501 case notEqual : mask = 0x4000; cond = zero; break;
01502 case less : mask = 0x0100; cond = notZero; break;
01503 case lessEqual : mask = 0x4500; cond = notZero; break;
01504 case greater : mask = 0x4500; cond = zero; break;
01505 case greaterEqual : mask = 0x0100; cond = zero; break;
01506 default : Unimplemented();
01507 };
01508 }
01509
01510
01511 void MacroAssembler::fpop() {
01512 ffree();
01513 fincstp();
01514 }
01515
01516
01517
01518
01519 void MacroAssembler::print_reg(char* name, oop obj) {
01520 std->print("%s = ", name);
01521 if (obj == NULL) {
01522 std->print_cr("NULL");
01523 } else if (obj->is_smi()) {
01524 std->print_cr("smi (%d)", smiOop(obj)->value());
01525 } else if (obj->is_mem() && Universe::is_heap((oop*)obj)) {
01526
01527 if (obj == Universe::nilObj()) {
01528 std->print_cr("nil (0x%08x)", obj);
01529 } else if (obj == Universe::trueObj()) {
01530 std->print_cr("true (0x%08x)", obj);
01531 } else if (obj == Universe::falseObj()) {
01532 std->print_cr("false (0x%08x)", obj);
01533 } else {
01534 std->print_cr("memOop (0x%08x)", obj);
01535 }
01536 } else {
01537 std->print_cr("0x%08x", obj);
01538 }
01539 }
01540
01541
01542 void MacroAssembler::inspector(oop edi, oop esi, oop ebp, oop esp, oop ebx, oop edx, oop ecx, oop eax, char* eip) {
01543 char* title = (char*)(nativeTest_at(eip)->data());
01544 if (title != NULL) std->print_cr("%s", title);
01545 print_reg("eax", eax);
01546 print_reg("ebx", ebx);
01547 print_reg("ecx", ecx);
01548 print_reg("edx", edx);
01549 print_reg("edi", edi);
01550 print_reg("esi", esi);
01551 std->print_cr("ebp = 0x%08x", ebp);
01552 std->print_cr("esp = 0x%08x", esp);
01553 std->cr();
01554 }
01555
01556
01557 void MacroAssembler::inspect(char* title) {
01558 char* entry = StubRoutines::call_inspector_entry();
01559 if (entry != NULL) {
01560 call(entry, relocInfo::runtime_call_type);
01561 testl(eax, int(title));
01562 } else {
01563 char* s = (title == NULL) ? "" : title;
01564 std->print_cr("cannot call inspector for \"%s\" - no entry point yet", s);
01565 }
01566 }