1 // Copyright (c) 1994-2006 Sun Microsystems Inc. 2 // All Rights Reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions 6 // are met: 7 // 8 // - Redistributions of source code must retain the above copyright notice, 9 // this list of conditions and the following disclaimer. 10 // 11 // - Redistribution in binary form must reproduce the above copyright 12 // notice, this list of conditions and the following disclaimer in the 13 // documentation and/or other materials provided with the 14 // distribution. 15 // 16 // - Neither the name of Sun Microsystems or the names of contributors may 17 // be used to endorse or promote products derived from this software without 18 // specific prior written permission. 19 // 20 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23 // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24 // COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 26 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 27 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 29 // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 31 // OF THE POSSIBILITY OF SUCH DAMAGE. 32 33 // The original source code covered by the above license above has been 34 // modified significantly by Google Inc. 35 // Copyright 2014 the V8 project authors. All rights reserved. 36 37 #include "src/s390/assembler-s390.h" 38 39 #if V8_TARGET_ARCH_S390 40 41 #if V8_HOST_ARCH_S390 42 #include <elf.h> // Required for auxv checks for STFLE support 43 #endif 44 45 #include "src/base/bits.h" 46 #include "src/base/cpu.h" 47 #include "src/s390/assembler-s390-inl.h" 48 49 #include "src/macro-assembler.h" 50 51 namespace v8 { 52 namespace internal { 53 54 // Get the CPU features enabled by the build. 55 static unsigned CpuFeaturesImpliedByCompiler() { 56 unsigned answer = 0; 57 return answer; 58 } 59 60 // Check whether Store Facility STFLE instruction is available on the platform. 61 // Instruction returns a bit vector of the enabled hardware facilities. 62 static bool supportsSTFLE() { 63 #if V8_HOST_ARCH_S390 64 static bool read_tried = false; 65 static uint32_t auxv_hwcap = 0; 66 67 if (!read_tried) { 68 // Open the AUXV (auxilliary vector) psuedo-file 69 int fd = open("/proc/self/auxv", O_RDONLY); 70 71 read_tried = true; 72 if (fd != -1) { 73 #if V8_TARGET_ARCH_S390X 74 static Elf64_auxv_t buffer[16]; 75 Elf64_auxv_t* auxv_element; 76 #else 77 static Elf32_auxv_t buffer[16]; 78 Elf32_auxv_t* auxv_element; 79 #endif 80 int bytes_read = 0; 81 while (bytes_read >= 0) { 82 // Read a chunk of the AUXV 83 bytes_read = read(fd, buffer, sizeof(buffer)); 84 // Locate and read the platform field of AUXV if it is in the chunk 85 for (auxv_element = buffer; 86 auxv_element + sizeof(auxv_element) <= buffer + bytes_read && 87 auxv_element->a_type != AT_NULL; 88 auxv_element++) { 89 // We are looking for HWCAP entry in AUXV to search for STFLE support 90 if (auxv_element->a_type == AT_HWCAP) { 91 /* Note: Both auxv_hwcap and buffer are static */ 92 auxv_hwcap = auxv_element->a_un.a_val; 93 goto done_reading; 94 } 95 } 96 } 97 done_reading: 98 close(fd); 99 } 100 } 101 102 // Did not find result 103 if (0 == auxv_hwcap) { 104 return false; 105 } 106 107 // HWCAP_S390_STFLE is defined to be 4 in include/asm/elf.h. Currently 108 // hardcoded in case that include file does not exist. 109 const uint32_t HWCAP_S390_STFLE = 4; 110 return (auxv_hwcap & HWCAP_S390_STFLE); 111 #else 112 // STFLE is not available on non-s390 hosts 113 return false; 114 #endif 115 } 116 117 void CpuFeatures::ProbeImpl(bool cross_compile) { 118 supported_ |= CpuFeaturesImpliedByCompiler(); 119 icache_line_size_ = 256; 120 121 // Only use statically determined features for cross compile (snapshot). 122 if (cross_compile) return; 123 124 #ifdef DEBUG 125 initialized_ = true; 126 #endif 127 128 static bool performSTFLE = supportsSTFLE(); 129 130 // Need to define host, as we are generating inlined S390 assembly to test 131 // for facilities. 132 #if V8_HOST_ARCH_S390 133 if (performSTFLE) { 134 // STFLE D(B) requires: 135 // GPR0 to specify # of double words to update minus 1. 136 // i.e. GPR0 = 0 for 1 doubleword 137 // D(B) to specify to memory location to store the facilities bits 138 // The facilities we are checking for are: 139 // Bit 45 - Distinct Operands for instructions like ARK, SRK, etc. 140 // As such, we require only 1 double word 141 int64_t facilities[1]; 142 facilities[0] = 0; 143 // LHI sets up GPR0 144 // STFLE is specified as .insn, as opcode is not recognized. 145 // We register the instructions kill r0 (LHI) and the CC (STFLE). 146 asm volatile( 147 "lhi 0,0\n" 148 ".insn s,0xb2b00000,%0\n" 149 : "=Q"(facilities) 150 : 151 : "cc", "r0"); 152 153 // Test for Distinct Operands Facility - Bit 45 154 if (facilities[0] & (1lu << (63 - 45))) { 155 supported_ |= (1u << DISTINCT_OPS); 156 } 157 // Test for General Instruction Extension Facility - Bit 34 158 if (facilities[0] & (1lu << (63 - 34))) { 159 supported_ |= (1u << GENERAL_INSTR_EXT); 160 } 161 // Test for Floating Point Extension Facility - Bit 37 162 if (facilities[0] & (1lu << (63 - 37))) { 163 supported_ |= (1u << FLOATING_POINT_EXT); 164 } 165 } 166 #else 167 // All distinct ops instructions can be simulated 168 supported_ |= (1u << DISTINCT_OPS); 169 // RISBG can be simulated 170 supported_ |= (1u << GENERAL_INSTR_EXT); 171 172 supported_ |= (1u << FLOATING_POINT_EXT); 173 USE(performSTFLE); // To avoid assert 174 #endif 175 supported_ |= (1u << FPU); 176 } 177 178 void CpuFeatures::PrintTarget() { 179 const char* s390_arch = NULL; 180 181 #if V8_TARGET_ARCH_S390X 182 s390_arch = "s390x"; 183 #else 184 s390_arch = "s390"; 185 #endif 186 187 printf("target %s\n", s390_arch); 188 } 189 190 void CpuFeatures::PrintFeatures() { 191 printf("FPU=%d\n", CpuFeatures::IsSupported(FPU)); 192 printf("FPU_EXT=%d\n", CpuFeatures::IsSupported(FLOATING_POINT_EXT)); 193 printf("GENERAL_INSTR=%d\n", CpuFeatures::IsSupported(GENERAL_INSTR_EXT)); 194 printf("DISTINCT_OPS=%d\n", CpuFeatures::IsSupported(DISTINCT_OPS)); 195 } 196 197 Register ToRegister(int num) { 198 DCHECK(num >= 0 && num < kNumRegisters); 199 const Register kRegisters[] = {r0, r1, r2, r3, r4, r5, r6, r7, 200 r8, r9, r10, fp, ip, r13, r14, sp}; 201 return kRegisters[num]; 202 } 203 204 // ----------------------------------------------------------------------------- 205 // Implementation of RelocInfo 206 207 const int RelocInfo::kApplyMask = 208 RelocInfo::kCodeTargetMask | 1 << RelocInfo::INTERNAL_REFERENCE; 209 210 bool RelocInfo::IsCodedSpecially() { 211 // The deserializer needs to know whether a pointer is specially 212 // coded. Being specially coded on S390 means that it is an iihf/iilf 213 // instruction sequence, and that is always the case inside code 214 // objects. 215 return true; 216 } 217 218 bool RelocInfo::IsInConstantPool() { return false; } 219 220 Address RelocInfo::wasm_memory_reference() { 221 DCHECK(IsWasmMemoryReference(rmode_)); 222 return Assembler::target_address_at(pc_, host_); 223 } 224 225 uint32_t RelocInfo::wasm_memory_size_reference() { 226 DCHECK(IsWasmMemorySizeReference(rmode_)); 227 return static_cast<uint32_t>( 228 reinterpret_cast<intptr_t>(Assembler::target_address_at(pc_, host_))); 229 } 230 231 Address RelocInfo::wasm_global_reference() { 232 DCHECK(IsWasmGlobalReference(rmode_)); 233 return Assembler::target_address_at(pc_, host_); 234 } 235 236 void RelocInfo::unchecked_update_wasm_memory_reference( 237 Address address, ICacheFlushMode flush_mode) { 238 Assembler::set_target_address_at(isolate_, pc_, host_, address, flush_mode); 239 } 240 241 void RelocInfo::unchecked_update_wasm_memory_size(uint32_t size, 242 ICacheFlushMode flush_mode) { 243 Assembler::set_target_address_at(isolate_, pc_, host_, 244 reinterpret_cast<Address>(size), flush_mode); 245 } 246 247 // ----------------------------------------------------------------------------- 248 // Implementation of Operand and MemOperand 249 // See assembler-s390-inl.h for inlined constructors 250 251 Operand::Operand(Handle<Object> handle) { 252 AllowDeferredHandleDereference using_raw_address; 253 rm_ = no_reg; 254 // Verify all Objects referred by code are NOT in new space. 255 Object* obj = *handle; 256 if (obj->IsHeapObject()) { 257 DCHECK(!HeapObject::cast(obj)->GetHeap()->InNewSpace(obj)); 258 imm_ = reinterpret_cast<intptr_t>(handle.location()); 259 rmode_ = RelocInfo::EMBEDDED_OBJECT; 260 } else { 261 // no relocation needed 262 imm_ = reinterpret_cast<intptr_t>(obj); 263 rmode_ = kRelocInfo_NONEPTR; 264 } 265 } 266 267 MemOperand::MemOperand(Register rn, int32_t offset) { 268 baseRegister = rn; 269 indexRegister = r0; 270 offset_ = offset; 271 } 272 273 MemOperand::MemOperand(Register rx, Register rb, int32_t offset) { 274 baseRegister = rb; 275 indexRegister = rx; 276 offset_ = offset; 277 } 278 279 // ----------------------------------------------------------------------------- 280 // Specific instructions, constants, and masks. 281 282 Assembler::Assembler(Isolate* isolate, void* buffer, int buffer_size) 283 : AssemblerBase(isolate, buffer, buffer_size), 284 recorded_ast_id_(TypeFeedbackId::None()), 285 code_targets_(100), 286 positions_recorder_(this) { 287 reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_); 288 289 last_bound_pos_ = 0; 290 ClearRecordedAstId(); 291 relocations_.reserve(128); 292 } 293 294 void Assembler::GetCode(CodeDesc* desc) { 295 EmitRelocations(); 296 297 // Set up code descriptor. 298 desc->buffer = buffer_; 299 desc->buffer_size = buffer_size_; 300 desc->instr_size = pc_offset(); 301 desc->reloc_size = (buffer_ + buffer_size_) - reloc_info_writer.pos(); 302 desc->origin = this; 303 desc->unwinding_info_size = 0; 304 desc->unwinding_info = nullptr; 305 } 306 307 void Assembler::Align(int m) { 308 DCHECK(m >= 4 && base::bits::IsPowerOfTwo32(m)); 309 while ((pc_offset() & (m - 1)) != 0) { 310 nop(0); 311 } 312 } 313 314 void Assembler::CodeTargetAlign() { Align(8); } 315 316 Condition Assembler::GetCondition(Instr instr) { 317 switch (instr & kCondMask) { 318 case BT: 319 return eq; 320 case BF: 321 return ne; 322 default: 323 UNIMPLEMENTED(); 324 } 325 return al; 326 } 327 328 #if V8_TARGET_ARCH_S390X 329 // This code assumes a FIXED_SEQUENCE for 64bit loads (iihf/iilf) 330 bool Assembler::Is64BitLoadIntoIP(SixByteInstr instr1, SixByteInstr instr2) { 331 // Check the instructions are the iihf/iilf load into ip 332 return (((instr1 >> 32) == 0xC0C8) && ((instr2 >> 32) == 0xC0C9)); 333 } 334 #else 335 // This code assumes a FIXED_SEQUENCE for 32bit loads (iilf) 336 bool Assembler::Is32BitLoadIntoIP(SixByteInstr instr) { 337 // Check the instruction is an iilf load into ip/r12. 338 return ((instr >> 32) == 0xC0C9); 339 } 340 #endif 341 342 // Labels refer to positions in the (to be) generated code. 343 // There are bound, linked, and unused labels. 344 // 345 // Bound labels refer to known positions in the already 346 // generated code. pos() is the position the label refers to. 347 // 348 // Linked labels refer to unknown positions in the code 349 // to be generated; pos() is the position of the last 350 // instruction using the label. 351 352 // The link chain is terminated by a negative code position (must be aligned) 353 const int kEndOfChain = -4; 354 355 // Returns the target address of the relative instructions, typically 356 // of the form: pos + imm (where immediate is in # of halfwords for 357 // BR* and LARL). 358 int Assembler::target_at(int pos) { 359 SixByteInstr instr = instr_at(pos); 360 // check which type of branch this is 16 or 26 bit offset 361 Opcode opcode = Instruction::S390OpcodeValue(buffer_ + pos); 362 363 if (BRC == opcode || BRCT == opcode || BRCTG == opcode) { 364 int16_t imm16 = SIGN_EXT_IMM16((instr & kImm16Mask)); 365 imm16 <<= 1; // BRC immediate is in # of halfwords 366 if (imm16 == 0) return kEndOfChain; 367 return pos + imm16; 368 } else if (LLILF == opcode || BRCL == opcode || LARL == opcode || 369 BRASL == opcode) { 370 int32_t imm32 = 371 static_cast<int32_t>(instr & (static_cast<uint64_t>(0xffffffff))); 372 if (LLILF != opcode) 373 imm32 <<= 1; // BR* + LARL treat immediate in # of halfwords 374 if (imm32 == 0) return kEndOfChain; 375 return pos + imm32; 376 } 377 378 // Unknown condition 379 DCHECK(false); 380 return -1; 381 } 382 383 // Update the target address of the current relative instruction. 384 void Assembler::target_at_put(int pos, int target_pos, bool* is_branch) { 385 SixByteInstr instr = instr_at(pos); 386 Opcode opcode = Instruction::S390OpcodeValue(buffer_ + pos); 387 388 if (is_branch != nullptr) { 389 *is_branch = (opcode == BRC || opcode == BRCT || opcode == BRCTG || 390 opcode == BRCL || opcode == BRASL); 391 } 392 393 if (BRC == opcode || BRCT == opcode || BRCTG == opcode) { 394 int16_t imm16 = target_pos - pos; 395 instr &= (~0xffff); 396 DCHECK(is_int16(imm16)); 397 instr_at_put<FourByteInstr>(pos, instr | (imm16 >> 1)); 398 return; 399 } else if (BRCL == opcode || LARL == opcode || BRASL == opcode) { 400 // Immediate is in # of halfwords 401 int32_t imm32 = target_pos - pos; 402 instr &= (~static_cast<uint64_t>(0xffffffff)); 403 instr_at_put<SixByteInstr>(pos, instr | (imm32 >> 1)); 404 return; 405 } else if (LLILF == opcode) { 406 DCHECK(target_pos == kEndOfChain || target_pos >= 0); 407 // Emitted label constant, not part of a branch. 408 // Make label relative to Code* of generated Code object. 409 int32_t imm32 = target_pos + (Code::kHeaderSize - kHeapObjectTag); 410 instr &= (~static_cast<uint64_t>(0xffffffff)); 411 instr_at_put<SixByteInstr>(pos, instr | imm32); 412 return; 413 } 414 DCHECK(false); 415 } 416 417 // Returns the maximum number of bits given instruction can address. 418 int Assembler::max_reach_from(int pos) { 419 Opcode opcode = Instruction::S390OpcodeValue(buffer_ + pos); 420 421 // Check which type of instr. In theory, we can return 422 // the values below + 1, given offset is # of halfwords 423 if (BRC == opcode || BRCT == opcode || BRCTG == opcode) { 424 return 16; 425 } else if (LLILF == opcode || BRCL == opcode || LARL == opcode || 426 BRASL == opcode) { 427 return 31; // Using 31 as workaround instead of 32 as 428 // is_intn(x,32) doesn't work on 32-bit platforms. 429 // llilf: Emitted label constant, not part of 430 // a branch (regexp PushBacktrack). 431 } 432 DCHECK(false); 433 return 16; 434 } 435 436 void Assembler::bind_to(Label* L, int pos) { 437 DCHECK(0 <= pos && pos <= pc_offset()); // must have a valid binding position 438 bool is_branch = false; 439 while (L->is_linked()) { 440 int fixup_pos = L->pos(); 441 #ifdef DEBUG 442 int32_t offset = pos - fixup_pos; 443 int maxReach = max_reach_from(fixup_pos); 444 #endif 445 next(L); // call next before overwriting link with target at fixup_pos 446 DCHECK(is_intn(offset, maxReach)); 447 target_at_put(fixup_pos, pos, &is_branch); 448 } 449 L->bind_to(pos); 450 451 // Keep track of the last bound label so we don't eliminate any instructions 452 // before a bound label. 453 if (pos > last_bound_pos_) last_bound_pos_ = pos; 454 } 455 456 void Assembler::bind(Label* L) { 457 DCHECK(!L->is_bound()); // label can only be bound once 458 bind_to(L, pc_offset()); 459 } 460 461 void Assembler::next(Label* L) { 462 DCHECK(L->is_linked()); 463 int link = target_at(L->pos()); 464 if (link == kEndOfChain) { 465 L->Unuse(); 466 } else { 467 DCHECK(link >= 0); 468 L->link_to(link); 469 } 470 } 471 472 bool Assembler::is_near(Label* L, Condition cond) { 473 DCHECK(L->is_bound()); 474 if (L->is_bound() == false) return false; 475 476 int maxReach = ((cond == al) ? 26 : 16); 477 int offset = L->pos() - pc_offset(); 478 479 return is_intn(offset, maxReach); 480 } 481 482 int Assembler::link(Label* L) { 483 int position; 484 if (L->is_bound()) { 485 position = L->pos(); 486 } else { 487 if (L->is_linked()) { 488 position = L->pos(); // L's link 489 } else { 490 // was: target_pos = kEndOfChain; 491 // However, using self to mark the first reference 492 // should avoid most instances of branch offset overflow. See 493 // target_at() for where this is converted back to kEndOfChain. 494 position = pc_offset(); 495 } 496 L->link_to(pc_offset()); 497 } 498 499 return position; 500 } 501 502 void Assembler::load_label_offset(Register r1, Label* L) { 503 int target_pos; 504 int constant; 505 if (L->is_bound()) { 506 target_pos = L->pos(); 507 constant = target_pos + (Code::kHeaderSize - kHeapObjectTag); 508 } else { 509 if (L->is_linked()) { 510 target_pos = L->pos(); // L's link 511 } else { 512 // was: target_pos = kEndOfChain; 513 // However, using branch to self to mark the first reference 514 // should avoid most instances of branch offset overflow. See 515 // target_at() for where this is converted back to kEndOfChain. 516 target_pos = pc_offset(); 517 } 518 L->link_to(pc_offset()); 519 520 constant = target_pos - pc_offset(); 521 } 522 llilf(r1, Operand(constant)); 523 } 524 525 // Pseudo op - branch on condition 526 void Assembler::branchOnCond(Condition c, int branch_offset, bool is_bound) { 527 int offset = branch_offset; 528 if (is_bound && is_int16(offset)) { 529 brc(c, Operand(offset & 0xFFFF)); // short jump 530 } else { 531 brcl(c, Operand(offset)); // long jump 532 } 533 } 534 535 // 32-bit Store Multiple - short displacement (12-bits unsigned) 536 void Assembler::stm(Register r1, Register r2, const MemOperand& src) { 537 rs_form(STM, r1, r2, src.rb(), src.offset()); 538 } 539 540 // 32-bit Store Multiple - long displacement (20-bits signed) 541 void Assembler::stmy(Register r1, Register r2, const MemOperand& src) { 542 rsy_form(STMY, r1, r2, src.rb(), src.offset()); 543 } 544 545 // 64-bit Store Multiple - long displacement (20-bits signed) 546 void Assembler::stmg(Register r1, Register r2, const MemOperand& src) { 547 rsy_form(STMG, r1, r2, src.rb(), src.offset()); 548 } 549 550 // Exception-generating instructions and debugging support. 551 // Stops with a non-negative code less than kNumOfWatchedStops support 552 // enabling/disabling and a counter feature. See simulator-s390.h . 553 void Assembler::stop(const char* msg, Condition cond, int32_t code, 554 CRegister cr) { 555 if (cond != al) { 556 Label skip; 557 b(NegateCondition(cond), &skip, Label::kNear); 558 bkpt(0); 559 bind(&skip); 560 } else { 561 bkpt(0); 562 } 563 } 564 565 void Assembler::bkpt(uint32_t imm16) { 566 // GDB software breakpoint instruction 567 emit2bytes(0x0001); 568 } 569 570 // Pseudo instructions. 571 void Assembler::nop(int type) { 572 switch (type) { 573 case 0: 574 lr(r0, r0); 575 break; 576 case DEBUG_BREAK_NOP: 577 // TODO(john.yan): Use a better NOP break 578 oill(r3, Operand::Zero()); 579 break; 580 default: 581 UNIMPLEMENTED(); 582 } 583 } 584 585 // RR format: <insn> R1,R2 586 // +--------+----+----+ 587 // | OpCode | R1 | R2 | 588 // +--------+----+----+ 589 // 0 8 12 15 590 #define RR_FORM_EMIT(name, op) \ 591 void Assembler::name(Register r1, Register r2) { rr_form(op, r1, r2); } 592 593 void Assembler::rr_form(Opcode op, Register r1, Register r2) { 594 DCHECK(is_uint8(op)); 595 emit2bytes(op * B8 | r1.code() * B4 | r2.code()); 596 } 597 598 void Assembler::rr_form(Opcode op, DoubleRegister r1, DoubleRegister r2) { 599 DCHECK(is_uint8(op)); 600 emit2bytes(op * B8 | r1.code() * B4 | r2.code()); 601 } 602 603 // RR2 format: <insn> M1,R2 604 // +--------+----+----+ 605 // | OpCode | M1 | R2 | 606 // +--------+----+----+ 607 // 0 8 12 15 608 #define RR2_FORM_EMIT(name, op) \ 609 void Assembler::name(Condition m1, Register r2) { rr_form(op, m1, r2); } 610 611 void Assembler::rr_form(Opcode op, Condition m1, Register r2) { 612 DCHECK(is_uint8(op)); 613 DCHECK(is_uint4(m1)); 614 emit2bytes(op * B8 | m1 * B4 | r2.code()); 615 } 616 617 // RX format: <insn> R1,D2(X2,B2) 618 // +--------+----+----+----+-------------+ 619 // | OpCode | R1 | X2 | B2 | D2 | 620 // +--------+----+----+----+-------------+ 621 // 0 8 12 16 20 31 622 #define RX_FORM_EMIT(name, op) \ 623 void Assembler::name(Register r, const MemOperand& opnd) { \ 624 name(r, opnd.getIndexRegister(), opnd.getBaseRegister(), \ 625 opnd.getDisplacement()); \ 626 } \ 627 void Assembler::name(Register r1, Register x2, Register b2, Disp d2) { \ 628 rx_form(op, r1, x2, b2, d2); \ 629 } 630 void Assembler::rx_form(Opcode op, Register r1, Register x2, Register b2, 631 Disp d2) { 632 DCHECK(is_uint8(op)); 633 DCHECK(is_uint12(d2)); 634 emit4bytes(op * B24 | r1.code() * B20 | x2.code() * B16 | b2.code() * B12 | 635 d2); 636 } 637 638 void Assembler::rx_form(Opcode op, DoubleRegister r1, Register x2, Register b2, 639 Disp d2) { 640 DCHECK(is_uint8(op)); 641 DCHECK(is_uint12(d2)); 642 emit4bytes(op * B24 | r1.code() * B20 | x2.code() * B16 | b2.code() * B12 | 643 d2); 644 } 645 646 // RI1 format: <insn> R1,I2 647 // +--------+----+----+------------------+ 648 // | OpCode | R1 |OpCd| I2 | 649 // +--------+----+----+------------------+ 650 // 0 8 12 16 31 651 #define RI1_FORM_EMIT(name, op) \ 652 void Assembler::name(Register r, const Operand& i2) { ri_form(op, r, i2); } 653 654 void Assembler::ri_form(Opcode op, Register r1, const Operand& i2) { 655 DCHECK(is_uint12(op)); 656 DCHECK(is_uint16(i2.imm_) || is_int16(i2.imm_)); 657 emit4bytes((op & 0xFF0) * B20 | r1.code() * B20 | (op & 0xF) * B16 | 658 (i2.imm_ & 0xFFFF)); 659 } 660 661 // RI2 format: <insn> M1,I2 662 // +--------+----+----+------------------+ 663 // | OpCode | M1 |OpCd| I2 | 664 // +--------+----+----+------------------+ 665 // 0 8 12 16 31 666 #define RI2_FORM_EMIT(name, op) \ 667 void Assembler::name(Condition m, const Operand& i2) { ri_form(op, m, i2); } 668 669 void Assembler::ri_form(Opcode op, Condition m1, const Operand& i2) { 670 DCHECK(is_uint12(op)); 671 DCHECK(is_uint4(m1)); 672 DCHECK(is_uint16(i2.imm_)); 673 emit4bytes((op & 0xFF0) * B20 | m1 * B20 | (op & 0xF) * B16 | 674 (i2.imm_ & 0xFFFF)); 675 } 676 677 // RIE-f format: <insn> R1,R2,I3,I4,I5 678 // +--------+----+----+------------------+--------+--------+ 679 // | OpCode | R1 | R2 | I3 | I4 | I5 | OpCode | 680 // +--------+----+----+------------------+--------+--------+ 681 // 0 8 12 16 24 32 40 47 682 void Assembler::rie_f_form(Opcode op, Register r1, Register r2, 683 const Operand& i3, const Operand& i4, 684 const Operand& i5) { 685 DCHECK(is_uint16(op)); 686 DCHECK(is_uint8(i3.imm_)); 687 DCHECK(is_uint8(i4.imm_)); 688 DCHECK(is_uint8(i5.imm_)); 689 uint64_t code = (static_cast<uint64_t>(op & 0xFF00)) * B32 | 690 (static_cast<uint64_t>(r1.code())) * B36 | 691 (static_cast<uint64_t>(r2.code())) * B32 | 692 (static_cast<uint64_t>(i3.imm_)) * B24 | 693 (static_cast<uint64_t>(i4.imm_)) * B16 | 694 (static_cast<uint64_t>(i5.imm_)) * B8 | 695 (static_cast<uint64_t>(op & 0x00FF)); 696 emit6bytes(code); 697 } 698 699 // RIE format: <insn> R1,R3,I2 700 // +--------+----+----+------------------+--------+--------+ 701 // | OpCode | R1 | R3 | I2 |////////| OpCode | 702 // +--------+----+----+------------------+--------+--------+ 703 // 0 8 12 16 32 40 47 704 #define RIE_FORM_EMIT(name, op) \ 705 void Assembler::name(Register r1, Register r3, const Operand& i2) { \ 706 rie_form(op, r1, r3, i2); \ 707 } 708 709 void Assembler::rie_form(Opcode op, Register r1, Register r3, 710 const Operand& i2) { 711 DCHECK(is_uint16(op)); 712 DCHECK(is_int16(i2.imm_)); 713 uint64_t code = (static_cast<uint64_t>(op & 0xFF00)) * B32 | 714 (static_cast<uint64_t>(r1.code())) * B36 | 715 (static_cast<uint64_t>(r3.code())) * B32 | 716 (static_cast<uint64_t>(i2.imm_ & 0xFFFF)) * B16 | 717 (static_cast<uint64_t>(op & 0x00FF)); 718 emit6bytes(code); 719 } 720 721 // RIL1 format: <insn> R1,I2 722 // +--------+----+----+------------------------------------+ 723 // | OpCode | R1 |OpCd| I2 | 724 // +--------+----+----+------------------------------------+ 725 // 0 8 12 16 47 726 #define RIL1_FORM_EMIT(name, op) \ 727 void Assembler::name(Register r, const Operand& i2) { ril_form(op, r, i2); } 728 729 void Assembler::ril_form(Opcode op, Register r1, const Operand& i2) { 730 DCHECK(is_uint12(op)); 731 uint64_t code = (static_cast<uint64_t>(op & 0xFF0)) * B36 | 732 (static_cast<uint64_t>(r1.code())) * B36 | 733 (static_cast<uint64_t>(op & 0x00F)) * B32 | 734 (static_cast<uint64_t>(i2.imm_) & 0xFFFFFFFF); 735 emit6bytes(code); 736 } 737 738 // RIL2 format: <insn> M1,I2 739 // +--------+----+----+------------------------------------+ 740 // | OpCode | M1 |OpCd| I2 | 741 // +--------+----+----+------------------------------------+ 742 // 0 8 12 16 47 743 #define RIL2_FORM_EMIT(name, op) \ 744 void Assembler::name(Condition m1, const Operand& i2) { \ 745 ril_form(op, m1, i2); \ 746 } 747 748 void Assembler::ril_form(Opcode op, Condition m1, const Operand& i2) { 749 DCHECK(is_uint12(op)); 750 DCHECK(is_uint4(m1)); 751 uint64_t code = (static_cast<uint64_t>(op & 0xFF0)) * B36 | 752 (static_cast<uint64_t>(m1)) * B36 | 753 (static_cast<uint64_t>(op & 0x00F)) * B32 | 754 (static_cast<uint64_t>(i2.imm_ & 0xFFFFFFFF)); 755 emit6bytes(code); 756 } 757 758 // RRE format: <insn> R1,R2 759 // +------------------+--------+----+----+ 760 // | OpCode |////////| R1 | R2 | 761 // +------------------+--------+----+----+ 762 // 0 16 24 28 31 763 #define RRE_FORM_EMIT(name, op) \ 764 void Assembler::name(Register r1, Register r2) { rre_form(op, r1, r2); } 765 766 void Assembler::rre_form(Opcode op, Register r1, Register r2) { 767 DCHECK(is_uint16(op)); 768 emit4bytes(op << 16 | r1.code() * B4 | r2.code()); 769 } 770 771 void Assembler::rre_form(Opcode op, DoubleRegister r1, DoubleRegister r2) { 772 DCHECK(is_uint16(op)); 773 emit4bytes(op << 16 | r1.code() * B4 | r2.code()); 774 } 775 776 // RRD format: <insn> R1,R3, R2 777 // +------------------+----+----+----+----+ 778 // | OpCode | R1 |////| R3 | R2 | 779 // +------------------+----+----+----+----+ 780 // 0 16 20 24 28 31 781 #define RRD_FORM_EMIT(name, op) \ 782 void Assembler::name(Register r1, Register r3, Register r2) { \ 783 rrd_form(op, r1, r3, r2); \ 784 } 785 786 void Assembler::rrd_form(Opcode op, Register r1, Register r3, Register r2) { 787 emit4bytes(op << 16 | r1.code() * B12 | r3.code() * B4 | r2.code()); 788 } 789 790 // RS1 format: <insn> R1,R3,D2(B2) 791 // +--------+----+----+----+-------------+ 792 // | OpCode | R1 | R3 | B2 | D2 | 793 // +--------+----+----+----+-------------+ 794 // 0 8 12 16 20 31 795 #define RS1_FORM_EMIT(name, op) \ 796 void Assembler::name(Register r1, Register r3, Register b2, Disp d2) { \ 797 rs_form(op, r1, r3, b2, d2); \ 798 } \ 799 void Assembler::name(Register r1, Register r3, const MemOperand& opnd) { \ 800 name(r1, r3, opnd.getBaseRegister(), opnd.getDisplacement()); \ 801 } 802 803 void Assembler::rs_form(Opcode op, Register r1, Register r3, Register b2, 804 const Disp d2) { 805 DCHECK(is_uint12(d2)); 806 emit4bytes(op * B24 | r1.code() * B20 | r3.code() * B16 | b2.code() * B12 | 807 d2); 808 } 809 810 // RS2 format: <insn> R1,M3,D2(B2) 811 // +--------+----+----+----+-------------+ 812 // | OpCode | R1 | M3 | B2 | D2 | 813 // +--------+----+----+----+-------------+ 814 // 0 8 12 16 20 31 815 #define RS2_FORM_EMIT(name, op) \ 816 void Assembler::name(Register r1, Condition m3, Register b2, Disp d2) { \ 817 rs_form(op, r1, m3, b2, d2); \ 818 } \ 819 void Assembler::name(Register r1, Condition m3, const MemOperand& opnd) { \ 820 name(r1, m3, opnd.getBaseRegister(), opnd.getDisplacement()); \ 821 } 822 823 void Assembler::rs_form(Opcode op, Register r1, Condition m3, Register b2, 824 const Disp d2) { 825 DCHECK(is_uint12(d2)); 826 emit4bytes(op * B24 | r1.code() * B20 | m3 * B16 | b2.code() * B12 | d2); 827 } 828 829 // RSI format: <insn> R1,R3,I2 830 // +--------+----+----+------------------+ 831 // | OpCode | R1 | R3 | RI2 | 832 // +--------+----+----+------------------+ 833 // 0 8 12 16 31 834 #define RSI_FORM_EMIT(name, op) \ 835 void Assembler::name(Register r1, Register r3, const Operand& i2) { \ 836 rsi_form(op, r1, r3, i2); \ 837 } 838 839 void Assembler::rsi_form(Opcode op, Register r1, Register r3, 840 const Operand& i2) { 841 DCHECK(is_uint8(op)); 842 DCHECK(is_uint16(i2.imm_)); 843 emit4bytes(op * B24 | r1.code() * B20 | r3.code() * B16 | (i2.imm_ & 0xFFFF)); 844 } 845 846 // RSL format: <insn> R1,R3,D2(B2) 847 // +--------+----+----+----+-------------+--------+--------+ 848 // | OpCode | L1 | | B2 | D2 | | OpCode | 849 // +--------+----+----+----+-------------+--------+--------+ 850 // 0 8 12 16 20 32 40 47 851 #define RSL_FORM_EMIT(name, op) \ 852 void Assembler::name(Length l1, Register b2, Disp d2) { \ 853 rsl_form(op, l1, b2, d2); \ 854 } 855 856 void Assembler::rsl_form(Opcode op, Length l1, Register b2, Disp d2) { 857 DCHECK(is_uint16(op)); 858 uint64_t code = (static_cast<uint64_t>(op & 0xFF00)) * B32 | 859 (static_cast<uint64_t>(l1)) * B36 | 860 (static_cast<uint64_t>(b2.code())) * B28 | 861 (static_cast<uint64_t>(d2)) * B16 | 862 (static_cast<uint64_t>(op & 0x00FF)); 863 emit6bytes(code); 864 } 865 866 // RSY1 format: <insn> R1,R3,D2(B2) 867 // +--------+----+----+----+-------------+--------+--------+ 868 // | OpCode | R1 | R3 | B2 | DL2 | DH2 | OpCode | 869 // +--------+----+----+----+-------------+--------+--------+ 870 // 0 8 12 16 20 32 40 47 871 #define RSY1_FORM_EMIT(name, op) \ 872 void Assembler::name(Register r1, Register r3, Register b2, Disp d2) { \ 873 rsy_form(op, r1, r3, b2, d2); \ 874 } \ 875 void Assembler::name(Register r1, Register r3, const MemOperand& opnd) { \ 876 name(r1, r3, opnd.getBaseRegister(), opnd.getDisplacement()); \ 877 } 878 879 void Assembler::rsy_form(Opcode op, Register r1, Register r3, Register b2, 880 const Disp d2) { 881 DCHECK(is_int20(d2)); 882 DCHECK(is_uint16(op)); 883 uint64_t code = (static_cast<uint64_t>(op & 0xFF00)) * B32 | 884 (static_cast<uint64_t>(r1.code())) * B36 | 885 (static_cast<uint64_t>(r3.code())) * B32 | 886 (static_cast<uint64_t>(b2.code())) * B28 | 887 (static_cast<uint64_t>(d2 & 0x0FFF)) * B16 | 888 (static_cast<uint64_t>(d2 & 0x0FF000)) >> 4 | 889 (static_cast<uint64_t>(op & 0x00FF)); 890 emit6bytes(code); 891 } 892 893 // RSY2 format: <insn> R1,M3,D2(B2) 894 // +--------+----+----+----+-------------+--------+--------+ 895 // | OpCode | R1 | M3 | B2 | DL2 | DH2 | OpCode | 896 // +--------+----+----+----+-------------+--------+--------+ 897 // 0 8 12 16 20 32 40 47 898 #define RSY2_FORM_EMIT(name, op) \ 899 void Assembler::name(Register r1, Condition m3, Register b2, Disp d2) { \ 900 rsy_form(op, r1, m3, b2, d2); \ 901 } \ 902 void Assembler::name(Register r1, Condition m3, const MemOperand& opnd) { \ 903 name(r1, m3, opnd.getBaseRegister(), opnd.getDisplacement()); \ 904 } 905 906 void Assembler::rsy_form(Opcode op, Register r1, Condition m3, Register b2, 907 const Disp d2) { 908 DCHECK(is_int20(d2)); 909 DCHECK(is_uint16(op)); 910 uint64_t code = (static_cast<uint64_t>(op & 0xFF00)) * B32 | 911 (static_cast<uint64_t>(r1.code())) * B36 | 912 (static_cast<uint64_t>(m3)) * B32 | 913 (static_cast<uint64_t>(b2.code())) * B28 | 914 (static_cast<uint64_t>(d2 & 0x0FFF)) * B16 | 915 (static_cast<uint64_t>(d2 & 0x0FF000)) >> 4 | 916 (static_cast<uint64_t>(op & 0x00FF)); 917 emit6bytes(code); 918 } 919 920 // RXE format: <insn> R1,D2(X2,B2) 921 // +--------+----+----+----+-------------+--------+--------+ 922 // | OpCode | R1 | X2 | B2 | D2 |////////| OpCode | 923 // +--------+----+----+----+-------------+--------+--------+ 924 // 0 8 12 16 20 32 40 47 925 #define RXE_FORM_EMIT(name, op) \ 926 void Assembler::name(Register r1, Register x2, Register b2, Disp d2) { \ 927 rxe_form(op, r1, x2, b2, d2); \ 928 } \ 929 void Assembler::name(Register r1, const MemOperand& opnd) { \ 930 name(r1, opnd.getIndexRegister(), opnd.getBaseRegister(), \ 931 opnd.getDisplacement()); \ 932 } 933 934 void Assembler::rxe_form(Opcode op, Register r1, Register x2, Register b2, 935 Disp d2) { 936 DCHECK(is_uint12(d2)); 937 DCHECK(is_uint16(op)); 938 uint64_t code = (static_cast<uint64_t>(op & 0xFF00)) * B32 | 939 (static_cast<uint64_t>(r1.code())) * B36 | 940 (static_cast<uint64_t>(x2.code())) * B32 | 941 (static_cast<uint64_t>(b2.code())) * B28 | 942 (static_cast<uint64_t>(d2 & 0x0FFF)) * B16 | 943 (static_cast<uint64_t>(op & 0x00FF)); 944 emit6bytes(code); 945 } 946 947 // RXY format: <insn> R1,D2(X2,B2) 948 // +--------+----+----+----+-------------+--------+--------+ 949 // | OpCode | R1 | X2 | B2 | DL2 | DH2 | OpCode | 950 // +--------+----+----+----+-------------+--------+--------+ 951 // 0 8 12 16 20 32 36 40 47 952 #define RXY_FORM_EMIT(name, op) \ 953 void Assembler::name(Register r1, Register x2, Register b2, Disp d2) { \ 954 rxy_form(op, r1, x2, b2, d2); \ 955 } \ 956 void Assembler::name(Register r1, const MemOperand& opnd) { \ 957 name(r1, opnd.getIndexRegister(), opnd.getBaseRegister(), \ 958 opnd.getDisplacement()); \ 959 } 960 961 void Assembler::rxy_form(Opcode op, Register r1, Register x2, Register b2, 962 Disp d2) { 963 DCHECK(is_int20(d2)); 964 DCHECK(is_uint16(op)); 965 uint64_t code = (static_cast<uint64_t>(op & 0xFF00)) * B32 | 966 (static_cast<uint64_t>(r1.code())) * B36 | 967 (static_cast<uint64_t>(x2.code())) * B32 | 968 (static_cast<uint64_t>(b2.code())) * B28 | 969 (static_cast<uint64_t>(d2 & 0x0FFF)) * B16 | 970 (static_cast<uint64_t>(d2 & 0x0FF000)) >> 4 | 971 (static_cast<uint64_t>(op & 0x00FF)); 972 emit6bytes(code); 973 } 974 975 void Assembler::rxy_form(Opcode op, DoubleRegister r1, Register x2, Register b2, 976 Disp d2) { 977 DCHECK(is_int20(d2)); 978 DCHECK(is_uint16(op)); 979 uint64_t code = (static_cast<uint64_t>(op & 0xFF00)) * B32 | 980 (static_cast<uint64_t>(r1.code())) * B36 | 981 (static_cast<uint64_t>(x2.code())) * B32 | 982 (static_cast<uint64_t>(b2.code())) * B28 | 983 (static_cast<uint64_t>(d2 & 0x0FFF)) * B16 | 984 (static_cast<uint64_t>(d2 & 0x0FF000)) >> 4 | 985 (static_cast<uint64_t>(op & 0x00FF)); 986 emit6bytes(code); 987 } 988 989 // RRS format: <insn> R1,R2,M3,D4(B4) 990 // +--------+----+----+----+-------------+----+---+--------+ 991 // | OpCode | R1 | R2 | B4 | D4 | M3 |///| OpCode | 992 // +--------+----+----+----+-------------+----+---+--------+ 993 // 0 8 12 16 20 32 36 40 47 994 #define RRS_FORM_EMIT(name, op) \ 995 void Assembler::name(Register r1, Register r2, Register b4, Disp d4, \ 996 Condition m3) { \ 997 rrs_form(op, r1, r2, b4, d4, m3); \ 998 } \ 999 void Assembler::name(Register r1, Register r2, Condition m3, \ 1000 const MemOperand& opnd) { \ 1001 name(r1, r2, opnd.getBaseRegister(), opnd.getDisplacement(), m3); \ 1002 } 1003 1004 void Assembler::rrs_form(Opcode op, Register r1, Register r2, Register b4, 1005 Disp d4, Condition m3) { 1006 DCHECK(is_uint12(d4)); 1007 DCHECK(is_uint16(op)); 1008 uint64_t code = (static_cast<uint64_t>(op & 0xFF00)) * B32 | 1009 (static_cast<uint64_t>(r1.code())) * B36 | 1010 (static_cast<uint64_t>(r2.code())) * B32 | 1011 (static_cast<uint64_t>(b4.code())) * B28 | 1012 (static_cast<uint64_t>(d4)) * B16 | 1013 (static_cast<uint64_t>(m3)) << 12 | 1014 (static_cast<uint64_t>(op & 0x00FF)); 1015 emit6bytes(code); 1016 } 1017 1018 // RIS format: <insn> R1,I2,M3,D4(B4) 1019 // +--------+----+----+----+-------------+--------+--------+ 1020 // | OpCode | R1 | M3 | B4 | D4 | I2 | OpCode | 1021 // +--------+----+----+----+-------------+--------+--------+ 1022 // 0 8 12 16 20 32 40 47 1023 #define RIS_FORM_EMIT(name, op) \ 1024 void Assembler::name(Register r1, Condition m3, Register b4, Disp d4, \ 1025 const Operand& i2) { \ 1026 ris_form(op, r1, m3, b4, d4, i2); \ 1027 } \ 1028 void Assembler::name(Register r1, const Operand& i2, Condition m3, \ 1029 const MemOperand& opnd) { \ 1030 name(r1, m3, opnd.getBaseRegister(), opnd.getDisplacement(), i2); \ 1031 } 1032 1033 void Assembler::ris_form(Opcode op, Register r1, Condition m3, Register b4, 1034 Disp d4, const Operand& i2) { 1035 DCHECK(is_uint12(d4)); 1036 DCHECK(is_uint16(op)); 1037 DCHECK(is_uint8(i2.imm_)); 1038 uint64_t code = (static_cast<uint64_t>(op & 0xFF00)) * B32 | 1039 (static_cast<uint64_t>(r1.code())) * B36 | 1040 (static_cast<uint64_t>(m3)) * B32 | 1041 (static_cast<uint64_t>(b4.code())) * B28 | 1042 (static_cast<uint64_t>(d4)) * B16 | 1043 (static_cast<uint64_t>(i2.imm_)) << 8 | 1044 (static_cast<uint64_t>(op & 0x00FF)); 1045 emit6bytes(code); 1046 } 1047 1048 // S format: <insn> D2(B2) 1049 // +------------------+----+-------------+ 1050 // | OpCode | B2 | D2 | 1051 // +------------------+----+-------------+ 1052 // 0 16 20 31 1053 #define S_FORM_EMIT(name, op) \ 1054 void Assembler::name(Register b1, Disp d2) { s_form(op, b1, d2); } \ 1055 void Assembler::name(const MemOperand& opnd) { \ 1056 name(opnd.getBaseRegister(), opnd.getDisplacement()); \ 1057 } 1058 1059 void Assembler::s_form(Opcode op, Register b1, Disp d2) { 1060 DCHECK(is_uint12(d2)); 1061 emit4bytes(op << 16 | b1.code() * B12 | d2); 1062 } 1063 1064 // SI format: <insn> D1(B1),I2 1065 // +--------+---------+----+-------------+ 1066 // | OpCode | I2 | B1 | D1 | 1067 // +--------+---------+----+-------------+ 1068 // 0 8 16 20 31 1069 #define SI_FORM_EMIT(name, op) \ 1070 void Assembler::name(const Operand& i2, Register b1, Disp d1) { \ 1071 si_form(op, i2, b1, d1); \ 1072 } \ 1073 void Assembler::name(const MemOperand& opnd, const Operand& i2) { \ 1074 name(i2, opnd.getBaseRegister(), opnd.getDisplacement()); \ 1075 } 1076 1077 void Assembler::si_form(Opcode op, const Operand& i2, Register b1, Disp d1) { 1078 emit4bytes((op & 0x00FF) << 24 | i2.imm_ * B16 | b1.code() * B12 | d1); 1079 } 1080 1081 // SIY format: <insn> D1(B1),I2 1082 // +--------+---------+----+-------------+--------+--------+ 1083 // | OpCode | I2 | B1 | DL1 | DH1 | OpCode | 1084 // +--------+---------+----+-------------+--------+--------+ 1085 // 0 8 16 20 32 36 40 47 1086 #define SIY_FORM_EMIT(name, op) \ 1087 void Assembler::name(const Operand& i2, Register b1, Disp d1) { \ 1088 siy_form(op, i2, b1, d1); \ 1089 } \ 1090 void Assembler::name(const MemOperand& opnd, const Operand& i2) { \ 1091 name(i2, opnd.getBaseRegister(), opnd.getDisplacement()); \ 1092 } 1093 1094 void Assembler::siy_form(Opcode op, const Operand& i2, Register b1, Disp d1) { 1095 DCHECK(is_uint20(d1)); 1096 DCHECK(is_uint16(op)); 1097 DCHECK(is_uint8(i2.imm_)); 1098 uint64_t code = (static_cast<uint64_t>(op & 0xFF00)) * B32 | 1099 (static_cast<uint64_t>(i2.imm_)) * B32 | 1100 (static_cast<uint64_t>(b1.code())) * B28 | 1101 (static_cast<uint64_t>(d1 & 0x0FFF)) * B16 | 1102 (static_cast<uint64_t>(d1 & 0x0FF000)) >> 4 | 1103 (static_cast<uint64_t>(op & 0x00FF)); 1104 emit6bytes(code); 1105 } 1106 1107 // SIL format: <insn> D1(B1),I2 1108 // +------------------+----+-------------+-----------------+ 1109 // | OpCode | B1 | D1 | I2 | 1110 // +------------------+----+-------------+-----------------+ 1111 // 0 16 20 32 47 1112 #define SIL_FORM_EMIT(name, op) \ 1113 void Assembler::name(Register b1, Disp d1, const Operand& i2) { \ 1114 sil_form(op, b1, d1, i2); \ 1115 } \ 1116 void Assembler::name(const MemOperand& opnd, const Operand& i2) { \ 1117 name(opnd.getBaseRegister(), opnd.getDisplacement(), i2); \ 1118 } 1119 1120 void Assembler::sil_form(Opcode op, Register b1, Disp d1, const Operand& i2) { 1121 DCHECK(is_uint12(d1)); 1122 DCHECK(is_uint16(op)); 1123 DCHECK(is_uint16(i2.imm_)); 1124 uint64_t code = (static_cast<uint64_t>(op)) * B32 | 1125 (static_cast<uint64_t>(b1.code())) * B28 | 1126 (static_cast<uint64_t>(d1)) * B16 | 1127 (static_cast<uint64_t>(i2.imm_)); 1128 emit6bytes(code); 1129 } 1130 1131 // RXF format: <insn> R1,R3,D2(X2,B2) 1132 // +--------+----+----+----+-------------+----+---+--------+ 1133 // | OpCode | R3 | X2 | B2 | D2 | R1 |///| OpCode | 1134 // +--------+----+----+----+-------------+----+---+--------+ 1135 // 0 8 12 16 20 32 36 40 47 1136 #define RXF_FORM_EMIT(name, op) \ 1137 void Assembler::name(Register r1, Register r3, Register b2, Register x2, \ 1138 Disp d2) { \ 1139 rxf_form(op, r1, r3, b2, x2, d2); \ 1140 } \ 1141 void Assembler::name(Register r1, Register r3, const MemOperand& opnd) { \ 1142 name(r1, r3, opnd.getBaseRegister(), opnd.getIndexRegister(), \ 1143 opnd.getDisplacement()); \ 1144 } 1145 1146 void Assembler::rxf_form(Opcode op, Register r1, Register r3, Register b2, 1147 Register x2, Disp d2) { 1148 DCHECK(is_uint12(d2)); 1149 DCHECK(is_uint16(op)); 1150 uint64_t code = (static_cast<uint64_t>(op & 0xFF00)) * B32 | 1151 (static_cast<uint64_t>(r3.code())) * B36 | 1152 (static_cast<uint64_t>(x2.code())) * B32 | 1153 (static_cast<uint64_t>(b2.code())) * B28 | 1154 (static_cast<uint64_t>(d2)) * B16 | 1155 (static_cast<uint64_t>(r1.code())) * B12 | 1156 (static_cast<uint64_t>(op & 0x00FF)); 1157 emit6bytes(code); 1158 } 1159 1160 // SS1 format: <insn> D1(L,B1),D2(B3) 1161 // +--------+----+----+----+-------------+----+------------+ 1162 // | OpCode | L | B1 | D1 | B2 | D2 | 1163 // +--------+----+----+----+-------------+----+------------+ 1164 // 0 8 12 16 20 32 36 47 1165 #define SS1_FORM_EMIT(name, op) \ 1166 void Assembler::name(Register b1, Disp d1, Register b2, Disp d2, Length l) { \ 1167 ss_form(op, l, b1, d1, b2, d2); \ 1168 } \ 1169 void Assembler::name(const MemOperand& opnd1, const MemOperand& opnd2, \ 1170 Length length) { \ 1171 name(opnd1.getBaseRegister(), opnd1.getDisplacement(), \ 1172 opnd2.getBaseRegister(), opnd2.getDisplacement(), length); \ 1173 } 1174 1175 void Assembler::ss_form(Opcode op, Length l, Register b1, Disp d1, Register b2, 1176 Disp d2) { 1177 DCHECK(is_uint12(d2)); 1178 DCHECK(is_uint12(d1)); 1179 DCHECK(is_uint8(op)); 1180 DCHECK(is_uint8(l)); 1181 uint64_t code = 1182 (static_cast<uint64_t>(op)) * B40 | (static_cast<uint64_t>(l)) * B32 | 1183 (static_cast<uint64_t>(b1.code())) * B28 | 1184 (static_cast<uint64_t>(d1)) * B16 | 1185 (static_cast<uint64_t>(b2.code())) * B12 | (static_cast<uint64_t>(d2)); 1186 emit6bytes(code); 1187 } 1188 1189 // SS2 format: <insn> D1(L1,B1), D2(L3,B3) 1190 // +--------+----+----+----+-------------+----+------------+ 1191 // | OpCode | L1 | L2 | B1 | D1 | B2 | D2 | 1192 // +--------+----+----+----+-------------+----+------------+ 1193 // 0 8 12 16 20 32 36 47 1194 #define SS2_FORM_EMIT(name, op) \ 1195 void Assembler::name(Register b1, Disp d1, Register b2, Disp d2, Length l1, \ 1196 Length l2) { \ 1197 ss_form(op, l1, l2, b1, d1, b2, d2); \ 1198 } \ 1199 void Assembler::name(const MemOperand& opnd1, const MemOperand& opnd2, \ 1200 Length length1, Length length2) { \ 1201 name(opnd1.getBaseRegister(), opnd1.getDisplacement(), \ 1202 opnd2.getBaseRegister(), opnd2.getDisplacement(), length1, length2); \ 1203 } 1204 1205 void Assembler::ss_form(Opcode op, Length l1, Length l2, Register b1, Disp d1, 1206 Register b2, Disp d2) { 1207 DCHECK(is_uint12(d2)); 1208 DCHECK(is_uint12(d1)); 1209 DCHECK(is_uint8(op)); 1210 DCHECK(is_uint4(l2)); 1211 DCHECK(is_uint4(l1)); 1212 uint64_t code = 1213 (static_cast<uint64_t>(op)) * B40 | (static_cast<uint64_t>(l1)) * B36 | 1214 (static_cast<uint64_t>(l2)) * B32 | 1215 (static_cast<uint64_t>(b1.code())) * B28 | 1216 (static_cast<uint64_t>(d1)) * B16 | 1217 (static_cast<uint64_t>(b2.code())) * B12 | (static_cast<uint64_t>(d2)); 1218 emit6bytes(code); 1219 } 1220 1221 // SS3 format: <insn> D1(L1,B1), D2(I3,B2) 1222 // +--------+----+----+----+-------------+----+------------+ 1223 // | OpCode | L1 | I3 | B1 | D1 | B2 | D2 | 1224 // +--------+----+----+----+-------------+----+------------+ 1225 // 0 8 12 16 20 32 36 47 1226 #define SS3_FORM_EMIT(name, op) \ 1227 void Assembler::name(const Operand& i3, Register b1, Disp d1, Register b2, \ 1228 Disp d2, Length l1) { \ 1229 ss_form(op, l1, i3, b1, d1, b2, d2); \ 1230 } \ 1231 void Assembler::name(const MemOperand& opnd1, const MemOperand& opnd2, \ 1232 Length length) { \ 1233 DCHECK(false); \ 1234 } 1235 void Assembler::ss_form(Opcode op, Length l1, const Operand& i3, Register b1, 1236 Disp d1, Register b2, Disp d2) { 1237 DCHECK(is_uint12(d2)); 1238 DCHECK(is_uint12(d1)); 1239 DCHECK(is_uint8(op)); 1240 DCHECK(is_uint4(l1)); 1241 DCHECK(is_uint4(i3.imm_)); 1242 uint64_t code = 1243 (static_cast<uint64_t>(op)) * B40 | (static_cast<uint64_t>(l1)) * B36 | 1244 (static_cast<uint64_t>(i3.imm_)) * B32 | 1245 (static_cast<uint64_t>(b1.code())) * B28 | 1246 (static_cast<uint64_t>(d1)) * B16 | 1247 (static_cast<uint64_t>(b2.code())) * B12 | (static_cast<uint64_t>(d2)); 1248 emit6bytes(code); 1249 } 1250 1251 // SS4 format: <insn> D1(R1,B1), D2(R3,B2) 1252 // +--------+----+----+----+-------------+----+------------+ 1253 // | OpCode | R1 | R3 | B1 | D1 | B2 | D2 | 1254 // +--------+----+----+----+-------------+----+------------+ 1255 // 0 8 12 16 20 32 36 47 1256 #define SS4_FORM_EMIT(name, op) \ 1257 void Assembler::name(Register r1, Register r3, Register b1, Disp d1, \ 1258 Register b2, Disp d2) { \ 1259 ss_form(op, r1, r3, b1, d1, b2, d2); \ 1260 } \ 1261 void Assembler::name(const MemOperand& opnd1, const MemOperand& opnd2) { \ 1262 DCHECK(false); \ 1263 } 1264 void Assembler::ss_form(Opcode op, Register r1, Register r3, Register b1, 1265 Disp d1, Register b2, Disp d2) { 1266 DCHECK(is_uint12(d2)); 1267 DCHECK(is_uint12(d1)); 1268 DCHECK(is_uint8(op)); 1269 uint64_t code = (static_cast<uint64_t>(op)) * B40 | 1270 (static_cast<uint64_t>(r1.code())) * B36 | 1271 (static_cast<uint64_t>(r3.code())) * B32 | 1272 (static_cast<uint64_t>(b1.code())) * B28 | 1273 (static_cast<uint64_t>(d1)) * B16 | 1274 (static_cast<uint64_t>(b2.code())) * B12 | 1275 (static_cast<uint64_t>(d2)); 1276 emit6bytes(code); 1277 } 1278 1279 // SS5 format: <insn> D1(R1,B1), D2(R3,B2) 1280 // +--------+----+----+----+-------------+----+------------+ 1281 // | OpCode | R1 | R3 | B2 | D2 | B4 | D4 | 1282 // +--------+----+----+----+-------------+----+------------+ 1283 // 0 8 12 16 20 32 36 47 1284 #define SS5_FORM_EMIT(name, op) \ 1285 void Assembler::name(Register r1, Register r3, Register b2, Disp d2, \ 1286 Register b4, Disp d4) { \ 1287 ss_form(op, r1, r3, b2, d2, b4, d4); /*SS5 use the same form as SS4*/ \ 1288 } \ 1289 void Assembler::name(const MemOperand& opnd1, const MemOperand& opnd2) { \ 1290 DCHECK(false); \ 1291 } 1292 1293 #define SS6_FORM_EMIT(name, op) SS1_FORM_EMIT(name, op) 1294 1295 // SSE format: <insn> D1(B1),D2(B2) 1296 // +------------------+----+-------------+----+------------+ 1297 // | OpCode | B1 | D1 | B2 | D2 | 1298 // +------------------+----+-------------+----+------------+ 1299 // 0 8 12 16 20 32 36 47 1300 #define SSE_FORM_EMIT(name, op) \ 1301 void Assembler::name(Register b1, Disp d1, Register b2, Disp d2) { \ 1302 sse_form(op, b1, d1, b2, d2); \ 1303 } \ 1304 void Assembler::name(const MemOperand& opnd1, const MemOperand& opnd2) { \ 1305 name(opnd1.getBaseRegister(), opnd1.getDisplacement(), \ 1306 opnd2.getBaseRegister(), opnd2.getDisplacement()); \ 1307 } 1308 void Assembler::sse_form(Opcode op, Register b1, Disp d1, Register b2, 1309 Disp d2) { 1310 DCHECK(is_uint12(d2)); 1311 DCHECK(is_uint12(d1)); 1312 DCHECK(is_uint16(op)); 1313 uint64_t code = (static_cast<uint64_t>(op)) * B32 | 1314 (static_cast<uint64_t>(b1.code())) * B28 | 1315 (static_cast<uint64_t>(d1)) * B16 | 1316 (static_cast<uint64_t>(b2.code())) * B12 | 1317 (static_cast<uint64_t>(d2)); 1318 emit6bytes(code); 1319 } 1320 1321 // SSF format: <insn> R3, D1(B1),D2(B2),R3 1322 // +--------+----+----+----+-------------+----+------------+ 1323 // | OpCode | R3 |OpCd| B1 | D1 | B2 | D2 | 1324 // +--------+----+----+----+-------------+----+------------+ 1325 // 0 8 12 16 20 32 36 47 1326 #define SSF_FORM_EMIT(name, op) \ 1327 void Assembler::name(Register r3, Register b1, Disp d1, Register b2, \ 1328 Disp d2) { \ 1329 ssf_form(op, r3, b1, d1, b2, d2); \ 1330 } \ 1331 void Assembler::name(Register r3, const MemOperand& opnd1, \ 1332 const MemOperand& opnd2) { \ 1333 name(r3, opnd1.getBaseRegister(), opnd1.getDisplacement(), \ 1334 opnd2.getBaseRegister(), opnd2.getDisplacement()); \ 1335 } 1336 1337 void Assembler::ssf_form(Opcode op, Register r3, Register b1, Disp d1, 1338 Register b2, Disp d2) { 1339 DCHECK(is_uint12(d2)); 1340 DCHECK(is_uint12(d1)); 1341 DCHECK(is_uint12(op)); 1342 uint64_t code = (static_cast<uint64_t>(op & 0xFF0)) * B36 | 1343 (static_cast<uint64_t>(r3.code())) * B36 | 1344 (static_cast<uint64_t>(op & 0x00F)) * B32 | 1345 (static_cast<uint64_t>(b1.code())) * B28 | 1346 (static_cast<uint64_t>(d1)) * B16 | 1347 (static_cast<uint64_t>(b2.code())) * B12 | 1348 (static_cast<uint64_t>(d2)); 1349 emit6bytes(code); 1350 } 1351 1352 // RRF1 format: <insn> R1,R2,R3 1353 // +------------------+----+----+----+----+ 1354 // | OpCode | R3 | | R1 | R2 | 1355 // +------------------+----+----+----+----+ 1356 // 0 16 20 24 28 31 1357 #define RRF1_FORM_EMIT(name, op) \ 1358 void Assembler::name(Register r1, Register r2, Register r3) { \ 1359 rrf1_form(op << 16 | r3.code() * B12 | r1.code() * B4 | r2.code()); \ 1360 } 1361 1362 void Assembler::rrf1_form(Opcode op, Register r1, Register r2, Register r3) { 1363 uint32_t code = op << 16 | r3.code() * B12 | r1.code() * B4 | r2.code(); 1364 emit4bytes(code); 1365 } 1366 1367 void Assembler::rrf1_form(uint32_t code) { emit4bytes(code); } 1368 1369 // RRF2 format: <insn> R1,R2,M3 1370 // +------------------+----+----+----+----+ 1371 // | OpCode | M3 | | R1 | R2 | 1372 // +------------------+----+----+----+----+ 1373 // 0 16 20 24 28 31 1374 #define RRF2_FORM_EMIT(name, op) \ 1375 void Assembler::name(Condition m3, Register r1, Register r2) { \ 1376 rrf2_form(op << 16 | m3 * B12 | r1.code() * B4 | r2.code()); \ 1377 } 1378 1379 void Assembler::rrf2_form(uint32_t code) { emit4bytes(code); } 1380 1381 // RRF3 format: <insn> R1,R2,R3,M4 1382 // +------------------+----+----+----+----+ 1383 // | OpCode | R3 | M4 | R1 | R2 | 1384 // +------------------+----+----+----+----+ 1385 // 0 16 20 24 28 31 1386 #define RRF3_FORM_EMIT(name, op) \ 1387 void Assembler::name(Register r3, Conition m4, Register r1, Register r2) { \ 1388 rrf3_form(op << 16 | r3.code() * B12 | m4 * B8 | r1.code() * B4 | \ 1389 r2.code()); \ 1390 } 1391 1392 void Assembler::rrf3_form(uint32_t code) { emit4bytes(code); } 1393 1394 // RRF-e format: <insn> R1,M3,R2,M4 1395 // +------------------+----+----+----+----+ 1396 // | OpCode | M3 | M4 | R1 | R2 | 1397 // +------------------+----+----+----+----+ 1398 // 0 16 20 24 28 31 1399 void Assembler::rrfe_form(Opcode op, Condition m3, Condition m4, Register r1, 1400 Register r2) { 1401 uint32_t code = op << 16 | m3 * B12 | m4 * B8 | r1.code() * B4 | r2.code(); 1402 emit4bytes(code); 1403 } 1404 1405 // end of S390 Instruction generation 1406 1407 // start of S390 instruction 1408 RX_FORM_EMIT(bc, BC) 1409 RR_FORM_EMIT(bctr, BCTR) 1410 RXE_FORM_EMIT(ceb, CEB) 1411 RRE_FORM_EMIT(cefbr, CEFBR) 1412 SS1_FORM_EMIT(ed, ED) 1413 RX_FORM_EMIT(ex, EX) 1414 RRE_FORM_EMIT(flogr, FLOGR) 1415 RRE_FORM_EMIT(lcgr, LCGR) 1416 RR_FORM_EMIT(lcr, LCR) 1417 RX_FORM_EMIT(le_z, LE) 1418 RXY_FORM_EMIT(ley, LEY) 1419 RIL1_FORM_EMIT(llihf, LLIHF) 1420 RIL1_FORM_EMIT(llilf, LLILF) 1421 RRE_FORM_EMIT(lngr, LNGR) 1422 RR_FORM_EMIT(lnr, LNR) 1423 RSY1_FORM_EMIT(loc, LOC) 1424 RXY_FORM_EMIT(lrv, LRV) 1425 RXY_FORM_EMIT(lrvh, LRVH) 1426 SS1_FORM_EMIT(mvn, MVN) 1427 SS1_FORM_EMIT(nc, NC) 1428 SI_FORM_EMIT(ni, NI) 1429 RIL1_FORM_EMIT(nihf, NIHF) 1430 RIL1_FORM_EMIT(nilf, NILF) 1431 RI1_FORM_EMIT(nilh, NILH) 1432 RI1_FORM_EMIT(nill, NILL) 1433 RIL1_FORM_EMIT(oihf, OIHF) 1434 RIL1_FORM_EMIT(oilf, OILF) 1435 RI1_FORM_EMIT(oill, OILL) 1436 RRE_FORM_EMIT(popcnt, POPCNT_Z) 1437 RIL1_FORM_EMIT(slfi, SLFI) 1438 RXY_FORM_EMIT(slgf, SLGF) 1439 RIL1_FORM_EMIT(slgfi, SLGFI) 1440 RXY_FORM_EMIT(strv, STRV) 1441 RI1_FORM_EMIT(tmll, TMLL) 1442 SS1_FORM_EMIT(tr, TR) 1443 S_FORM_EMIT(ts, TS) 1444 RIL1_FORM_EMIT(xihf, XIHF) 1445 RIL1_FORM_EMIT(xilf, XILF) 1446 1447 // ------------------------- 1448 // Load Address Instructions 1449 // ------------------------- 1450 // Load Address Register-Storage 1451 void Assembler::la(Register r1, const MemOperand& opnd) { 1452 rx_form(LA, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1453 } 1454 1455 // Load Address Register-Storage 1456 void Assembler::lay(Register r1, const MemOperand& opnd) { 1457 rxy_form(LAY, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1458 } 1459 1460 // Load Address Relative Long 1461 void Assembler::larl(Register r1, const Operand& opnd) { 1462 ril_form(LARL, r1, opnd); 1463 } 1464 1465 // Load Address Relative Long 1466 void Assembler::larl(Register r1, Label* l) { 1467 larl(r1, Operand(branch_offset(l))); 1468 } 1469 1470 // ----------------- 1471 // Load Instructions 1472 // ----------------- 1473 // Load Byte Register-Storage (32<-8) 1474 void Assembler::lb(Register r, const MemOperand& src) { 1475 rxy_form(LB, r, src.rx(), src.rb(), src.offset()); 1476 } 1477 1478 // Load Byte Register-Register (32<-8) 1479 void Assembler::lbr(Register r1, Register r2) { rre_form(LBR, r1, r2); } 1480 1481 // Load Byte Register-Storage (64<-8) 1482 void Assembler::lgb(Register r, const MemOperand& src) { 1483 rxy_form(LGB, r, src.rx(), src.rb(), src.offset()); 1484 } 1485 1486 // Load Byte Register-Register (64<-8) 1487 void Assembler::lgbr(Register r1, Register r2) { rre_form(LGBR, r1, r2); } 1488 1489 // Load Halfword Register-Storage (32<-16) 1490 void Assembler::lh(Register r, const MemOperand& src) { 1491 rx_form(LH, r, src.rx(), src.rb(), src.offset()); 1492 } 1493 1494 // Load Halfword Register-Storage (32<-16) 1495 void Assembler::lhy(Register r, const MemOperand& src) { 1496 rxy_form(LHY, r, src.rx(), src.rb(), src.offset()); 1497 } 1498 1499 // Load Halfword Register-Register (32<-16) 1500 void Assembler::lhr(Register r1, Register r2) { rre_form(LHR, r1, r2); } 1501 1502 // Load Halfword Register-Storage (64<-16) 1503 void Assembler::lgh(Register r, const MemOperand& src) { 1504 rxy_form(LGH, r, src.rx(), src.rb(), src.offset()); 1505 } 1506 1507 // Load Halfword Register-Register (64<-16) 1508 void Assembler::lghr(Register r1, Register r2) { rre_form(LGHR, r1, r2); } 1509 1510 // Load Register-Storage (32) 1511 void Assembler::l(Register r, const MemOperand& src) { 1512 rx_form(L, r, src.rx(), src.rb(), src.offset()); 1513 } 1514 1515 // Load Register-Storage (32) 1516 void Assembler::ly(Register r, const MemOperand& src) { 1517 rxy_form(LY, r, src.rx(), src.rb(), src.offset()); 1518 } 1519 1520 // Load Register-Register (32) 1521 void Assembler::lr(Register r1, Register r2) { rr_form(LR, r1, r2); } 1522 1523 // Load Register-Storage (64) 1524 void Assembler::lg(Register r, const MemOperand& src) { 1525 rxy_form(LG, r, src.rx(), src.rb(), src.offset()); 1526 } 1527 1528 // Load Register-Register (64) 1529 void Assembler::lgr(Register r1, Register r2) { rre_form(LGR, r1, r2); } 1530 1531 // Load Register-Storage (64<-32) 1532 void Assembler::lgf(Register r, const MemOperand& src) { 1533 rxy_form(LGF, r, src.rx(), src.rb(), src.offset()); 1534 } 1535 1536 // Load Sign Extended Register-Register (64<-32) 1537 void Assembler::lgfr(Register r1, Register r2) { rre_form(LGFR, r1, r2); } 1538 1539 // Load Halfword Immediate (32) 1540 void Assembler::lhi(Register r, const Operand& imm) { ri_form(LHI, r, imm); } 1541 1542 // Load Halfword Immediate (64) 1543 void Assembler::lghi(Register r, const Operand& imm) { ri_form(LGHI, r, imm); } 1544 1545 // -------------------------- 1546 // Load And Test Instructions 1547 // -------------------------- 1548 // Load and Test Register-Storage (32) 1549 void Assembler::lt_z(Register r1, const MemOperand& opnd) { 1550 rxy_form(LT, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1551 } 1552 1553 // Load and Test Register-Storage (64) 1554 void Assembler::ltg(Register r1, const MemOperand& opnd) { 1555 rxy_form(LTG, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1556 } 1557 1558 // Load and Test Register-Register (32) 1559 void Assembler::ltr(Register r1, Register r2) { rr_form(LTR, r1, r2); } 1560 1561 // Load and Test Register-Register (64) 1562 void Assembler::ltgr(Register r1, Register r2) { rre_form(LTGR, r1, r2); } 1563 1564 // Load and Test Register-Register (64<-32) 1565 void Assembler::ltgfr(Register r1, Register r2) { rre_form(LTGFR, r1, r2); } 1566 1567 // ------------------------- 1568 // Load Logical Instructions 1569 // ------------------------- 1570 // Load Logical Character (32) - loads a byte and zero ext. 1571 void Assembler::llc(Register r1, const MemOperand& opnd) { 1572 rxy_form(LLC, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1573 } 1574 1575 // Load Logical Character (64) - loads a byte and zero ext. 1576 void Assembler::llgc(Register r1, const MemOperand& opnd) { 1577 rxy_form(LLGC, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1578 } 1579 1580 // Load Logical halfword Register-Storage (64<-32) 1581 void Assembler::llgf(Register r1, const MemOperand& opnd) { 1582 rxy_form(LLGF, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1583 } 1584 1585 // Load Logical Register-Register (64<-32) 1586 void Assembler::llgfr(Register r1, Register r2) { rre_form(LLGFR, r1, r2); } 1587 1588 // Load Logical halfword Register-Storage (32) 1589 void Assembler::llh(Register r1, const MemOperand& opnd) { 1590 rxy_form(LLH, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1591 } 1592 1593 // Load Logical halfword Register-Storage (64) 1594 void Assembler::llgh(Register r1, const MemOperand& opnd) { 1595 rxy_form(LLGH, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1596 } 1597 1598 // Load Logical halfword Register-Register (32) 1599 void Assembler::llhr(Register r1, Register r2) { rre_form(LLHR, r1, r2); } 1600 1601 // Load Logical halfword Register-Register (64) 1602 void Assembler::llghr(Register r1, Register r2) { rre_form(LLGHR, r1, r2); } 1603 1604 // ------------------- 1605 // Branch Instructions 1606 // ------------------- 1607 // Branch and Save 1608 void Assembler::basr(Register r1, Register r2) { rr_form(BASR, r1, r2); } 1609 1610 // Indirect Conditional Branch via register 1611 void Assembler::bcr(Condition m, Register target) { rr_form(BCR, m, target); } 1612 1613 // Branch on Count (32) 1614 void Assembler::bct(Register r, const MemOperand& opnd) { 1615 rx_form(BCT, r, opnd.rx(), opnd.rb(), opnd.offset()); 1616 } 1617 1618 // Branch on Count (64) 1619 void Assembler::bctg(Register r, const MemOperand& opnd) { 1620 rxy_form(BCTG, r, opnd.rx(), opnd.rb(), opnd.offset()); 1621 } 1622 1623 // Branch Relative and Save (32) 1624 void Assembler::bras(Register r, const Operand& opnd) { 1625 ri_form(BRAS, r, opnd); 1626 } 1627 1628 // Branch Relative and Save (64) 1629 void Assembler::brasl(Register r, const Operand& opnd) { 1630 ril_form(BRASL, r, opnd); 1631 } 1632 1633 // Branch relative on Condition (32) 1634 void Assembler::brc(Condition c, const Operand& opnd) { 1635 // BRC actually encodes # of halfwords, so divide by 2. 1636 int16_t numHalfwords = static_cast<int16_t>(opnd.immediate()) / 2; 1637 Operand halfwordOp = Operand(numHalfwords); 1638 halfwordOp.setBits(16); 1639 ri_form(BRC, c, halfwordOp); 1640 } 1641 1642 // Branch Relative on Condition (64) 1643 void Assembler::brcl(Condition c, const Operand& opnd, bool isCodeTarget) { 1644 Operand halfwordOp = opnd; 1645 // Operand for code targets will be index to code_targets_ 1646 if (!isCodeTarget) { 1647 // BRCL actually encodes # of halfwords, so divide by 2. 1648 int32_t numHalfwords = static_cast<int32_t>(opnd.immediate()) / 2; 1649 halfwordOp = Operand(numHalfwords); 1650 } 1651 ril_form(BRCL, c, halfwordOp); 1652 } 1653 1654 // Branch On Count (32) 1655 void Assembler::brct(Register r1, const Operand& imm) { 1656 // BRCT encodes # of halfwords, so divide by 2. 1657 int16_t numHalfwords = static_cast<int16_t>(imm.immediate()) / 2; 1658 Operand halfwordOp = Operand(numHalfwords); 1659 halfwordOp.setBits(16); 1660 ri_form(BRCT, r1, halfwordOp); 1661 } 1662 1663 // Branch On Count (32) 1664 void Assembler::brctg(Register r1, const Operand& imm) { 1665 // BRCTG encodes # of halfwords, so divide by 2. 1666 int16_t numHalfwords = static_cast<int16_t>(imm.immediate()) / 2; 1667 Operand halfwordOp = Operand(numHalfwords); 1668 halfwordOp.setBits(16); 1669 ri_form(BRCTG, r1, halfwordOp); 1670 } 1671 1672 // -------------------- 1673 // Compare Instructions 1674 // -------------------- 1675 // Compare Register-Storage (32) 1676 void Assembler::c(Register r, const MemOperand& opnd) { 1677 rx_form(C, r, opnd.rx(), opnd.rb(), opnd.offset()); 1678 } 1679 1680 // Compare Register-Storage (32) 1681 void Assembler::cy(Register r, const MemOperand& opnd) { 1682 rxy_form(CY, r, opnd.rx(), opnd.rb(), opnd.offset()); 1683 } 1684 1685 // Compare Register-Register (32) 1686 void Assembler::cr_z(Register r1, Register r2) { rr_form(CR, r1, r2); } 1687 1688 // Compare Register-Storage (64) 1689 void Assembler::cg(Register r, const MemOperand& opnd) { 1690 rxy_form(CG, r, opnd.rx(), opnd.rb(), opnd.offset()); 1691 } 1692 1693 // Compare Register-Register (64) 1694 void Assembler::cgr(Register r1, Register r2) { rre_form(CGR, r1, r2); } 1695 1696 // Compare Halfword Register-Storage (32) 1697 void Assembler::ch(Register r, const MemOperand& opnd) { 1698 rx_form(CH, r, opnd.rx(), opnd.rb(), opnd.offset()); 1699 } 1700 1701 // Compare Halfword Register-Storage (32) 1702 void Assembler::chy(Register r, const MemOperand& opnd) { 1703 rxy_form(CHY, r, opnd.rx(), opnd.rb(), opnd.offset()); 1704 } 1705 1706 // Compare Halfword Immediate (32) 1707 void Assembler::chi(Register r, const Operand& opnd) { ri_form(CHI, r, opnd); } 1708 1709 // Compare Halfword Immediate (64) 1710 void Assembler::cghi(Register r, const Operand& opnd) { 1711 ri_form(CGHI, r, opnd); 1712 } 1713 1714 // Compare Immediate (32) 1715 void Assembler::cfi(Register r, const Operand& opnd) { ril_form(CFI, r, opnd); } 1716 1717 // Compare Immediate (64) 1718 void Assembler::cgfi(Register r, const Operand& opnd) { 1719 ril_form(CGFI, r, opnd); 1720 } 1721 1722 // ---------------------------- 1723 // Compare Logical Instructions 1724 // ---------------------------- 1725 // Compare Logical Register-Storage (32) 1726 void Assembler::cl(Register r, const MemOperand& opnd) { 1727 rx_form(CL, r, opnd.rx(), opnd.rb(), opnd.offset()); 1728 } 1729 1730 // Compare Logical Register-Storage (32) 1731 void Assembler::cly(Register r, const MemOperand& opnd) { 1732 rxy_form(CLY, r, opnd.rx(), opnd.rb(), opnd.offset()); 1733 } 1734 1735 // Compare Logical Register-Register (32) 1736 void Assembler::clr(Register r1, Register r2) { rr_form(CLR, r1, r2); } 1737 1738 // Compare Logical Register-Storage (64) 1739 void Assembler::clg(Register r, const MemOperand& opnd) { 1740 rxy_form(CLG, r, opnd.rx(), opnd.rb(), opnd.offset()); 1741 } 1742 1743 // Compare Logical Register-Register (64) 1744 void Assembler::clgr(Register r1, Register r2) { rre_form(CLGR, r1, r2); } 1745 1746 // Compare Logical Immediate (32) 1747 void Assembler::clfi(Register r1, const Operand& i2) { ril_form(CLFI, r1, i2); } 1748 1749 // Compare Logical Immediate (64<32) 1750 void Assembler::clgfi(Register r1, const Operand& i2) { 1751 ril_form(CLGFI, r1, i2); 1752 } 1753 1754 // Compare Immediate (Mem - Imm) (8) 1755 void Assembler::cli(const MemOperand& opnd, const Operand& imm) { 1756 si_form(CLI, imm, opnd.rb(), opnd.offset()); 1757 } 1758 1759 // Compare Immediate (Mem - Imm) (8) 1760 void Assembler::cliy(const MemOperand& opnd, const Operand& imm) { 1761 siy_form(CLIY, imm, opnd.rb(), opnd.offset()); 1762 } 1763 1764 // Compare logical - mem to mem operation 1765 void Assembler::clc(const MemOperand& opnd1, const MemOperand& opnd2, 1766 Length length) { 1767 ss_form(CLC, length - 1, opnd1.getBaseRegister(), opnd1.getDisplacement(), 1768 opnd2.getBaseRegister(), opnd2.getDisplacement()); 1769 } 1770 1771 // ---------------------------- 1772 // Test Under Mask Instructions 1773 // ---------------------------- 1774 // Test Under Mask (Mem - Imm) (8) 1775 void Assembler::tm(const MemOperand& opnd, const Operand& imm) { 1776 si_form(TM, imm, opnd.rb(), opnd.offset()); 1777 } 1778 1779 // Test Under Mask (Mem - Imm) (8) 1780 void Assembler::tmy(const MemOperand& opnd, const Operand& imm) { 1781 siy_form(TMY, imm, opnd.rb(), opnd.offset()); 1782 } 1783 1784 // ------------------------------- 1785 // Rotate and Insert Selected Bits 1786 // ------------------------------- 1787 // Rotate-And-Insert-Selected-Bits 1788 void Assembler::risbg(Register dst, Register src, const Operand& startBit, 1789 const Operand& endBit, const Operand& shiftAmt, 1790 bool zeroBits) { 1791 // High tag the top bit of I4/EndBit to zero out any unselected bits 1792 if (zeroBits) 1793 rie_f_form(RISBG, dst, src, startBit, Operand(endBit.imm_ | 0x80), 1794 shiftAmt); 1795 else 1796 rie_f_form(RISBG, dst, src, startBit, endBit, shiftAmt); 1797 } 1798 1799 // Rotate-And-Insert-Selected-Bits 1800 void Assembler::risbgn(Register dst, Register src, const Operand& startBit, 1801 const Operand& endBit, const Operand& shiftAmt, 1802 bool zeroBits) { 1803 // High tag the top bit of I4/EndBit to zero out any unselected bits 1804 if (zeroBits) 1805 rie_f_form(RISBGN, dst, src, startBit, Operand(endBit.imm_ | 0x80), 1806 shiftAmt); 1807 else 1808 rie_f_form(RISBGN, dst, src, startBit, endBit, shiftAmt); 1809 } 1810 1811 // --------------------------- 1812 // Move Character Instructions 1813 // --------------------------- 1814 // Move charactor - mem to mem operation 1815 void Assembler::mvc(const MemOperand& opnd1, const MemOperand& opnd2, 1816 uint32_t length) { 1817 ss_form(MVC, length - 1, opnd1.getBaseRegister(), opnd1.getDisplacement(), 1818 opnd2.getBaseRegister(), opnd2.getDisplacement()); 1819 } 1820 1821 // ----------------------- 1822 // 32-bit Add Instructions 1823 // ----------------------- 1824 // Add Register-Storage (32) 1825 void Assembler::a(Register r1, const MemOperand& opnd) { 1826 rx_form(A, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1827 } 1828 1829 // Add Register-Storage (32) 1830 void Assembler::ay(Register r1, const MemOperand& opnd) { 1831 rxy_form(AY, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1832 } 1833 1834 // Add Immediate (32) 1835 void Assembler::afi(Register r1, const Operand& opnd) { 1836 ril_form(AFI, r1, opnd); 1837 } 1838 1839 // Add Halfword Register-Storage (32) 1840 void Assembler::ah(Register r1, const MemOperand& opnd) { 1841 rx_form(AH, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1842 } 1843 1844 // Add Halfword Register-Storage (32) 1845 void Assembler::ahy(Register r1, const MemOperand& opnd) { 1846 rxy_form(AHY, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1847 } 1848 1849 // Add Halfword Immediate (32) 1850 void Assembler::ahi(Register r1, const Operand& i2) { ri_form(AHI, r1, i2); } 1851 1852 // Add Halfword Immediate (32) 1853 void Assembler::ahik(Register r1, Register r3, const Operand& i2) { 1854 rie_form(AHIK, r1, r3, i2); 1855 } 1856 1857 // Add Register (32) 1858 void Assembler::ar(Register r1, Register r2) { rr_form(AR, r1, r2); } 1859 1860 // Add Register-Register-Register (32) 1861 void Assembler::ark(Register r1, Register r2, Register r3) { 1862 rrf1_form(ARK, r1, r2, r3); 1863 } 1864 1865 // Add Storage-Imm (32) 1866 void Assembler::asi(const MemOperand& opnd, const Operand& imm) { 1867 DCHECK(is_int8(imm.imm_)); 1868 DCHECK(is_int20(opnd.offset())); 1869 siy_form(ASI, Operand(0xff & imm.imm_), opnd.rb(), 0xfffff & opnd.offset()); 1870 } 1871 1872 // ----------------------- 1873 // 64-bit Add Instructions 1874 // ----------------------- 1875 // Add Register-Storage (64) 1876 void Assembler::ag(Register r1, const MemOperand& opnd) { 1877 rxy_form(AG, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1878 } 1879 1880 // Add Register-Storage (64<-32) 1881 void Assembler::agf(Register r1, const MemOperand& opnd) { 1882 rxy_form(AGF, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1883 } 1884 1885 // Add Immediate (64) 1886 void Assembler::agfi(Register r1, const Operand& opnd) { 1887 ril_form(ALFI, r1, opnd); 1888 } 1889 1890 // Add Register-Register (64<-32) 1891 void Assembler::agfr(Register r1, Register r2) { rre_form(AGFR, r1, r2); } 1892 1893 // Add Halfword Immediate (64) 1894 void Assembler::aghi(Register r1, const Operand& i2) { ri_form(AGHI, r1, i2); } 1895 1896 // Add Halfword Immediate (64) 1897 void Assembler::aghik(Register r1, Register r3, const Operand& i2) { 1898 rie_form(AGHIK, r1, r3, i2); 1899 } 1900 1901 // Add Register (64) 1902 void Assembler::agr(Register r1, Register r2) { rre_form(AGR, r1, r2); } 1903 1904 // Add Register-Register-Register (64) 1905 void Assembler::agrk(Register r1, Register r2, Register r3) { 1906 rrf1_form(AGRK, r1, r2, r3); 1907 } 1908 1909 // Add Storage-Imm (64) 1910 void Assembler::agsi(const MemOperand& opnd, const Operand& imm) { 1911 DCHECK(is_int8(imm.imm_)); 1912 DCHECK(is_int20(opnd.offset())); 1913 siy_form(AGSI, Operand(0xff & imm.imm_), opnd.rb(), 0xfffff & opnd.offset()); 1914 } 1915 1916 // ------------------------------- 1917 // 32-bit Add Logical Instructions 1918 // ------------------------------- 1919 // Add Logical Register-Storage (32) 1920 void Assembler::al_z(Register r1, const MemOperand& opnd) { 1921 rx_form(AL, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1922 } 1923 1924 // Add Logical Register-Storage (32) 1925 void Assembler::aly(Register r1, const MemOperand& opnd) { 1926 rxy_form(ALY, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1927 } 1928 1929 // Add Logical Immediate (32) 1930 void Assembler::alfi(Register r1, const Operand& opnd) { 1931 ril_form(ALFI, r1, opnd); 1932 } 1933 1934 // Add Logical Register-Register (32) 1935 void Assembler::alr(Register r1, Register r2) { rr_form(ALR, r1, r2); } 1936 1937 // Add Logical With Carry Register-Register (32) 1938 void Assembler::alcr(Register r1, Register r2) { rre_form(ALCR, r1, r2); } 1939 1940 // Add Logical Register-Register-Register (32) 1941 void Assembler::alrk(Register r1, Register r2, Register r3) { 1942 rrf1_form(ALRK, r1, r2, r3); 1943 } 1944 1945 // ------------------------------- 1946 // 64-bit Add Logical Instructions 1947 // ------------------------------- 1948 // Add Logical Register-Storage (64) 1949 void Assembler::alg(Register r1, const MemOperand& opnd) { 1950 rxy_form(ALG, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1951 } 1952 1953 // Add Logical Immediate (64) 1954 void Assembler::algfi(Register r1, const Operand& opnd) { 1955 ril_form(ALGFI, r1, opnd); 1956 } 1957 1958 // Add Logical Register-Register (64) 1959 void Assembler::algr(Register r1, Register r2) { rre_form(ALGR, r1, r2); } 1960 1961 // Add Logical Register-Register-Register (64) 1962 void Assembler::algrk(Register r1, Register r2, Register r3) { 1963 rrf1_form(ALGRK, r1, r2, r3); 1964 } 1965 1966 // ---------------------------- 1967 // 32-bit Subtract Instructions 1968 // ---------------------------- 1969 // Subtract Register-Storage (32) 1970 void Assembler::s(Register r1, const MemOperand& opnd) { 1971 rx_form(S, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1972 } 1973 1974 // Subtract Register-Storage (32) 1975 void Assembler::sy(Register r1, const MemOperand& opnd) { 1976 rxy_form(SY, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1977 } 1978 1979 // Subtract Halfword Register-Storage (32) 1980 void Assembler::sh(Register r1, const MemOperand& opnd) { 1981 rx_form(SH, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1982 } 1983 1984 // Subtract Halfword Register-Storage (32) 1985 void Assembler::shy(Register r1, const MemOperand& opnd) { 1986 rxy_form(SHY, r1, opnd.rx(), opnd.rb(), opnd.offset()); 1987 } 1988 1989 // Subtract Register (32) 1990 void Assembler::sr(Register r1, Register r2) { rr_form(SR, r1, r2); } 1991 1992 // Subtract Register-Register-Register (32) 1993 void Assembler::srk(Register r1, Register r2, Register r3) { 1994 rrf1_form(SRK, r1, r2, r3); 1995 } 1996 1997 // ---------------------------- 1998 // 64-bit Subtract Instructions 1999 // ---------------------------- 2000 // Subtract Register-Storage (64) 2001 void Assembler::sg(Register r1, const MemOperand& opnd) { 2002 rxy_form(SG, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2003 } 2004 2005 // Subtract Register-Storage (64<-32) 2006 void Assembler::sgf(Register r1, const MemOperand& opnd) { 2007 rxy_form(SGF, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2008 } 2009 2010 // Subtract Register (64) 2011 void Assembler::sgr(Register r1, Register r2) { rre_form(SGR, r1, r2); } 2012 2013 // Subtract Register (64<-32) 2014 void Assembler::sgfr(Register r1, Register r2) { rre_form(SGFR, r1, r2); } 2015 2016 // Subtract Register-Register-Register (64) 2017 void Assembler::sgrk(Register r1, Register r2, Register r3) { 2018 rrf1_form(SGRK, r1, r2, r3); 2019 } 2020 2021 // ------------------------------------ 2022 // 32-bit Subtract Logical Instructions 2023 // ------------------------------------ 2024 // Subtract Logical Register-Storage (32) 2025 void Assembler::sl(Register r1, const MemOperand& opnd) { 2026 rx_form(SL, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2027 } 2028 2029 // Subtract Logical Register-Storage (32) 2030 void Assembler::sly(Register r1, const MemOperand& opnd) { 2031 rxy_form(SLY, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2032 } 2033 2034 // Subtract Logical Register-Register (32) 2035 void Assembler::slr(Register r1, Register r2) { rr_form(SLR, r1, r2); } 2036 2037 // Subtract Logical With Borrow Register-Register (32) 2038 void Assembler::slbr(Register r1, Register r2) { rre_form(SLBR, r1, r2); } 2039 2040 // Subtract Logical Register-Register-Register (32) 2041 void Assembler::slrk(Register r1, Register r2, Register r3) { 2042 rrf1_form(SLRK, r1, r2, r3); 2043 } 2044 2045 // ------------------------------------ 2046 // 64-bit Subtract Logical Instructions 2047 // ------------------------------------ 2048 // Subtract Logical Register-Storage (64) 2049 void Assembler::slg(Register r1, const MemOperand& opnd) { 2050 rxy_form(SLG, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2051 } 2052 2053 // Subtract Logical Register-Register (64) 2054 void Assembler::slgr(Register r1, Register r2) { rre_form(SLGR, r1, r2); } 2055 2056 // Subtract Logical Register-Register-Register (64) 2057 void Assembler::slgrk(Register r1, Register r2, Register r3) { 2058 rrf1_form(SLGRK, r1, r2, r3); 2059 } 2060 2061 // ---------------------------- 2062 // 32-bit Multiply Instructions 2063 // ---------------------------- 2064 // Multiply Register-Storage (64<32) 2065 void Assembler::m(Register r1, const MemOperand& opnd) { 2066 rx_form(M, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2067 } 2068 2069 // Multiply Register (64<32) 2070 void Assembler::mr_z(Register r1, Register r2) { 2071 DCHECK(r1.code() % 2 == 0); 2072 rr_form(MR, r1, r2); 2073 } 2074 2075 // Multiply Logical Register-Storage (64<32) 2076 void Assembler::ml(Register r1, const MemOperand& opnd) { 2077 rxy_form(ML, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2078 } 2079 2080 // Multiply Logical Register (64<32) 2081 void Assembler::mlr(Register r1, Register r2) { 2082 DCHECK(r1.code() % 2 == 0); 2083 rre_form(MLR, r1, r2); 2084 } 2085 2086 // Multiply Single Register-Storage (32) 2087 void Assembler::ms(Register r1, const MemOperand& opnd) { 2088 rx_form(MS, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2089 } 2090 2091 // Multiply Single Register-Storage (32) 2092 void Assembler::msy(Register r1, const MemOperand& opnd) { 2093 rxy_form(MSY, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2094 } 2095 2096 // Multiply Single Immediate (32) 2097 void Assembler::msfi(Register r1, const Operand& opnd) { 2098 ril_form(MSFI, r1, opnd); 2099 } 2100 2101 // Multiply Single Register (64<32) 2102 void Assembler::msr(Register r1, Register r2) { rre_form(MSR, r1, r2); } 2103 2104 // Multiply Halfword Register-Storage (32) 2105 void Assembler::mh(Register r1, const MemOperand& opnd) { 2106 rx_form(MH, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2107 } 2108 2109 // Multiply Halfword Register-Storage (32) 2110 void Assembler::mhy(Register r1, const MemOperand& opnd) { 2111 rxy_form(MHY, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2112 } 2113 2114 // Multiply Halfword Immediate (32) 2115 void Assembler::mhi(Register r1, const Operand& opnd) { 2116 ri_form(MHI, r1, opnd); 2117 } 2118 2119 // ---------------------------- 2120 // 64-bit Multiply Instructions 2121 // ---------------------------- 2122 // Multiply Logical Register-Storage (128<64) 2123 void Assembler::mlg(Register r1, const MemOperand& opnd) { 2124 rxy_form(MLG, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2125 } 2126 2127 // Multiply Register (128<64) 2128 void Assembler::mlgr(Register r1, Register r2) { rre_form(MLGR, r1, r2); } 2129 2130 // Multiply Halfword Immediate (64) 2131 void Assembler::mghi(Register r1, const Operand& opnd) { 2132 ri_form(MGHI, r1, opnd); 2133 } 2134 2135 // Multiply Single Immediate (64) 2136 void Assembler::msgfi(Register r1, const Operand& opnd) { 2137 ril_form(MSGFI, r1, opnd); 2138 } 2139 2140 // Multiply Single Register-Storage (64) 2141 void Assembler::msg(Register r1, const MemOperand& opnd) { 2142 rxy_form(MSG, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2143 } 2144 2145 // Multiply Single Register-Register (64) 2146 void Assembler::msgr(Register r1, Register r2) { rre_form(MSGR, r1, r2); } 2147 2148 // -------------------------- 2149 // 32-bit Divide Instructions 2150 // -------------------------- 2151 // Divide Register-Storage (32<-64) 2152 void Assembler::d(Register r1, const MemOperand& opnd) { 2153 rx_form(D, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2154 } 2155 2156 // Divide Register (32<-64) 2157 void Assembler::dr(Register r1, Register r2) { 2158 DCHECK(r1.code() % 2 == 0); 2159 rr_form(DR, r1, r2); 2160 } 2161 2162 // Divide Logical Register-Storage (32<-64) 2163 void Assembler::dl(Register r1, const MemOperand& opnd) { 2164 rx_form(DL, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2165 } 2166 2167 // Divide Logical Register (32<-64) 2168 void Assembler::dlr(Register r1, Register r2) { rre_form(DLR, r1, r2); } 2169 2170 // -------------------------- 2171 // 64-bit Divide Instructions 2172 // -------------------------- 2173 // Divide Logical Register (64<-128) 2174 void Assembler::dlgr(Register r1, Register r2) { rre_form(DLGR, r1, r2); } 2175 2176 // Divide Single Register (64<-32) 2177 void Assembler::dsgr(Register r1, Register r2) { rre_form(DSGR, r1, r2); } 2178 2179 // -------------------- 2180 // Bitwise Instructions 2181 // -------------------- 2182 // AND Register-Storage (32) 2183 void Assembler::n(Register r1, const MemOperand& opnd) { 2184 rx_form(N, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2185 } 2186 2187 // AND Register-Storage (32) 2188 void Assembler::ny(Register r1, const MemOperand& opnd) { 2189 rxy_form(NY, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2190 } 2191 2192 // AND Register (32) 2193 void Assembler::nr(Register r1, Register r2) { rr_form(NR, r1, r2); } 2194 2195 // AND Register-Register-Register (32) 2196 void Assembler::nrk(Register r1, Register r2, Register r3) { 2197 rrf1_form(NRK, r1, r2, r3); 2198 } 2199 2200 // AND Register-Storage (64) 2201 void Assembler::ng(Register r1, const MemOperand& opnd) { 2202 rxy_form(NG, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2203 } 2204 2205 // AND Register (64) 2206 void Assembler::ngr(Register r1, Register r2) { rre_form(NGR, r1, r2); } 2207 2208 // AND Register-Register-Register (64) 2209 void Assembler::ngrk(Register r1, Register r2, Register r3) { 2210 rrf1_form(NGRK, r1, r2, r3); 2211 } 2212 2213 // OR Register-Storage (32) 2214 void Assembler::o(Register r1, const MemOperand& opnd) { 2215 rx_form(O, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2216 } 2217 2218 // OR Register-Storage (32) 2219 void Assembler::oy(Register r1, const MemOperand& opnd) { 2220 rxy_form(OY, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2221 } 2222 2223 // OR Register (32) 2224 void Assembler::or_z(Register r1, Register r2) { rr_form(OR, r1, r2); } 2225 2226 // OR Register-Register-Register (32) 2227 void Assembler::ork(Register r1, Register r2, Register r3) { 2228 rrf1_form(ORK, r1, r2, r3); 2229 } 2230 2231 // OR Register-Storage (64) 2232 void Assembler::og(Register r1, const MemOperand& opnd) { 2233 rxy_form(OG, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2234 } 2235 2236 // OR Register (64) 2237 void Assembler::ogr(Register r1, Register r2) { rre_form(OGR, r1, r2); } 2238 2239 // OR Register-Register-Register (64) 2240 void Assembler::ogrk(Register r1, Register r2, Register r3) { 2241 rrf1_form(OGRK, r1, r2, r3); 2242 } 2243 2244 // XOR Register-Storage (32) 2245 void Assembler::x(Register r1, const MemOperand& opnd) { 2246 rx_form(X, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2247 } 2248 2249 // XOR Register-Storage (32) 2250 void Assembler::xy(Register r1, const MemOperand& opnd) { 2251 rxy_form(XY, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2252 } 2253 2254 // XOR Register (32) 2255 void Assembler::xr(Register r1, Register r2) { rr_form(XR, r1, r2); } 2256 2257 // XOR Register-Register-Register (32) 2258 void Assembler::xrk(Register r1, Register r2, Register r3) { 2259 rrf1_form(XRK, r1, r2, r3); 2260 } 2261 2262 // XOR Register-Storage (64) 2263 void Assembler::xg(Register r1, const MemOperand& opnd) { 2264 rxy_form(XG, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2265 } 2266 2267 // XOR Register (64) 2268 void Assembler::xgr(Register r1, Register r2) { rre_form(XGR, r1, r2); } 2269 2270 // XOR Register-Register-Register (64) 2271 void Assembler::xgrk(Register r1, Register r2, Register r3) { 2272 rrf1_form(XGRK, r1, r2, r3); 2273 } 2274 2275 // XOR Storage-Storage 2276 void Assembler::xc(const MemOperand& opnd1, const MemOperand& opnd2, 2277 Length length) { 2278 ss_form(XC, length - 1, opnd1.getBaseRegister(), opnd1.getDisplacement(), 2279 opnd2.getBaseRegister(), opnd2.getDisplacement()); 2280 } 2281 2282 // ------------------------------------------- 2283 // Bitwise GPR <-> FPR Conversion Instructions 2284 // ------------------------------------------- 2285 // Load GR from FPR (64 <- L) 2286 void Assembler::lgdr(Register r1, DoubleRegister f2) { 2287 rre_form(LGDR, r1, Register::from_code(f2.code())); 2288 } 2289 2290 // Load FPR from FR (L <- 64) 2291 void Assembler::ldgr(DoubleRegister f1, Register r2) { 2292 rre_form(LDGR, Register::from_code(f1.code()), r2); 2293 } 2294 2295 void Assembler::EnsureSpaceFor(int space_needed) { 2296 if (buffer_space() <= (kGap + space_needed)) { 2297 GrowBuffer(space_needed); 2298 } 2299 } 2300 2301 // Rotate Left Single Logical (32) 2302 void Assembler::rll(Register r1, Register r3, Register opnd) { 2303 DCHECK(!opnd.is(r0)); 2304 rsy_form(RLL, r1, r3, opnd, 0); 2305 } 2306 2307 // Rotate Left Single Logical (32) 2308 void Assembler::rll(Register r1, Register r3, const Operand& opnd) { 2309 rsy_form(RLL, r1, r3, r0, opnd.immediate()); 2310 } 2311 2312 // Rotate Left Single Logical (32) 2313 void Assembler::rll(Register r1, Register r3, Register r2, 2314 const Operand& opnd) { 2315 rsy_form(RLL, r1, r3, r2, opnd.immediate()); 2316 } 2317 2318 // Rotate Left Single Logical (64) 2319 void Assembler::rllg(Register r1, Register r3, Register opnd) { 2320 DCHECK(!opnd.is(r0)); 2321 rsy_form(RLLG, r1, r3, opnd, 0); 2322 } 2323 2324 // Rotate Left Single Logical (64) 2325 void Assembler::rllg(Register r1, Register r3, const Operand& opnd) { 2326 rsy_form(RLLG, r1, r3, r0, opnd.immediate()); 2327 } 2328 2329 // Rotate Left Single Logical (64) 2330 void Assembler::rllg(Register r1, Register r3, Register r2, 2331 const Operand& opnd) { 2332 rsy_form(RLLG, r1, r3, r2, opnd.immediate()); 2333 } 2334 2335 // Shift Left Single Logical (32) 2336 void Assembler::sll(Register r1, Register opnd) { 2337 DCHECK(!opnd.is(r0)); 2338 rs_form(SLL, r1, r0, opnd, 0); 2339 } 2340 2341 // Shift Left Single Logical (32) 2342 void Assembler::sll(Register r1, const Operand& opnd) { 2343 rs_form(SLL, r1, r0, r0, opnd.immediate()); 2344 } 2345 2346 // Shift Left Single Logical (32) 2347 void Assembler::sllk(Register r1, Register r3, Register opnd) { 2348 DCHECK(!opnd.is(r0)); 2349 rsy_form(SLLK, r1, r3, opnd, 0); 2350 } 2351 2352 // Shift Left Single Logical (32) 2353 void Assembler::sllk(Register r1, Register r3, const Operand& opnd) { 2354 rsy_form(SLLK, r1, r3, r0, opnd.immediate()); 2355 } 2356 2357 // Shift Left Single Logical (64) 2358 void Assembler::sllg(Register r1, Register r3, Register opnd) { 2359 DCHECK(!opnd.is(r0)); 2360 rsy_form(SLLG, r1, r3, opnd, 0); 2361 } 2362 2363 // Shift Left Single Logical (64) 2364 void Assembler::sllg(Register r1, Register r3, const Operand& opnd) { 2365 rsy_form(SLLG, r1, r3, r0, opnd.immediate()); 2366 } 2367 2368 // Shift Left Double Logical (64) 2369 void Assembler::sldl(Register r1, Register b2, const Operand& opnd) { 2370 DCHECK(r1.code() % 2 == 0); 2371 rs_form(SLDL, r1, r0, b2, opnd.immediate()); 2372 } 2373 2374 // Shift Right Single Logical (32) 2375 void Assembler::srl(Register r1, Register opnd) { 2376 DCHECK(!opnd.is(r0)); 2377 rs_form(SRL, r1, r0, opnd, 0); 2378 } 2379 2380 // Shift Right Double Arith (64) 2381 void Assembler::srda(Register r1, Register b2, const Operand& opnd) { 2382 DCHECK(r1.code() % 2 == 0); 2383 rs_form(SRDA, r1, r0, b2, opnd.immediate()); 2384 } 2385 2386 // Shift Right Double Logical (64) 2387 void Assembler::srdl(Register r1, Register b2, const Operand& opnd) { 2388 DCHECK(r1.code() % 2 == 0); 2389 rs_form(SRDL, r1, r0, b2, opnd.immediate()); 2390 } 2391 2392 // Shift Right Single Logical (32) 2393 void Assembler::srl(Register r1, const Operand& opnd) { 2394 rs_form(SRL, r1, r0, r0, opnd.immediate()); 2395 } 2396 2397 // Shift Right Single Logical (32) 2398 void Assembler::srlk(Register r1, Register r3, Register opnd) { 2399 DCHECK(!opnd.is(r0)); 2400 rsy_form(SRLK, r1, r3, opnd, 0); 2401 } 2402 2403 // Shift Right Single Logical (32) 2404 void Assembler::srlk(Register r1, Register r3, const Operand& opnd) { 2405 rsy_form(SRLK, r1, r3, r0, opnd.immediate()); 2406 } 2407 2408 // Shift Right Single Logical (64) 2409 void Assembler::srlg(Register r1, Register r3, Register opnd) { 2410 DCHECK(!opnd.is(r0)); 2411 rsy_form(SRLG, r1, r3, opnd, 0); 2412 } 2413 2414 // Shift Right Single Logical (64) 2415 void Assembler::srlg(Register r1, Register r3, const Operand& opnd) { 2416 rsy_form(SRLG, r1, r3, r0, opnd.immediate()); 2417 } 2418 2419 // Shift Left Single (32) 2420 void Assembler::sla(Register r1, Register opnd) { 2421 DCHECK(!opnd.is(r0)); 2422 rs_form(SLA, r1, r0, opnd, 0); 2423 } 2424 2425 // Shift Left Single (32) 2426 void Assembler::sla(Register r1, const Operand& opnd) { 2427 rs_form(SLA, r1, r0, r0, opnd.immediate()); 2428 } 2429 2430 // Shift Left Single (32) 2431 void Assembler::slak(Register r1, Register r3, Register opnd) { 2432 DCHECK(!opnd.is(r0)); 2433 rsy_form(SLAK, r1, r3, opnd, 0); 2434 } 2435 2436 // Shift Left Single (32) 2437 void Assembler::slak(Register r1, Register r3, const Operand& opnd) { 2438 rsy_form(SLAK, r1, r3, r0, opnd.immediate()); 2439 } 2440 2441 // Shift Left Single (64) 2442 void Assembler::slag(Register r1, Register r3, Register opnd) { 2443 DCHECK(!opnd.is(r0)); 2444 rsy_form(SLAG, r1, r3, opnd, 0); 2445 } 2446 2447 // Shift Left Single (64) 2448 void Assembler::slag(Register r1, Register r3, const Operand& opnd) { 2449 rsy_form(SLAG, r1, r3, r0, opnd.immediate()); 2450 } 2451 2452 // Shift Right Single (32) 2453 void Assembler::sra(Register r1, Register opnd) { 2454 DCHECK(!opnd.is(r0)); 2455 rs_form(SRA, r1, r0, opnd, 0); 2456 } 2457 2458 // Shift Right Single (32) 2459 void Assembler::sra(Register r1, const Operand& opnd) { 2460 rs_form(SRA, r1, r0, r0, opnd.immediate()); 2461 } 2462 2463 // Shift Right Single (32) 2464 void Assembler::srak(Register r1, Register r3, Register opnd) { 2465 DCHECK(!opnd.is(r0)); 2466 rsy_form(SRAK, r1, r3, opnd, 0); 2467 } 2468 2469 // Shift Right Single (32) 2470 void Assembler::srak(Register r1, Register r3, const Operand& opnd) { 2471 rsy_form(SRAK, r1, r3, r0, opnd.immediate()); 2472 } 2473 2474 // Shift Right Single (64) 2475 void Assembler::srag(Register r1, Register r3, Register opnd) { 2476 DCHECK(!opnd.is(r0)); 2477 rsy_form(SRAG, r1, r3, opnd, 0); 2478 } 2479 2480 void Assembler::srag(Register r1, Register r3, const Operand& opnd) { 2481 rsy_form(SRAG, r1, r3, r0, opnd.immediate()); 2482 } 2483 2484 // Shift Right Double 2485 void Assembler::srda(Register r1, const Operand& opnd) { 2486 DCHECK(r1.code() % 2 == 0); 2487 rs_form(SRDA, r1, r0, r0, opnd.immediate()); 2488 } 2489 2490 // Shift Right Double Logical 2491 void Assembler::srdl(Register r1, const Operand& opnd) { 2492 DCHECK(r1.code() % 2 == 0); 2493 rs_form(SRDL, r1, r0, r0, opnd.immediate()); 2494 } 2495 2496 void Assembler::call(Handle<Code> target, RelocInfo::Mode rmode, 2497 TypeFeedbackId ast_id) { 2498 EnsureSpace ensure_space(this); 2499 2500 int32_t target_index = emit_code_target(target, rmode, ast_id); 2501 brasl(r14, Operand(target_index)); 2502 } 2503 2504 void Assembler::jump(Handle<Code> target, RelocInfo::Mode rmode, 2505 Condition cond) { 2506 EnsureSpace ensure_space(this); 2507 2508 int32_t target_index = emit_code_target(target, rmode); 2509 brcl(cond, Operand(target_index), true); 2510 } 2511 2512 // Store (32) 2513 void Assembler::st(Register src, const MemOperand& dst) { 2514 rx_form(ST, src, dst.rx(), dst.rb(), dst.offset()); 2515 } 2516 2517 // Store (32) 2518 void Assembler::sty(Register src, const MemOperand& dst) { 2519 rxy_form(STY, src, dst.rx(), dst.rb(), dst.offset()); 2520 } 2521 2522 // Store Halfword 2523 void Assembler::sth(Register src, const MemOperand& dst) { 2524 rx_form(STH, src, dst.rx(), dst.rb(), dst.offset()); 2525 } 2526 2527 // Store Halfword 2528 void Assembler::sthy(Register src, const MemOperand& dst) { 2529 rxy_form(STHY, src, dst.rx(), dst.rb(), dst.offset()); 2530 } 2531 2532 // Store Character 2533 void Assembler::stc(Register src, const MemOperand& dst) { 2534 rx_form(STC, src, dst.rx(), dst.rb(), dst.offset()); 2535 } 2536 2537 // Store Character 2538 void Assembler::stcy(Register src, const MemOperand& dst) { 2539 rxy_form(STCY, src, dst.rx(), dst.rb(), dst.offset()); 2540 } 2541 2542 // 32-bit Load Multiple - short displacement (12-bits unsigned) 2543 void Assembler::lm(Register r1, Register r2, const MemOperand& src) { 2544 rs_form(LM, r1, r2, src.rb(), src.offset()); 2545 } 2546 2547 // 32-bit Load Multiple - long displacement (20-bits signed) 2548 void Assembler::lmy(Register r1, Register r2, const MemOperand& src) { 2549 rsy_form(LMY, r1, r2, src.rb(), src.offset()); 2550 } 2551 2552 // 64-bit Load Multiple - long displacement (20-bits signed) 2553 void Assembler::lmg(Register r1, Register r2, const MemOperand& src) { 2554 rsy_form(LMG, r1, r2, src.rb(), src.offset()); 2555 } 2556 2557 // Move integer (32) 2558 void Assembler::mvhi(const MemOperand& opnd1, const Operand& i2) { 2559 sil_form(MVHI, opnd1.getBaseRegister(), opnd1.getDisplacement(), i2); 2560 } 2561 2562 // Move integer (64) 2563 void Assembler::mvghi(const MemOperand& opnd1, const Operand& i2) { 2564 sil_form(MVGHI, opnd1.getBaseRegister(), opnd1.getDisplacement(), i2); 2565 } 2566 2567 // Store Register (64) 2568 void Assembler::stg(Register src, const MemOperand& dst) { 2569 DCHECK(!(dst.rb().code() == 15 && dst.offset() < 0)); 2570 rxy_form(STG, src, dst.rx(), dst.rb(), dst.offset()); 2571 } 2572 2573 // Insert Character 2574 void Assembler::ic_z(Register r1, const MemOperand& opnd) { 2575 rx_form(IC_z, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2576 } 2577 2578 // Insert Character 2579 void Assembler::icy(Register r1, const MemOperand& opnd) { 2580 rxy_form(ICY, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2581 } 2582 2583 // Insert Immediate (High) 2584 void Assembler::iihf(Register r1, const Operand& opnd) { 2585 ril_form(IIHF, r1, opnd); 2586 } 2587 2588 // Insert Immediate (low) 2589 void Assembler::iilf(Register r1, const Operand& opnd) { 2590 ril_form(IILF, r1, opnd); 2591 } 2592 2593 // Insert Immediate (high high) 2594 void Assembler::iihh(Register r1, const Operand& opnd) { 2595 ri_form(IIHH, r1, opnd); 2596 } 2597 2598 // Insert Immediate (high low) 2599 void Assembler::iihl(Register r1, const Operand& opnd) { 2600 ri_form(IIHL, r1, opnd); 2601 } 2602 2603 // Insert Immediate (low high) 2604 void Assembler::iilh(Register r1, const Operand& opnd) { 2605 ri_form(IILH, r1, opnd); 2606 } 2607 2608 // Insert Immediate (low low) 2609 void Assembler::iill(Register r1, const Operand& opnd) { 2610 ri_form(IILL, r1, opnd); 2611 } 2612 2613 // GPR <-> FPR Instructions 2614 2615 // Floating point instructions 2616 // 2617 // Load zero Register (64) 2618 void Assembler::lzdr(DoubleRegister r1) { 2619 rre_form(LZDR, Register::from_code(r1.code()), Register::from_code(0)); 2620 } 2621 2622 // Add Register-Register (LB) 2623 void Assembler::aebr(DoubleRegister r1, DoubleRegister r2) { 2624 rre_form(AEBR, Register::from_code(r1.code()), 2625 Register::from_code(r2.code())); 2626 } 2627 2628 // Add Register-Storage (LB) 2629 void Assembler::adb(DoubleRegister r1, const MemOperand& opnd) { 2630 rxe_form(ADB, Register::from_code(r1.code()), opnd.rx(), opnd.rb(), 2631 opnd.offset()); 2632 } 2633 2634 // Add Register-Register (LB) 2635 void Assembler::adbr(DoubleRegister r1, DoubleRegister r2) { 2636 rre_form(ADBR, Register::from_code(r1.code()), 2637 Register::from_code(r2.code())); 2638 } 2639 2640 // Compare Register-Register (LB) 2641 void Assembler::cebr(DoubleRegister r1, DoubleRegister r2) { 2642 rre_form(CEBR, Register::from_code(r1.code()), 2643 Register::from_code(r2.code())); 2644 } 2645 2646 // Compare Register-Storage (LB) 2647 void Assembler::cdb(DoubleRegister r1, const MemOperand& opnd) { 2648 rx_form(CD, Register::from_code(r1.code()), opnd.rx(), opnd.rb(), 2649 opnd.offset()); 2650 } 2651 2652 // Compare Register-Register (LB) 2653 void Assembler::cdbr(DoubleRegister r1, DoubleRegister r2) { 2654 rre_form(CDBR, Register::from_code(r1.code()), 2655 Register::from_code(r2.code())); 2656 } 2657 2658 // Divide Register-Register (LB) 2659 void Assembler::debr(DoubleRegister r1, DoubleRegister r2) { 2660 rre_form(DEBR, Register::from_code(r1.code()), 2661 Register::from_code(r2.code())); 2662 } 2663 2664 // Divide Register-Storage (LB) 2665 void Assembler::ddb(DoubleRegister r1, const MemOperand& opnd) { 2666 rxe_form(DDB, Register::from_code(r1.code()), opnd.rx(), opnd.rb(), 2667 opnd.offset()); 2668 } 2669 2670 // Divide Register-Register (LB) 2671 void Assembler::ddbr(DoubleRegister r1, DoubleRegister r2) { 2672 rre_form(DDBR, Register::from_code(r1.code()), 2673 Register::from_code(r2.code())); 2674 } 2675 2676 // Multiply Register-Register (LB) 2677 void Assembler::meebr(DoubleRegister r1, DoubleRegister r2) { 2678 rre_form(MEEBR, Register::from_code(r1.code()), 2679 Register::from_code(r2.code())); 2680 } 2681 2682 // Multiply Register-Storage (LB) 2683 void Assembler::mdb(DoubleRegister r1, const MemOperand& opnd) { 2684 rxe_form(MDB, Register::from_code(r1.code()), opnd.rb(), opnd.rx(), 2685 opnd.offset()); 2686 } 2687 2688 // Multiply Register-Register (LB) 2689 void Assembler::mdbr(DoubleRegister r1, DoubleRegister r2) { 2690 rre_form(MDBR, Register::from_code(r1.code()), 2691 Register::from_code(r2.code())); 2692 } 2693 2694 // Subtract Register-Register (LB) 2695 void Assembler::sebr(DoubleRegister r1, DoubleRegister r2) { 2696 rre_form(SEBR, Register::from_code(r1.code()), 2697 Register::from_code(r2.code())); 2698 } 2699 2700 // Subtract Register-Storage (LB) 2701 void Assembler::sdb(DoubleRegister r1, const MemOperand& opnd) { 2702 rxe_form(SDB, Register::from_code(r1.code()), opnd.rx(), opnd.rb(), 2703 opnd.offset()); 2704 } 2705 2706 // Subtract Register-Register (LB) 2707 void Assembler::sdbr(DoubleRegister r1, DoubleRegister r2) { 2708 rre_form(SDBR, Register::from_code(r1.code()), 2709 Register::from_code(r2.code())); 2710 } 2711 2712 // Square Root (LB) 2713 void Assembler::sqdb(DoubleRegister r1, const MemOperand& opnd) { 2714 rxe_form(SQDB, Register::from_code(r1.code()), opnd.rx(), opnd.rb(), 2715 opnd.offset()); 2716 } 2717 2718 // Square Root Register-Register (LB) 2719 void Assembler::sqebr(DoubleRegister r1, DoubleRegister r2) { 2720 rre_form(SQEBR, Register::from_code(r1.code()), 2721 Register::from_code(r2.code())); 2722 } 2723 2724 // Square Root Register-Register (LB) 2725 void Assembler::sqdbr(DoubleRegister r1, DoubleRegister r2) { 2726 rre_form(SQDBR, Register::from_code(r1.code()), 2727 Register::from_code(r2.code())); 2728 } 2729 2730 // Load Rounded (double -> float) 2731 void Assembler::ledbr(DoubleRegister r1, DoubleRegister r2) { 2732 rre_form(LEDBR, Register::from_code(r1.code()), 2733 Register::from_code(r2.code())); 2734 } 2735 2736 // Load Lengthen (float -> double) 2737 void Assembler::ldebr(DoubleRegister r1, DoubleRegister r2) { 2738 rre_form(LDEBR, Register::from_code(r1.code()), 2739 Register::from_code(r2.code())); 2740 } 2741 2742 // Load Complement Register-Register (LB) 2743 void Assembler::lcdbr(DoubleRegister r1, DoubleRegister r2) { 2744 rre_form(LCDBR, Register::from_code(r1.code()), 2745 Register::from_code(r2.code())); 2746 } 2747 2748 // Load Positive Register-Register (LB) 2749 void Assembler::lpebr(DoubleRegister r1, DoubleRegister r2) { 2750 rre_form(LPEBR, Register::from_code(r1.code()), 2751 Register::from_code(r2.code())); 2752 } 2753 2754 // Load Positive Register-Register (LB) 2755 void Assembler::lpdbr(DoubleRegister r1, DoubleRegister r2) { 2756 rre_form(LPDBR, Register::from_code(r1.code()), 2757 Register::from_code(r2.code())); 2758 } 2759 2760 // Store Double (64) 2761 void Assembler::std(DoubleRegister r1, const MemOperand& opnd) { 2762 rx_form(STD, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2763 } 2764 2765 // Store Double (64) 2766 void Assembler::stdy(DoubleRegister r1, const MemOperand& opnd) { 2767 DCHECK(!(opnd.rb().code() == 15 && opnd.offset() < 0)); 2768 rxy_form(STDY, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2769 } 2770 2771 // Store Float (32) 2772 void Assembler::ste(DoubleRegister r1, const MemOperand& opnd) { 2773 rx_form(STE, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2774 } 2775 2776 // Store Float (32) 2777 void Assembler::stey(DoubleRegister r1, const MemOperand& opnd) { 2778 DCHECK(!(opnd.rb().code() == 15 && opnd.offset() < 0)); 2779 rxy_form(STEY, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2780 } 2781 2782 // Load Double (64) 2783 void Assembler::ld(DoubleRegister r1, const MemOperand& opnd) { 2784 DCHECK(is_uint12(opnd.offset())); 2785 rx_form(LD, r1, opnd.rx(), opnd.rb(), opnd.offset() & 0xfff); 2786 } 2787 2788 // Load Double (64) 2789 void Assembler::ldy(DoubleRegister r1, const MemOperand& opnd) { 2790 DCHECK(is_int20(opnd.offset())); 2791 rxy_form(LDY, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2792 } 2793 2794 // Load Float (32) 2795 void Assembler::le_z(DoubleRegister r1, const MemOperand& opnd) { 2796 DCHECK(is_uint12(opnd.offset())); 2797 rx_form(LE, r1, opnd.rx(), opnd.rb(), opnd.offset() & 0xfff); 2798 } 2799 2800 // Load Float (32) 2801 void Assembler::ley(DoubleRegister r1, const MemOperand& opnd) { 2802 DCHECK(is_int20(opnd.offset())); 2803 rxy_form(LEY, r1, opnd.rx(), opnd.rb(), opnd.offset()); 2804 } 2805 2806 // Load Double Register-Register (64) 2807 void Assembler::ldr(DoubleRegister r1, DoubleRegister r2) { 2808 rr_form(LDR, r1, r2); 2809 } 2810 2811 // Load And Test Register-Register (L) 2812 void Assembler::ltebr(DoubleRegister r1, DoubleRegister r2) { 2813 rre_form(LTEBR, r1, r2); 2814 } 2815 2816 // Load And Test Register-Register (L) 2817 void Assembler::ltdbr(DoubleRegister r1, DoubleRegister r2) { 2818 rre_form(LTDBR, r1, r2); 2819 } 2820 2821 // Convert to Fixed point (64<-S) 2822 void Assembler::cgebr(Condition m, Register r1, DoubleRegister r2) { 2823 rrfe_form(CGEBR, m, Condition(0), r1, Register::from_code(r2.code())); 2824 } 2825 2826 // Convert to Fixed point (64<-L) 2827 void Assembler::cgdbr(Condition m, Register r1, DoubleRegister r2) { 2828 rrfe_form(CGDBR, m, Condition(0), r1, Register::from_code(r2.code())); 2829 } 2830 2831 // Convert to Fixed point (32<-L) 2832 void Assembler::cfdbr(Condition m, Register r1, DoubleRegister r2) { 2833 rrfe_form(CFDBR, m, Condition(0), r1, Register::from_code(r2.code())); 2834 } 2835 2836 // Convert from Fixed point (L<-64) 2837 void Assembler::cegbr(DoubleRegister r1, Register r2) { 2838 rre_form(CEGBR, Register::from_code(r1.code()), r2); 2839 } 2840 2841 // Convert from Fixed point (L<-64) 2842 void Assembler::cdgbr(DoubleRegister r1, Register r2) { 2843 rre_form(CDGBR, Register::from_code(r1.code()), r2); 2844 } 2845 2846 // Convert from Fixed point (L<-32) 2847 void Assembler::cdfbr(DoubleRegister r1, Register r2) { 2848 rre_form(CDFBR, Register::from_code(r1.code()), r2); 2849 } 2850 2851 // Convert to Fixed Logical (64<-L) 2852 void Assembler::clgdbr(Condition m3, Condition m4, Register r1, 2853 DoubleRegister r2) { 2854 DCHECK_EQ(m4, Condition(0)); 2855 rrfe_form(CLGDBR, m3, m4, r1, Register::from_code(r2.code())); 2856 } 2857 2858 // Convert to Fixed Logical (64<-F32) 2859 void Assembler::clgebr(Condition m3, Condition m4, Register r1, 2860 DoubleRegister r2) { 2861 DCHECK_EQ(m4, Condition(0)); 2862 rrfe_form(CLGEBR, m3, m4, r1, Register::from_code(r2.code())); 2863 } 2864 2865 // Convert to Fixed Logical (32<-F64) 2866 void Assembler::clfdbr(Condition m3, Condition m4, Register r1, 2867 DoubleRegister r2) { 2868 DCHECK_EQ(m3, Condition(0)); 2869 DCHECK_EQ(m4, Condition(0)); 2870 rrfe_form(CLFDBR, Condition(0), Condition(0), r1, 2871 Register::from_code(r2.code())); 2872 } 2873 2874 // Convert to Fixed Logical (32<-F32) 2875 void Assembler::clfebr(Condition m3, Condition m4, Register r1, 2876 DoubleRegister r2) { 2877 DCHECK_EQ(m4, Condition(0)); 2878 rrfe_form(CLFEBR, m3, Condition(0), r1, Register::from_code(r2.code())); 2879 } 2880 2881 // Convert from Fixed Logical (L<-64) 2882 void Assembler::celgbr(Condition m3, Condition m4, DoubleRegister r1, 2883 Register r2) { 2884 DCHECK_EQ(m3, Condition(0)); 2885 DCHECK_EQ(m4, Condition(0)); 2886 rrfe_form(CELGBR, Condition(0), Condition(0), Register::from_code(r1.code()), 2887 r2); 2888 } 2889 2890 // Convert from Fixed Logical (F32<-32) 2891 void Assembler::celfbr(Condition m3, Condition m4, DoubleRegister r1, 2892 Register r2) { 2893 DCHECK_EQ(m3, Condition(0)); 2894 DCHECK_EQ(m4, Condition(0)); 2895 rrfe_form(CELFBR, Condition(0), Condition(0), Register::from_code(r1.code()), 2896 r2); 2897 } 2898 2899 // Convert from Fixed Logical (L<-64) 2900 void Assembler::cdlgbr(Condition m3, Condition m4, DoubleRegister r1, 2901 Register r2) { 2902 DCHECK_EQ(m3, Condition(0)); 2903 DCHECK_EQ(m4, Condition(0)); 2904 rrfe_form(CDLGBR, Condition(0), Condition(0), Register::from_code(r1.code()), 2905 r2); 2906 } 2907 2908 // Convert from Fixed Logical (L<-32) 2909 void Assembler::cdlfbr(Condition m3, Condition m4, DoubleRegister r1, 2910 Register r2) { 2911 DCHECK_EQ(m4, Condition(0)); 2912 rrfe_form(CDLFBR, m3, Condition(0), Register::from_code(r1.code()), r2); 2913 } 2914 2915 // Convert from Fixed point (S<-32) 2916 void Assembler::cefbr(DoubleRegister r1, Register r2) { 2917 rre_form(CEFBR, Register::from_code(r1.code()), r2); 2918 } 2919 2920 // Convert to Fixed point (32<-S) 2921 void Assembler::cfebr(Condition m3, Register r1, DoubleRegister r2) { 2922 rrfe_form(CFEBR, m3, Condition(0), r1, Register::from_code(r2.code())); 2923 } 2924 2925 // Load (L <- S) 2926 void Assembler::ldeb(DoubleRegister d1, const MemOperand& opnd) { 2927 rxe_form(LDEB, Register::from_code(d1.code()), opnd.rx(), opnd.rb(), 2928 opnd.offset()); 2929 } 2930 2931 // Load FP Integer 2932 void Assembler::fiebra(DoubleRegister d1, DoubleRegister d2, FIDBRA_MASK3 m3) { 2933 rrf2_form(FIEBRA << 16 | m3 * B12 | d1.code() * B4 | d2.code()); 2934 } 2935 2936 // Load FP Integer 2937 void Assembler::fidbra(DoubleRegister d1, DoubleRegister d2, FIDBRA_MASK3 m3) { 2938 rrf2_form(FIDBRA << 16 | m3 * B12 | d1.code() * B4 | d2.code()); 2939 } 2940 2941 // Multiply and Add - MADBR R1, R3, R2 2942 // R1 = R3 * R2 + R1 2943 void Assembler::madbr(DoubleRegister d1, DoubleRegister d3, DoubleRegister d2) { 2944 rrd_form(MADBR, Register::from_code(d1.code()), 2945 Register::from_code(d3.code()), Register::from_code(d2.code())); 2946 } 2947 2948 // Multiply and Subtract - MSDBR R1, R3, R2 2949 // R1 = R3 * R2 - R1 2950 void Assembler::msdbr(DoubleRegister d1, DoubleRegister d3, DoubleRegister d2) { 2951 rrd_form(MSDBR, Register::from_code(d1.code()), 2952 Register::from_code(d3.code()), Register::from_code(d2.code())); 2953 } 2954 2955 // end of S390instructions 2956 2957 bool Assembler::IsNop(SixByteInstr instr, int type) { 2958 DCHECK((0 == type) || (DEBUG_BREAK_NOP == type)); 2959 if (DEBUG_BREAK_NOP == type) { 2960 return ((instr & 0xffffffff) == 0xa53b0000); // oill r3, 0 2961 } 2962 return ((instr & 0xffff) == 0x1800); // lr r0,r0 2963 } 2964 2965 void Assembler::GrowBuffer(int needed) { 2966 if (!own_buffer_) FATAL("external code buffer is too small"); 2967 2968 // Compute new buffer size. 2969 CodeDesc desc; // the new buffer 2970 if (buffer_size_ < 4 * KB) { 2971 desc.buffer_size = 4 * KB; 2972 } else if (buffer_size_ < 1 * MB) { 2973 desc.buffer_size = 2 * buffer_size_; 2974 } else { 2975 desc.buffer_size = buffer_size_ + 1 * MB; 2976 } 2977 int space = buffer_space() + (desc.buffer_size - buffer_size_); 2978 if (space < needed) { 2979 desc.buffer_size += needed - space; 2980 } 2981 CHECK_GT(desc.buffer_size, 0); // no overflow 2982 2983 // Set up new buffer. 2984 desc.buffer = NewArray<byte>(desc.buffer_size); 2985 desc.origin = this; 2986 2987 desc.instr_size = pc_offset(); 2988 desc.reloc_size = (buffer_ + buffer_size_) - reloc_info_writer.pos(); 2989 2990 // Copy the data. 2991 intptr_t pc_delta = desc.buffer - buffer_; 2992 intptr_t rc_delta = 2993 (desc.buffer + desc.buffer_size) - (buffer_ + buffer_size_); 2994 memmove(desc.buffer, buffer_, desc.instr_size); 2995 memmove(reloc_info_writer.pos() + rc_delta, reloc_info_writer.pos(), 2996 desc.reloc_size); 2997 2998 // Switch buffers. 2999 DeleteArray(buffer_); 3000 buffer_ = desc.buffer; 3001 buffer_size_ = desc.buffer_size; 3002 pc_ += pc_delta; 3003 reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta, 3004 reloc_info_writer.last_pc() + pc_delta); 3005 3006 // None of our relocation types are pc relative pointing outside the code 3007 // buffer nor pc absolute pointing inside the code buffer, so there is no need 3008 // to relocate any emitted relocation entries. 3009 } 3010 3011 void Assembler::db(uint8_t data) { 3012 CheckBuffer(); 3013 *reinterpret_cast<uint8_t*>(pc_) = data; 3014 pc_ += sizeof(uint8_t); 3015 } 3016 3017 void Assembler::dd(uint32_t data) { 3018 CheckBuffer(); 3019 *reinterpret_cast<uint32_t*>(pc_) = data; 3020 pc_ += sizeof(uint32_t); 3021 } 3022 3023 void Assembler::dq(uint64_t value) { 3024 CheckBuffer(); 3025 *reinterpret_cast<uint64_t*>(pc_) = value; 3026 pc_ += sizeof(uint64_t); 3027 } 3028 3029 void Assembler::dp(uintptr_t data) { 3030 CheckBuffer(); 3031 *reinterpret_cast<uintptr_t*>(pc_) = data; 3032 pc_ += sizeof(uintptr_t); 3033 } 3034 3035 void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { 3036 if (RelocInfo::IsNone(rmode) || 3037 // Don't record external references unless the heap will be serialized. 3038 (rmode == RelocInfo::EXTERNAL_REFERENCE && !serializer_enabled() && 3039 !emit_debug_code())) { 3040 return; 3041 } 3042 if (rmode == RelocInfo::CODE_TARGET_WITH_ID) { 3043 data = RecordedAstId().ToInt(); 3044 ClearRecordedAstId(); 3045 } 3046 DeferredRelocInfo rinfo(pc_offset(), rmode, data); 3047 relocations_.push_back(rinfo); 3048 } 3049 3050 void Assembler::emit_label_addr(Label* label) { 3051 CheckBuffer(); 3052 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE); 3053 int position = link(label); 3054 DCHECK(label->is_bound()); 3055 // Keep internal references relative until EmitRelocations. 3056 dp(position); 3057 } 3058 3059 void Assembler::EmitRelocations() { 3060 EnsureSpaceFor(relocations_.size() * kMaxRelocSize); 3061 3062 for (std::vector<DeferredRelocInfo>::iterator it = relocations_.begin(); 3063 it != relocations_.end(); it++) { 3064 RelocInfo::Mode rmode = it->rmode(); 3065 Address pc = buffer_ + it->position(); 3066 Code* code = NULL; 3067 RelocInfo rinfo(isolate(), pc, rmode, it->data(), code); 3068 3069 // Fix up internal references now that they are guaranteed to be bound. 3070 if (RelocInfo::IsInternalReference(rmode)) { 3071 // Jump table entry 3072 intptr_t pos = reinterpret_cast<intptr_t>(Memory::Address_at(pc)); 3073 Memory::Address_at(pc) = buffer_ + pos; 3074 } else if (RelocInfo::IsInternalReferenceEncoded(rmode)) { 3075 // mov sequence 3076 intptr_t pos = reinterpret_cast<intptr_t>(target_address_at(pc, code)); 3077 set_target_address_at(isolate(), pc, code, buffer_ + pos, 3078 SKIP_ICACHE_FLUSH); 3079 } 3080 3081 reloc_info_writer.Write(&rinfo); 3082 } 3083 3084 reloc_info_writer.Finish(); 3085 } 3086 3087 } // namespace internal 3088 } // namespace v8 3089 #endif // V8_TARGET_ARCH_S390 3090