1 /* 2 * Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #ifndef CPU_ARM_MACROASSEMBLER_ARM_HPP 26 #define CPU_ARM_MACROASSEMBLER_ARM_HPP 27 28 #include "code/relocInfo.hpp" 29 #include "code/relocInfo_ext.hpp" 30 31 class BiasedLockingCounters; 32 33 // Introduced AddressLiteral and its subclasses to ease portability from 34 // x86 and avoid relocation issues 35 class AddressLiteral { 36 RelocationHolder _rspec; 37 // Typically we use AddressLiterals we want to use their rval 38 // However in some situations we want the lval (effect address) of the item. 39 // We provide a special factory for making those lvals. 40 bool _is_lval; 41 42 address _target; 43 44 private: 45 static relocInfo::relocType reloc_for_target(address target) { 46 // Used for ExternalAddress or when the type is not specified 47 // Sometimes ExternalAddress is used for values which aren't 48 // exactly addresses, like the card table base. 49 // external_word_type can't be used for values in the first page 50 // so just skip the reloc in that case. 51 return external_word_Relocation::can_be_relocated(target) ? relocInfo::external_word_type : relocInfo::none; 52 } 53 54 void set_rspec(relocInfo::relocType rtype); 55 56 protected: 57 // creation 58 AddressLiteral() 59 : _is_lval(false), 60 _target(NULL) 61 {} 62 63 public: 64 65 AddressLiteral(address target, relocInfo::relocType rtype) { 66 _is_lval = false; 67 _target = target; 68 set_rspec(rtype); 69 } 70 71 AddressLiteral(address target, RelocationHolder const& rspec) 72 : _rspec(rspec), 73 _is_lval(false), 74 _target(target) 75 {} 76 77 AddressLiteral(address target) { 78 _is_lval = false; 79 _target = target; 80 set_rspec(reloc_for_target(target)); 81 } 82 83 AddressLiteral addr() { 84 AddressLiteral ret = *this; 85 ret._is_lval = true; 86 return ret; 87 } 88 89 private: 90 91 address target() { return _target; } 92 bool is_lval() { return _is_lval; } 93 94 relocInfo::relocType reloc() const { return _rspec.type(); } 95 const RelocationHolder& rspec() const { return _rspec; } 96 97 friend class Assembler; 98 friend class MacroAssembler; 99 friend class Address; 100 friend class LIR_Assembler; 101 friend class InlinedAddress; 102 }; 103 104 class ExternalAddress: public AddressLiteral { 105 106 public: 107 108 ExternalAddress(address target) : AddressLiteral(target) {} 109 110 }; 111 112 class InternalAddress: public AddressLiteral { 113 114 public: 115 116 InternalAddress(address target) : AddressLiteral(target, relocInfo::internal_word_type) {} 117 118 }; 119 120 // Inlined constants, for use with ldr_literal / bind_literal 121 // Note: InlinedInteger not supported (use move_slow(Register,int[,cond])) 122 class InlinedLiteral: StackObj { 123 public: 124 Label label; // need to be public for direct access with & 125 InlinedLiteral() { 126 } 127 }; 128 129 class InlinedMetadata: public InlinedLiteral { 130 private: 131 Metadata *_data; 132 133 public: 134 InlinedMetadata(Metadata *data): InlinedLiteral() { 135 _data = data; 136 } 137 Metadata *data() { return _data; } 138 }; 139 140 // Currently unused 141 // class InlinedOop: public InlinedLiteral { 142 // private: 143 // jobject _jobject; 144 // 145 // public: 146 // InlinedOop(jobject target): InlinedLiteral() { 147 // _jobject = target; 148 // } 149 // jobject jobject() { return _jobject; } 150 // }; 151 152 class InlinedAddress: public InlinedLiteral { 153 private: 154 AddressLiteral _literal; 155 156 public: 157 158 InlinedAddress(jobject object): InlinedLiteral(), _literal((address)object, relocInfo::oop_type) { 159 ShouldNotReachHere(); // use mov_oop (or implement InlinedOop) 160 } 161 162 InlinedAddress(Metadata *data): InlinedLiteral(), _literal((address)data, relocInfo::metadata_type) { 163 ShouldNotReachHere(); // use InlinedMetadata or mov_metadata 164 } 165 166 InlinedAddress(address target, const RelocationHolder &rspec): InlinedLiteral(), _literal(target, rspec) { 167 assert(rspec.type() != relocInfo::oop_type, "Do not use InlinedAddress for oops"); 168 assert(rspec.type() != relocInfo::metadata_type, "Do not use InlinedAddress for metadatas"); 169 } 170 171 InlinedAddress(address target, relocInfo::relocType rtype): InlinedLiteral(), _literal(target, rtype) { 172 assert(rtype != relocInfo::oop_type, "Do not use InlinedAddress for oops"); 173 assert(rtype != relocInfo::metadata_type, "Do not use InlinedAddress for metadatas"); 174 } 175 176 // Note: default is relocInfo::none for InlinedAddress 177 InlinedAddress(address target): InlinedLiteral(), _literal(target, relocInfo::none) { 178 } 179 180 address target() { return _literal.target(); } 181 182 const RelocationHolder& rspec() const { return _literal.rspec(); } 183 }; 184 185 class InlinedString: public InlinedLiteral { 186 private: 187 const char* _msg; 188 189 public: 190 InlinedString(const char* msg): InlinedLiteral() { 191 _msg = msg; 192 } 193 const char* msg() { return _msg; } 194 }; 195 196 class MacroAssembler: public Assembler { 197 protected: 198 199 // Support for VM calls 200 // 201 202 // This is the base routine called by the different versions of call_VM_leaf. 203 void call_VM_leaf_helper(address entry_point, int number_of_arguments); 204 205 // This is the base routine called by the different versions of call_VM. The interpreter 206 // may customize this version by overriding it for its purposes (e.g., to save/restore 207 // additional registers when doing a VM call). 208 virtual void call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions); 209 public: 210 211 MacroAssembler(CodeBuffer* code) : Assembler(code) {} 212 213 // These routines should emit JVMTI PopFrame and ForceEarlyReturn handling code. 214 // The implementation is only non-empty for the InterpreterMacroAssembler, 215 // as only the interpreter handles PopFrame and ForceEarlyReturn requests. 216 virtual void check_and_handle_popframe() {} 217 virtual void check_and_handle_earlyret() {} 218 219 // By default, we do not need relocation information for non 220 // patchable absolute addresses. However, when needed by some 221 // extensions, ignore_non_patchable_relocations can be modified, 222 // returning false to preserve all relocation information. 223 inline bool ignore_non_patchable_relocations() { return true; } 224 225 // Initially added to the Assembler interface as a pure virtual: 226 // RegisterConstant delayed_value(..) 227 // for: 228 // 6812678 macro assembler needs delayed binding of a few constants (for 6655638) 229 // this was subsequently modified to its present name and return type 230 virtual RegisterOrConstant delayed_value_impl(intptr_t* delayed_value_addr, Register tmp, int offset); 231 232 233 void align(int modulus); 234 235 // Support for VM calls 236 // 237 // It is imperative that all calls into the VM are handled via the call_VM methods. 238 // They make sure that the stack linkage is setup correctly. call_VM's correspond 239 // to ENTRY/ENTRY_X entry points while call_VM_leaf's correspond to LEAF entry points. 240 241 void call_VM(Register oop_result, address entry_point, bool check_exceptions = true); 242 void call_VM(Register oop_result, address entry_point, Register arg_1, bool check_exceptions = true); 243 void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, bool check_exceptions = true); 244 void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, Register arg_3, bool check_exceptions = true); 245 246 // The following methods are required by templateTable.cpp, 247 // but not used on ARM. 248 void call_VM(Register oop_result, Register last_java_sp, address entry_point, int number_of_arguments = 0, bool check_exceptions = true); 249 void call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, bool check_exceptions = true); 250 void call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2, bool check_exceptions = true); 251 void call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2, Register arg_3, bool check_exceptions = true); 252 253 // Note: The super_call_VM calls are not used on ARM 254 255 // Raw call, without saving/restoring registers, exception handling, etc. 256 // Mainly used from various stubs. 257 // Note: if 'save_R9_if_scratched' is true, call_VM may on some 258 // platforms save values on the stack. Set it to false (and handle 259 // R9 in the callers) if the top of the stack must not be modified 260 // by call_VM. 261 void call_VM(address entry_point, bool save_R9_if_scratched); 262 263 void call_VM_leaf(address entry_point); 264 void call_VM_leaf(address entry_point, Register arg_1); 265 void call_VM_leaf(address entry_point, Register arg_1, Register arg_2); 266 void call_VM_leaf(address entry_point, Register arg_1, Register arg_2, Register arg_3); 267 void call_VM_leaf(address entry_point, Register arg_1, Register arg_2, Register arg_3, Register arg_4); 268 269 void get_vm_result(Register oop_result, Register tmp); 270 void get_vm_result_2(Register metadata_result, Register tmp); 271 272 // Always sets/resets sp, which default to SP if (last_sp == noreg) 273 // Optionally sets/resets fp (use noreg to avoid setting it) 274 // Optionally sets/resets pc depending on save_last_java_pc flag 275 // Note: when saving PC, set_last_Java_frame returns PC's offset in the code section 276 // (for oop_maps offset computation) 277 int set_last_Java_frame(Register last_sp, Register last_fp, bool save_last_java_pc, Register tmp); 278 void reset_last_Java_frame(Register tmp); 279 // status set in set_last_Java_frame for reset_last_Java_frame 280 bool _fp_saved; 281 bool _pc_saved; 282 283 #ifdef PRODUCT 284 #define BLOCK_COMMENT(str) /* nothing */ 285 #define STOP(error) __ stop(error) 286 #else 287 #define BLOCK_COMMENT(str) __ block_comment(str) 288 #define STOP(error) __ block_comment(error); __ stop(error) 289 #endif 290 291 void lookup_virtual_method(Register recv_klass, 292 Register vtable_index, 293 Register method_result); 294 295 // Test sub_klass against super_klass, with fast and slow paths. 296 297 // The fast path produces a tri-state answer: yes / no / maybe-slow. 298 // One of the three labels can be NULL, meaning take the fall-through. 299 // No registers are killed, except temp_regs. 300 void check_klass_subtype_fast_path(Register sub_klass, 301 Register super_klass, 302 Register temp_reg, 303 Register temp_reg2, 304 Label* L_success, 305 Label* L_failure, 306 Label* L_slow_path); 307 308 // The rest of the type check; must be wired to a corresponding fast path. 309 // It does not repeat the fast path logic, so don't use it standalone. 310 // temp_reg3 can be noreg, if no temps are available. 311 // Updates the sub's secondary super cache as necessary. 312 // If set_cond_codes: 313 // - condition codes will be Z on success, NZ on failure. 314 // - temp_reg will be 0 on success, non-0 on failure 315 void check_klass_subtype_slow_path(Register sub_klass, 316 Register super_klass, 317 Register temp_reg, 318 Register temp_reg2, 319 Register temp_reg3, // auto assigned if noreg 320 Label* L_success, 321 Label* L_failure, 322 bool set_cond_codes = false); 323 324 // Simplified, combined version, good for typical uses. 325 // temp_reg3 can be noreg, if no temps are available. It is used only on slow path. 326 // Falls through on failure. 327 void check_klass_subtype(Register sub_klass, 328 Register super_klass, 329 Register temp_reg, 330 Register temp_reg2, 331 Register temp_reg3, // auto assigned on slow path if noreg 332 Label& L_success); 333 334 // Returns address of receiver parameter, using tmp as base register. tmp and params_count can be the same. 335 Address receiver_argument_address(Register params_base, Register params_count, Register tmp); 336 337 void _verify_oop(Register reg, const char* s, const char* file, int line); 338 void _verify_oop_addr(Address addr, const char * s, const char* file, int line); 339 340 // TODO: verify method and klass metadata (compare against vptr?) 341 void _verify_method_ptr(Register reg, const char * msg, const char * file, int line) {} 342 void _verify_klass_ptr(Register reg, const char * msg, const char * file, int line) {} 343 344 #define verify_oop(reg) _verify_oop(reg, "broken oop " #reg, __FILE__, __LINE__) 345 #define verify_oop_addr(addr) _verify_oop_addr(addr, "broken oop ", __FILE__, __LINE__) 346 #define verify_method_ptr(reg) _verify_method_ptr(reg, "broken method " #reg, __FILE__, __LINE__) 347 #define verify_klass_ptr(reg) _verify_klass_ptr(reg, "broken klass " #reg, __FILE__, __LINE__) 348 349 void null_check(Register reg, Register tmp, int offset = -1); 350 inline void null_check(Register reg) { null_check(reg, noreg, -1); } // for C1 lir_null_check 351 352 // Puts address of allocated object into register `obj` and end of allocated object into register `obj_end`. 353 void eden_allocate(Register obj, Register obj_end, Register tmp1, Register tmp2, 354 RegisterOrConstant size_expression, Label& slow_case); 355 void tlab_allocate(Register obj, Register obj_end, Register tmp1, 356 RegisterOrConstant size_expression, Label& slow_case); 357 358 void zero_memory(Register start, Register end, Register tmp); 359 360 static bool needs_explicit_null_check(intptr_t offset); 361 static bool uses_implicit_null_check(void* address); 362 363 void arm_stack_overflow_check(int frame_size_in_bytes, Register tmp); 364 void arm_stack_overflow_check(Register Rsize, Register tmp); 365 366 void bang_stack_with_offset(int offset) { 367 ShouldNotReachHere(); 368 } 369 370 // Biased locking support 371 // lock_reg and obj_reg must be loaded up with the appropriate values. 372 // swap_reg must be supplied. 373 // tmp_reg must be supplied. 374 // Done label is branched to with condition code EQ set if the lock is 375 // biased and we acquired it. Slow case label is branched to with 376 // condition code NE set if the lock is biased but we failed to acquire 377 // it. Otherwise fall through. 378 // Returns offset of first potentially-faulting instruction for null 379 // check info (currently consumed only by C1). If 380 // swap_reg_contains_mark is true then returns -1 as it is assumed 381 // the calling code has already passed any potential faults. 382 // Notes: 383 // - swap_reg and tmp_reg are scratched 384 // - Rtemp was (implicitly) scratched and can now be specified as the tmp2 385 int biased_locking_enter(Register obj_reg, Register swap_reg, Register tmp_reg, 386 bool swap_reg_contains_mark, 387 Register tmp2, 388 Label& done, Label& slow_case, 389 BiasedLockingCounters* counters = NULL); 390 void biased_locking_exit(Register obj_reg, Register temp_reg, Label& done); 391 392 // Building block for CAS cases of biased locking: makes CAS and records statistics. 393 // Optional slow_case label is used to transfer control if CAS fails. Otherwise leaves condition codes set. 394 void biased_locking_enter_with_cas(Register obj_reg, Register old_mark_reg, Register new_mark_reg, 395 Register tmp, Label& slow_case, int* counter_addr); 396 397 void resolve_jobject(Register value, Register tmp1, Register tmp2); 398 399 void nop() { 400 mov(R0, R0); 401 } 402 403 void push(Register rd, AsmCondition cond = al) { 404 assert(rd != SP, "unpredictable instruction"); 405 str(rd, Address(SP, -wordSize, pre_indexed), cond); 406 } 407 408 void push(RegisterSet reg_set, AsmCondition cond = al) { 409 assert(!reg_set.contains(SP), "unpredictable instruction"); 410 stmdb(SP, reg_set, writeback, cond); 411 } 412 413 void pop(Register rd, AsmCondition cond = al) { 414 assert(rd != SP, "unpredictable instruction"); 415 ldr(rd, Address(SP, wordSize, post_indexed), cond); 416 } 417 418 void pop(RegisterSet reg_set, AsmCondition cond = al) { 419 assert(!reg_set.contains(SP), "unpredictable instruction"); 420 ldmia(SP, reg_set, writeback, cond); 421 } 422 423 void fpushd(FloatRegister fd, AsmCondition cond = al) { 424 fstmdbd(SP, FloatRegisterSet(fd), writeback, cond); 425 } 426 427 void fpushs(FloatRegister fd, AsmCondition cond = al) { 428 fstmdbs(SP, FloatRegisterSet(fd), writeback, cond); 429 } 430 431 void fpopd(FloatRegister fd, AsmCondition cond = al) { 432 fldmiad(SP, FloatRegisterSet(fd), writeback, cond); 433 } 434 435 void fpops(FloatRegister fd, AsmCondition cond = al) { 436 fldmias(SP, FloatRegisterSet(fd), writeback, cond); 437 } 438 439 // Order access primitives 440 enum Membar_mask_bits { 441 StoreStore = 1 << 3, 442 LoadStore = 1 << 2, 443 StoreLoad = 1 << 1, 444 LoadLoad = 1 << 0 445 }; 446 447 void membar(Membar_mask_bits mask, 448 Register tmp, 449 bool preserve_flags = true, 450 Register load_tgt = noreg); 451 452 void breakpoint(AsmCondition cond = al); 453 void stop(const char* msg); 454 // prints msg and continues 455 void warn(const char* msg); 456 void unimplemented(const char* what = ""); 457 void should_not_reach_here() { stop("should not reach here"); } 458 static void debug(const char* msg, const intx* registers); 459 460 // Create a walkable frame to help tracking down who called this code. 461 // Returns the frame size in words. 462 int should_not_call_this() { 463 raw_push(FP, LR); 464 should_not_reach_here(); 465 flush(); 466 return 2; // frame_size_in_words (FP+LR) 467 } 468 469 int save_all_registers(); 470 void restore_all_registers(); 471 int save_caller_save_registers(); 472 void restore_caller_save_registers(); 473 474 void add_rc(Register dst, Register arg1, RegisterOrConstant arg2); 475 476 // add_slow and mov_slow are used to manipulate offsets larger than 1024, 477 // these functions are not expected to handle all possible constants, 478 // only those that can really occur during compilation 479 void add_slow(Register rd, Register rn, int c); 480 void sub_slow(Register rd, Register rn, int c); 481 482 483 void mov_slow(Register rd, intptr_t c, AsmCondition cond = al); 484 void mov_slow(Register rd, const char *string); 485 void mov_slow(Register rd, address addr); 486 487 void patchable_mov_oop(Register rd, jobject o, int oop_index) { 488 mov_oop(rd, o, oop_index); 489 } 490 void mov_oop(Register rd, jobject o, int index = 0, AsmCondition cond = al); 491 492 void patchable_mov_metadata(Register rd, Metadata* o, int index) { 493 mov_metadata(rd, o, index); 494 } 495 void mov_metadata(Register rd, Metadata* o, int index = 0); 496 497 void mov_float(FloatRegister fd, jfloat c, AsmCondition cond = al); 498 void mov_double(FloatRegister fd, jdouble c, AsmCondition cond = al); 499 500 501 // Note: this variant of mov_address assumes the address moves with 502 // the code. Do *not* implement it with non-relocated instructions, 503 // unless PC-relative. 504 void mov_relative_address(Register rd, address addr, AsmCondition cond = al) { 505 int offset = addr - pc() - 8; 506 assert((offset & 3) == 0, "bad alignment"); 507 if (offset >= 0) { 508 assert(AsmOperand::is_rotated_imm(offset), "addr too far"); 509 add(rd, PC, offset, cond); 510 } else { 511 assert(AsmOperand::is_rotated_imm(-offset), "addr too far"); 512 sub(rd, PC, -offset, cond); 513 } 514 } 515 516 // Runtime address that may vary from one execution to another. The 517 // symbolic_reference describes what the address is, allowing 518 // the address to be resolved in a different execution context. 519 // Warning: do not implement as a PC relative address. 520 void mov_address(Register rd, address addr, symbolic_Relocation::symbolic_reference t) { 521 mov_address(rd, addr, RelocationHolder::none); 522 } 523 524 // rspec can be RelocationHolder::none (for ignored symbolic_Relocation). 525 // In that case, the address is absolute and the generated code need 526 // not be relocable. 527 void mov_address(Register rd, address addr, RelocationHolder const& rspec) { 528 assert(rspec.type() != relocInfo::runtime_call_type, "do not use mov_address for runtime calls"); 529 assert(rspec.type() != relocInfo::static_call_type, "do not use mov_address for relocable calls"); 530 if (rspec.type() == relocInfo::none) { 531 // absolute address, relocation not needed 532 mov_slow(rd, (intptr_t)addr); 533 return; 534 } 535 if (VM_Version::supports_movw()) { 536 relocate(rspec); 537 int c = (int)addr; 538 movw(rd, c & 0xffff); 539 if ((unsigned int)c >> 16) { 540 movt(rd, (unsigned int)c >> 16); 541 } 542 return; 543 } 544 Label skip_literal; 545 InlinedAddress addr_literal(addr, rspec); 546 ldr_literal(rd, addr_literal); 547 b(skip_literal); 548 bind_literal(addr_literal); 549 bind(skip_literal); 550 } 551 552 // Note: Do not define mov_address for a Label 553 // 554 // Load from addresses potentially within the code are now handled 555 // InlinedLiteral subclasses (to allow more flexibility on how the 556 // ldr_literal is performed). 557 558 void ldr_literal(Register rd, InlinedAddress& L) { 559 assert(L.rspec().type() != relocInfo::runtime_call_type, "avoid ldr_literal for calls"); 560 assert(L.rspec().type() != relocInfo::static_call_type, "avoid ldr_literal for calls"); 561 relocate(L.rspec()); 562 ldr(rd, Address(PC, target(L.label) - pc() - 8)); 563 } 564 565 void ldr_literal(Register rd, InlinedString& L) { 566 const char* msg = L.msg(); 567 if (code()->consts()->contains((address)msg)) { 568 // string address moves with the code 569 ldr(rd, Address(PC, ((address)msg) - pc() - 8)); 570 return; 571 } 572 // Warning: use external strings with care. They are not relocated 573 // if the code moves. If needed, use code_string to move them 574 // to the consts section. 575 ldr(rd, Address(PC, target(L.label) - pc() - 8)); 576 } 577 578 void ldr_literal(Register rd, InlinedMetadata& L) { 579 // relocation done in the bind_literal for metadatas 580 ldr(rd, Address(PC, target(L.label) - pc() - 8)); 581 } 582 583 void bind_literal(InlinedAddress& L) { 584 bind(L.label); 585 assert(L.rspec().type() != relocInfo::metadata_type, "Must use InlinedMetadata"); 586 // We currently do not use oop 'bound' literals. 587 // If the code evolves and the following assert is triggered, 588 // we need to implement InlinedOop (see InlinedMetadata). 589 assert(L.rspec().type() != relocInfo::oop_type, "Inlined oops not supported"); 590 // Note: relocation is handled by relocate calls in ldr_literal 591 AbstractAssembler::emit_address((address)L.target()); 592 } 593 594 void bind_literal(InlinedString& L) { 595 const char* msg = L.msg(); 596 if (code()->consts()->contains((address)msg)) { 597 // The Label should not be used; avoid binding it 598 // to detect errors. 599 return; 600 } 601 bind(L.label); 602 AbstractAssembler::emit_address((address)L.msg()); 603 } 604 605 void bind_literal(InlinedMetadata& L) { 606 bind(L.label); 607 relocate(metadata_Relocation::spec_for_immediate()); 608 AbstractAssembler::emit_address((address)L.data()); 609 } 610 611 void resolve_oop_handle(Register result); 612 void load_mirror(Register mirror, Register method, Register tmp); 613 614 #define ARM_INSTR_1(common_mnemonic, arm32_mnemonic, arg_type) \ 615 void common_mnemonic(arg_type arg) { \ 616 arm32_mnemonic(arg); \ 617 } 618 619 #define ARM_INSTR_2(common_mnemonic, arm32_mnemonic, arg1_type, arg2_type) \ 620 void common_mnemonic(arg1_type arg1, arg2_type arg2) { \ 621 arm32_mnemonic(arg1, arg2); \ 622 } 623 624 #define ARM_INSTR_3(common_mnemonic, arm32_mnemonic, arg1_type, arg2_type, arg3_type) \ 625 void common_mnemonic(arg1_type arg1, arg2_type arg2, arg3_type arg3) { \ 626 arm32_mnemonic(arg1, arg2, arg3); \ 627 } 628 629 ARM_INSTR_1(jump, bx, Register) 630 ARM_INSTR_1(call, blx, Register) 631 632 ARM_INSTR_2(cbz_32, cbz, Register, Label&) 633 ARM_INSTR_2(cbnz_32, cbnz, Register, Label&) 634 635 ARM_INSTR_2(ldr_u32, ldr, Register, Address) 636 ARM_INSTR_2(ldr_s32, ldr, Register, Address) 637 ARM_INSTR_2(str_32, str, Register, Address) 638 639 ARM_INSTR_2(mvn_32, mvn, Register, Register) 640 ARM_INSTR_2(cmp_32, cmp, Register, Register) 641 ARM_INSTR_2(neg_32, neg, Register, Register) 642 ARM_INSTR_2(clz_32, clz, Register, Register) 643 ARM_INSTR_2(rbit_32, rbit, Register, Register) 644 645 ARM_INSTR_2(cmp_32, cmp, Register, int) 646 ARM_INSTR_2(cmn_32, cmn, Register, int) 647 648 ARM_INSTR_3(add_32, add, Register, Register, Register) 649 ARM_INSTR_3(sub_32, sub, Register, Register, Register) 650 ARM_INSTR_3(subs_32, subs, Register, Register, Register) 651 ARM_INSTR_3(mul_32, mul, Register, Register, Register) 652 ARM_INSTR_3(and_32, andr, Register, Register, Register) 653 ARM_INSTR_3(orr_32, orr, Register, Register, Register) 654 ARM_INSTR_3(eor_32, eor, Register, Register, Register) 655 656 ARM_INSTR_3(add_32, add, Register, Register, AsmOperand) 657 ARM_INSTR_3(sub_32, sub, Register, Register, AsmOperand) 658 ARM_INSTR_3(orr_32, orr, Register, Register, AsmOperand) 659 ARM_INSTR_3(eor_32, eor, Register, Register, AsmOperand) 660 ARM_INSTR_3(and_32, andr, Register, Register, AsmOperand) 661 662 663 ARM_INSTR_3(add_32, add, Register, Register, int) 664 ARM_INSTR_3(adds_32, adds, Register, Register, int) 665 ARM_INSTR_3(sub_32, sub, Register, Register, int) 666 ARM_INSTR_3(subs_32, subs, Register, Register, int) 667 668 ARM_INSTR_2(tst_32, tst, Register, unsigned int) 669 ARM_INSTR_2(tst_32, tst, Register, AsmOperand) 670 671 ARM_INSTR_3(and_32, andr, Register, Register, uint) 672 ARM_INSTR_3(orr_32, orr, Register, Register, uint) 673 ARM_INSTR_3(eor_32, eor, Register, Register, uint) 674 675 ARM_INSTR_1(cmp_zero_float, fcmpzs, FloatRegister) 676 ARM_INSTR_1(cmp_zero_double, fcmpzd, FloatRegister) 677 678 ARM_INSTR_2(ldr_float, flds, FloatRegister, Address) 679 ARM_INSTR_2(str_float, fsts, FloatRegister, Address) 680 ARM_INSTR_2(mov_float, fcpys, FloatRegister, FloatRegister) 681 ARM_INSTR_2(neg_float, fnegs, FloatRegister, FloatRegister) 682 ARM_INSTR_2(abs_float, fabss, FloatRegister, FloatRegister) 683 ARM_INSTR_2(sqrt_float, fsqrts, FloatRegister, FloatRegister) 684 ARM_INSTR_2(cmp_float, fcmps, FloatRegister, FloatRegister) 685 686 ARM_INSTR_3(add_float, fadds, FloatRegister, FloatRegister, FloatRegister) 687 ARM_INSTR_3(sub_float, fsubs, FloatRegister, FloatRegister, FloatRegister) 688 ARM_INSTR_3(mul_float, fmuls, FloatRegister, FloatRegister, FloatRegister) 689 ARM_INSTR_3(div_float, fdivs, FloatRegister, FloatRegister, FloatRegister) 690 691 ARM_INSTR_2(ldr_double, fldd, FloatRegister, Address) 692 ARM_INSTR_2(str_double, fstd, FloatRegister, Address) 693 ARM_INSTR_2(mov_double, fcpyd, FloatRegister, FloatRegister) 694 ARM_INSTR_2(neg_double, fnegd, FloatRegister, FloatRegister) 695 ARM_INSTR_2(cmp_double, fcmpd, FloatRegister, FloatRegister) 696 ARM_INSTR_2(abs_double, fabsd, FloatRegister, FloatRegister) 697 ARM_INSTR_2(sqrt_double, fsqrtd, FloatRegister, FloatRegister) 698 699 ARM_INSTR_3(add_double, faddd, FloatRegister, FloatRegister, FloatRegister) 700 ARM_INSTR_3(sub_double, fsubd, FloatRegister, FloatRegister, FloatRegister) 701 ARM_INSTR_3(mul_double, fmuld, FloatRegister, FloatRegister, FloatRegister) 702 ARM_INSTR_3(div_double, fdivd, FloatRegister, FloatRegister, FloatRegister) 703 704 ARM_INSTR_2(convert_f2d, fcvtds, FloatRegister, FloatRegister) 705 ARM_INSTR_2(convert_d2f, fcvtsd, FloatRegister, FloatRegister) 706 707 ARM_INSTR_2(mov_fpr2gpr_float, fmrs, Register, FloatRegister) 708 709 #undef ARM_INSTR_1 710 #undef ARM_INSTR_2 711 #undef ARM_INSTR_3 712 713 714 715 void tbz(Register rt, int bit, Label& L) { 716 assert(0 <= bit && bit < BitsPerWord, "bit number is out of range"); 717 tst(rt, 1 << bit); 718 b(L, eq); 719 } 720 721 void tbnz(Register rt, int bit, Label& L) { 722 assert(0 <= bit && bit < BitsPerWord, "bit number is out of range"); 723 tst(rt, 1 << bit); 724 b(L, ne); 725 } 726 727 void cbz(Register rt, Label& L) { 728 cmp(rt, 0); 729 b(L, eq); 730 } 731 732 void cbz(Register rt, address target) { 733 cmp(rt, 0); 734 b(target, eq); 735 } 736 737 void cbnz(Register rt, Label& L) { 738 cmp(rt, 0); 739 b(L, ne); 740 } 741 742 void ret(Register dst = LR) { 743 bx(dst); 744 } 745 746 747 Register zero_register(Register tmp) { 748 mov(tmp, 0); 749 return tmp; 750 } 751 752 void logical_shift_left(Register dst, Register src, int shift) { 753 mov(dst, AsmOperand(src, lsl, shift)); 754 } 755 756 void logical_shift_left_32(Register dst, Register src, int shift) { 757 mov(dst, AsmOperand(src, lsl, shift)); 758 } 759 760 void logical_shift_right(Register dst, Register src, int shift) { 761 mov(dst, AsmOperand(src, lsr, shift)); 762 } 763 764 void arith_shift_right(Register dst, Register src, int shift) { 765 mov(dst, AsmOperand(src, asr, shift)); 766 } 767 768 void asr_32(Register dst, Register src, int shift) { 769 mov(dst, AsmOperand(src, asr, shift)); 770 } 771 772 // If <cond> holds, compares r1 and r2. Otherwise, flags are set so that <cond> does not hold. 773 void cond_cmp(Register r1, Register r2, AsmCondition cond) { 774 cmp(r1, r2, cond); 775 } 776 777 // If <cond> holds, compares r and imm. Otherwise, flags are set so that <cond> does not hold. 778 void cond_cmp(Register r, int imm, AsmCondition cond) { 779 cmp(r, imm, cond); 780 } 781 782 void align_reg(Register dst, Register src, int align) { 783 assert (is_power_of_2(align), "should be"); 784 bic(dst, src, align-1); 785 } 786 787 void prefetch_read(Address addr) { 788 pld(addr); 789 } 790 791 void raw_push(Register r1, Register r2) { 792 assert(r1->encoding() < r2->encoding(), "should be ordered"); 793 push(RegisterSet(r1) | RegisterSet(r2)); 794 } 795 796 void raw_pop(Register r1, Register r2) { 797 assert(r1->encoding() < r2->encoding(), "should be ordered"); 798 pop(RegisterSet(r1) | RegisterSet(r2)); 799 } 800 801 void raw_push(Register r1, Register r2, Register r3) { 802 assert(r1->encoding() < r2->encoding() && r2->encoding() < r3->encoding(), "should be ordered"); 803 push(RegisterSet(r1) | RegisterSet(r2) | RegisterSet(r3)); 804 } 805 806 void raw_pop(Register r1, Register r2, Register r3) { 807 assert(r1->encoding() < r2->encoding() && r2->encoding() < r3->encoding(), "should be ordered"); 808 pop(RegisterSet(r1) | RegisterSet(r2) | RegisterSet(r3)); 809 } 810 811 // Restores registers r1 and r2 previously saved by raw_push(r1, r2, ret_addr) and returns by ret_addr. Clobbers LR. 812 void raw_pop_and_ret(Register r1, Register r2) { 813 raw_pop(r1, r2, PC); 814 } 815 816 void indirect_jump(Address addr, Register scratch) { 817 ldr(PC, addr); 818 } 819 820 void indirect_jump(InlinedAddress& literal, Register scratch) { 821 ldr_literal(PC, literal); 822 } 823 824 void neg(Register dst, Register src) { 825 rsb(dst, src, 0); 826 } 827 828 void branch_if_negative_32(Register r, Label& L) { 829 // TODO: This function and branch_if_any_negative_32 could possibly 830 // be revised after the aarch64 removal. 831 // tbnz is not used instead of tst & b.mi because destination may be out of tbnz range (+-32KB) 832 // since these methods are used in LIR_Assembler::emit_arraycopy() to jump to stub entry. 833 tst_32(r, r); 834 b(L, mi); 835 } 836 837 void branch_if_any_negative_32(Register r1, Register r2, Register tmp, Label& L) { 838 orrs(tmp, r1, r2); 839 b(L, mi); 840 } 841 842 void branch_if_any_negative_32(Register r1, Register r2, Register r3, Register tmp, Label& L) { 843 orr_32(tmp, r1, r2); 844 orrs(tmp, tmp, r3); 845 b(L, mi); 846 } 847 848 void add_ptr_scaled_int32(Register dst, Register r1, Register r2, int shift) { 849 add(dst, r1, AsmOperand(r2, lsl, shift)); 850 } 851 852 void sub_ptr_scaled_int32(Register dst, Register r1, Register r2, int shift) { 853 sub(dst, r1, AsmOperand(r2, lsl, shift)); 854 } 855 856 // C 'boolean' to Java boolean: x == 0 ? 0 : 1 857 void c2bool(Register x); 858 859 // klass oop manipulations if compressed 860 861 void load_klass(Register dst_klass, Register src_oop, AsmCondition cond = al); 862 863 void store_klass(Register src_klass, Register dst_oop); 864 865 866 // oop manipulations 867 868 void load_heap_oop(Register dst, Address src, Register tmp1 = noreg, Register tmp2 = noreg, Register tmp3 = noreg, DecoratorSet decorators = 0); 869 void store_heap_oop(Address obj, Register new_val, Register tmp1 = noreg, Register tmp2 = noreg, Register tmp3 = noreg, DecoratorSet decorators = 0); 870 void store_heap_oop_null(Address obj, Register new_val, Register tmp1 = noreg, Register tmp2 = noreg, Register tmp3 = noreg, DecoratorSet decorators = 0); 871 872 void access_load_at(BasicType type, DecoratorSet decorators, Address src, Register dst, Register tmp1, Register tmp2, Register tmp3); 873 void access_store_at(BasicType type, DecoratorSet decorators, Address obj, Register new_val, Register tmp1, Register tmp2, Register tmp3, bool is_null); 874 875 // Resolves obj for access. Result is placed in the same register. 876 // All other registers are preserved. 877 void resolve(DecoratorSet decorators, Register obj); 878 879 880 void ldr_global_ptr(Register reg, address address_of_global); 881 void ldr_global_s32(Register reg, address address_of_global); 882 void ldrb_global(Register reg, address address_of_global); 883 884 // address_placeholder_instruction is invalid instruction and is used 885 // as placeholder in code for address of label 886 enum { address_placeholder_instruction = 0xFFFFFFFF }; 887 888 void emit_address(Label& L) { 889 assert(!L.is_bound(), "otherwise address will not be patched"); 890 target(L); // creates relocation which will be patched later 891 892 assert ((offset() & (wordSize-1)) == 0, "should be aligned by word size"); 893 894 AbstractAssembler::emit_address((address)address_placeholder_instruction); 895 } 896 897 void b(address target, AsmCondition cond = al) { 898 Assembler::b(target, cond); \ 899 } 900 void b(Label& L, AsmCondition cond = al) { 901 // internal jumps 902 Assembler::b(target(L), cond); 903 } 904 905 void bl(address target, AsmCondition cond = al) { 906 Assembler::bl(target, cond); 907 } 908 void bl(Label& L, AsmCondition cond = al) { 909 // internal calls 910 Assembler::bl(target(L), cond); 911 } 912 913 void adr(Register dest, Label& L, AsmCondition cond = al) { 914 int delta = target(L) - pc() - 8; 915 if (delta >= 0) { 916 add(dest, PC, delta, cond); 917 } else { 918 sub(dest, PC, -delta, cond); 919 } 920 } 921 922 // Variable-length jump and calls. We now distinguish only the 923 // patchable case from the other cases. Patchable must be 924 // distinguised from relocable. Relocable means the generated code 925 // containing the jump/call may move. Patchable means that the 926 // targeted address may be changed later. 927 928 // Non patchable versions. 929 // - used only for relocInfo::runtime_call_type and relocInfo::none 930 // - may use relative or absolute format (do not use relocInfo::none 931 // if the generated code may move) 932 // - the implementation takes into account switch to THUMB mode if the 933 // destination is a THUMB address 934 // - the implementation supports far targets 935 // 936 // To reduce regression risk, scratch still defaults to noreg on 937 // arm32. This results in patchable instructions. However, if 938 // patching really matters, the call sites should be modified and 939 // use patchable_call or patchable_jump. If patching is not required 940 // and if a register can be cloberred, it should be explicitly 941 // specified to allow future optimizations. 942 void jump(address target, 943 relocInfo::relocType rtype = relocInfo::runtime_call_type, 944 Register scratch = noreg, AsmCondition cond = al); 945 946 void call(address target, 947 RelocationHolder rspec, AsmCondition cond = al); 948 949 void call(address target, 950 relocInfo::relocType rtype = relocInfo::runtime_call_type, 951 AsmCondition cond = al) { 952 call(target, Relocation::spec_simple(rtype), cond); 953 } 954 955 void jump(AddressLiteral dest) { 956 jump(dest.target(), dest.reloc()); 957 } 958 void jump(address dest, relocInfo::relocType rtype, AsmCondition cond) { 959 jump(dest, rtype, Rtemp, cond); 960 } 961 962 void call(AddressLiteral dest) { 963 call(dest.target(), dest.reloc()); 964 } 965 966 // Patchable version: 967 // - set_destination can be used to atomically change the target 968 // 969 // The targets for patchable_jump and patchable_call must be in the 970 // code cache. 971 // [ including possible extensions of the code cache, like AOT code ] 972 // 973 // To reduce regression risk, scratch still defaults to noreg on 974 // arm32. If a register can be cloberred, it should be explicitly 975 // specified to allow future optimizations. 976 void patchable_jump(address target, 977 relocInfo::relocType rtype = relocInfo::runtime_call_type, 978 Register scratch = noreg, AsmCondition cond = al 979 ); 980 981 // patchable_call may scratch Rtemp 982 int patchable_call(address target, 983 RelocationHolder const& rspec, 984 bool c2 = false); 985 986 int patchable_call(address target, 987 relocInfo::relocType rtype, 988 bool c2 = false) { 989 return patchable_call(target, Relocation::spec_simple(rtype), c2); 990 } 991 992 993 static bool _reachable_from_cache(address target); 994 static bool _cache_fully_reachable(); 995 bool cache_fully_reachable(); 996 bool reachable_from_cache(address target); 997 998 void zero_extend(Register rd, Register rn, int bits); 999 void sign_extend(Register rd, Register rn, int bits); 1000 1001 inline void zap_high_non_significant_bits(Register r) { 1002 } 1003 1004 void cmpoop(Register obj1, Register obj2); 1005 1006 void long_move(Register rd_lo, Register rd_hi, 1007 Register rn_lo, Register rn_hi, 1008 AsmCondition cond = al); 1009 void long_shift(Register rd_lo, Register rd_hi, 1010 Register rn_lo, Register rn_hi, 1011 AsmShift shift, Register count); 1012 void long_shift(Register rd_lo, Register rd_hi, 1013 Register rn_lo, Register rn_hi, 1014 AsmShift shift, int count); 1015 1016 void atomic_cas(Register tmpreg1, Register tmpreg2, Register oldval, Register newval, Register base, int offset); 1017 void atomic_cas_bool(Register oldval, Register newval, Register base, int offset, Register tmpreg); 1018 void atomic_cas64(Register temp_lo, Register temp_hi, Register temp_result, Register oldval_lo, Register oldval_hi, Register newval_lo, Register newval_hi, Register base, int offset); 1019 1020 void cas_for_lock_acquire(Register oldval, Register newval, Register base, Register tmp, Label &slow_case, bool allow_fallthrough_on_failure = false, bool one_shot = false); 1021 void cas_for_lock_release(Register oldval, Register newval, Register base, Register tmp, Label &slow_case, bool allow_fallthrough_on_failure = false, bool one_shot = false); 1022 1023 #ifndef PRODUCT 1024 // Preserves flags and all registers. 1025 // On SMP the updated value might not be visible to external observers without a sychronization barrier 1026 void cond_atomic_inc32(AsmCondition cond, int* counter_addr); 1027 #endif // !PRODUCT 1028 1029 // unconditional non-atomic increment 1030 void inc_counter(address counter_addr, Register tmpreg1, Register tmpreg2); 1031 void inc_counter(int* counter_addr, Register tmpreg1, Register tmpreg2) { 1032 inc_counter((address) counter_addr, tmpreg1, tmpreg2); 1033 } 1034 1035 void pd_patch_instruction(address branch, address target, const char* file, int line); 1036 1037 // Loading and storing values by size and signed-ness; 1038 // size must not exceed wordSize (i.e. 8-byte values are not supported on 32-bit ARM); 1039 // each of these calls generates exactly one load or store instruction, 1040 // so src can be pre- or post-indexed address. 1041 // 32-bit ARM variants also support conditional execution 1042 void load_sized_value(Register dst, Address src, size_t size_in_bytes, bool is_signed, AsmCondition cond = al); 1043 void store_sized_value(Register src, Address dst, size_t size_in_bytes, AsmCondition cond = al); 1044 1045 void lookup_interface_method(Register recv_klass, 1046 Register intf_klass, 1047 RegisterOrConstant itable_index, 1048 Register method_result, 1049 Register temp_reg1, 1050 Register temp_reg2, 1051 Label& L_no_such_interface); 1052 1053 // Compare char[] arrays aligned to 4 bytes. 1054 void char_arrays_equals(Register ary1, Register ary2, 1055 Register limit, Register result, 1056 Register chr1, Register chr2, Label& Ldone); 1057 1058 1059 void floating_cmp(Register dst); 1060 1061 // improved x86 portability (minimizing source code changes) 1062 1063 void ldr_literal(Register rd, AddressLiteral addr) { 1064 relocate(addr.rspec()); 1065 ldr(rd, Address(PC, addr.target() - pc() - 8)); 1066 } 1067 1068 void lea(Register Rd, AddressLiteral addr) { 1069 // Never dereferenced, as on x86 (lval status ignored) 1070 mov_address(Rd, addr.target(), addr.rspec()); 1071 } 1072 1073 void restore_default_fp_mode(); 1074 1075 #ifdef COMPILER2 1076 void fast_lock(Register obj, Register box, Register scratch, Register scratch2, Register scratch3 = noreg); 1077 void fast_unlock(Register obj, Register box, Register scratch, Register scratch2); 1078 #endif 1079 1080 1081 }; 1082 1083 1084 // The purpose of this class is to build several code fragments of the same size 1085 // in order to allow fast table branch. 1086 1087 class FixedSizeCodeBlock { 1088 public: 1089 FixedSizeCodeBlock(MacroAssembler* masm, int size_in_instrs, bool enabled); 1090 ~FixedSizeCodeBlock(); 1091 1092 private: 1093 MacroAssembler* _masm; 1094 address _start; 1095 int _size_in_instrs; 1096 bool _enabled; 1097 }; 1098 1099 1100 #endif // CPU_ARM_MACROASSEMBLER_ARM_HPP