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