OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stdarg.h> | 5 #include <stdarg.h> |
6 #include <stdlib.h> | 6 #include <stdlib.h> |
7 #include <cmath> | 7 #include <cmath> |
8 | 8 |
9 #if V8_TARGET_ARCH_S390 | 9 #if V8_TARGET_ARCH_S390 |
10 | 10 |
(...skipping 5947 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5958 int b1 = AS(SIYInstruction)->B1Value(); \ | 5958 int b1 = AS(SIYInstruction)->B1Value(); \ |
5959 intptr_t d1 = AS(SIYInstruction)->D1Value(); \ | 5959 intptr_t d1 = AS(SIYInstruction)->D1Value(); \ |
5960 uint8_t i2 = AS(SIYInstruction)->I2Value(); \ | 5960 uint8_t i2 = AS(SIYInstruction)->I2Value(); \ |
5961 int length = 6; | 5961 int length = 6; |
5962 | 5962 |
5963 #define DECODE_RRE_INSTRUCTION(r1, r2) \ | 5963 #define DECODE_RRE_INSTRUCTION(r1, r2) \ |
5964 int r1 = AS(RREInstruction)->R1Value(); \ | 5964 int r1 = AS(RREInstruction)->R1Value(); \ |
5965 int r2 = AS(RREInstruction)->R2Value(); \ | 5965 int r2 = AS(RREInstruction)->R2Value(); \ |
5966 int length = 4; | 5966 int length = 4; |
5967 | 5967 |
| 5968 #define DECODE_RRE_INSTRUCTION_M3(r1, r2, m3) \ |
| 5969 int r1 = AS(RREInstruction)->R1Value(); \ |
| 5970 int r2 = AS(RREInstruction)->R2Value(); \ |
| 5971 int m3 = AS(RREInstruction)->M3Value(); \ |
| 5972 int length = 4; |
| 5973 |
5968 #define DECODE_RRE_INSTRUCTION_NO_R2(r1) \ | 5974 #define DECODE_RRE_INSTRUCTION_NO_R2(r1) \ |
5969 int r1 = AS(RREInstruction)->R1Value(); \ | 5975 int r1 = AS(RREInstruction)->R1Value(); \ |
5970 int length = 4; | 5976 int length = 4; |
5971 | 5977 |
5972 #define DECODE_RRD_INSTRUCTION(r1, r2, r3) \ | 5978 #define DECODE_RRD_INSTRUCTION(r1, r2, r3) \ |
5973 int r1 = AS(RRDInstruction)->R1Value(); \ | 5979 int r1 = AS(RRDInstruction)->R1Value(); \ |
5974 int r2 = AS(RRDInstruction)->R2Value(); \ | 5980 int r2 = AS(RRDInstruction)->R2Value(); \ |
5975 int r3 = AS(RRDInstruction)->R3Value(); \ | 5981 int r3 = AS(RRDInstruction)->R3Value(); \ |
5976 int length = 4; | 5982 int length = 4; |
5977 | 5983 |
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6369 | 6375 |
6370 EVALUATE(BKPT) { | 6376 EVALUATE(BKPT) { |
6371 DCHECK_OPCODE(BKPT); | 6377 DCHECK_OPCODE(BKPT); |
6372 set_pc(get_pc() + 2); | 6378 set_pc(get_pc() + 2); |
6373 S390Debugger dbg(this); | 6379 S390Debugger dbg(this); |
6374 dbg.Debug(); | 6380 dbg.Debug(); |
6375 int length = 2; | 6381 int length = 2; |
6376 return length; | 6382 return length; |
6377 } | 6383 } |
6378 | 6384 |
6379 EVALUATE(SPM) { return DecodeInstructionOriginal(instr); } | 6385 EVALUATE(SPM) { |
| 6386 UNIMPLEMENTED(); |
| 6387 USE(instr); |
| 6388 return 0; |
| 6389 } |
6380 | 6390 |
6381 EVALUATE(BALR) { return DecodeInstructionOriginal(instr); } | 6391 EVALUATE(BALR) { |
| 6392 UNIMPLEMENTED(); |
| 6393 USE(instr); |
| 6394 return 0; |
| 6395 } |
6382 | 6396 |
6383 EVALUATE(BCTR) { return DecodeInstructionOriginal(instr); } | 6397 EVALUATE(BCTR) { |
| 6398 UNIMPLEMENTED(); |
| 6399 USE(instr); |
| 6400 return 0; |
| 6401 } |
6384 | 6402 |
6385 EVALUATE(BCR) { | 6403 EVALUATE(BCR) { |
6386 DCHECK_OPCODE(BCR); | 6404 DCHECK_OPCODE(BCR); |
6387 DECODE_RR_INSTRUCTION(r1, r2); | 6405 DECODE_RR_INSTRUCTION(r1, r2); |
6388 if (TestConditionCode(Condition(r1))) { | 6406 if (TestConditionCode(Condition(r1))) { |
6389 intptr_t r2_val = get_register(r2); | 6407 intptr_t r2_val = get_register(r2); |
6390 #if (!V8_TARGET_ARCH_S390X && V8_HOST_ARCH_S390) | 6408 #if (!V8_TARGET_ARCH_S390X && V8_HOST_ARCH_S390) |
6391 // On 31-bit, the top most bit may be 0 or 1, but is ignored by the | 6409 // On 31-bit, the top most bit may be 0 or 1, but is ignored by the |
6392 // hardware. Cleanse the top bit before jumping to it, unless it's one | 6410 // hardware. Cleanse the top bit before jumping to it, unless it's one |
6393 // of the special PCs | 6411 // of the special PCs |
6394 if (r2_val != bad_lr && r2_val != end_sim_pc) r2_val &= 0x7FFFFFFF; | 6412 if (r2_val != bad_lr && r2_val != end_sim_pc) r2_val &= 0x7FFFFFFF; |
6395 #endif | 6413 #endif |
6396 set_pc(r2_val); | 6414 set_pc(r2_val); |
6397 } | 6415 } |
6398 | 6416 |
6399 return length; | 6417 return length; |
6400 } | 6418 } |
6401 | 6419 |
6402 EVALUATE(SVC) { return DecodeInstructionOriginal(instr); } | 6420 EVALUATE(SVC) { |
| 6421 UNIMPLEMENTED(); |
| 6422 USE(instr); |
| 6423 return 0; |
| 6424 } |
6403 | 6425 |
6404 EVALUATE(BSM) { return DecodeInstructionOriginal(instr); } | 6426 EVALUATE(BSM) { |
| 6427 UNIMPLEMENTED(); |
| 6428 USE(instr); |
| 6429 return 0; |
| 6430 } |
6405 | 6431 |
6406 EVALUATE(BASSM) { return DecodeInstructionOriginal(instr); } | 6432 EVALUATE(BASSM) { |
| 6433 UNIMPLEMENTED(); |
| 6434 USE(instr); |
| 6435 return 0; |
| 6436 } |
6407 | 6437 |
6408 EVALUATE(BASR) { | 6438 EVALUATE(BASR) { |
6409 DCHECK_OPCODE(BASR); | 6439 DCHECK_OPCODE(BASR); |
6410 DECODE_RR_INSTRUCTION(r1, r2); | 6440 DECODE_RR_INSTRUCTION(r1, r2); |
6411 intptr_t link_addr = get_pc() + 2; | 6441 intptr_t link_addr = get_pc() + 2; |
6412 // If R2 is zero, the BASR does not branch. | 6442 // If R2 is zero, the BASR does not branch. |
6413 int64_t r2_val = (r2 == 0) ? link_addr : get_register(r2); | 6443 int64_t r2_val = (r2 == 0) ? link_addr : get_register(r2); |
6414 #if (!V8_TARGET_ARCH_S390X && V8_HOST_ARCH_S390) | 6444 #if (!V8_TARGET_ARCH_S390X && V8_HOST_ARCH_S390) |
6415 // On 31-bit, the top most bit may be 0 or 1, which can cause issues | 6445 // On 31-bit, the top most bit may be 0 or 1, which can cause issues |
6416 // for stackwalker. The top bit should either be cleanse before being | 6446 // for stackwalker. The top bit should either be cleanse before being |
6417 // pushed onto the stack, or during stack walking when dereferenced. | 6447 // pushed onto the stack, or during stack walking when dereferenced. |
6418 // For simulator, we'll take the worst case scenario and always tag | 6448 // For simulator, we'll take the worst case scenario and always tag |
6419 // the high bit, to flush out more problems. | 6449 // the high bit, to flush out more problems. |
6420 link_addr |= 0x80000000; | 6450 link_addr |= 0x80000000; |
6421 #endif | 6451 #endif |
6422 set_register(r1, link_addr); | 6452 set_register(r1, link_addr); |
6423 set_pc(r2_val); | 6453 set_pc(r2_val); |
6424 return length; | 6454 return length; |
6425 } | 6455 } |
6426 | 6456 |
6427 EVALUATE(MVCL) { return DecodeInstructionOriginal(instr); } | 6457 EVALUATE(MVCL) { |
| 6458 UNIMPLEMENTED(); |
| 6459 USE(instr); |
| 6460 return 0; |
| 6461 } |
6428 | 6462 |
6429 EVALUATE(CLCL) { return DecodeInstructionOriginal(instr); } | 6463 EVALUATE(CLCL) { |
| 6464 UNIMPLEMENTED(); |
| 6465 USE(instr); |
| 6466 return 0; |
| 6467 } |
6430 | 6468 |
6431 EVALUATE(LPR) { return DecodeInstructionOriginal(instr); } | 6469 EVALUATE(LPR) { |
| 6470 UNIMPLEMENTED(); |
| 6471 USE(instr); |
| 6472 return 0; |
| 6473 } |
6432 | 6474 |
6433 EVALUATE(LNR) { | 6475 EVALUATE(LNR) { |
6434 DCHECK_OPCODE(LNR); | 6476 DCHECK_OPCODE(LNR); |
6435 // Load Negative (32) | 6477 // Load Negative (32) |
6436 DECODE_RR_INSTRUCTION(r1, r2); | 6478 DECODE_RR_INSTRUCTION(r1, r2); |
6437 int32_t r2_val = get_low_register<int32_t>(r2); | 6479 int32_t r2_val = get_low_register<int32_t>(r2); |
6438 r2_val = (r2_val >= 0) ? -r2_val : r2_val; // If pos, then negate it. | 6480 r2_val = (r2_val >= 0) ? -r2_val : r2_val; // If pos, then negate it. |
6439 set_low_register(r1, r2_val); | 6481 set_low_register(r1, r2_val); |
6440 condition_reg_ = (r2_val == 0) ? CC_EQ : CC_LT; // CC0 - result is zero | 6482 condition_reg_ = (r2_val == 0) ? CC_EQ : CC_LT; // CC0 - result is zero |
6441 // CC1 - result is negative | 6483 // CC1 - result is negative |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6595 } | 6637 } |
6596 | 6638 |
6597 EVALUATE(LDR) { | 6639 EVALUATE(LDR) { |
6598 DCHECK_OPCODE(LDR); | 6640 DCHECK_OPCODE(LDR); |
6599 DECODE_RR_INSTRUCTION(r1, r2); | 6641 DECODE_RR_INSTRUCTION(r1, r2); |
6600 int64_t r2_val = get_d_register(r2); | 6642 int64_t r2_val = get_d_register(r2); |
6601 set_d_register(r1, r2_val); | 6643 set_d_register(r1, r2_val); |
6602 return length; | 6644 return length; |
6603 } | 6645 } |
6604 | 6646 |
6605 EVALUATE(CDR) { return DecodeInstructionOriginal(instr); } | 6647 EVALUATE(CDR) { |
| 6648 UNIMPLEMENTED(); |
| 6649 USE(instr); |
| 6650 return 0; |
| 6651 } |
6606 | 6652 |
6607 EVALUATE(LER) { return DecodeInstructionOriginal(instr); } | 6653 EVALUATE(LER) { |
| 6654 UNIMPLEMENTED(); |
| 6655 USE(instr); |
| 6656 return 0; |
| 6657 } |
6608 | 6658 |
6609 EVALUATE(STH) { | 6659 EVALUATE(STH) { |
6610 DCHECK_OPCODE(STH); | 6660 DCHECK_OPCODE(STH); |
6611 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); | 6661 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); |
6612 int16_t r1_val = get_low_register<int32_t>(r1); | 6662 int16_t r1_val = get_low_register<int32_t>(r1); |
6613 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 6663 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
6614 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 6664 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
6615 intptr_t mem_addr = b2_val + x2_val + d2_val; | 6665 intptr_t mem_addr = b2_val + x2_val + d2_val; |
6616 WriteH(mem_addr, r1_val, instr); | 6666 WriteH(mem_addr, r1_val, instr); |
6617 | 6667 |
(...skipping 15 matching lines...) Expand all Loading... |
6633 // Store Character/Byte | 6683 // Store Character/Byte |
6634 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); | 6684 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); |
6635 uint8_t r1_val = get_low_register<int32_t>(r1); | 6685 uint8_t r1_val = get_low_register<int32_t>(r1); |
6636 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 6686 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
6637 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 6687 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
6638 intptr_t mem_addr = b2_val + x2_val + d2_val; | 6688 intptr_t mem_addr = b2_val + x2_val + d2_val; |
6639 WriteB(mem_addr, r1_val); | 6689 WriteB(mem_addr, r1_val); |
6640 return length; | 6690 return length; |
6641 } | 6691 } |
6642 | 6692 |
6643 EVALUATE(IC_z) { return DecodeInstructionOriginal(instr); } | 6693 EVALUATE(IC_z) { |
| 6694 UNIMPLEMENTED(); |
| 6695 USE(instr); |
| 6696 return 0; |
| 6697 } |
6644 | 6698 |
6645 EVALUATE(EX) { | 6699 EVALUATE(EX) { |
6646 DCHECK_OPCODE(EX); | 6700 DCHECK_OPCODE(EX); |
6647 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); | 6701 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); |
6648 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 6702 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
6649 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 6703 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
6650 int32_t r1_val = get_low_register<int32_t>(r1); | 6704 int32_t r1_val = get_low_register<int32_t>(r1); |
6651 | 6705 |
6652 SixByteInstr the_instr = Instruction::InstructionBits( | 6706 SixByteInstr the_instr = Instruction::InstructionBits( |
6653 reinterpret_cast<const byte*>(b2_val + x2_val + d2_val)); | 6707 reinterpret_cast<const byte*>(b2_val + x2_val + d2_val)); |
6654 int inst_length = Instruction::InstructionLength( | 6708 int inst_length = Instruction::InstructionLength( |
6655 reinterpret_cast<const byte*>(b2_val + x2_val + d2_val)); | 6709 reinterpret_cast<const byte*>(b2_val + x2_val + d2_val)); |
6656 | 6710 |
6657 char new_instr_buf[8]; | 6711 char new_instr_buf[8]; |
6658 char* addr = reinterpret_cast<char*>(&new_instr_buf[0]); | 6712 char* addr = reinterpret_cast<char*>(&new_instr_buf[0]); |
6659 the_instr |= static_cast<SixByteInstr>(r1_val & 0xff) | 6713 the_instr |= static_cast<SixByteInstr>(r1_val & 0xff) |
6660 << (8 * inst_length - 16); | 6714 << (8 * inst_length - 16); |
6661 Instruction::SetInstructionBits<SixByteInstr>( | 6715 Instruction::SetInstructionBits<SixByteInstr>( |
6662 reinterpret_cast<byte*>(addr), static_cast<SixByteInstr>(the_instr)); | 6716 reinterpret_cast<byte*>(addr), static_cast<SixByteInstr>(the_instr)); |
6663 ExecuteInstruction(reinterpret_cast<Instruction*>(addr), false); | 6717 ExecuteInstruction(reinterpret_cast<Instruction*>(addr), false); |
6664 return length; | 6718 return length; |
6665 } | 6719 } |
6666 | 6720 |
6667 EVALUATE(BAL) { return DecodeInstructionOriginal(instr); } | 6721 EVALUATE(BAL) { |
| 6722 UNIMPLEMENTED(); |
| 6723 USE(instr); |
| 6724 return 0; |
| 6725 } |
6668 | 6726 |
6669 EVALUATE(BCT) { return DecodeInstructionOriginal(instr); } | 6727 EVALUATE(BCT) { |
| 6728 UNIMPLEMENTED(); |
| 6729 USE(instr); |
| 6730 return 0; |
| 6731 } |
6670 | 6732 |
6671 EVALUATE(BC) { return DecodeInstructionOriginal(instr); } | 6733 EVALUATE(BC) { |
| 6734 UNIMPLEMENTED(); |
| 6735 USE(instr); |
| 6736 return 0; |
| 6737 } |
6672 | 6738 |
6673 EVALUATE(LH) { | 6739 EVALUATE(LH) { |
6674 DCHECK_OPCODE(LH); | 6740 DCHECK_OPCODE(LH); |
6675 // Load Halfword | 6741 // Load Halfword |
6676 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); | 6742 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); |
6677 | 6743 |
6678 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 6744 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
6679 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 6745 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
6680 intptr_t mem_addr = x2_val + b2_val + d2_val; | 6746 intptr_t mem_addr = x2_val + b2_val + d2_val; |
6681 | 6747 |
6682 int32_t result = static_cast<int32_t>(ReadH(mem_addr, instr)); | 6748 int32_t result = static_cast<int32_t>(ReadH(mem_addr, instr)); |
6683 set_low_register(r1, result); | 6749 set_low_register(r1, result); |
6684 return length; | 6750 return length; |
6685 } | 6751 } |
6686 | 6752 |
6687 EVALUATE(CH) { return DecodeInstructionOriginal(instr); } | 6753 EVALUATE(CH) { |
| 6754 UNIMPLEMENTED(); |
| 6755 USE(instr); |
| 6756 return 0; |
| 6757 } |
6688 | 6758 |
6689 EVALUATE(AH) { | 6759 EVALUATE(AH) { |
6690 DCHECK_OPCODE(AH); | 6760 DCHECK_OPCODE(AH); |
6691 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); | 6761 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); |
6692 int32_t r1_val = get_low_register<int32_t>(r1); | 6762 int32_t r1_val = get_low_register<int32_t>(r1); |
6693 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 6763 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
6694 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 6764 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
6695 intptr_t addr = b2_val + x2_val + d2_val; | 6765 intptr_t addr = b2_val + x2_val + d2_val; |
6696 int32_t mem_val = static_cast<int32_t>(ReadH(addr, instr)); | 6766 int32_t mem_val = static_cast<int32_t>(ReadH(addr, instr)); |
6697 int32_t alu_out = 0; | 6767 int32_t alu_out = 0; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6730 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 6800 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
6731 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 6801 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
6732 intptr_t addr = b2_val + x2_val + d2_val; | 6802 intptr_t addr = b2_val + x2_val + d2_val; |
6733 int32_t mem_val = static_cast<int32_t>(ReadH(addr, instr)); | 6803 int32_t mem_val = static_cast<int32_t>(ReadH(addr, instr)); |
6734 int32_t alu_out = 0; | 6804 int32_t alu_out = 0; |
6735 alu_out = r1_val * mem_val; | 6805 alu_out = r1_val * mem_val; |
6736 set_low_register(r1, alu_out); | 6806 set_low_register(r1, alu_out); |
6737 return length; | 6807 return length; |
6738 } | 6808 } |
6739 | 6809 |
6740 EVALUATE(BAS) { return DecodeInstructionOriginal(instr); } | 6810 EVALUATE(BAS) { |
| 6811 UNIMPLEMENTED(); |
| 6812 USE(instr); |
| 6813 return 0; |
| 6814 } |
6741 | 6815 |
6742 EVALUATE(CVD) { return DecodeInstructionOriginal(instr); } | 6816 EVALUATE(CVD) { |
| 6817 UNIMPLEMENTED(); |
| 6818 USE(instr); |
| 6819 return 0; |
| 6820 } |
6743 | 6821 |
6744 EVALUATE(CVB) { return DecodeInstructionOriginal(instr); } | 6822 EVALUATE(CVB) { |
| 6823 UNIMPLEMENTED(); |
| 6824 USE(instr); |
| 6825 return 0; |
| 6826 } |
6745 | 6827 |
6746 EVALUATE(LAE) { return DecodeInstructionOriginal(instr); } | 6828 EVALUATE(LAE) { |
| 6829 UNIMPLEMENTED(); |
| 6830 USE(instr); |
| 6831 return 0; |
| 6832 } |
6747 | 6833 |
6748 EVALUATE(N) { | 6834 EVALUATE(N) { |
6749 DCHECK_OPCODE(N); | 6835 DCHECK_OPCODE(N); |
6750 // 32-bit Reg-Mem instructions | 6836 // 32-bit Reg-Mem instructions |
6751 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); | 6837 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); |
6752 int32_t r1_val = get_low_register<int32_t>(r1); | 6838 int32_t r1_val = get_low_register<int32_t>(r1); |
6753 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 6839 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
6754 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 6840 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
6755 int32_t mem_val = ReadW(b2_val + x2_val + d2_val, instr); | 6841 int32_t mem_val = ReadW(b2_val + x2_val + d2_val, instr); |
6756 int32_t alu_out = 0; | 6842 int32_t alu_out = 0; |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6843 int32_t alu_out = 0; | 6929 int32_t alu_out = 0; |
6844 bool isOF = false; | 6930 bool isOF = false; |
6845 isOF = CheckOverflowForIntSub(r1_val, mem_val, int32_t); | 6931 isOF = CheckOverflowForIntSub(r1_val, mem_val, int32_t); |
6846 alu_out = r1_val - mem_val; | 6932 alu_out = r1_val - mem_val; |
6847 SetS390ConditionCode<int32_t>(alu_out, 0); | 6933 SetS390ConditionCode<int32_t>(alu_out, 0); |
6848 SetS390OverflowCode(isOF); | 6934 SetS390OverflowCode(isOF); |
6849 set_low_register(r1, alu_out); | 6935 set_low_register(r1, alu_out); |
6850 return length; | 6936 return length; |
6851 } | 6937 } |
6852 | 6938 |
6853 EVALUATE(M) { return DecodeInstructionOriginal(instr); } | 6939 EVALUATE(M) { |
| 6940 UNIMPLEMENTED(); |
| 6941 USE(instr); |
| 6942 return 0; |
| 6943 } |
6854 | 6944 |
6855 EVALUATE(D) { return DecodeInstructionOriginal(instr); } | 6945 EVALUATE(D) { |
| 6946 UNIMPLEMENTED(); |
| 6947 USE(instr); |
| 6948 return 0; |
| 6949 } |
6856 | 6950 |
6857 EVALUATE(AL) { return DecodeInstructionOriginal(instr); } | 6951 EVALUATE(AL) { |
| 6952 UNIMPLEMENTED(); |
| 6953 USE(instr); |
| 6954 return 0; |
| 6955 } |
6858 | 6956 |
6859 EVALUATE(SL) { return DecodeInstructionOriginal(instr); } | 6957 EVALUATE(SL) { |
| 6958 UNIMPLEMENTED(); |
| 6959 USE(instr); |
| 6960 return 0; |
| 6961 } |
6860 | 6962 |
6861 EVALUATE(STD) { | 6963 EVALUATE(STD) { |
6862 DCHECK_OPCODE(STD); | 6964 DCHECK_OPCODE(STD); |
6863 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); | 6965 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); |
6864 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 6966 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
6865 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 6967 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
6866 intptr_t addr = b2_val + x2_val + d2_val; | 6968 intptr_t addr = b2_val + x2_val + d2_val; |
6867 int64_t frs_val = get_d_register(r1); | 6969 int64_t frs_val = get_d_register(r1); |
6868 WriteDW(addr, frs_val); | 6970 WriteDW(addr, frs_val); |
6869 return length; | 6971 return length; |
6870 } | 6972 } |
6871 | 6973 |
6872 EVALUATE(LD) { | 6974 EVALUATE(LD) { |
6873 DCHECK_OPCODE(LD); | 6975 DCHECK_OPCODE(LD); |
6874 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); | 6976 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); |
6875 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 6977 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
6876 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 6978 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
6877 intptr_t addr = b2_val + x2_val + d2_val; | 6979 intptr_t addr = b2_val + x2_val + d2_val; |
6878 int64_t dbl_val = *reinterpret_cast<int64_t*>(addr); | 6980 int64_t dbl_val = *reinterpret_cast<int64_t*>(addr); |
6879 set_d_register(r1, dbl_val); | 6981 set_d_register(r1, dbl_val); |
6880 return length; | 6982 return length; |
6881 } | 6983 } |
6882 | 6984 |
6883 EVALUATE(CD) { return DecodeInstructionOriginal(instr); } | 6985 EVALUATE(CD) { |
| 6986 UNIMPLEMENTED(); |
| 6987 USE(instr); |
| 6988 return 0; |
| 6989 } |
6884 | 6990 |
6885 EVALUATE(STE) { | 6991 EVALUATE(STE) { |
6886 DCHECK_OPCODE(STE); | 6992 DCHECK_OPCODE(STE); |
6887 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); | 6993 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); |
6888 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 6994 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
6889 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 6995 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
6890 intptr_t addr = b2_val + x2_val + d2_val; | 6996 intptr_t addr = b2_val + x2_val + d2_val; |
6891 int64_t frs_val = get_d_register(r1) >> 32; | 6997 int64_t frs_val = get_d_register(r1) >> 32; |
6892 WriteW(addr, static_cast<int32_t>(frs_val), instr); | 6998 WriteW(addr, static_cast<int32_t>(frs_val), instr); |
6893 return length; | 6999 return length; |
(...skipping 14 matching lines...) Expand all Loading... |
6908 DCHECK_OPCODE(LE); | 7014 DCHECK_OPCODE(LE); |
6909 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); | 7015 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val); |
6910 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 7016 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
6911 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 7017 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
6912 intptr_t addr = b2_val + x2_val + d2_val; | 7018 intptr_t addr = b2_val + x2_val + d2_val; |
6913 float float_val = *reinterpret_cast<float*>(addr); | 7019 float float_val = *reinterpret_cast<float*>(addr); |
6914 set_d_register_from_float32(r1, float_val); | 7020 set_d_register_from_float32(r1, float_val); |
6915 return length; | 7021 return length; |
6916 } | 7022 } |
6917 | 7023 |
6918 EVALUATE(BRXH) { return DecodeInstructionOriginal(instr); } | 7024 EVALUATE(BRXH) { |
| 7025 UNIMPLEMENTED(); |
| 7026 USE(instr); |
| 7027 return 0; |
| 7028 } |
6919 | 7029 |
6920 EVALUATE(BRXLE) { return DecodeInstructionOriginal(instr); } | 7030 EVALUATE(BRXLE) { |
| 7031 UNIMPLEMENTED(); |
| 7032 USE(instr); |
| 7033 return 0; |
| 7034 } |
6921 | 7035 |
6922 EVALUATE(BXH) { | 7036 EVALUATE(BXH) { |
6923 DCHECK_OPCODE(BXH); | 7037 DCHECK_OPCODE(BXH); |
6924 DECODE_RS_A_INSTRUCTION(r1, r3, b2, d2); | 7038 DECODE_RS_A_INSTRUCTION(r1, r3, b2, d2); |
6925 | 7039 |
6926 // r1_val is the first operand, r3_val is the increment | 7040 // r1_val is the first operand, r3_val is the increment |
6927 int32_t r1_val = r1 == 0 ? 0 : get_register(r1); | 7041 int32_t r1_val = r1 == 0 ? 0 : get_register(r1); |
6928 int32_t r3_val = r2 == 0 ? 0 : get_register(r3); | 7042 int32_t r3_val = r2 == 0 ? 0 : get_register(r3); |
6929 intptr_t b2_val = b2 == 0 ? 0 : get_register(b2); | 7043 intptr_t b2_val = b2 == 0 ? 0 : get_register(b2); |
6930 intptr_t branch_address = b2_val + d2; | 7044 intptr_t branch_address = b2_val + d2; |
6931 // increment r1_val | 7045 // increment r1_val |
6932 r1_val += r3_val; | 7046 r1_val += r3_val; |
6933 | 7047 |
6934 // if the increment is even, then it designates a pair of registers | 7048 // if the increment is even, then it designates a pair of registers |
6935 // and the contents of the even and odd registers of the pair are used as | 7049 // and the contents of the even and odd registers of the pair are used as |
6936 // the increment and compare value respectively. If the increment is odd, | 7050 // the increment and compare value respectively. If the increment is odd, |
6937 // the increment itself is used as both the increment and compare value | 7051 // the increment itself is used as both the increment and compare value |
6938 int32_t compare_val = r3 % 2 == 0 ? get_register(r3 + 1) : r3_val; | 7052 int32_t compare_val = r3 % 2 == 0 ? get_register(r3 + 1) : r3_val; |
6939 if (r1_val > compare_val) { | 7053 if (r1_val > compare_val) { |
6940 // branch to address if r1_val is greater than compare value | 7054 // branch to address if r1_val is greater than compare value |
6941 set_pc(branch_address); | 7055 set_pc(branch_address); |
6942 } | 7056 } |
6943 | 7057 |
6944 // update contents of register in r1 with the new incremented value | 7058 // update contents of register in r1 with the new incremented value |
6945 set_register(r1, r1_val); | 7059 set_register(r1, r1_val); |
6946 | 7060 |
6947 return length; | 7061 return length; |
6948 } | 7062 } |
6949 | 7063 |
6950 EVALUATE(BXLE) { return DecodeInstructionOriginal(instr); } | 7064 EVALUATE(BXLE) { |
| 7065 UNIMPLEMENTED(); |
| 7066 USE(instr); |
| 7067 return 0; |
| 7068 } |
6951 | 7069 |
6952 EVALUATE(SRL) { | 7070 EVALUATE(SRL) { |
6953 DCHECK_OPCODE(SRL); | 7071 DCHECK_OPCODE(SRL); |
6954 DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2); | 7072 DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2); |
6955 // only takes rightmost 6bits | 7073 // only takes rightmost 6bits |
6956 int64_t b2_val = b2 == 0 ? 0 : get_register(b2); | 7074 int64_t b2_val = b2 == 0 ? 0 : get_register(b2); |
6957 int shiftBits = (b2_val + d2) & 0x3F; | 7075 int shiftBits = (b2_val + d2) & 0x3F; |
6958 uint32_t r1_val = get_low_register<uint32_t>(r1); | 7076 uint32_t r1_val = get_low_register<uint32_t>(r1); |
6959 uint32_t alu_out = 0; | 7077 uint32_t alu_out = 0; |
6960 alu_out = r1_val >> shiftBits; | 7078 alu_out = r1_val >> shiftBits; |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7053 int64_t opnd1 = static_cast<int64_t>(get_low_register<int32_t>(r1)) << 32; | 7171 int64_t opnd1 = static_cast<int64_t>(get_low_register<int32_t>(r1)) << 32; |
7054 int64_t opnd2 = static_cast<uint64_t>(get_low_register<uint32_t>(r1 + 1)); | 7172 int64_t opnd2 = static_cast<uint64_t>(get_low_register<uint32_t>(r1 + 1)); |
7055 int64_t r1_val = opnd1 + opnd2; | 7173 int64_t r1_val = opnd1 + opnd2; |
7056 int64_t alu_out = r1_val >> shiftBits; | 7174 int64_t alu_out = r1_val >> shiftBits; |
7057 set_low_register(r1, alu_out >> 32); | 7175 set_low_register(r1, alu_out >> 32); |
7058 set_low_register(r1 + 1, alu_out & 0x00000000FFFFFFFF); | 7176 set_low_register(r1 + 1, alu_out & 0x00000000FFFFFFFF); |
7059 SetS390ConditionCode<int32_t>(alu_out, 0); | 7177 SetS390ConditionCode<int32_t>(alu_out, 0); |
7060 return length; | 7178 return length; |
7061 } | 7179 } |
7062 | 7180 |
7063 EVALUATE(SLDA) { return DecodeInstructionOriginal(instr); } | 7181 EVALUATE(SLDA) { |
| 7182 UNIMPLEMENTED(); |
| 7183 USE(instr); |
| 7184 return 0; |
| 7185 } |
7064 | 7186 |
7065 EVALUATE(STM) { | 7187 EVALUATE(STM) { |
7066 DCHECK_OPCODE(STM); | 7188 DCHECK_OPCODE(STM); |
7067 DECODE_RS_A_INSTRUCTION(r1, r3, rb, d2); | 7189 DECODE_RS_A_INSTRUCTION(r1, r3, rb, d2); |
7068 // Store Multiple 32-bits. | 7190 // Store Multiple 32-bits. |
7069 int offset = d2; | 7191 int offset = d2; |
7070 // Regs roll around if r3 is less than r1. | 7192 // Regs roll around if r3 is less than r1. |
7071 // Artifically increase r3 by 16 so we can calculate | 7193 // Artifically increase r3 by 16 so we can calculate |
7072 // the number of regs stored properly. | 7194 // the number of regs stored properly. |
7073 if (r3 < r1) r3 += 16; | 7195 if (r3 < r1) r3 += 16; |
(...skipping 22 matching lines...) Expand all Loading... |
7096 if (0 == selected_bits) { | 7218 if (0 == selected_bits) { |
7097 condition_reg_ = CC_EQ; // CC0 | 7219 condition_reg_ = CC_EQ; // CC0 |
7098 } else if (selected_bits == imm_val) { | 7220 } else if (selected_bits == imm_val) { |
7099 condition_reg_ = 0x1; // CC3 | 7221 condition_reg_ = 0x1; // CC3 |
7100 } else { | 7222 } else { |
7101 condition_reg_ = 0x4; // CC1 | 7223 condition_reg_ = 0x4; // CC1 |
7102 } | 7224 } |
7103 return length; | 7225 return length; |
7104 } | 7226 } |
7105 | 7227 |
7106 EVALUATE(MVI) { return DecodeInstructionOriginal(instr); } | 7228 EVALUATE(MVI) { |
| 7229 UNIMPLEMENTED(); |
| 7230 USE(instr); |
| 7231 return 0; |
| 7232 } |
7107 | 7233 |
7108 EVALUATE(TS) { return DecodeInstructionOriginal(instr); } | 7234 EVALUATE(TS) { |
| 7235 UNIMPLEMENTED(); |
| 7236 USE(instr); |
| 7237 return 0; |
| 7238 } |
7109 | 7239 |
7110 EVALUATE(NI) { return DecodeInstructionOriginal(instr); } | 7240 EVALUATE(NI) { |
| 7241 UNIMPLEMENTED(); |
| 7242 USE(instr); |
| 7243 return 0; |
| 7244 } |
7111 | 7245 |
7112 EVALUATE(CLI) { | 7246 EVALUATE(CLI) { |
7113 DCHECK_OPCODE(CLI); | 7247 DCHECK_OPCODE(CLI); |
7114 // Compare Immediate (Mem - Imm) (8) | 7248 // Compare Immediate (Mem - Imm) (8) |
7115 DECODE_SI_INSTRUCTION_I_UINT8(b1, d1_val, imm_val) | 7249 DECODE_SI_INSTRUCTION_I_UINT8(b1, d1_val, imm_val) |
7116 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1); | 7250 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1); |
7117 intptr_t addr = b1_val + d1_val; | 7251 intptr_t addr = b1_val + d1_val; |
7118 uint8_t mem_val = ReadB(addr); | 7252 uint8_t mem_val = ReadB(addr); |
7119 SetS390ConditionCode<uint8_t>(mem_val, imm_val); | 7253 SetS390ConditionCode<uint8_t>(mem_val, imm_val); |
7120 return length; | 7254 return length; |
7121 } | 7255 } |
7122 | 7256 |
7123 EVALUATE(OI) { return DecodeInstructionOriginal(instr); } | 7257 EVALUATE(OI) { |
| 7258 UNIMPLEMENTED(); |
| 7259 USE(instr); |
| 7260 return 0; |
| 7261 } |
7124 | 7262 |
7125 EVALUATE(XI) { return DecodeInstructionOriginal(instr); } | 7263 EVALUATE(XI) { |
| 7264 UNIMPLEMENTED(); |
| 7265 USE(instr); |
| 7266 return 0; |
| 7267 } |
7126 | 7268 |
7127 EVALUATE(LM) { | 7269 EVALUATE(LM) { |
7128 DCHECK_OPCODE(LM); | 7270 DCHECK_OPCODE(LM); |
7129 DECODE_RS_A_INSTRUCTION(r1, r3, rb, d2); | 7271 DECODE_RS_A_INSTRUCTION(r1, r3, rb, d2); |
7130 // Store Multiple 32-bits. | 7272 // Store Multiple 32-bits. |
7131 int offset = d2; | 7273 int offset = d2; |
7132 // Regs roll around if r3 is less than r1. | 7274 // Regs roll around if r3 is less than r1. |
7133 // Artifically increase r3 by 16 so we can calculate | 7275 // Artifically increase r3 by 16 so we can calculate |
7134 // the number of regs stored properly. | 7276 // the number of regs stored properly. |
7135 if (r3 < r1) r3 += 16; | 7277 if (r3 < r1) r3 += 16; |
7136 | 7278 |
7137 int32_t rb_val = (rb == 0) ? 0 : get_low_register<int32_t>(rb); | 7279 int32_t rb_val = (rb == 0) ? 0 : get_low_register<int32_t>(rb); |
7138 | 7280 |
7139 // Store each register in ascending order. | 7281 // Store each register in ascending order. |
7140 for (int i = 0; i <= r3 - r1; i++) { | 7282 for (int i = 0; i <= r3 - r1; i++) { |
7141 int32_t value = ReadW(rb_val + offset + 4 * i, instr); | 7283 int32_t value = ReadW(rb_val + offset + 4 * i, instr); |
7142 set_low_register((r1 + i) % 16, value); | 7284 set_low_register((r1 + i) % 16, value); |
7143 } | 7285 } |
7144 return length; | 7286 return length; |
7145 } | 7287 } |
7146 | 7288 |
7147 EVALUATE(MVCLE) { return DecodeInstructionOriginal(instr); } | 7289 EVALUATE(MVCLE) { |
| 7290 UNIMPLEMENTED(); |
| 7291 USE(instr); |
| 7292 return 0; |
| 7293 } |
7148 | 7294 |
7149 EVALUATE(CLCLE) { return DecodeInstructionOriginal(instr); } | 7295 EVALUATE(CLCLE) { |
| 7296 UNIMPLEMENTED(); |
| 7297 USE(instr); |
| 7298 return 0; |
| 7299 } |
7150 | 7300 |
7151 EVALUATE(MC) { return DecodeInstructionOriginal(instr); } | 7301 EVALUATE(MC) { |
| 7302 UNIMPLEMENTED(); |
| 7303 USE(instr); |
| 7304 return 0; |
| 7305 } |
7152 | 7306 |
7153 EVALUATE(CDS) { return DecodeInstructionOriginal(instr); } | 7307 EVALUATE(CDS) { |
| 7308 UNIMPLEMENTED(); |
| 7309 USE(instr); |
| 7310 return 0; |
| 7311 } |
7154 | 7312 |
7155 EVALUATE(STCM) { return DecodeInstructionOriginal(instr); } | 7313 EVALUATE(STCM) { |
| 7314 UNIMPLEMENTED(); |
| 7315 USE(instr); |
| 7316 return 0; |
| 7317 } |
7156 | 7318 |
7157 EVALUATE(ICM) { return DecodeInstructionOriginal(instr); } | 7319 EVALUATE(ICM) { |
| 7320 UNIMPLEMENTED(); |
| 7321 USE(instr); |
| 7322 return 0; |
| 7323 } |
7158 | 7324 |
7159 EVALUATE(BPRP) { return DecodeInstructionOriginal(instr); } | 7325 EVALUATE(BPRP) { |
| 7326 UNIMPLEMENTED(); |
| 7327 USE(instr); |
| 7328 return 0; |
| 7329 } |
7160 | 7330 |
7161 EVALUATE(BPP) { return DecodeInstructionOriginal(instr); } | 7331 EVALUATE(BPP) { |
| 7332 UNIMPLEMENTED(); |
| 7333 USE(instr); |
| 7334 return 0; |
| 7335 } |
7162 | 7336 |
7163 EVALUATE(TRTR) { return DecodeInstructionOriginal(instr); } | 7337 EVALUATE(TRTR) { |
| 7338 UNIMPLEMENTED(); |
| 7339 USE(instr); |
| 7340 return 0; |
| 7341 } |
7164 | 7342 |
7165 EVALUATE(MVN) { return DecodeInstructionOriginal(instr); } | 7343 EVALUATE(MVN) { |
| 7344 UNIMPLEMENTED(); |
| 7345 USE(instr); |
| 7346 return 0; |
| 7347 } |
7166 | 7348 |
7167 EVALUATE(MVC) { | 7349 EVALUATE(MVC) { |
7168 DCHECK_OPCODE(MVC); | 7350 DCHECK_OPCODE(MVC); |
7169 // Move Character | 7351 // Move Character |
7170 SSInstruction* ssInstr = reinterpret_cast<SSInstruction*>(instr); | 7352 SSInstruction* ssInstr = reinterpret_cast<SSInstruction*>(instr); |
7171 int b1 = ssInstr->B1Value(); | 7353 int b1 = ssInstr->B1Value(); |
7172 intptr_t d1 = ssInstr->D1Value(); | 7354 intptr_t d1 = ssInstr->D1Value(); |
7173 int b2 = ssInstr->B2Value(); | 7355 int b2 = ssInstr->B2Value(); |
7174 intptr_t d2 = ssInstr->D2Value(); | 7356 intptr_t d2 = ssInstr->D2Value(); |
7175 int length = ssInstr->Length(); | 7357 int length = ssInstr->Length(); |
7176 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1); | 7358 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1); |
7177 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 7359 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
7178 intptr_t src_addr = b2_val + d2; | 7360 intptr_t src_addr = b2_val + d2; |
7179 intptr_t dst_addr = b1_val + d1; | 7361 intptr_t dst_addr = b1_val + d1; |
7180 // remember that the length is the actual length - 1 | 7362 // remember that the length is the actual length - 1 |
7181 for (int i = 0; i < length + 1; ++i) { | 7363 for (int i = 0; i < length + 1; ++i) { |
7182 WriteB(dst_addr++, ReadB(src_addr++)); | 7364 WriteB(dst_addr++, ReadB(src_addr++)); |
7183 } | 7365 } |
7184 length = 6; | 7366 length = 6; |
7185 return length; | 7367 return length; |
7186 } | 7368 } |
7187 | 7369 |
7188 EVALUATE(MVZ) { return DecodeInstructionOriginal(instr); } | 7370 EVALUATE(MVZ) { |
7189 | 7371 UNIMPLEMENTED(); |
7190 EVALUATE(NC) { return DecodeInstructionOriginal(instr); } | 7372 USE(instr); |
7191 | 7373 return 0; |
7192 EVALUATE(CLC) { return DecodeInstructionOriginal(instr); } | 7374 } |
7193 | 7375 |
7194 EVALUATE(OC) { return DecodeInstructionOriginal(instr); } | 7376 EVALUATE(NC) { |
7195 | 7377 UNIMPLEMENTED(); |
7196 EVALUATE(XC) { return DecodeInstructionOriginal(instr); } | 7378 USE(instr); |
7197 | 7379 return 0; |
7198 EVALUATE(MVCP) { return DecodeInstructionOriginal(instr); } | 7380 } |
7199 | 7381 |
7200 EVALUATE(TR) { return DecodeInstructionOriginal(instr); } | 7382 EVALUATE(CLC) { |
7201 | 7383 UNIMPLEMENTED(); |
7202 EVALUATE(TRT) { return DecodeInstructionOriginal(instr); } | 7384 USE(instr); |
7203 | 7385 return 0; |
7204 EVALUATE(ED) { return DecodeInstructionOriginal(instr); } | 7386 } |
7205 | 7387 |
7206 EVALUATE(EDMK) { return DecodeInstructionOriginal(instr); } | 7388 EVALUATE(OC) { |
7207 | 7389 UNIMPLEMENTED(); |
7208 EVALUATE(PKU) { return DecodeInstructionOriginal(instr); } | 7390 USE(instr); |
7209 | 7391 return 0; |
7210 EVALUATE(UNPKU) { return DecodeInstructionOriginal(instr); } | 7392 } |
7211 | 7393 |
7212 EVALUATE(MVCIN) { return DecodeInstructionOriginal(instr); } | 7394 EVALUATE(XC) { |
7213 | 7395 UNIMPLEMENTED(); |
7214 EVALUATE(PKA) { return DecodeInstructionOriginal(instr); } | 7396 USE(instr); |
7215 | 7397 return 0; |
7216 EVALUATE(UNPKA) { return DecodeInstructionOriginal(instr); } | 7398 } |
7217 | 7399 |
7218 EVALUATE(PLO) { return DecodeInstructionOriginal(instr); } | 7400 EVALUATE(MVCP) { |
7219 | 7401 UNIMPLEMENTED(); |
7220 EVALUATE(LMD) { return DecodeInstructionOriginal(instr); } | 7402 USE(instr); |
7221 | 7403 return 0; |
7222 EVALUATE(SRP) { return DecodeInstructionOriginal(instr); } | 7404 } |
7223 | 7405 |
7224 EVALUATE(MVO) { return DecodeInstructionOriginal(instr); } | 7406 EVALUATE(TR) { |
7225 | 7407 UNIMPLEMENTED(); |
7226 EVALUATE(PACK) { return DecodeInstructionOriginal(instr); } | 7408 USE(instr); |
7227 | 7409 return 0; |
7228 EVALUATE(UNPK) { return DecodeInstructionOriginal(instr); } | 7410 } |
7229 | 7411 |
7230 EVALUATE(ZAP) { return DecodeInstructionOriginal(instr); } | 7412 EVALUATE(TRT) { |
7231 | 7413 UNIMPLEMENTED(); |
7232 EVALUATE(AP) { return DecodeInstructionOriginal(instr); } | 7414 USE(instr); |
7233 | 7415 return 0; |
7234 EVALUATE(SP) { return DecodeInstructionOriginal(instr); } | 7416 } |
7235 | 7417 |
7236 EVALUATE(MP) { return DecodeInstructionOriginal(instr); } | 7418 EVALUATE(ED) { |
7237 | 7419 UNIMPLEMENTED(); |
7238 EVALUATE(DP) { return DecodeInstructionOriginal(instr); } | 7420 USE(instr); |
7239 | 7421 return 0; |
7240 EVALUATE(UPT) { return DecodeInstructionOriginal(instr); } | 7422 } |
7241 | 7423 |
7242 EVALUATE(PFPO) { return DecodeInstructionOriginal(instr); } | 7424 EVALUATE(EDMK) { |
7243 | 7425 UNIMPLEMENTED(); |
7244 EVALUATE(IIHH) { return DecodeInstructionOriginal(instr); } | 7426 USE(instr); |
7245 | 7427 return 0; |
7246 EVALUATE(IIHL) { return DecodeInstructionOriginal(instr); } | 7428 } |
7247 | 7429 |
7248 EVALUATE(IILH) { return DecodeInstructionOriginal(instr); } | 7430 EVALUATE(PKU) { |
7249 | 7431 UNIMPLEMENTED(); |
7250 EVALUATE(IILL) { return DecodeInstructionOriginal(instr); } | 7432 USE(instr); |
7251 | 7433 return 0; |
7252 EVALUATE(NIHH) { return DecodeInstructionOriginal(instr); } | 7434 } |
7253 | 7435 |
7254 EVALUATE(NIHL) { return DecodeInstructionOriginal(instr); } | 7436 EVALUATE(UNPKU) { |
| 7437 UNIMPLEMENTED(); |
| 7438 USE(instr); |
| 7439 return 0; |
| 7440 } |
| 7441 |
| 7442 EVALUATE(MVCIN) { |
| 7443 UNIMPLEMENTED(); |
| 7444 USE(instr); |
| 7445 return 0; |
| 7446 } |
| 7447 |
| 7448 EVALUATE(PKA) { |
| 7449 UNIMPLEMENTED(); |
| 7450 USE(instr); |
| 7451 return 0; |
| 7452 } |
| 7453 |
| 7454 EVALUATE(UNPKA) { |
| 7455 UNIMPLEMENTED(); |
| 7456 USE(instr); |
| 7457 return 0; |
| 7458 } |
| 7459 |
| 7460 EVALUATE(PLO) { |
| 7461 UNIMPLEMENTED(); |
| 7462 USE(instr); |
| 7463 return 0; |
| 7464 } |
| 7465 |
| 7466 EVALUATE(LMD) { |
| 7467 UNIMPLEMENTED(); |
| 7468 USE(instr); |
| 7469 return 0; |
| 7470 } |
| 7471 |
| 7472 EVALUATE(SRP) { |
| 7473 UNIMPLEMENTED(); |
| 7474 USE(instr); |
| 7475 return 0; |
| 7476 } |
| 7477 |
| 7478 EVALUATE(MVO) { |
| 7479 UNIMPLEMENTED(); |
| 7480 USE(instr); |
| 7481 return 0; |
| 7482 } |
| 7483 |
| 7484 EVALUATE(PACK) { |
| 7485 UNIMPLEMENTED(); |
| 7486 USE(instr); |
| 7487 return 0; |
| 7488 } |
| 7489 |
| 7490 EVALUATE(UNPK) { |
| 7491 UNIMPLEMENTED(); |
| 7492 USE(instr); |
| 7493 return 0; |
| 7494 } |
| 7495 |
| 7496 EVALUATE(ZAP) { |
| 7497 UNIMPLEMENTED(); |
| 7498 USE(instr); |
| 7499 return 0; |
| 7500 } |
| 7501 |
| 7502 EVALUATE(AP) { |
| 7503 UNIMPLEMENTED(); |
| 7504 USE(instr); |
| 7505 return 0; |
| 7506 } |
| 7507 |
| 7508 EVALUATE(SP) { |
| 7509 UNIMPLEMENTED(); |
| 7510 USE(instr); |
| 7511 return 0; |
| 7512 } |
| 7513 |
| 7514 EVALUATE(MP) { |
| 7515 UNIMPLEMENTED(); |
| 7516 USE(instr); |
| 7517 return 0; |
| 7518 } |
| 7519 |
| 7520 EVALUATE(DP) { |
| 7521 UNIMPLEMENTED(); |
| 7522 USE(instr); |
| 7523 return 0; |
| 7524 } |
| 7525 |
| 7526 EVALUATE(UPT) { |
| 7527 UNIMPLEMENTED(); |
| 7528 USE(instr); |
| 7529 return 0; |
| 7530 } |
| 7531 |
| 7532 EVALUATE(PFPO) { |
| 7533 UNIMPLEMENTED(); |
| 7534 USE(instr); |
| 7535 return 0; |
| 7536 } |
| 7537 |
| 7538 EVALUATE(IIHH) { |
| 7539 UNIMPLEMENTED(); |
| 7540 USE(instr); |
| 7541 return 0; |
| 7542 } |
| 7543 |
| 7544 EVALUATE(IIHL) { |
| 7545 UNIMPLEMENTED(); |
| 7546 USE(instr); |
| 7547 return 0; |
| 7548 } |
| 7549 |
| 7550 EVALUATE(IILH) { |
| 7551 UNIMPLEMENTED(); |
| 7552 USE(instr); |
| 7553 return 0; |
| 7554 } |
| 7555 |
| 7556 EVALUATE(IILL) { |
| 7557 UNIMPLEMENTED(); |
| 7558 USE(instr); |
| 7559 return 0; |
| 7560 } |
| 7561 |
| 7562 EVALUATE(NIHH) { |
| 7563 UNIMPLEMENTED(); |
| 7564 USE(instr); |
| 7565 return 0; |
| 7566 } |
| 7567 |
| 7568 EVALUATE(NIHL) { |
| 7569 UNIMPLEMENTED(); |
| 7570 USE(instr); |
| 7571 return 0; |
| 7572 } |
7255 | 7573 |
7256 EVALUATE(NILH) { | 7574 EVALUATE(NILH) { |
7257 DCHECK_OPCODE(NILH); | 7575 DCHECK_OPCODE(NILH); |
7258 DECODE_RI_A_INSTRUCTION(instr, r1, i); | 7576 DECODE_RI_A_INSTRUCTION(instr, r1, i); |
7259 int32_t r1_val = get_low_register<int32_t>(r1); | 7577 int32_t r1_val = get_low_register<int32_t>(r1); |
7260 // CC is set based on the 16 bits that are AND'd | 7578 // CC is set based on the 16 bits that are AND'd |
7261 SetS390BitWiseConditionCode<uint16_t>((r1_val >> 16) & i); | 7579 SetS390BitWiseConditionCode<uint16_t>((r1_val >> 16) & i); |
7262 i = (i << 16) | 0x0000FFFF; | 7580 i = (i << 16) | 0x0000FFFF; |
7263 set_low_register(r1, r1_val & i); | 7581 set_low_register(r1, r1_val & i); |
7264 return length; | 7582 return length; |
7265 } | 7583 } |
7266 | 7584 |
7267 EVALUATE(NILL) { | 7585 EVALUATE(NILL) { |
7268 DCHECK_OPCODE(NILL); | 7586 DCHECK_OPCODE(NILL); |
7269 DECODE_RI_A_INSTRUCTION(instr, r1, i); | 7587 DECODE_RI_A_INSTRUCTION(instr, r1, i); |
7270 int32_t r1_val = get_low_register<int32_t>(r1); | 7588 int32_t r1_val = get_low_register<int32_t>(r1); |
7271 // CC is set based on the 16 bits that are AND'd | 7589 // CC is set based on the 16 bits that are AND'd |
7272 SetS390BitWiseConditionCode<uint16_t>(r1_val & i); | 7590 SetS390BitWiseConditionCode<uint16_t>(r1_val & i); |
7273 i |= 0xFFFF0000; | 7591 i |= 0xFFFF0000; |
7274 set_low_register(r1, r1_val & i); | 7592 set_low_register(r1, r1_val & i); |
7275 return length; | 7593 return length; |
7276 } | 7594 } |
7277 | 7595 |
7278 EVALUATE(OIHH) { return DecodeInstructionOriginal(instr); } | 7596 EVALUATE(OIHH) { |
| 7597 UNIMPLEMENTED(); |
| 7598 USE(instr); |
| 7599 return 0; |
| 7600 } |
7279 | 7601 |
7280 EVALUATE(OIHL) { return DecodeInstructionOriginal(instr); } | 7602 EVALUATE(OIHL) { |
| 7603 UNIMPLEMENTED(); |
| 7604 USE(instr); |
| 7605 return 0; |
| 7606 } |
7281 | 7607 |
7282 EVALUATE(OILH) { | 7608 EVALUATE(OILH) { |
7283 DCHECK_OPCODE(OILH); | 7609 DCHECK_OPCODE(OILH); |
7284 DECODE_RI_A_INSTRUCTION(instr, r1, i); | 7610 DECODE_RI_A_INSTRUCTION(instr, r1, i); |
7285 int32_t r1_val = get_low_register<int32_t>(r1); | 7611 int32_t r1_val = get_low_register<int32_t>(r1); |
7286 // CC is set based on the 16 bits that are AND'd | 7612 // CC is set based on the 16 bits that are AND'd |
7287 SetS390BitWiseConditionCode<uint16_t>((r1_val >> 16) | i); | 7613 SetS390BitWiseConditionCode<uint16_t>((r1_val >> 16) | i); |
7288 i = i << 16; | 7614 i = i << 16; |
7289 set_low_register(r1, r1_val | i); | 7615 set_low_register(r1, r1_val | i); |
7290 return length; | 7616 return length; |
7291 } | 7617 } |
7292 | 7618 |
7293 EVALUATE(OILL) { | 7619 EVALUATE(OILL) { |
7294 DCHECK_OPCODE(OILL); | 7620 DCHECK_OPCODE(OILL); |
7295 DECODE_RI_A_INSTRUCTION(instr, r1, i); | 7621 DECODE_RI_A_INSTRUCTION(instr, r1, i); |
7296 int32_t r1_val = get_low_register<int32_t>(r1); | 7622 int32_t r1_val = get_low_register<int32_t>(r1); |
7297 // CC is set based on the 16 bits that are AND'd | 7623 // CC is set based on the 16 bits that are AND'd |
7298 SetS390BitWiseConditionCode<uint16_t>(r1_val | i); | 7624 SetS390BitWiseConditionCode<uint16_t>(r1_val | i); |
7299 set_low_register(r1, r1_val | i); | 7625 set_low_register(r1, r1_val | i); |
7300 return length; | 7626 return length; |
7301 } | 7627 } |
7302 | 7628 |
7303 EVALUATE(LLIHH) { return DecodeInstructionOriginal(instr); } | 7629 EVALUATE(LLIHH) { |
| 7630 UNIMPLEMENTED(); |
| 7631 USE(instr); |
| 7632 return 0; |
| 7633 } |
7304 | 7634 |
7305 EVALUATE(LLIHL) { return DecodeInstructionOriginal(instr); } | 7635 EVALUATE(LLIHL) { |
| 7636 UNIMPLEMENTED(); |
| 7637 USE(instr); |
| 7638 return 0; |
| 7639 } |
7306 | 7640 |
7307 EVALUATE(LLILH) { return DecodeInstructionOriginal(instr); } | 7641 EVALUATE(LLILH) { |
| 7642 UNIMPLEMENTED(); |
| 7643 USE(instr); |
| 7644 return 0; |
| 7645 } |
7308 | 7646 |
7309 EVALUATE(LLILL) { return DecodeInstructionOriginal(instr); } | 7647 EVALUATE(LLILL) { |
| 7648 UNIMPLEMENTED(); |
| 7649 USE(instr); |
| 7650 return 0; |
| 7651 } |
7310 | 7652 |
7311 EVALUATE(TMLH) { return DecodeInstructionOriginal(instr); } | 7653 EVALUATE(TMLH) { |
| 7654 UNIMPLEMENTED(); |
| 7655 USE(instr); |
| 7656 return 0; |
| 7657 } |
7312 | 7658 |
7313 EVALUATE(TMLL) { | 7659 EVALUATE(TMLL) { |
7314 DCHECK_OPCODE(TMLL); | 7660 DCHECK_OPCODE(TMLL); |
7315 DECODE_RI_A_INSTRUCTION(instr, r1, i2); | 7661 DECODE_RI_A_INSTRUCTION(instr, r1, i2); |
7316 int mask = i2 & 0x0000FFFF; | 7662 int mask = i2 & 0x0000FFFF; |
7317 if (mask == 0) { | 7663 if (mask == 0) { |
7318 condition_reg_ = 0x0; | 7664 condition_reg_ = 0x0; |
7319 return length; | 7665 return length; |
7320 } | 7666 } |
7321 uint32_t r1_val = get_low_register<uint32_t>(r1); | 7667 uint32_t r1_val = get_low_register<uint32_t>(r1); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7361 } else { | 7707 } else { |
7362 // leftmost bit is zero | 7708 // leftmost bit is zero |
7363 condition_reg_ = 0x4; | 7709 condition_reg_ = 0x4; |
7364 } | 7710 } |
7365 return length; // Done! | 7711 return length; // Done! |
7366 } | 7712 } |
7367 } | 7713 } |
7368 return length; | 7714 return length; |
7369 } | 7715 } |
7370 | 7716 |
7371 EVALUATE(TMHH) { return DecodeInstructionOriginal(instr); } | 7717 EVALUATE(TMHH) { |
| 7718 UNIMPLEMENTED(); |
| 7719 USE(instr); |
| 7720 return 0; |
| 7721 } |
7372 | 7722 |
7373 EVALUATE(TMHL) { return DecodeInstructionOriginal(instr); } | 7723 EVALUATE(TMHL) { |
| 7724 UNIMPLEMENTED(); |
| 7725 USE(instr); |
| 7726 return 0; |
| 7727 } |
7374 | 7728 |
7375 EVALUATE(BRAS) { | 7729 EVALUATE(BRAS) { |
7376 DCHECK_OPCODE(BRAS); | 7730 DCHECK_OPCODE(BRAS); |
7377 // Branch Relative and Save | 7731 // Branch Relative and Save |
7378 DECODE_RI_B_INSTRUCTION(instr, r1, d2) | 7732 DECODE_RI_B_INSTRUCTION(instr, r1, d2) |
7379 intptr_t pc = get_pc(); | 7733 intptr_t pc = get_pc(); |
7380 // Set PC of next instruction to register | 7734 // Set PC of next instruction to register |
7381 set_register(r1, pc + sizeof(FourByteInstr)); | 7735 set_register(r1, pc + sizeof(FourByteInstr)); |
7382 // Update PC to branch target | 7736 // Update PC to branch target |
7383 set_pc(pc + d2 * 2); | 7737 set_pc(pc + d2 * 2); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7472 } | 7826 } |
7473 | 7827 |
7474 EVALUATE(LARL) { | 7828 EVALUATE(LARL) { |
7475 DCHECK_OPCODE(LARL); | 7829 DCHECK_OPCODE(LARL); |
7476 DECODE_RIL_B_INSTRUCTION(r1, i2); | 7830 DECODE_RIL_B_INSTRUCTION(r1, i2); |
7477 intptr_t offset = i2 * 2; | 7831 intptr_t offset = i2 * 2; |
7478 set_register(r1, get_pc() + offset); | 7832 set_register(r1, get_pc() + offset); |
7479 return length; | 7833 return length; |
7480 } | 7834 } |
7481 | 7835 |
7482 EVALUATE(LGFI) { return DecodeInstructionOriginal(instr); } | 7836 EVALUATE(LGFI) { |
| 7837 UNIMPLEMENTED(); |
| 7838 USE(instr); |
| 7839 return 0; |
| 7840 } |
7483 | 7841 |
7484 EVALUATE(BRASL) { | 7842 EVALUATE(BRASL) { |
7485 DCHECK_OPCODE(BRASL); | 7843 DCHECK_OPCODE(BRASL); |
7486 // Branch and Save Relative Long | 7844 // Branch and Save Relative Long |
7487 DECODE_RIL_B_INSTRUCTION(r1, i2); | 7845 DECODE_RIL_B_INSTRUCTION(r1, i2); |
7488 intptr_t d2 = i2; | 7846 intptr_t d2 = i2; |
7489 intptr_t pc = get_pc(); | 7847 intptr_t pc = get_pc(); |
7490 set_register(r1, pc + 6); // save next instruction to register | 7848 set_register(r1, pc + 6); // save next instruction to register |
7491 set_pc(pc + d2 * 2); // update register | 7849 set_pc(pc + d2 * 2); // update register |
7492 return length; | 7850 return length; |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7703 } | 8061 } |
7704 | 8062 |
7705 EVALUATE(CLFI) { | 8063 EVALUATE(CLFI) { |
7706 DCHECK_OPCODE(CLFI); | 8064 DCHECK_OPCODE(CLFI); |
7707 // Compare Logical with Immediate (32) | 8065 // Compare Logical with Immediate (32) |
7708 DECODE_RIL_A_INSTRUCTION(r1, imm); | 8066 DECODE_RIL_A_INSTRUCTION(r1, imm); |
7709 SetS390ConditionCode<uint32_t>(get_low_register<uint32_t>(r1), imm); | 8067 SetS390ConditionCode<uint32_t>(get_low_register<uint32_t>(r1), imm); |
7710 return length; | 8068 return length; |
7711 } | 8069 } |
7712 | 8070 |
7713 EVALUATE(LLHRL) { return DecodeInstructionOriginal(instr); } | 8071 EVALUATE(LLHRL) { |
7714 | 8072 UNIMPLEMENTED(); |
7715 EVALUATE(LGHRL) { return DecodeInstructionOriginal(instr); } | 8073 USE(instr); |
7716 | 8074 return 0; |
7717 EVALUATE(LHRL) { return DecodeInstructionOriginal(instr); } | 8075 } |
7718 | 8076 |
7719 EVALUATE(LLGHRL) { return DecodeInstructionOriginal(instr); } | 8077 EVALUATE(LGHRL) { |
7720 | 8078 UNIMPLEMENTED(); |
7721 EVALUATE(STHRL) { return DecodeInstructionOriginal(instr); } | 8079 USE(instr); |
7722 | 8080 return 0; |
7723 EVALUATE(LGRL) { return DecodeInstructionOriginal(instr); } | 8081 } |
7724 | 8082 |
7725 EVALUATE(STGRL) { return DecodeInstructionOriginal(instr); } | 8083 EVALUATE(LHRL) { |
7726 | 8084 UNIMPLEMENTED(); |
7727 EVALUATE(LGFRL) { return DecodeInstructionOriginal(instr); } | 8085 USE(instr); |
7728 | 8086 return 0; |
7729 EVALUATE(LRL) { return DecodeInstructionOriginal(instr); } | 8087 } |
7730 | 8088 |
7731 EVALUATE(LLGFRL) { return DecodeInstructionOriginal(instr); } | 8089 EVALUATE(LLGHRL) { |
7732 | 8090 UNIMPLEMENTED(); |
7733 EVALUATE(STRL) { return DecodeInstructionOriginal(instr); } | 8091 USE(instr); |
7734 | 8092 return 0; |
7735 EVALUATE(EXRL) { return DecodeInstructionOriginal(instr); } | 8093 } |
7736 | 8094 |
7737 EVALUATE(PFDRL) { return DecodeInstructionOriginal(instr); } | 8095 EVALUATE(STHRL) { |
7738 | 8096 UNIMPLEMENTED(); |
7739 EVALUATE(CGHRL) { return DecodeInstructionOriginal(instr); } | 8097 USE(instr); |
7740 | 8098 return 0; |
7741 EVALUATE(CHRL) { return DecodeInstructionOriginal(instr); } | 8099 } |
7742 | 8100 |
7743 EVALUATE(CGRL) { return DecodeInstructionOriginal(instr); } | 8101 EVALUATE(LGRL) { |
7744 | 8102 UNIMPLEMENTED(); |
7745 EVALUATE(CGFRL) { return DecodeInstructionOriginal(instr); } | 8103 USE(instr); |
7746 | 8104 return 0; |
7747 EVALUATE(ECTG) { return DecodeInstructionOriginal(instr); } | 8105 } |
7748 | 8106 |
7749 EVALUATE(CSST) { return DecodeInstructionOriginal(instr); } | 8107 EVALUATE(STGRL) { |
7750 | 8108 UNIMPLEMENTED(); |
7751 EVALUATE(LPD) { return DecodeInstructionOriginal(instr); } | 8109 USE(instr); |
7752 | 8110 return 0; |
7753 EVALUATE(LPDG) { return DecodeInstructionOriginal(instr); } | 8111 } |
7754 | 8112 |
7755 EVALUATE(BRCTH) { return DecodeInstructionOriginal(instr); } | 8113 EVALUATE(LGFRL) { |
7756 | 8114 UNIMPLEMENTED(); |
7757 EVALUATE(AIH) { return DecodeInstructionOriginal(instr); } | 8115 USE(instr); |
7758 | 8116 return 0; |
7759 EVALUATE(ALSIH) { return DecodeInstructionOriginal(instr); } | 8117 } |
7760 | 8118 |
7761 EVALUATE(ALSIHN) { return DecodeInstructionOriginal(instr); } | 8119 EVALUATE(LRL) { |
7762 | 8120 UNIMPLEMENTED(); |
7763 EVALUATE(CIH) { return DecodeInstructionOriginal(instr); } | 8121 USE(instr); |
7764 | 8122 return 0; |
7765 EVALUATE(STCK) { return DecodeInstructionOriginal(instr); } | 8123 } |
7766 | 8124 |
7767 EVALUATE(CFC) { return DecodeInstructionOriginal(instr); } | 8125 EVALUATE(LLGFRL) { |
7768 | 8126 UNIMPLEMENTED(); |
7769 EVALUATE(IPM) { return DecodeInstructionOriginal(instr); } | 8127 USE(instr); |
7770 | 8128 return 0; |
7771 EVALUATE(HSCH) { return DecodeInstructionOriginal(instr); } | 8129 } |
7772 | 8130 |
7773 EVALUATE(MSCH) { return DecodeInstructionOriginal(instr); } | 8131 EVALUATE(STRL) { |
7774 | 8132 UNIMPLEMENTED(); |
7775 EVALUATE(SSCH) { return DecodeInstructionOriginal(instr); } | 8133 USE(instr); |
7776 | 8134 return 0; |
7777 EVALUATE(STSCH) { return DecodeInstructionOriginal(instr); } | 8135 } |
7778 | 8136 |
7779 EVALUATE(TSCH) { return DecodeInstructionOriginal(instr); } | 8137 EVALUATE(EXRL) { |
7780 | 8138 UNIMPLEMENTED(); |
7781 EVALUATE(TPI) { return DecodeInstructionOriginal(instr); } | 8139 USE(instr); |
7782 | 8140 return 0; |
7783 EVALUATE(SAL) { return DecodeInstructionOriginal(instr); } | 8141 } |
7784 | 8142 |
7785 EVALUATE(RSCH) { return DecodeInstructionOriginal(instr); } | 8143 EVALUATE(PFDRL) { |
7786 | 8144 UNIMPLEMENTED(); |
7787 EVALUATE(STCRW) { return DecodeInstructionOriginal(instr); } | 8145 USE(instr); |
7788 | 8146 return 0; |
7789 EVALUATE(STCPS) { return DecodeInstructionOriginal(instr); } | 8147 } |
7790 | 8148 |
7791 EVALUATE(RCHP) { return DecodeInstructionOriginal(instr); } | 8149 EVALUATE(CGHRL) { |
7792 | 8150 UNIMPLEMENTED(); |
7793 EVALUATE(SCHM) { return DecodeInstructionOriginal(instr); } | 8151 USE(instr); |
7794 | 8152 return 0; |
7795 EVALUATE(CKSM) { return DecodeInstructionOriginal(instr); } | 8153 } |
7796 | 8154 |
7797 EVALUATE(SAR) { return DecodeInstructionOriginal(instr); } | 8155 EVALUATE(CHRL) { |
7798 | 8156 UNIMPLEMENTED(); |
7799 EVALUATE(EAR) { return DecodeInstructionOriginal(instr); } | 8157 USE(instr); |
| 8158 return 0; |
| 8159 } |
| 8160 |
| 8161 EVALUATE(CGRL) { |
| 8162 UNIMPLEMENTED(); |
| 8163 USE(instr); |
| 8164 return 0; |
| 8165 } |
| 8166 |
| 8167 EVALUATE(CGFRL) { |
| 8168 UNIMPLEMENTED(); |
| 8169 USE(instr); |
| 8170 return 0; |
| 8171 } |
| 8172 |
| 8173 EVALUATE(ECTG) { |
| 8174 UNIMPLEMENTED(); |
| 8175 USE(instr); |
| 8176 return 0; |
| 8177 } |
| 8178 |
| 8179 EVALUATE(CSST) { |
| 8180 UNIMPLEMENTED(); |
| 8181 USE(instr); |
| 8182 return 0; |
| 8183 } |
| 8184 |
| 8185 EVALUATE(LPD) { |
| 8186 UNIMPLEMENTED(); |
| 8187 USE(instr); |
| 8188 return 0; |
| 8189 } |
| 8190 |
| 8191 EVALUATE(LPDG) { |
| 8192 UNIMPLEMENTED(); |
| 8193 USE(instr); |
| 8194 return 0; |
| 8195 } |
| 8196 |
| 8197 EVALUATE(BRCTH) { |
| 8198 UNIMPLEMENTED(); |
| 8199 USE(instr); |
| 8200 return 0; |
| 8201 } |
| 8202 |
| 8203 EVALUATE(AIH) { |
| 8204 UNIMPLEMENTED(); |
| 8205 USE(instr); |
| 8206 return 0; |
| 8207 } |
| 8208 |
| 8209 EVALUATE(ALSIH) { |
| 8210 UNIMPLEMENTED(); |
| 8211 USE(instr); |
| 8212 return 0; |
| 8213 } |
| 8214 |
| 8215 EVALUATE(ALSIHN) { |
| 8216 UNIMPLEMENTED(); |
| 8217 USE(instr); |
| 8218 return 0; |
| 8219 } |
| 8220 |
| 8221 EVALUATE(CIH) { |
| 8222 UNIMPLEMENTED(); |
| 8223 USE(instr); |
| 8224 return 0; |
| 8225 } |
| 8226 |
| 8227 EVALUATE(STCK) { |
| 8228 UNIMPLEMENTED(); |
| 8229 USE(instr); |
| 8230 return 0; |
| 8231 } |
| 8232 |
| 8233 EVALUATE(CFC) { |
| 8234 UNIMPLEMENTED(); |
| 8235 USE(instr); |
| 8236 return 0; |
| 8237 } |
| 8238 |
| 8239 EVALUATE(IPM) { |
| 8240 UNIMPLEMENTED(); |
| 8241 USE(instr); |
| 8242 return 0; |
| 8243 } |
| 8244 |
| 8245 EVALUATE(HSCH) { |
| 8246 UNIMPLEMENTED(); |
| 8247 USE(instr); |
| 8248 return 0; |
| 8249 } |
| 8250 |
| 8251 EVALUATE(MSCH) { |
| 8252 UNIMPLEMENTED(); |
| 8253 USE(instr); |
| 8254 return 0; |
| 8255 } |
| 8256 |
| 8257 EVALUATE(SSCH) { |
| 8258 UNIMPLEMENTED(); |
| 8259 USE(instr); |
| 8260 return 0; |
| 8261 } |
| 8262 |
| 8263 EVALUATE(STSCH) { |
| 8264 UNIMPLEMENTED(); |
| 8265 USE(instr); |
| 8266 return 0; |
| 8267 } |
| 8268 |
| 8269 EVALUATE(TSCH) { |
| 8270 UNIMPLEMENTED(); |
| 8271 USE(instr); |
| 8272 return 0; |
| 8273 } |
| 8274 |
| 8275 EVALUATE(TPI) { |
| 8276 UNIMPLEMENTED(); |
| 8277 USE(instr); |
| 8278 return 0; |
| 8279 } |
| 8280 |
| 8281 EVALUATE(SAL) { |
| 8282 UNIMPLEMENTED(); |
| 8283 USE(instr); |
| 8284 return 0; |
| 8285 } |
| 8286 |
| 8287 EVALUATE(RSCH) { |
| 8288 UNIMPLEMENTED(); |
| 8289 USE(instr); |
| 8290 return 0; |
| 8291 } |
| 8292 |
| 8293 EVALUATE(STCRW) { |
| 8294 UNIMPLEMENTED(); |
| 8295 USE(instr); |
| 8296 return 0; |
| 8297 } |
| 8298 |
| 8299 EVALUATE(STCPS) { |
| 8300 UNIMPLEMENTED(); |
| 8301 USE(instr); |
| 8302 return 0; |
| 8303 } |
| 8304 |
| 8305 EVALUATE(RCHP) { |
| 8306 UNIMPLEMENTED(); |
| 8307 USE(instr); |
| 8308 return 0; |
| 8309 } |
| 8310 |
| 8311 EVALUATE(SCHM) { |
| 8312 UNIMPLEMENTED(); |
| 8313 USE(instr); |
| 8314 return 0; |
| 8315 } |
| 8316 |
| 8317 EVALUATE(CKSM) { |
| 8318 UNIMPLEMENTED(); |
| 8319 USE(instr); |
| 8320 return 0; |
| 8321 } |
| 8322 |
| 8323 EVALUATE(SAR) { |
| 8324 UNIMPLEMENTED(); |
| 8325 USE(instr); |
| 8326 return 0; |
| 8327 } |
| 8328 |
| 8329 EVALUATE(EAR) { |
| 8330 UNIMPLEMENTED(); |
| 8331 USE(instr); |
| 8332 return 0; |
| 8333 } |
7800 | 8334 |
7801 EVALUATE(MSR) { | 8335 EVALUATE(MSR) { |
7802 DCHECK_OPCODE(MSR); | 8336 DCHECK_OPCODE(MSR); |
7803 DECODE_RRE_INSTRUCTION(r1, r2); | 8337 DECODE_RRE_INSTRUCTION(r1, r2); |
7804 int32_t r1_val = get_low_register<int32_t>(r1); | 8338 int32_t r1_val = get_low_register<int32_t>(r1); |
7805 int32_t r2_val = get_low_register<int32_t>(r2); | 8339 int32_t r2_val = get_low_register<int32_t>(r2); |
7806 set_low_register(r1, r1_val * r2_val); | 8340 set_low_register(r1, r1_val * r2_val); |
7807 return length; | 8341 return length; |
7808 } | 8342 } |
7809 | 8343 |
7810 EVALUATE(MVST) { return DecodeInstructionOriginal(instr); } | 8344 EVALUATE(MVST) { |
| 8345 UNIMPLEMENTED(); |
| 8346 USE(instr); |
| 8347 return 0; |
| 8348 } |
7811 | 8349 |
7812 EVALUATE(CUSE) { return DecodeInstructionOriginal(instr); } | 8350 EVALUATE(CUSE) { |
| 8351 UNIMPLEMENTED(); |
| 8352 USE(instr); |
| 8353 return 0; |
| 8354 } |
7813 | 8355 |
7814 EVALUATE(SRST) { return DecodeInstructionOriginal(instr); } | 8356 EVALUATE(SRST) { |
| 8357 UNIMPLEMENTED(); |
| 8358 USE(instr); |
| 8359 return 0; |
| 8360 } |
7815 | 8361 |
7816 EVALUATE(XSCH) { return DecodeInstructionOriginal(instr); } | 8362 EVALUATE(XSCH) { |
| 8363 UNIMPLEMENTED(); |
| 8364 USE(instr); |
| 8365 return 0; |
| 8366 } |
7817 | 8367 |
7818 EVALUATE(STCKE) { return DecodeInstructionOriginal(instr); } | 8368 EVALUATE(STCKE) { |
| 8369 UNIMPLEMENTED(); |
| 8370 USE(instr); |
| 8371 return 0; |
| 8372 } |
7819 | 8373 |
7820 EVALUATE(STCKF) { return DecodeInstructionOriginal(instr); } | 8374 EVALUATE(STCKF) { |
| 8375 UNIMPLEMENTED(); |
| 8376 USE(instr); |
| 8377 return 0; |
| 8378 } |
7821 | 8379 |
7822 EVALUATE(SRNM) { return DecodeInstructionOriginal(instr); } | 8380 EVALUATE(SRNM) { |
| 8381 UNIMPLEMENTED(); |
| 8382 USE(instr); |
| 8383 return 0; |
| 8384 } |
7823 | 8385 |
7824 EVALUATE(STFPC) { return DecodeInstructionOriginal(instr); } | 8386 EVALUATE(STFPC) { |
| 8387 UNIMPLEMENTED(); |
| 8388 USE(instr); |
| 8389 return 0; |
| 8390 } |
7825 | 8391 |
7826 EVALUATE(LFPC) { return DecodeInstructionOriginal(instr); } | 8392 EVALUATE(LFPC) { |
| 8393 UNIMPLEMENTED(); |
| 8394 USE(instr); |
| 8395 return 0; |
| 8396 } |
7827 | 8397 |
7828 EVALUATE(TRE) { return DecodeInstructionOriginal(instr); } | 8398 EVALUATE(TRE) { |
| 8399 UNIMPLEMENTED(); |
| 8400 USE(instr); |
| 8401 return 0; |
| 8402 } |
7829 | 8403 |
7830 EVALUATE(CUUTF) { return DecodeInstructionOriginal(instr); } | 8404 EVALUATE(CUUTF) { |
| 8405 UNIMPLEMENTED(); |
| 8406 USE(instr); |
| 8407 return 0; |
| 8408 } |
7831 | 8409 |
7832 EVALUATE(CUTFU) { return DecodeInstructionOriginal(instr); } | 8410 EVALUATE(CUTFU) { |
| 8411 UNIMPLEMENTED(); |
| 8412 USE(instr); |
| 8413 return 0; |
| 8414 } |
7833 | 8415 |
7834 EVALUATE(STFLE) { return DecodeInstructionOriginal(instr); } | 8416 EVALUATE(STFLE) { |
| 8417 UNIMPLEMENTED(); |
| 8418 USE(instr); |
| 8419 return 0; |
| 8420 } |
7835 | 8421 |
7836 EVALUATE(SRNMB) { return DecodeInstructionOriginal(instr); } | 8422 EVALUATE(SRNMB) { |
| 8423 UNIMPLEMENTED(); |
| 8424 USE(instr); |
| 8425 return 0; |
| 8426 } |
7837 | 8427 |
7838 EVALUATE(SRNMT) { return DecodeInstructionOriginal(instr); } | 8428 EVALUATE(SRNMT) { |
| 8429 UNIMPLEMENTED(); |
| 8430 USE(instr); |
| 8431 return 0; |
| 8432 } |
7839 | 8433 |
7840 EVALUATE(LFAS) { return DecodeInstructionOriginal(instr); } | 8434 EVALUATE(LFAS) { |
| 8435 UNIMPLEMENTED(); |
| 8436 USE(instr); |
| 8437 return 0; |
| 8438 } |
7841 | 8439 |
7842 EVALUATE(PPA) { return DecodeInstructionOriginal(instr); } | 8440 EVALUATE(PPA) { |
| 8441 UNIMPLEMENTED(); |
| 8442 USE(instr); |
| 8443 return 0; |
| 8444 } |
7843 | 8445 |
7844 EVALUATE(ETND) { return DecodeInstructionOriginal(instr); } | 8446 EVALUATE(ETND) { |
| 8447 UNIMPLEMENTED(); |
| 8448 USE(instr); |
| 8449 return 0; |
| 8450 } |
7845 | 8451 |
7846 EVALUATE(TEND) { return DecodeInstructionOriginal(instr); } | 8452 EVALUATE(TEND) { |
| 8453 UNIMPLEMENTED(); |
| 8454 USE(instr); |
| 8455 return 0; |
| 8456 } |
7847 | 8457 |
7848 EVALUATE(NIAI) { return DecodeInstructionOriginal(instr); } | 8458 EVALUATE(NIAI) { |
| 8459 UNIMPLEMENTED(); |
| 8460 USE(instr); |
| 8461 return 0; |
| 8462 } |
7849 | 8463 |
7850 EVALUATE(TABORT) { return DecodeInstructionOriginal(instr); } | 8464 EVALUATE(TABORT) { |
| 8465 UNIMPLEMENTED(); |
| 8466 USE(instr); |
| 8467 return 0; |
| 8468 } |
7851 | 8469 |
7852 EVALUATE(TRAP4) { return DecodeInstructionOriginal(instr); } | 8470 EVALUATE(TRAP4) { |
| 8471 DCHECK_OPCODE(TRAP4); |
| 8472 int length = 4; |
| 8473 // whack the space of the caller allocated stack |
| 8474 int64_t sp_addr = get_register(sp); |
| 8475 for (int i = 0; i < kCalleeRegisterSaveAreaSize / kPointerSize; ++i) { |
| 8476 // we dont want to whack the RA (r14) |
| 8477 if (i != 14) (reinterpret_cast<intptr_t*>(sp_addr))[i] = 0xdeadbabe; |
| 8478 } |
| 8479 SoftwareInterrupt(instr); |
| 8480 return length; |
| 8481 } |
7853 | 8482 |
7854 EVALUATE(LPEBR) { | 8483 EVALUATE(LPEBR) { |
7855 DCHECK_OPCODE(LPEBR); | 8484 DCHECK_OPCODE(LPEBR); |
7856 DECODE_RRE_INSTRUCTION(r1, r2); | 8485 DECODE_RRE_INSTRUCTION(r1, r2); |
7857 float fr1_val = get_float32_from_d_register(r1); | 8486 float fr1_val = get_float32_from_d_register(r1); |
7858 float fr2_val = get_float32_from_d_register(r2); | 8487 float fr2_val = get_float32_from_d_register(r2); |
7859 fr1_val = std::fabs(fr2_val); | 8488 fr1_val = std::fabs(fr2_val); |
7860 set_d_register_from_float32(r1, fr1_val); | 8489 set_d_register_from_float32(r1, fr1_val); |
7861 if (fr2_val != fr2_val) { // input is NaN | 8490 if (fr2_val != fr2_val) { // input is NaN |
7862 condition_reg_ = CC_OF; | 8491 condition_reg_ = CC_OF; |
7863 } else if (fr2_val == 0) { | 8492 } else if (fr2_val == 0) { |
7864 condition_reg_ = CC_EQ; | 8493 condition_reg_ = CC_EQ; |
7865 } else { | 8494 } else { |
7866 condition_reg_ = CC_GT; | 8495 condition_reg_ = CC_GT; |
7867 } | 8496 } |
7868 | 8497 |
7869 return length; | 8498 return length; |
7870 } | 8499 } |
7871 | 8500 |
7872 EVALUATE(LNEBR) { return DecodeInstructionOriginal(instr); } | 8501 EVALUATE(LNEBR) { |
| 8502 UNIMPLEMENTED(); |
| 8503 USE(instr); |
| 8504 return 0; |
| 8505 } |
7873 | 8506 |
7874 EVALUATE(LTEBR) { | 8507 EVALUATE(LTEBR) { |
7875 DCHECK_OPCODE(LTEBR); | 8508 DCHECK_OPCODE(LTEBR); |
7876 DECODE_RRE_INSTRUCTION(r1, r2); | 8509 DECODE_RRE_INSTRUCTION(r1, r2); |
7877 int64_t r2_val = get_d_register(r2); | 8510 int64_t r2_val = get_d_register(r2); |
7878 float fr2_val = get_float32_from_d_register(r2); | 8511 float fr2_val = get_float32_from_d_register(r2); |
7879 SetS390ConditionCode<float>(fr2_val, 0.0); | 8512 SetS390ConditionCode<float>(fr2_val, 0.0); |
7880 set_d_register(r1, r2_val); | 8513 set_d_register(r1, r2_val); |
7881 return length; | 8514 return length; |
7882 } | 8515 } |
7883 | 8516 |
7884 EVALUATE(LCEBR) { return DecodeInstructionOriginal(instr); } | 8517 EVALUATE(LCEBR) { |
| 8518 UNIMPLEMENTED(); |
| 8519 USE(instr); |
| 8520 return 0; |
| 8521 } |
7885 | 8522 |
7886 EVALUATE(LDEBR) { | 8523 EVALUATE(LDEBR) { |
7887 DCHECK_OPCODE(LDEBR); | 8524 DCHECK_OPCODE(LDEBR); |
7888 DECODE_RRE_INSTRUCTION(r1, r2); | 8525 DECODE_RRE_INSTRUCTION(r1, r2); |
7889 float fp_val = get_float32_from_d_register(r2); | 8526 float fp_val = get_float32_from_d_register(r2); |
7890 double db_val = static_cast<double>(fp_val); | 8527 double db_val = static_cast<double>(fp_val); |
7891 set_d_register_from_double(r1, db_val); | 8528 set_d_register_from_double(r1, db_val); |
7892 return length; | 8529 return length; |
7893 } | 8530 } |
7894 | 8531 |
7895 EVALUATE(LXDBR) { return DecodeInstructionOriginal(instr); } | 8532 EVALUATE(LXDBR) { |
| 8533 UNIMPLEMENTED(); |
| 8534 USE(instr); |
| 8535 return 0; |
| 8536 } |
7896 | 8537 |
7897 EVALUATE(LXEBR) { return DecodeInstructionOriginal(instr); } | 8538 EVALUATE(LXEBR) { |
| 8539 UNIMPLEMENTED(); |
| 8540 USE(instr); |
| 8541 return 0; |
| 8542 } |
7898 | 8543 |
7899 EVALUATE(MXDBR) { return DecodeInstructionOriginal(instr); } | 8544 EVALUATE(MXDBR) { |
| 8545 UNIMPLEMENTED(); |
| 8546 USE(instr); |
| 8547 return 0; |
| 8548 } |
7900 | 8549 |
7901 EVALUATE(KEBR) { return DecodeInstructionOriginal(instr); } | 8550 EVALUATE(KEBR) { |
| 8551 UNIMPLEMENTED(); |
| 8552 USE(instr); |
| 8553 return 0; |
| 8554 } |
7902 | 8555 |
7903 EVALUATE(CEBR) { | 8556 EVALUATE(CEBR) { |
7904 DCHECK_OPCODE(CEBR); | 8557 DCHECK_OPCODE(CEBR); |
7905 DECODE_RRE_INSTRUCTION(r1, r2); | 8558 DECODE_RRE_INSTRUCTION(r1, r2); |
7906 float fr1_val = get_float32_from_d_register(r1); | 8559 float fr1_val = get_float32_from_d_register(r1); |
7907 float fr2_val = get_float32_from_d_register(r2); | 8560 float fr2_val = get_float32_from_d_register(r2); |
7908 if (isNaN(fr1_val) || isNaN(fr2_val)) { | 8561 if (isNaN(fr1_val) || isNaN(fr2_val)) { |
7909 condition_reg_ = CC_OF; | 8562 condition_reg_ = CC_OF; |
7910 } else { | 8563 } else { |
7911 SetS390ConditionCode<float>(fr1_val, fr2_val); | 8564 SetS390ConditionCode<float>(fr1_val, fr2_val); |
(...skipping 19 matching lines...) Expand all Loading... |
7931 DECODE_RRE_INSTRUCTION(r1, r2); | 8584 DECODE_RRE_INSTRUCTION(r1, r2); |
7932 float fr1_val = get_float32_from_d_register(r1); | 8585 float fr1_val = get_float32_from_d_register(r1); |
7933 float fr2_val = get_float32_from_d_register(r2); | 8586 float fr2_val = get_float32_from_d_register(r2); |
7934 fr1_val -= fr2_val; | 8587 fr1_val -= fr2_val; |
7935 set_d_register_from_float32(r1, fr1_val); | 8588 set_d_register_from_float32(r1, fr1_val); |
7936 SetS390ConditionCode<float>(fr1_val, 0); | 8589 SetS390ConditionCode<float>(fr1_val, 0); |
7937 | 8590 |
7938 return length; | 8591 return length; |
7939 } | 8592 } |
7940 | 8593 |
7941 EVALUATE(MDEBR) { return DecodeInstructionOriginal(instr); } | 8594 EVALUATE(MDEBR) { |
| 8595 UNIMPLEMENTED(); |
| 8596 USE(instr); |
| 8597 return 0; |
| 8598 } |
7942 | 8599 |
7943 EVALUATE(DEBR) { | 8600 EVALUATE(DEBR) { |
7944 DCHECK_OPCODE(DEBR); | 8601 DCHECK_OPCODE(DEBR); |
7945 DECODE_RRE_INSTRUCTION(r1, r2); | 8602 DECODE_RRE_INSTRUCTION(r1, r2); |
7946 float fr1_val = get_float32_from_d_register(r1); | 8603 float fr1_val = get_float32_from_d_register(r1); |
7947 float fr2_val = get_float32_from_d_register(r2); | 8604 float fr2_val = get_float32_from_d_register(r2); |
7948 fr1_val /= fr2_val; | 8605 fr1_val /= fr2_val; |
7949 set_d_register_from_float32(r1, fr1_val); | 8606 set_d_register_from_float32(r1, fr1_val); |
7950 SetS390ConditionCode<float>(fr1_val, 0); | 8607 SetS390ConditionCode<float>(fr1_val, 0); |
7951 | 8608 |
7952 return length; | 8609 return length; |
7953 } | 8610 } |
7954 | 8611 |
7955 EVALUATE(MAEBR) { return DecodeInstructionOriginal(instr); } | 8612 EVALUATE(MAEBR) { |
| 8613 UNIMPLEMENTED(); |
| 8614 USE(instr); |
| 8615 return 0; |
| 8616 } |
7956 | 8617 |
7957 EVALUATE(MSEBR) { return DecodeInstructionOriginal(instr); } | 8618 EVALUATE(MSEBR) { |
| 8619 UNIMPLEMENTED(); |
| 8620 USE(instr); |
| 8621 return 0; |
| 8622 } |
7958 | 8623 |
7959 EVALUATE(LPDBR) { | 8624 EVALUATE(LPDBR) { |
7960 DCHECK_OPCODE(LPDBR); | 8625 DCHECK_OPCODE(LPDBR); |
7961 DECODE_RRE_INSTRUCTION(r1, r2); | 8626 DECODE_RRE_INSTRUCTION(r1, r2); |
7962 double r1_val = get_double_from_d_register(r1); | 8627 double r1_val = get_double_from_d_register(r1); |
7963 double r2_val = get_double_from_d_register(r2); | 8628 double r2_val = get_double_from_d_register(r2); |
7964 r1_val = std::fabs(r2_val); | 8629 r1_val = std::fabs(r2_val); |
7965 set_d_register_from_double(r1, r1_val); | 8630 set_d_register_from_double(r1, r1_val); |
7966 if (r2_val != r2_val) { // input is NaN | 8631 if (r2_val != r2_val) { // input is NaN |
7967 condition_reg_ = CC_OF; | 8632 condition_reg_ = CC_OF; |
7968 } else if (r2_val == 0) { | 8633 } else if (r2_val == 0) { |
7969 condition_reg_ = CC_EQ; | 8634 condition_reg_ = CC_EQ; |
7970 } else { | 8635 } else { |
7971 condition_reg_ = CC_GT; | 8636 condition_reg_ = CC_GT; |
7972 } | 8637 } |
7973 return length; | 8638 return length; |
7974 } | 8639 } |
7975 | 8640 |
7976 EVALUATE(LNDBR) { return DecodeInstructionOriginal(instr); } | 8641 EVALUATE(LNDBR) { |
| 8642 UNIMPLEMENTED(); |
| 8643 USE(instr); |
| 8644 return 0; |
| 8645 } |
7977 | 8646 |
7978 EVALUATE(LTDBR) { | 8647 EVALUATE(LTDBR) { |
7979 DCHECK_OPCODE(LTDBR); | 8648 DCHECK_OPCODE(LTDBR); |
7980 DECODE_RRE_INSTRUCTION(r1, r2); | 8649 DECODE_RRE_INSTRUCTION(r1, r2); |
7981 int64_t r2_val = get_d_register(r2); | 8650 int64_t r2_val = get_d_register(r2); |
7982 SetS390ConditionCode<double>(bit_cast<double, int64_t>(r2_val), 0.0); | 8651 SetS390ConditionCode<double>(bit_cast<double, int64_t>(r2_val), 0.0); |
7983 set_d_register(r1, r2_val); | 8652 set_d_register(r1, r2_val); |
7984 return length; | 8653 return length; |
7985 } | 8654 } |
7986 | 8655 |
(...skipping 29 matching lines...) Expand all Loading... |
8016 EVALUATE(SQDBR) { | 8685 EVALUATE(SQDBR) { |
8017 DCHECK_OPCODE(SQDBR); | 8686 DCHECK_OPCODE(SQDBR); |
8018 DECODE_RRE_INSTRUCTION(r1, r2); | 8687 DECODE_RRE_INSTRUCTION(r1, r2); |
8019 double r1_val = get_double_from_d_register(r1); | 8688 double r1_val = get_double_from_d_register(r1); |
8020 double r2_val = get_double_from_d_register(r2); | 8689 double r2_val = get_double_from_d_register(r2); |
8021 r1_val = std::sqrt(r2_val); | 8690 r1_val = std::sqrt(r2_val); |
8022 set_d_register_from_double(r1, r1_val); | 8691 set_d_register_from_double(r1, r1_val); |
8023 return length; | 8692 return length; |
8024 } | 8693 } |
8025 | 8694 |
8026 EVALUATE(SQXBR) { return DecodeInstructionOriginal(instr); } | 8695 EVALUATE(SQXBR) { |
| 8696 UNIMPLEMENTED(); |
| 8697 USE(instr); |
| 8698 return 0; |
| 8699 } |
8027 | 8700 |
8028 EVALUATE(MEEBR) { | 8701 EVALUATE(MEEBR) { |
8029 DCHECK_OPCODE(MEEBR); | 8702 DCHECK_OPCODE(MEEBR); |
8030 DECODE_RRE_INSTRUCTION(r1, r2); | 8703 DECODE_RRE_INSTRUCTION(r1, r2); |
8031 float fr1_val = get_float32_from_d_register(r1); | 8704 float fr1_val = get_float32_from_d_register(r1); |
8032 float fr2_val = get_float32_from_d_register(r2); | 8705 float fr2_val = get_float32_from_d_register(r2); |
8033 fr1_val *= fr2_val; | 8706 fr1_val *= fr2_val; |
8034 set_d_register_from_float32(r1, fr1_val); | 8707 set_d_register_from_float32(r1, fr1_val); |
8035 SetS390ConditionCode<float>(fr1_val, 0); | 8708 SetS390ConditionCode<float>(fr1_val, 0); |
8036 return length; | 8709 return length; |
8037 } | 8710 } |
8038 | 8711 |
8039 EVALUATE(KDBR) { return DecodeInstructionOriginal(instr); } | 8712 EVALUATE(KDBR) { |
| 8713 UNIMPLEMENTED(); |
| 8714 USE(instr); |
| 8715 return 0; |
| 8716 } |
8040 | 8717 |
8041 EVALUATE(CDBR) { | 8718 EVALUATE(CDBR) { |
8042 DCHECK_OPCODE(CDBR); | 8719 DCHECK_OPCODE(CDBR); |
8043 DECODE_RRE_INSTRUCTION(r1, r2); | 8720 DECODE_RRE_INSTRUCTION(r1, r2); |
8044 double r1_val = get_double_from_d_register(r1); | 8721 double r1_val = get_double_from_d_register(r1); |
8045 double r2_val = get_double_from_d_register(r2); | 8722 double r2_val = get_double_from_d_register(r2); |
8046 if (isNaN(r1_val) || isNaN(r2_val)) { | 8723 if (isNaN(r1_val) || isNaN(r2_val)) { |
8047 condition_reg_ = CC_OF; | 8724 condition_reg_ = CC_OF; |
8048 } else { | 8725 } else { |
8049 SetS390ConditionCode<double>(r1_val, r2_val); | 8726 SetS390ConditionCode<double>(r1_val, r2_val); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8100 DECODE_RRD_INSTRUCTION(r1, r2, r3); | 8777 DECODE_RRD_INSTRUCTION(r1, r2, r3); |
8101 double r1_val = get_double_from_d_register(r1); | 8778 double r1_val = get_double_from_d_register(r1); |
8102 double r2_val = get_double_from_d_register(r2); | 8779 double r2_val = get_double_from_d_register(r2); |
8103 double r3_val = get_double_from_d_register(r3); | 8780 double r3_val = get_double_from_d_register(r3); |
8104 r1_val += r2_val * r3_val; | 8781 r1_val += r2_val * r3_val; |
8105 set_d_register_from_double(r1, r1_val); | 8782 set_d_register_from_double(r1, r1_val); |
8106 SetS390ConditionCode<double>(r1_val, 0); | 8783 SetS390ConditionCode<double>(r1_val, 0); |
8107 return length; | 8784 return length; |
8108 } | 8785 } |
8109 | 8786 |
8110 EVALUATE(MSDBR) { return DecodeInstructionOriginal(instr); } | 8787 EVALUATE(MSDBR) { |
| 8788 UNIMPLEMENTED(); |
| 8789 USE(instr); |
| 8790 return 0; |
| 8791 } |
8111 | 8792 |
8112 EVALUATE(LPXBR) { return DecodeInstructionOriginal(instr); } | 8793 EVALUATE(LPXBR) { |
| 8794 UNIMPLEMENTED(); |
| 8795 USE(instr); |
| 8796 return 0; |
| 8797 } |
8113 | 8798 |
8114 EVALUATE(LNXBR) { return DecodeInstructionOriginal(instr); } | 8799 EVALUATE(LNXBR) { |
| 8800 UNIMPLEMENTED(); |
| 8801 USE(instr); |
| 8802 return 0; |
| 8803 } |
8115 | 8804 |
8116 EVALUATE(LTXBR) { return DecodeInstructionOriginal(instr); } | 8805 EVALUATE(LTXBR) { |
| 8806 UNIMPLEMENTED(); |
| 8807 USE(instr); |
| 8808 return 0; |
| 8809 } |
8117 | 8810 |
8118 EVALUATE(LCXBR) { return DecodeInstructionOriginal(instr); } | 8811 EVALUATE(LCXBR) { |
| 8812 UNIMPLEMENTED(); |
| 8813 USE(instr); |
| 8814 return 0; |
| 8815 } |
8119 | 8816 |
8120 EVALUATE(LEDBRA) { return DecodeInstructionOriginal(instr); } | 8817 EVALUATE(LEDBRA) { |
| 8818 DCHECK_OPCODE(LEDBRA); |
| 8819 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8820 double r2_val = get_double_from_d_register(r2); |
| 8821 set_d_register_from_float32(r1, static_cast<float>(r2_val)); |
| 8822 return length; |
| 8823 } |
8121 | 8824 |
8122 EVALUATE(LDXBRA) { return DecodeInstructionOriginal(instr); } | 8825 EVALUATE(LDXBRA) { |
| 8826 UNIMPLEMENTED(); |
| 8827 USE(instr); |
| 8828 return 0; |
| 8829 } |
8123 | 8830 |
8124 EVALUATE(LEXBRA) { return DecodeInstructionOriginal(instr); } | 8831 EVALUATE(LEXBRA) { |
| 8832 UNIMPLEMENTED(); |
| 8833 USE(instr); |
| 8834 return 0; |
| 8835 } |
8125 | 8836 |
8126 EVALUATE(FIXBRA) { return DecodeInstructionOriginal(instr); } | 8837 EVALUATE(FIXBRA) { |
| 8838 UNIMPLEMENTED(); |
| 8839 USE(instr); |
| 8840 return 0; |
| 8841 } |
8127 | 8842 |
8128 EVALUATE(KXBR) { return DecodeInstructionOriginal(instr); } | 8843 EVALUATE(KXBR) { |
| 8844 UNIMPLEMENTED(); |
| 8845 USE(instr); |
| 8846 return 0; |
| 8847 } |
8129 | 8848 |
8130 EVALUATE(CXBR) { return DecodeInstructionOriginal(instr); } | 8849 EVALUATE(CXBR) { |
| 8850 UNIMPLEMENTED(); |
| 8851 USE(instr); |
| 8852 return 0; |
| 8853 } |
8131 | 8854 |
8132 EVALUATE(AXBR) { return DecodeInstructionOriginal(instr); } | 8855 EVALUATE(AXBR) { |
| 8856 UNIMPLEMENTED(); |
| 8857 USE(instr); |
| 8858 return 0; |
| 8859 } |
8133 | 8860 |
8134 EVALUATE(SXBR) { return DecodeInstructionOriginal(instr); } | 8861 EVALUATE(SXBR) { |
| 8862 UNIMPLEMENTED(); |
| 8863 USE(instr); |
| 8864 return 0; |
| 8865 } |
8135 | 8866 |
8136 EVALUATE(MXBR) { return DecodeInstructionOriginal(instr); } | 8867 EVALUATE(MXBR) { |
| 8868 UNIMPLEMENTED(); |
| 8869 USE(instr); |
| 8870 return 0; |
| 8871 } |
8137 | 8872 |
8138 EVALUATE(DXBR) { return DecodeInstructionOriginal(instr); } | 8873 EVALUATE(DXBR) { |
| 8874 UNIMPLEMENTED(); |
| 8875 USE(instr); |
| 8876 return 0; |
| 8877 } |
8139 | 8878 |
8140 EVALUATE(TBEDR) { return DecodeInstructionOriginal(instr); } | 8879 EVALUATE(TBEDR) { |
| 8880 UNIMPLEMENTED(); |
| 8881 USE(instr); |
| 8882 return 0; |
| 8883 } |
8141 | 8884 |
8142 EVALUATE(TBDR) { return DecodeInstructionOriginal(instr); } | 8885 EVALUATE(TBDR) { |
| 8886 UNIMPLEMENTED(); |
| 8887 USE(instr); |
| 8888 return 0; |
| 8889 } |
8143 | 8890 |
8144 EVALUATE(DIEBR) { return DecodeInstructionOriginal(instr); } | 8891 EVALUATE(DIEBR) { |
| 8892 UNIMPLEMENTED(); |
| 8893 USE(instr); |
| 8894 return 0; |
| 8895 } |
8145 | 8896 |
8146 EVALUATE(FIEBRA) { | 8897 EVALUATE(FIEBRA) { |
8147 DCHECK_OPCODE(FIEBRA); | 8898 DCHECK_OPCODE(FIEBRA); |
8148 DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4); | 8899 DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4); |
8149 float r2_val = get_float32_from_d_register(r2); | 8900 float r2_val = get_float32_from_d_register(r2); |
8150 CHECK(m4 == 0); | 8901 CHECK(m4 == 0); |
8151 switch (m3) { | 8902 switch (m3) { |
8152 case Assembler::FIDBRA_ROUND_TO_NEAREST_AWAY_FROM_0: | 8903 case Assembler::FIDBRA_ROUND_TO_NEAREST_AWAY_FROM_0: |
8153 set_d_register_from_float32(r1, round(r2_val)); | 8904 set_d_register_from_float32(r1, round(r2_val)); |
8154 break; | 8905 break; |
8155 case Assembler::FIDBRA_ROUND_TOWARD_0: | 8906 case Assembler::FIDBRA_ROUND_TOWARD_0: |
8156 set_d_register_from_float32(r1, trunc(r2_val)); | 8907 set_d_register_from_float32(r1, trunc(r2_val)); |
8157 break; | 8908 break; |
8158 case Assembler::FIDBRA_ROUND_TOWARD_POS_INF: | 8909 case Assembler::FIDBRA_ROUND_TOWARD_POS_INF: |
8159 set_d_register_from_float32(r1, std::ceil(r2_val)); | 8910 set_d_register_from_float32(r1, std::ceil(r2_val)); |
8160 break; | 8911 break; |
8161 case Assembler::FIDBRA_ROUND_TOWARD_NEG_INF: | 8912 case Assembler::FIDBRA_ROUND_TOWARD_NEG_INF: |
8162 set_d_register_from_float32(r1, std::floor(r2_val)); | 8913 set_d_register_from_float32(r1, std::floor(r2_val)); |
8163 break; | 8914 break; |
8164 default: | 8915 default: |
8165 UNIMPLEMENTED(); | 8916 UNIMPLEMENTED(); |
8166 break; | 8917 break; |
8167 } | 8918 } |
8168 return length; | 8919 return length; |
8169 } | 8920 } |
8170 | 8921 |
8171 EVALUATE(THDER) { return DecodeInstructionOriginal(instr); } | 8922 EVALUATE(THDER) { |
| 8923 UNIMPLEMENTED(); |
| 8924 USE(instr); |
| 8925 return 0; |
| 8926 } |
8172 | 8927 |
8173 EVALUATE(THDR) { return DecodeInstructionOriginal(instr); } | 8928 EVALUATE(THDR) { |
| 8929 UNIMPLEMENTED(); |
| 8930 USE(instr); |
| 8931 return 0; |
| 8932 } |
8174 | 8933 |
8175 EVALUATE(DIDBR) { return DecodeInstructionOriginal(instr); } | 8934 EVALUATE(DIDBR) { |
| 8935 UNIMPLEMENTED(); |
| 8936 USE(instr); |
| 8937 return 0; |
| 8938 } |
8176 | 8939 |
8177 EVALUATE(FIDBRA) { | 8940 EVALUATE(FIDBRA) { |
8178 DCHECK_OPCODE(FIDBRA); | 8941 DCHECK_OPCODE(FIDBRA); |
8179 DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4); | 8942 DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4); |
8180 double r2_val = get_double_from_d_register(r2); | 8943 double r2_val = get_double_from_d_register(r2); |
8181 CHECK(m4 == 0); | 8944 CHECK(m4 == 0); |
8182 switch (m3) { | 8945 switch (m3) { |
8183 case Assembler::FIDBRA_ROUND_TO_NEAREST_AWAY_FROM_0: | 8946 case Assembler::FIDBRA_ROUND_TO_NEAREST_AWAY_FROM_0: |
8184 set_d_register_from_double(r1, round(r2_val)); | 8947 set_d_register_from_double(r1, round(r2_val)); |
8185 break; | 8948 break; |
8186 case Assembler::FIDBRA_ROUND_TOWARD_0: | 8949 case Assembler::FIDBRA_ROUND_TOWARD_0: |
8187 set_d_register_from_double(r1, trunc(r2_val)); | 8950 set_d_register_from_double(r1, trunc(r2_val)); |
8188 break; | 8951 break; |
8189 case Assembler::FIDBRA_ROUND_TOWARD_POS_INF: | 8952 case Assembler::FIDBRA_ROUND_TOWARD_POS_INF: |
8190 set_d_register_from_double(r1, std::ceil(r2_val)); | 8953 set_d_register_from_double(r1, std::ceil(r2_val)); |
8191 break; | 8954 break; |
8192 case Assembler::FIDBRA_ROUND_TOWARD_NEG_INF: | 8955 case Assembler::FIDBRA_ROUND_TOWARD_NEG_INF: |
8193 set_d_register_from_double(r1, std::floor(r2_val)); | 8956 set_d_register_from_double(r1, std::floor(r2_val)); |
8194 break; | 8957 break; |
8195 default: | 8958 default: |
8196 UNIMPLEMENTED(); | 8959 UNIMPLEMENTED(); |
8197 break; | 8960 break; |
8198 } | 8961 } |
8199 return length; | 8962 return length; |
8200 } | 8963 } |
8201 | 8964 |
8202 EVALUATE(LXR) { return DecodeInstructionOriginal(instr); } | 8965 EVALUATE(LXR) { |
| 8966 UNIMPLEMENTED(); |
| 8967 USE(instr); |
| 8968 return 0; |
| 8969 } |
8203 | 8970 |
8204 EVALUATE(LPDFR) { return DecodeInstructionOriginal(instr); } | 8971 EVALUATE(LPDFR) { |
| 8972 UNIMPLEMENTED(); |
| 8973 USE(instr); |
| 8974 return 0; |
| 8975 } |
8205 | 8976 |
8206 EVALUATE(LNDFR) { return DecodeInstructionOriginal(instr); } | 8977 EVALUATE(LNDFR) { |
| 8978 UNIMPLEMENTED(); |
| 8979 USE(instr); |
| 8980 return 0; |
| 8981 } |
8207 | 8982 |
8208 EVALUATE(LCDFR) { return DecodeInstructionOriginal(instr); } | 8983 EVALUATE(LCDFR) { |
| 8984 UNIMPLEMENTED(); |
| 8985 USE(instr); |
| 8986 return 0; |
| 8987 } |
8209 | 8988 |
8210 EVALUATE(LZER) { return DecodeInstructionOriginal(instr); } | 8989 EVALUATE(LZER) { |
| 8990 UNIMPLEMENTED(); |
| 8991 USE(instr); |
| 8992 return 0; |
| 8993 } |
8211 | 8994 |
8212 EVALUATE(LZDR) { | 8995 EVALUATE(LZDR) { |
8213 DCHECK_OPCODE(LZDR); | 8996 DCHECK_OPCODE(LZDR); |
8214 DECODE_RRE_INSTRUCTION_NO_R2(r1); | 8997 DECODE_RRE_INSTRUCTION_NO_R2(r1); |
8215 set_d_register_from_double(r1, 0.0); | 8998 set_d_register_from_double(r1, 0.0); |
8216 return length; | 8999 return length; |
8217 } | 9000 } |
8218 | 9001 |
8219 EVALUATE(LZXR) { return DecodeInstructionOriginal(instr); } | 9002 EVALUATE(LZXR) { |
| 9003 UNIMPLEMENTED(); |
| 9004 USE(instr); |
| 9005 return 0; |
| 9006 } |
8220 | 9007 |
8221 EVALUATE(SFPC) { return DecodeInstructionOriginal(instr); } | 9008 EVALUATE(SFPC) { |
| 9009 UNIMPLEMENTED(); |
| 9010 USE(instr); |
| 9011 return 0; |
| 9012 } |
8222 | 9013 |
8223 EVALUATE(SFASR) { return DecodeInstructionOriginal(instr); } | 9014 EVALUATE(SFASR) { |
| 9015 UNIMPLEMENTED(); |
| 9016 USE(instr); |
| 9017 return 0; |
| 9018 } |
8224 | 9019 |
8225 EVALUATE(EFPC) { return DecodeInstructionOriginal(instr); } | 9020 EVALUATE(EFPC) { |
| 9021 UNIMPLEMENTED(); |
| 9022 USE(instr); |
| 9023 return 0; |
| 9024 } |
8226 | 9025 |
8227 EVALUATE(CELFBR) { | 9026 EVALUATE(CELFBR) { |
8228 DCHECK_OPCODE(CELFBR); | 9027 DCHECK_OPCODE(CELFBR); |
8229 DECODE_RRE_INSTRUCTION(r1, r2); | 9028 DECODE_RRE_INSTRUCTION(r1, r2); |
8230 uint32_t r2_val = get_low_register<uint32_t>(r2); | 9029 uint32_t r2_val = get_low_register<uint32_t>(r2); |
8231 float r1_val = static_cast<float>(r2_val); | 9030 float r1_val = static_cast<float>(r2_val); |
8232 set_d_register_from_float32(r1, r1_val); | 9031 set_d_register_from_float32(r1, r1_val); |
8233 return length; | 9032 return length; |
8234 } | 9033 } |
8235 | 9034 |
8236 EVALUATE(CDLFBR) { | 9035 EVALUATE(CDLFBR) { |
8237 DCHECK_OPCODE(CDLFBR); | 9036 DCHECK_OPCODE(CDLFBR); |
8238 DECODE_RRE_INSTRUCTION(r1, r2); | 9037 DECODE_RRE_INSTRUCTION(r1, r2); |
8239 uint32_t r2_val = get_low_register<uint32_t>(r2); | 9038 uint32_t r2_val = get_low_register<uint32_t>(r2); |
8240 double r1_val = static_cast<double>(r2_val); | 9039 double r1_val = static_cast<double>(r2_val); |
8241 set_d_register_from_double(r1, r1_val); | 9040 set_d_register_from_double(r1, r1_val); |
8242 return length; | 9041 return length; |
8243 } | 9042 } |
8244 | 9043 |
8245 EVALUATE(CXLFBR) { return DecodeInstructionOriginal(instr); } | 9044 EVALUATE(CXLFBR) { |
8246 | 9045 UNIMPLEMENTED(); |
8247 EVALUATE(CEFBRA) { return DecodeInstructionOriginal(instr); } | 9046 USE(instr); |
8248 | 9047 return 0; |
8249 EVALUATE(CDFBRA) { return DecodeInstructionOriginal(instr); } | 9048 } |
8250 | 9049 |
8251 EVALUATE(CXFBRA) { return DecodeInstructionOriginal(instr); } | 9050 EVALUATE(CEFBRA) { |
8252 | 9051 DCHECK_OPCODE(CEFBRA); |
8253 EVALUATE(CFEBRA) { return DecodeInstructionOriginal(instr); } | 9052 DECODE_RRE_INSTRUCTION(r1, r2); |
8254 | 9053 int32_t fr2_val = get_low_register<int32_t>(r2); |
8255 EVALUATE(CFDBRA) { return DecodeInstructionOriginal(instr); } | 9054 float fr1_val = static_cast<float>(fr2_val); |
8256 | 9055 set_d_register_from_float32(r1, fr1_val); |
8257 EVALUATE(CFXBRA) { return DecodeInstructionOriginal(instr); } | 9056 return length; |
| 9057 } |
| 9058 |
| 9059 EVALUATE(CDFBRA) { |
| 9060 DCHECK_OPCODE(CDFBRA); |
| 9061 DECODE_RRE_INSTRUCTION(r1, r2); |
| 9062 int32_t r2_val = get_low_register<int32_t>(r2); |
| 9063 double r1_val = static_cast<double>(r2_val); |
| 9064 set_d_register_from_double(r1, r1_val); |
| 9065 return length; |
| 9066 } |
| 9067 |
| 9068 EVALUATE(CXFBRA) { |
| 9069 UNIMPLEMENTED(); |
| 9070 USE(instr); |
| 9071 return 0; |
| 9072 } |
| 9073 |
| 9074 EVALUATE(CFEBRA) { |
| 9075 DCHECK_OPCODE(CFEBRA); |
| 9076 DECODE_RRE_INSTRUCTION_M3(r1, r2, mask_val); |
| 9077 float r2_fval = get_float32_from_d_register(r2); |
| 9078 int32_t r1_val = 0; |
| 9079 |
| 9080 SetS390RoundConditionCode(r2_fval, INT32_MAX, INT32_MIN); |
| 9081 |
| 9082 switch (mask_val) { |
| 9083 case CURRENT_ROUNDING_MODE: |
| 9084 case ROUND_TO_PREPARE_FOR_SHORTER_PRECISION: { |
| 9085 r1_val = static_cast<int32_t>(r2_fval); |
| 9086 break; |
| 9087 } |
| 9088 case ROUND_TO_NEAREST_WITH_TIES_AWAY_FROM_0: { |
| 9089 float ceil_val = std::ceil(r2_fval); |
| 9090 float floor_val = std::floor(r2_fval); |
| 9091 float sub_val1 = std::fabs(r2_fval - floor_val); |
| 9092 float sub_val2 = std::fabs(r2_fval - ceil_val); |
| 9093 if (sub_val1 > sub_val2) { |
| 9094 r1_val = static_cast<int32_t>(ceil_val); |
| 9095 } else if (sub_val1 < sub_val2) { |
| 9096 r1_val = static_cast<int32_t>(floor_val); |
| 9097 } else { // round away from zero: |
| 9098 if (r2_fval > 0.0) { |
| 9099 r1_val = static_cast<int32_t>(ceil_val); |
| 9100 } else { |
| 9101 r1_val = static_cast<int32_t>(floor_val); |
| 9102 } |
| 9103 } |
| 9104 break; |
| 9105 } |
| 9106 case ROUND_TO_NEAREST_WITH_TIES_TO_EVEN: { |
| 9107 float ceil_val = std::ceil(r2_fval); |
| 9108 float floor_val = std::floor(r2_fval); |
| 9109 float sub_val1 = std::fabs(r2_fval - floor_val); |
| 9110 float sub_val2 = std::fabs(r2_fval - ceil_val); |
| 9111 if (sub_val1 > sub_val2) { |
| 9112 r1_val = static_cast<int32_t>(ceil_val); |
| 9113 } else if (sub_val1 < sub_val2) { |
| 9114 r1_val = static_cast<int32_t>(floor_val); |
| 9115 } else { // check which one is even: |
| 9116 int32_t c_v = static_cast<int32_t>(ceil_val); |
| 9117 int32_t f_v = static_cast<int32_t>(floor_val); |
| 9118 if (f_v % 2 == 0) |
| 9119 r1_val = f_v; |
| 9120 else |
| 9121 r1_val = c_v; |
| 9122 } |
| 9123 break; |
| 9124 } |
| 9125 case ROUND_TOWARD_0: { |
| 9126 // check for overflow, cast r2_fval to 64bit integer |
| 9127 // then check value within the range of INT_MIN and INT_MAX |
| 9128 // and set condition code accordingly |
| 9129 int64_t temp = static_cast<int64_t>(r2_fval); |
| 9130 if (temp < INT_MIN || temp > INT_MAX) { |
| 9131 condition_reg_ = CC_OF; |
| 9132 } |
| 9133 r1_val = static_cast<int32_t>(r2_fval); |
| 9134 break; |
| 9135 } |
| 9136 case ROUND_TOWARD_PLUS_INFINITE: { |
| 9137 r1_val = static_cast<int32_t>(std::ceil(r2_fval)); |
| 9138 break; |
| 9139 } |
| 9140 case ROUND_TOWARD_MINUS_INFINITE: { |
| 9141 // check for overflow, cast r2_fval to 64bit integer |
| 9142 // then check value within the range of INT_MIN and INT_MAX |
| 9143 // and set condition code accordingly |
| 9144 int64_t temp = static_cast<int64_t>(std::floor(r2_fval)); |
| 9145 if (temp < INT_MIN || temp > INT_MAX) { |
| 9146 condition_reg_ = CC_OF; |
| 9147 } |
| 9148 r1_val = static_cast<int32_t>(std::floor(r2_fval)); |
| 9149 break; |
| 9150 } |
| 9151 default: |
| 9152 UNREACHABLE(); |
| 9153 } |
| 9154 set_low_register(r1, r1_val); |
| 9155 return length; |
| 9156 } |
| 9157 |
| 9158 EVALUATE(CFDBRA) { |
| 9159 DCHECK_OPCODE(CFDBRA); |
| 9160 DECODE_RRE_INSTRUCTION_M3(r1, r2, mask_val); |
| 9161 double r2_val = get_double_from_d_register(r2); |
| 9162 int32_t r1_val = 0; |
| 9163 |
| 9164 SetS390RoundConditionCode(r2_val, INT32_MAX, INT32_MIN); |
| 9165 |
| 9166 switch (mask_val) { |
| 9167 case CURRENT_ROUNDING_MODE: |
| 9168 case ROUND_TO_PREPARE_FOR_SHORTER_PRECISION: { |
| 9169 r1_val = static_cast<int32_t>(r2_val); |
| 9170 break; |
| 9171 } |
| 9172 case ROUND_TO_NEAREST_WITH_TIES_AWAY_FROM_0: { |
| 9173 double ceil_val = std::ceil(r2_val); |
| 9174 double floor_val = std::floor(r2_val); |
| 9175 double sub_val1 = std::fabs(r2_val - floor_val); |
| 9176 double sub_val2 = std::fabs(r2_val - ceil_val); |
| 9177 if (sub_val1 > sub_val2) { |
| 9178 r1_val = static_cast<int32_t>(ceil_val); |
| 9179 } else if (sub_val1 < sub_val2) { |
| 9180 r1_val = static_cast<int32_t>(floor_val); |
| 9181 } else { // round away from zero: |
| 9182 if (r2_val > 0.0) { |
| 9183 r1_val = static_cast<int32_t>(ceil_val); |
| 9184 } else { |
| 9185 r1_val = static_cast<int32_t>(floor_val); |
| 9186 } |
| 9187 } |
| 9188 break; |
| 9189 } |
| 9190 case ROUND_TO_NEAREST_WITH_TIES_TO_EVEN: { |
| 9191 double ceil_val = std::ceil(r2_val); |
| 9192 double floor_val = std::floor(r2_val); |
| 9193 double sub_val1 = std::fabs(r2_val - floor_val); |
| 9194 double sub_val2 = std::fabs(r2_val - ceil_val); |
| 9195 if (sub_val1 > sub_val2) { |
| 9196 r1_val = static_cast<int32_t>(ceil_val); |
| 9197 } else if (sub_val1 < sub_val2) { |
| 9198 r1_val = static_cast<int32_t>(floor_val); |
| 9199 } else { // check which one is even: |
| 9200 int32_t c_v = static_cast<int32_t>(ceil_val); |
| 9201 int32_t f_v = static_cast<int32_t>(floor_val); |
| 9202 if (f_v % 2 == 0) |
| 9203 r1_val = f_v; |
| 9204 else |
| 9205 r1_val = c_v; |
| 9206 } |
| 9207 break; |
| 9208 } |
| 9209 case ROUND_TOWARD_0: { |
| 9210 // check for overflow, cast r2_val to 64bit integer |
| 9211 // then check value within the range of INT_MIN and INT_MAX |
| 9212 // and set condition code accordingly |
| 9213 int64_t temp = static_cast<int64_t>(r2_val); |
| 9214 if (temp < INT_MIN || temp > INT_MAX) { |
| 9215 condition_reg_ = CC_OF; |
| 9216 } |
| 9217 r1_val = static_cast<int32_t>(r2_val); |
| 9218 break; |
| 9219 } |
| 9220 case ROUND_TOWARD_PLUS_INFINITE: { |
| 9221 r1_val = static_cast<int32_t>(std::ceil(r2_val)); |
| 9222 break; |
| 9223 } |
| 9224 case ROUND_TOWARD_MINUS_INFINITE: { |
| 9225 // check for overflow, cast r2_val to 64bit integer |
| 9226 // then check value within the range of INT_MIN and INT_MAX |
| 9227 // and set condition code accordingly |
| 9228 int64_t temp = static_cast<int64_t>(std::floor(r2_val)); |
| 9229 if (temp < INT_MIN || temp > INT_MAX) { |
| 9230 condition_reg_ = CC_OF; |
| 9231 } |
| 9232 r1_val = static_cast<int32_t>(std::floor(r2_val)); |
| 9233 break; |
| 9234 } |
| 9235 default: |
| 9236 UNREACHABLE(); |
| 9237 } |
| 9238 set_low_register(r1, r1_val); |
| 9239 return length; |
| 9240 } |
| 9241 |
| 9242 EVALUATE(CFXBRA) { |
| 9243 UNIMPLEMENTED(); |
| 9244 USE(instr); |
| 9245 return 0; |
| 9246 } |
8258 | 9247 |
8259 EVALUATE(CLFEBR) { | 9248 EVALUATE(CLFEBR) { |
8260 DCHECK_OPCODE(CLFEBR); | 9249 DCHECK_OPCODE(CLFEBR); |
8261 DECODE_RRE_INSTRUCTION(r1, r2); | 9250 DECODE_RRE_INSTRUCTION(r1, r2); |
8262 float r2_val = get_float32_from_d_register(r2); | 9251 float r2_val = get_float32_from_d_register(r2); |
8263 uint32_t r1_val = static_cast<uint32_t>(r2_val); | 9252 uint32_t r1_val = static_cast<uint32_t>(r2_val); |
8264 set_low_register(r1, r1_val); | 9253 set_low_register(r1, r1_val); |
8265 SetS390ConvertConditionCode<double>(r2_val, r1_val, UINT32_MAX); | 9254 SetS390ConvertConditionCode<double>(r2_val, r1_val, UINT32_MAX); |
8266 return length; | 9255 return length; |
8267 } | 9256 } |
8268 | 9257 |
8269 EVALUATE(CLFDBR) { | 9258 EVALUATE(CLFDBR) { |
8270 DCHECK_OPCODE(CLFDBR); | 9259 DCHECK_OPCODE(CLFDBR); |
8271 DECODE_RRE_INSTRUCTION(r1, r2); | 9260 DECODE_RRE_INSTRUCTION(r1, r2); |
8272 double r2_val = get_double_from_d_register(r2); | 9261 double r2_val = get_double_from_d_register(r2); |
8273 uint32_t r1_val = static_cast<uint32_t>(r2_val); | 9262 uint32_t r1_val = static_cast<uint32_t>(r2_val); |
8274 set_low_register(r1, r1_val); | 9263 set_low_register(r1, r1_val); |
8275 SetS390ConvertConditionCode<double>(r2_val, r1_val, UINT32_MAX); | 9264 SetS390ConvertConditionCode<double>(r2_val, r1_val, UINT32_MAX); |
8276 return length; | 9265 return length; |
8277 } | 9266 } |
8278 | 9267 |
8279 EVALUATE(CLFXBR) { return DecodeInstructionOriginal(instr); } | 9268 EVALUATE(CLFXBR) { |
| 9269 UNIMPLEMENTED(); |
| 9270 USE(instr); |
| 9271 return 0; |
| 9272 } |
8280 | 9273 |
8281 EVALUATE(CELGBR) { | 9274 EVALUATE(CELGBR) { |
8282 DCHECK_OPCODE(CELGBR); | 9275 DCHECK_OPCODE(CELGBR); |
8283 DECODE_RRE_INSTRUCTION(r1, r2); | 9276 DECODE_RRE_INSTRUCTION(r1, r2); |
8284 uint64_t r2_val = get_register(r2); | 9277 uint64_t r2_val = get_register(r2); |
8285 float r1_val = static_cast<float>(r2_val); | 9278 float r1_val = static_cast<float>(r2_val); |
8286 set_d_register_from_float32(r1, r1_val); | 9279 set_d_register_from_float32(r1, r1_val); |
8287 return length; | 9280 return length; |
8288 } | 9281 } |
8289 | 9282 |
8290 EVALUATE(CDLGBR) { | 9283 EVALUATE(CDLGBR) { |
8291 DCHECK_OPCODE(CDLGBR); | 9284 DCHECK_OPCODE(CDLGBR); |
8292 DECODE_RRE_INSTRUCTION(r1, r2); | 9285 DECODE_RRE_INSTRUCTION(r1, r2); |
8293 uint64_t r2_val = get_register(r2); | 9286 uint64_t r2_val = get_register(r2); |
8294 double r1_val = static_cast<double>(r2_val); | 9287 double r1_val = static_cast<double>(r2_val); |
8295 set_d_register_from_double(r1, r1_val); | 9288 set_d_register_from_double(r1, r1_val); |
8296 return length; | 9289 return length; |
8297 } | 9290 } |
8298 | 9291 |
8299 EVALUATE(CXLGBR) { return DecodeInstructionOriginal(instr); } | 9292 EVALUATE(CXLGBR) { |
| 9293 UNIMPLEMENTED(); |
| 9294 USE(instr); |
| 9295 return 0; |
| 9296 } |
8300 | 9297 |
8301 EVALUATE(CEGBRA) { return DecodeInstructionOriginal(instr); } | 9298 EVALUATE(CEGBRA) { |
| 9299 DCHECK_OPCODE(CEGBRA); |
| 9300 DECODE_RRE_INSTRUCTION(r1, r2); |
| 9301 int64_t fr2_val = get_register(r2); |
| 9302 float fr1_val = static_cast<float>(fr2_val); |
| 9303 set_d_register_from_float32(r1, fr1_val); |
| 9304 return length; |
| 9305 } |
8302 | 9306 |
8303 EVALUATE(CDGBRA) { return DecodeInstructionOriginal(instr); } | 9307 EVALUATE(CDGBRA) { |
| 9308 DCHECK_OPCODE(CDGBRA); |
| 9309 DECODE_RRE_INSTRUCTION(r1, r2); |
| 9310 int64_t r2_val = get_register(r2); |
| 9311 double r1_val = static_cast<double>(r2_val); |
| 9312 set_d_register_from_double(r1, r1_val); |
| 9313 return length; |
| 9314 } |
8304 | 9315 |
8305 EVALUATE(CXGBRA) { return DecodeInstructionOriginal(instr); } | 9316 EVALUATE(CXGBRA) { |
| 9317 UNIMPLEMENTED(); |
| 9318 USE(instr); |
| 9319 return 0; |
| 9320 } |
8306 | 9321 |
8307 EVALUATE(CGEBRA) { return DecodeInstructionOriginal(instr); } | 9322 EVALUATE(CGEBRA) { |
| 9323 DCHECK_OPCODE(CGEBRA); |
| 9324 DECODE_RRE_INSTRUCTION_M3(r1, r2, mask_val); |
| 9325 float r2_fval = get_float32_from_d_register(r2); |
| 9326 int64_t r1_val = 0; |
8308 | 9327 |
8309 EVALUATE(CGDBRA) { return DecodeInstructionOriginal(instr); } | 9328 SetS390RoundConditionCode(r2_fval, INT64_MAX, INT64_MIN); |
8310 | 9329 |
8311 EVALUATE(CGXBRA) { return DecodeInstructionOriginal(instr); } | 9330 switch (mask_val) { |
| 9331 case CURRENT_ROUNDING_MODE: |
| 9332 case ROUND_TO_NEAREST_WITH_TIES_AWAY_FROM_0: |
| 9333 case ROUND_TO_PREPARE_FOR_SHORTER_PRECISION: { |
| 9334 UNIMPLEMENTED(); |
| 9335 break; |
| 9336 } |
| 9337 case ROUND_TO_NEAREST_WITH_TIES_TO_EVEN: { |
| 9338 float ceil_val = std::ceil(r2_fval); |
| 9339 float floor_val = std::floor(r2_fval); |
| 9340 if (std::abs(r2_fval - floor_val) > std::abs(r2_fval - ceil_val)) { |
| 9341 r1_val = static_cast<int64_t>(ceil_val); |
| 9342 } else if (std::abs(r2_fval - floor_val) < std::abs(r2_fval - ceil_val)) { |
| 9343 r1_val = static_cast<int64_t>(floor_val); |
| 9344 } else { // check which one is even: |
| 9345 int64_t c_v = static_cast<int64_t>(ceil_val); |
| 9346 int64_t f_v = static_cast<int64_t>(floor_val); |
| 9347 if (f_v % 2 == 0) |
| 9348 r1_val = f_v; |
| 9349 else |
| 9350 r1_val = c_v; |
| 9351 } |
| 9352 break; |
| 9353 } |
| 9354 case ROUND_TOWARD_0: { |
| 9355 r1_val = static_cast<int64_t>(r2_fval); |
| 9356 break; |
| 9357 } |
| 9358 case ROUND_TOWARD_PLUS_INFINITE: { |
| 9359 r1_val = static_cast<int64_t>(std::ceil(r2_fval)); |
| 9360 break; |
| 9361 } |
| 9362 case ROUND_TOWARD_MINUS_INFINITE: { |
| 9363 r1_val = static_cast<int64_t>(std::floor(r2_fval)); |
| 9364 break; |
| 9365 } |
| 9366 default: |
| 9367 UNREACHABLE(); |
| 9368 } |
| 9369 set_register(r1, r1_val); |
| 9370 return length; |
| 9371 } |
| 9372 |
| 9373 EVALUATE(CGDBRA) { |
| 9374 DCHECK_OPCODE(CGDBRA); |
| 9375 DECODE_RRE_INSTRUCTION_M3(r1, r2, mask_val); |
| 9376 double r2_val = get_double_from_d_register(r2); |
| 9377 int64_t r1_val = 0; |
| 9378 |
| 9379 SetS390RoundConditionCode(r2_val, INT64_MAX, INT64_MIN); |
| 9380 |
| 9381 switch (mask_val) { |
| 9382 case CURRENT_ROUNDING_MODE: |
| 9383 case ROUND_TO_NEAREST_WITH_TIES_AWAY_FROM_0: |
| 9384 case ROUND_TO_PREPARE_FOR_SHORTER_PRECISION: { |
| 9385 UNIMPLEMENTED(); |
| 9386 break; |
| 9387 } |
| 9388 case ROUND_TO_NEAREST_WITH_TIES_TO_EVEN: { |
| 9389 double ceil_val = std::ceil(r2_val); |
| 9390 double floor_val = std::floor(r2_val); |
| 9391 if (std::abs(r2_val - floor_val) > std::abs(r2_val - ceil_val)) { |
| 9392 r1_val = static_cast<int64_t>(ceil_val); |
| 9393 } else if (std::abs(r2_val - floor_val) < std::abs(r2_val - ceil_val)) { |
| 9394 r1_val = static_cast<int64_t>(floor_val); |
| 9395 } else { // check which one is even: |
| 9396 int64_t c_v = static_cast<int64_t>(ceil_val); |
| 9397 int64_t f_v = static_cast<int64_t>(floor_val); |
| 9398 if (f_v % 2 == 0) |
| 9399 r1_val = f_v; |
| 9400 else |
| 9401 r1_val = c_v; |
| 9402 } |
| 9403 break; |
| 9404 } |
| 9405 case ROUND_TOWARD_0: { |
| 9406 r1_val = static_cast<int64_t>(r2_val); |
| 9407 break; |
| 9408 } |
| 9409 case ROUND_TOWARD_PLUS_INFINITE: { |
| 9410 r1_val = static_cast<int64_t>(std::ceil(r2_val)); |
| 9411 break; |
| 9412 } |
| 9413 case ROUND_TOWARD_MINUS_INFINITE: { |
| 9414 r1_val = static_cast<int64_t>(std::floor(r2_val)); |
| 9415 break; |
| 9416 } |
| 9417 default: |
| 9418 UNREACHABLE(); |
| 9419 } |
| 9420 set_register(r1, r1_val); |
| 9421 return length; |
| 9422 } |
| 9423 |
| 9424 EVALUATE(CGXBRA) { |
| 9425 UNIMPLEMENTED(); |
| 9426 USE(instr); |
| 9427 return 0; |
| 9428 } |
8312 | 9429 |
8313 EVALUATE(CLGEBR) { | 9430 EVALUATE(CLGEBR) { |
8314 DCHECK_OPCODE(CLGEBR); | 9431 DCHECK_OPCODE(CLGEBR); |
8315 DECODE_RRE_INSTRUCTION(r1, r2); | 9432 DECODE_RRE_INSTRUCTION(r1, r2); |
8316 float r2_val = get_float32_from_d_register(r2); | 9433 float r2_val = get_float32_from_d_register(r2); |
8317 uint64_t r1_val = static_cast<uint64_t>(r2_val); | 9434 uint64_t r1_val = static_cast<uint64_t>(r2_val); |
8318 set_register(r1, r1_val); | 9435 set_register(r1, r1_val); |
8319 SetS390ConvertConditionCode<double>(r2_val, r1_val, UINT64_MAX); | 9436 SetS390ConvertConditionCode<double>(r2_val, r1_val, UINT64_MAX); |
8320 return length; | 9437 return length; |
8321 } | 9438 } |
8322 | 9439 |
8323 EVALUATE(CLGDBR) { | 9440 EVALUATE(CLGDBR) { |
8324 DCHECK_OPCODE(CLGDBR); | 9441 DCHECK_OPCODE(CLGDBR); |
8325 DECODE_RRE_INSTRUCTION(r1, r2); | 9442 DECODE_RRE_INSTRUCTION(r1, r2); |
8326 double r2_val = get_double_from_d_register(r2); | 9443 double r2_val = get_double_from_d_register(r2); |
8327 uint64_t r1_val = static_cast<uint64_t>(r2_val); | 9444 uint64_t r1_val = static_cast<uint64_t>(r2_val); |
8328 set_register(r1, r1_val); | 9445 set_register(r1, r1_val); |
8329 SetS390ConvertConditionCode<double>(r2_val, r1_val, UINT64_MAX); | 9446 SetS390ConvertConditionCode<double>(r2_val, r1_val, UINT64_MAX); |
8330 return length; | 9447 return length; |
8331 } | 9448 } |
8332 | 9449 |
8333 EVALUATE(CFER) { return DecodeInstructionOriginal(instr); } | 9450 EVALUATE(CFER) { |
| 9451 UNIMPLEMENTED(); |
| 9452 USE(instr); |
| 9453 return 0; |
| 9454 } |
8334 | 9455 |
8335 EVALUATE(CFDR) { return DecodeInstructionOriginal(instr); } | 9456 EVALUATE(CFDR) { |
| 9457 UNIMPLEMENTED(); |
| 9458 USE(instr); |
| 9459 return 0; |
| 9460 } |
8336 | 9461 |
8337 EVALUATE(CFXR) { return DecodeInstructionOriginal(instr); } | 9462 EVALUATE(CFXR) { |
| 9463 UNIMPLEMENTED(); |
| 9464 USE(instr); |
| 9465 return 0; |
| 9466 } |
8338 | 9467 |
8339 EVALUATE(LDGR) { | 9468 EVALUATE(LDGR) { |
8340 DCHECK_OPCODE(LDGR); | 9469 DCHECK_OPCODE(LDGR); |
8341 // Load FPR from GPR (L <- 64) | 9470 // Load FPR from GPR (L <- 64) |
8342 DECODE_RRE_INSTRUCTION(r1, r2); | 9471 DECODE_RRE_INSTRUCTION(r1, r2); |
8343 uint64_t int_val = get_register(r2); | 9472 uint64_t int_val = get_register(r2); |
8344 // double double_val = bit_cast<double, uint64_t>(int_val); | 9473 // double double_val = bit_cast<double, uint64_t>(int_val); |
8345 // set_d_register_from_double(rreInst->R1Value(), double_val); | 9474 // set_d_register_from_double(rreInst->R1Value(), double_val); |
8346 set_d_register(r1, int_val); | 9475 set_d_register(r1, int_val); |
8347 return length; | 9476 return length; |
8348 } | 9477 } |
8349 | 9478 |
8350 EVALUATE(CGER) { return DecodeInstructionOriginal(instr); } | 9479 EVALUATE(CGER) { |
| 9480 UNIMPLEMENTED(); |
| 9481 USE(instr); |
| 9482 return 0; |
| 9483 } |
8351 | 9484 |
8352 EVALUATE(CGDR) { return DecodeInstructionOriginal(instr); } | 9485 EVALUATE(CGDR) { |
| 9486 UNIMPLEMENTED(); |
| 9487 USE(instr); |
| 9488 return 0; |
| 9489 } |
8353 | 9490 |
8354 EVALUATE(CGXR) { return DecodeInstructionOriginal(instr); } | 9491 EVALUATE(CGXR) { |
| 9492 UNIMPLEMENTED(); |
| 9493 USE(instr); |
| 9494 return 0; |
| 9495 } |
8355 | 9496 |
8356 EVALUATE(LGDR) { | 9497 EVALUATE(LGDR) { |
8357 DCHECK_OPCODE(LGDR); | 9498 DCHECK_OPCODE(LGDR); |
8358 DECODE_RRE_INSTRUCTION(r1, r2); | 9499 DECODE_RRE_INSTRUCTION(r1, r2); |
8359 // Load GPR from FPR (64 <- L) | 9500 // Load GPR from FPR (64 <- L) |
8360 int64_t double_val = get_d_register(r2); | 9501 int64_t double_val = get_d_register(r2); |
8361 set_register(r1, double_val); | 9502 set_register(r1, double_val); |
8362 return length; | 9503 return length; |
8363 } | 9504 } |
8364 | 9505 |
8365 EVALUATE(MDTR) { return DecodeInstructionOriginal(instr); } | 9506 EVALUATE(MDTR) { |
8366 | 9507 UNIMPLEMENTED(); |
8367 EVALUATE(MDTRA) { return DecodeInstructionOriginal(instr); } | 9508 USE(instr); |
8368 | 9509 return 0; |
8369 EVALUATE(DDTRA) { return DecodeInstructionOriginal(instr); } | 9510 } |
8370 | 9511 |
8371 EVALUATE(ADTRA) { return DecodeInstructionOriginal(instr); } | 9512 EVALUATE(MDTRA) { |
8372 | 9513 UNIMPLEMENTED(); |
8373 EVALUATE(SDTRA) { return DecodeInstructionOriginal(instr); } | 9514 USE(instr); |
8374 | 9515 return 0; |
8375 EVALUATE(LDETR) { return DecodeInstructionOriginal(instr); } | 9516 } |
8376 | 9517 |
8377 EVALUATE(LEDTR) { return DecodeInstructionOriginal(instr); } | 9518 EVALUATE(DDTRA) { |
8378 | 9519 UNIMPLEMENTED(); |
8379 EVALUATE(LTDTR) { return DecodeInstructionOriginal(instr); } | 9520 USE(instr); |
8380 | 9521 return 0; |
8381 EVALUATE(FIDTR) { return DecodeInstructionOriginal(instr); } | 9522 } |
8382 | 9523 |
8383 EVALUATE(MXTRA) { return DecodeInstructionOriginal(instr); } | 9524 EVALUATE(ADTRA) { |
8384 | 9525 UNIMPLEMENTED(); |
8385 EVALUATE(DXTRA) { return DecodeInstructionOriginal(instr); } | 9526 USE(instr); |
8386 | 9527 return 0; |
8387 EVALUATE(AXTRA) { return DecodeInstructionOriginal(instr); } | 9528 } |
8388 | 9529 |
8389 EVALUATE(SXTRA) { return DecodeInstructionOriginal(instr); } | 9530 EVALUATE(SDTRA) { |
8390 | 9531 UNIMPLEMENTED(); |
8391 EVALUATE(LXDTR) { return DecodeInstructionOriginal(instr); } | 9532 USE(instr); |
8392 | 9533 return 0; |
8393 EVALUATE(LDXTR) { return DecodeInstructionOriginal(instr); } | 9534 } |
8394 | 9535 |
8395 EVALUATE(LTXTR) { return DecodeInstructionOriginal(instr); } | 9536 EVALUATE(LDETR) { |
8396 | 9537 UNIMPLEMENTED(); |
8397 EVALUATE(FIXTR) { return DecodeInstructionOriginal(instr); } | 9538 USE(instr); |
8398 | 9539 return 0; |
8399 EVALUATE(KDTR) { return DecodeInstructionOriginal(instr); } | 9540 } |
8400 | 9541 |
8401 EVALUATE(CGDTRA) { return DecodeInstructionOriginal(instr); } | 9542 EVALUATE(LEDTR) { |
8402 | 9543 UNIMPLEMENTED(); |
8403 EVALUATE(CUDTR) { return DecodeInstructionOriginal(instr); } | 9544 USE(instr); |
8404 | 9545 return 0; |
8405 EVALUATE(CDTR) { return DecodeInstructionOriginal(instr); } | 9546 } |
8406 | 9547 |
8407 EVALUATE(EEDTR) { return DecodeInstructionOriginal(instr); } | 9548 EVALUATE(LTDTR) { |
8408 | 9549 UNIMPLEMENTED(); |
8409 EVALUATE(ESDTR) { return DecodeInstructionOriginal(instr); } | 9550 USE(instr); |
8410 | 9551 return 0; |
8411 EVALUATE(KXTR) { return DecodeInstructionOriginal(instr); } | 9552 } |
8412 | 9553 |
8413 EVALUATE(CGXTRA) { return DecodeInstructionOriginal(instr); } | 9554 EVALUATE(FIDTR) { |
8414 | 9555 UNIMPLEMENTED(); |
8415 EVALUATE(CUXTR) { return DecodeInstructionOriginal(instr); } | 9556 USE(instr); |
8416 | 9557 return 0; |
8417 EVALUATE(CSXTR) { return DecodeInstructionOriginal(instr); } | 9558 } |
8418 | 9559 |
8419 EVALUATE(CXTR) { return DecodeInstructionOriginal(instr); } | 9560 EVALUATE(MXTRA) { |
8420 | 9561 UNIMPLEMENTED(); |
8421 EVALUATE(EEXTR) { return DecodeInstructionOriginal(instr); } | 9562 USE(instr); |
8422 | 9563 return 0; |
8423 EVALUATE(ESXTR) { return DecodeInstructionOriginal(instr); } | 9564 } |
8424 | 9565 |
8425 EVALUATE(CDGTRA) { return DecodeInstructionOriginal(instr); } | 9566 EVALUATE(DXTRA) { |
8426 | 9567 UNIMPLEMENTED(); |
8427 EVALUATE(CDUTR) { return DecodeInstructionOriginal(instr); } | 9568 USE(instr); |
8428 | 9569 return 0; |
8429 EVALUATE(CDSTR) { return DecodeInstructionOriginal(instr); } | 9570 } |
8430 | 9571 |
8431 EVALUATE(CEDTR) { return DecodeInstructionOriginal(instr); } | 9572 EVALUATE(AXTRA) { |
8432 | 9573 UNIMPLEMENTED(); |
8433 EVALUATE(QADTR) { return DecodeInstructionOriginal(instr); } | 9574 USE(instr); |
8434 | 9575 return 0; |
8435 EVALUATE(IEDTR) { return DecodeInstructionOriginal(instr); } | 9576 } |
8436 | 9577 |
8437 EVALUATE(RRDTR) { return DecodeInstructionOriginal(instr); } | 9578 EVALUATE(SXTRA) { |
8438 | 9579 UNIMPLEMENTED(); |
8439 EVALUATE(CXGTRA) { return DecodeInstructionOriginal(instr); } | 9580 USE(instr); |
8440 | 9581 return 0; |
8441 EVALUATE(CXUTR) { return DecodeInstructionOriginal(instr); } | 9582 } |
8442 | 9583 |
8443 EVALUATE(CXSTR) { return DecodeInstructionOriginal(instr); } | 9584 EVALUATE(LXDTR) { |
8444 | 9585 UNIMPLEMENTED(); |
8445 EVALUATE(CEXTR) { return DecodeInstructionOriginal(instr); } | 9586 USE(instr); |
8446 | 9587 return 0; |
8447 EVALUATE(QAXTR) { return DecodeInstructionOriginal(instr); } | 9588 } |
8448 | 9589 |
8449 EVALUATE(IEXTR) { return DecodeInstructionOriginal(instr); } | 9590 EVALUATE(LDXTR) { |
8450 | 9591 UNIMPLEMENTED(); |
8451 EVALUATE(RRXTR) { return DecodeInstructionOriginal(instr); } | 9592 USE(instr); |
8452 | 9593 return 0; |
8453 EVALUATE(LPGR) { return DecodeInstructionOriginal(instr); } | 9594 } |
| 9595 |
| 9596 EVALUATE(LTXTR) { |
| 9597 UNIMPLEMENTED(); |
| 9598 USE(instr); |
| 9599 return 0; |
| 9600 } |
| 9601 |
| 9602 EVALUATE(FIXTR) { |
| 9603 UNIMPLEMENTED(); |
| 9604 USE(instr); |
| 9605 return 0; |
| 9606 } |
| 9607 |
| 9608 EVALUATE(KDTR) { |
| 9609 UNIMPLEMENTED(); |
| 9610 USE(instr); |
| 9611 return 0; |
| 9612 } |
| 9613 |
| 9614 EVALUATE(CGDTRA) { |
| 9615 UNIMPLEMENTED(); |
| 9616 USE(instr); |
| 9617 return 0; |
| 9618 } |
| 9619 |
| 9620 EVALUATE(CUDTR) { |
| 9621 UNIMPLEMENTED(); |
| 9622 USE(instr); |
| 9623 return 0; |
| 9624 } |
| 9625 |
| 9626 EVALUATE(CDTR) { |
| 9627 UNIMPLEMENTED(); |
| 9628 USE(instr); |
| 9629 return 0; |
| 9630 } |
| 9631 |
| 9632 EVALUATE(EEDTR) { |
| 9633 UNIMPLEMENTED(); |
| 9634 USE(instr); |
| 9635 return 0; |
| 9636 } |
| 9637 |
| 9638 EVALUATE(ESDTR) { |
| 9639 UNIMPLEMENTED(); |
| 9640 USE(instr); |
| 9641 return 0; |
| 9642 } |
| 9643 |
| 9644 EVALUATE(KXTR) { |
| 9645 UNIMPLEMENTED(); |
| 9646 USE(instr); |
| 9647 return 0; |
| 9648 } |
| 9649 |
| 9650 EVALUATE(CGXTRA) { |
| 9651 UNIMPLEMENTED(); |
| 9652 USE(instr); |
| 9653 return 0; |
| 9654 } |
| 9655 |
| 9656 EVALUATE(CUXTR) { |
| 9657 UNIMPLEMENTED(); |
| 9658 USE(instr); |
| 9659 return 0; |
| 9660 } |
| 9661 |
| 9662 EVALUATE(CSXTR) { |
| 9663 UNIMPLEMENTED(); |
| 9664 USE(instr); |
| 9665 return 0; |
| 9666 } |
| 9667 |
| 9668 EVALUATE(CXTR) { |
| 9669 UNIMPLEMENTED(); |
| 9670 USE(instr); |
| 9671 return 0; |
| 9672 } |
| 9673 |
| 9674 EVALUATE(EEXTR) { |
| 9675 UNIMPLEMENTED(); |
| 9676 USE(instr); |
| 9677 return 0; |
| 9678 } |
| 9679 |
| 9680 EVALUATE(ESXTR) { |
| 9681 UNIMPLEMENTED(); |
| 9682 USE(instr); |
| 9683 return 0; |
| 9684 } |
| 9685 |
| 9686 EVALUATE(CDGTRA) { |
| 9687 UNIMPLEMENTED(); |
| 9688 USE(instr); |
| 9689 return 0; |
| 9690 } |
| 9691 |
| 9692 EVALUATE(CDUTR) { |
| 9693 UNIMPLEMENTED(); |
| 9694 USE(instr); |
| 9695 return 0; |
| 9696 } |
| 9697 |
| 9698 EVALUATE(CDSTR) { |
| 9699 UNIMPLEMENTED(); |
| 9700 USE(instr); |
| 9701 return 0; |
| 9702 } |
| 9703 |
| 9704 EVALUATE(CEDTR) { |
| 9705 UNIMPLEMENTED(); |
| 9706 USE(instr); |
| 9707 return 0; |
| 9708 } |
| 9709 |
| 9710 EVALUATE(QADTR) { |
| 9711 UNIMPLEMENTED(); |
| 9712 USE(instr); |
| 9713 return 0; |
| 9714 } |
| 9715 |
| 9716 EVALUATE(IEDTR) { |
| 9717 UNIMPLEMENTED(); |
| 9718 USE(instr); |
| 9719 return 0; |
| 9720 } |
| 9721 |
| 9722 EVALUATE(RRDTR) { |
| 9723 UNIMPLEMENTED(); |
| 9724 USE(instr); |
| 9725 return 0; |
| 9726 } |
| 9727 |
| 9728 EVALUATE(CXGTRA) { |
| 9729 UNIMPLEMENTED(); |
| 9730 USE(instr); |
| 9731 return 0; |
| 9732 } |
| 9733 |
| 9734 EVALUATE(CXUTR) { |
| 9735 UNIMPLEMENTED(); |
| 9736 USE(instr); |
| 9737 return 0; |
| 9738 } |
| 9739 |
| 9740 EVALUATE(CXSTR) { |
| 9741 UNIMPLEMENTED(); |
| 9742 USE(instr); |
| 9743 return 0; |
| 9744 } |
| 9745 |
| 9746 EVALUATE(CEXTR) { |
| 9747 UNIMPLEMENTED(); |
| 9748 USE(instr); |
| 9749 return 0; |
| 9750 } |
| 9751 |
| 9752 EVALUATE(QAXTR) { |
| 9753 UNIMPLEMENTED(); |
| 9754 USE(instr); |
| 9755 return 0; |
| 9756 } |
| 9757 |
| 9758 EVALUATE(IEXTR) { |
| 9759 UNIMPLEMENTED(); |
| 9760 USE(instr); |
| 9761 return 0; |
| 9762 } |
| 9763 |
| 9764 EVALUATE(RRXTR) { |
| 9765 UNIMPLEMENTED(); |
| 9766 USE(instr); |
| 9767 return 0; |
| 9768 } |
| 9769 |
| 9770 EVALUATE(LPGR) { |
| 9771 UNIMPLEMENTED(); |
| 9772 USE(instr); |
| 9773 return 0; |
| 9774 } |
8454 | 9775 |
8455 EVALUATE(LNGR) { | 9776 EVALUATE(LNGR) { |
8456 DCHECK_OPCODE(LNGR); | 9777 DCHECK_OPCODE(LNGR); |
8457 // Load Negative (64) | 9778 // Load Negative (64) |
8458 DECODE_RRE_INSTRUCTION(r1, r2); | 9779 DECODE_RRE_INSTRUCTION(r1, r2); |
8459 int64_t r2_val = get_register(r2); | 9780 int64_t r2_val = get_register(r2); |
8460 r2_val = (r2_val >= 0) ? -r2_val : r2_val; // If pos, then negate it. | 9781 r2_val = (r2_val >= 0) ? -r2_val : r2_val; // If pos, then negate it. |
8461 set_register(r1, r2_val); | 9782 set_register(r1, r2_val); |
8462 condition_reg_ = (r2_val == 0) ? CC_EQ : CC_LT; // CC0 - result is zero | 9783 condition_reg_ = (r2_val == 0) ? CC_EQ : CC_LT; // CC0 - result is zero |
8463 // CC1 - result is negative | 9784 // CC1 - result is negative |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8496 int64_t r2_val = get_register(r2); | 9817 int64_t r2_val = get_register(r2); |
8497 bool isOF = false; | 9818 bool isOF = false; |
8498 isOF = CheckOverflowForIntSub(r1_val, r2_val, int64_t); | 9819 isOF = CheckOverflowForIntSub(r1_val, r2_val, int64_t); |
8499 r1_val -= r2_val; | 9820 r1_val -= r2_val; |
8500 SetS390ConditionCode<int64_t>(r1_val, 0); | 9821 SetS390ConditionCode<int64_t>(r1_val, 0); |
8501 SetS390OverflowCode(isOF); | 9822 SetS390OverflowCode(isOF); |
8502 set_register(r1, r1_val); | 9823 set_register(r1, r1_val); |
8503 return length; | 9824 return length; |
8504 } | 9825 } |
8505 | 9826 |
8506 EVALUATE(ALGR) { return DecodeInstructionOriginal(instr); } | 9827 EVALUATE(ALGR) { |
| 9828 UNIMPLEMENTED(); |
| 9829 USE(instr); |
| 9830 return 0; |
| 9831 } |
8507 | 9832 |
8508 EVALUATE(SLGR) { return DecodeInstructionOriginal(instr); } | 9833 EVALUATE(SLGR) { |
| 9834 UNIMPLEMENTED(); |
| 9835 USE(instr); |
| 9836 return 0; |
| 9837 } |
8509 | 9838 |
8510 EVALUATE(MSGR) { | 9839 EVALUATE(MSGR) { |
8511 DCHECK_OPCODE(MSGR); | 9840 DCHECK_OPCODE(MSGR); |
8512 DECODE_RRE_INSTRUCTION(r1, r2); | 9841 DECODE_RRE_INSTRUCTION(r1, r2); |
8513 int64_t r1_val = get_register(r1); | 9842 int64_t r1_val = get_register(r1); |
8514 int64_t r2_val = get_register(r2); | 9843 int64_t r2_val = get_register(r2); |
8515 set_register(r1, r1_val * r2_val); | 9844 set_register(r1, r1_val * r2_val); |
8516 return length; | 9845 return length; |
8517 } | 9846 } |
8518 | 9847 |
8519 EVALUATE(DSGR) { | 9848 EVALUATE(DSGR) { |
8520 DCHECK_OPCODE(DSGR); | 9849 DCHECK_OPCODE(DSGR); |
8521 DECODE_RRE_INSTRUCTION(r1, r2); | 9850 DECODE_RRE_INSTRUCTION(r1, r2); |
8522 | 9851 |
8523 DCHECK(r1 % 2 == 0); | 9852 DCHECK(r1 % 2 == 0); |
8524 | 9853 |
8525 int64_t dividend = get_register(r1 + 1); | 9854 int64_t dividend = get_register(r1 + 1); |
8526 int64_t divisor = get_register(r2); | 9855 int64_t divisor = get_register(r2); |
8527 set_register(r1, dividend % divisor); | 9856 set_register(r1, dividend % divisor); |
8528 set_register(r1 + 1, dividend / divisor); | 9857 set_register(r1 + 1, dividend / divisor); |
8529 return length; | 9858 return length; |
8530 } | 9859 } |
8531 | 9860 |
8532 EVALUATE(LRVGR) { return DecodeInstructionOriginal(instr); } | 9861 EVALUATE(LRVGR) { |
| 9862 UNIMPLEMENTED(); |
| 9863 USE(instr); |
| 9864 return 0; |
| 9865 } |
8533 | 9866 |
8534 EVALUATE(LPGFR) { return DecodeInstructionOriginal(instr); } | 9867 EVALUATE(LPGFR) { |
| 9868 UNIMPLEMENTED(); |
| 9869 USE(instr); |
| 9870 return 0; |
| 9871 } |
8535 | 9872 |
8536 EVALUATE(LNGFR) { return DecodeInstructionOriginal(instr); } | 9873 EVALUATE(LNGFR) { |
| 9874 UNIMPLEMENTED(); |
| 9875 USE(instr); |
| 9876 return 0; |
| 9877 } |
8537 | 9878 |
8538 EVALUATE(LTGFR) { | 9879 EVALUATE(LTGFR) { |
8539 DCHECK_OPCODE(LTGFR); | 9880 DCHECK_OPCODE(LTGFR); |
8540 DECODE_RRE_INSTRUCTION(r1, r2); | 9881 DECODE_RRE_INSTRUCTION(r1, r2); |
8541 // Load and Test Register (64 <- 32) (Sign Extends 32-bit val) | 9882 // Load and Test Register (64 <- 32) (Sign Extends 32-bit val) |
8542 // Load Register (64 <- 32) (Sign Extends 32-bit val) | 9883 // Load Register (64 <- 32) (Sign Extends 32-bit val) |
8543 int32_t r2_val = get_low_register<int32_t>(r2); | 9884 int32_t r2_val = get_low_register<int32_t>(r2); |
8544 int64_t result = static_cast<int64_t>(r2_val); | 9885 int64_t result = static_cast<int64_t>(r2_val); |
8545 set_register(r1, result); | 9886 set_register(r1, result); |
8546 SetS390ConditionCode<int64_t>(result, 0); | 9887 SetS390ConditionCode<int64_t>(result, 0); |
8547 return length; | 9888 return length; |
8548 } | 9889 } |
8549 | 9890 |
8550 EVALUATE(LCGFR) { | 9891 EVALUATE(LCGFR) { |
8551 DCHECK_OPCODE(LCGFR); | 9892 DCHECK_OPCODE(LCGFR); |
8552 DECODE_RRE_INSTRUCTION(r1, r2); | 9893 DECODE_RRE_INSTRUCTION(r1, r2); |
8553 // Load and Test Register (64 <- 32) (Sign Extends 32-bit val) | 9894 // Load and Test Register (64 <- 32) (Sign Extends 32-bit val) |
8554 // Load Register (64 <- 32) (Sign Extends 32-bit val) | 9895 // Load Register (64 <- 32) (Sign Extends 32-bit val) |
8555 int32_t r2_val = get_low_register<int32_t>(r2); | 9896 int32_t r2_val = get_low_register<int32_t>(r2); |
8556 int64_t result = static_cast<int64_t>(r2_val); | 9897 int64_t result = static_cast<int64_t>(r2_val); |
8557 set_register(r1, result); | 9898 set_register(r1, result); |
8558 return length; | 9899 return length; |
8559 } | 9900 } |
8560 | 9901 |
8561 EVALUATE(LLGFR) { return DecodeInstructionOriginal(instr); } | 9902 EVALUATE(LLGFR) { |
| 9903 DCHECK_OPCODE(LLGFR); |
| 9904 DECODE_RRE_INSTRUCTION(r1, r2); |
| 9905 int32_t r2_val = get_low_register<int32_t>(r2); |
| 9906 uint64_t r2_finalval = (static_cast<uint64_t>(r2_val) & 0x00000000ffffffff); |
| 9907 set_register(r1, r2_finalval); |
| 9908 return length; |
| 9909 } |
8562 | 9910 |
8563 EVALUATE(LLGTR) { return DecodeInstructionOriginal(instr); } | 9911 EVALUATE(LLGTR) { |
| 9912 UNIMPLEMENTED(); |
| 9913 USE(instr); |
| 9914 return 0; |
| 9915 } |
8564 | 9916 |
8565 EVALUATE(AGFR) { | 9917 EVALUATE(AGFR) { |
8566 DCHECK_OPCODE(AGFR); | 9918 DCHECK_OPCODE(AGFR); |
8567 DECODE_RRE_INSTRUCTION(r1, r2); | 9919 DECODE_RRE_INSTRUCTION(r1, r2); |
8568 // Add Register (64 <- 32) (Sign Extends 32-bit val) | 9920 // Add Register (64 <- 32) (Sign Extends 32-bit val) |
8569 int64_t r1_val = get_register(r1); | 9921 int64_t r1_val = get_register(r1); |
8570 int64_t r2_val = static_cast<int64_t>(get_low_register<int32_t>(r2)); | 9922 int64_t r2_val = static_cast<int64_t>(get_low_register<int32_t>(r2)); |
8571 bool isOF = CheckOverflowForIntAdd(r1_val, r2_val, int64_t); | 9923 bool isOF = CheckOverflowForIntAdd(r1_val, r2_val, int64_t); |
8572 r1_val += r2_val; | 9924 r1_val += r2_val; |
8573 SetS390ConditionCode<int64_t>(r1_val, 0); | 9925 SetS390ConditionCode<int64_t>(r1_val, 0); |
(...skipping 10 matching lines...) Expand all Loading... |
8584 int64_t r2_val = static_cast<int64_t>(get_low_register<int32_t>(r2)); | 9936 int64_t r2_val = static_cast<int64_t>(get_low_register<int32_t>(r2)); |
8585 bool isOF = false; | 9937 bool isOF = false; |
8586 isOF = CheckOverflowForIntSub(r1_val, r2_val, int64_t); | 9938 isOF = CheckOverflowForIntSub(r1_val, r2_val, int64_t); |
8587 r1_val -= r2_val; | 9939 r1_val -= r2_val; |
8588 SetS390ConditionCode<int64_t>(r1_val, 0); | 9940 SetS390ConditionCode<int64_t>(r1_val, 0); |
8589 SetS390OverflowCode(isOF); | 9941 SetS390OverflowCode(isOF); |
8590 set_register(r1, r1_val); | 9942 set_register(r1, r1_val); |
8591 return length; | 9943 return length; |
8592 } | 9944 } |
8593 | 9945 |
8594 EVALUATE(ALGFR) { return DecodeInstructionOriginal(instr); } | 9946 EVALUATE(ALGFR) { |
| 9947 UNIMPLEMENTED(); |
| 9948 USE(instr); |
| 9949 return 0; |
| 9950 } |
8595 | 9951 |
8596 EVALUATE(SLGFR) { return DecodeInstructionOriginal(instr); } | 9952 EVALUATE(SLGFR) { |
| 9953 UNIMPLEMENTED(); |
| 9954 USE(instr); |
| 9955 return 0; |
| 9956 } |
8597 | 9957 |
8598 EVALUATE(MSGFR) { return DecodeInstructionOriginal(instr); } | 9958 EVALUATE(MSGFR) { |
| 9959 UNIMPLEMENTED(); |
| 9960 USE(instr); |
| 9961 return 0; |
| 9962 } |
8599 | 9963 |
8600 EVALUATE(DSGFR) { return DecodeInstructionOriginal(instr); } | 9964 EVALUATE(DSGFR) { |
| 9965 UNIMPLEMENTED(); |
| 9966 USE(instr); |
| 9967 return 0; |
| 9968 } |
8601 | 9969 |
8602 EVALUATE(KMAC) { return DecodeInstructionOriginal(instr); } | 9970 EVALUATE(KMAC) { |
| 9971 UNIMPLEMENTED(); |
| 9972 USE(instr); |
| 9973 return 0; |
| 9974 } |
8603 | 9975 |
8604 EVALUATE(LRVR) { return DecodeInstructionOriginal(instr); } | 9976 EVALUATE(LRVR) { |
| 9977 UNIMPLEMENTED(); |
| 9978 USE(instr); |
| 9979 return 0; |
| 9980 } |
8605 | 9981 |
8606 EVALUATE(CGR) { | 9982 EVALUATE(CGR) { |
8607 DCHECK_OPCODE(CGR); | 9983 DCHECK_OPCODE(CGR); |
8608 DECODE_RRE_INSTRUCTION(r1, r2); | 9984 DECODE_RRE_INSTRUCTION(r1, r2); |
8609 // Compare (64) | 9985 // Compare (64) |
8610 int64_t r1_val = get_register(r1); | 9986 int64_t r1_val = get_register(r1); |
8611 int64_t r2_val = get_register(r2); | 9987 int64_t r2_val = get_register(r2); |
8612 SetS390ConditionCode<int64_t>(r1_val, r2_val); | 9988 SetS390ConditionCode<int64_t>(r1_val, r2_val); |
8613 return length; | 9989 return length; |
8614 } | 9990 } |
8615 | 9991 |
8616 EVALUATE(CLGR) { | 9992 EVALUATE(CLGR) { |
8617 DCHECK_OPCODE(CLGR); | 9993 DCHECK_OPCODE(CLGR); |
8618 DECODE_RRE_INSTRUCTION(r1, r2); | 9994 DECODE_RRE_INSTRUCTION(r1, r2); |
8619 // Compare Logical (64) | 9995 // Compare Logical (64) |
8620 uint64_t r1_val = static_cast<uint64_t>(get_register(r1)); | 9996 uint64_t r1_val = static_cast<uint64_t>(get_register(r1)); |
8621 uint64_t r2_val = static_cast<uint64_t>(get_register(r2)); | 9997 uint64_t r2_val = static_cast<uint64_t>(get_register(r2)); |
8622 SetS390ConditionCode<uint64_t>(r1_val, r2_val); | 9998 SetS390ConditionCode<uint64_t>(r1_val, r2_val); |
8623 return length; | 9999 return length; |
8624 } | 10000 } |
8625 | 10001 |
8626 EVALUATE(KMF) { return DecodeInstructionOriginal(instr); } | 10002 EVALUATE(KMF) { |
| 10003 UNIMPLEMENTED(); |
| 10004 USE(instr); |
| 10005 return 0; |
| 10006 } |
8627 | 10007 |
8628 EVALUATE(KMO) { return DecodeInstructionOriginal(instr); } | 10008 EVALUATE(KMO) { |
| 10009 UNIMPLEMENTED(); |
| 10010 USE(instr); |
| 10011 return 0; |
| 10012 } |
8629 | 10013 |
8630 EVALUATE(PCC) { return DecodeInstructionOriginal(instr); } | 10014 EVALUATE(PCC) { |
| 10015 UNIMPLEMENTED(); |
| 10016 USE(instr); |
| 10017 return 0; |
| 10018 } |
8631 | 10019 |
8632 EVALUATE(KMCTR) { return DecodeInstructionOriginal(instr); } | 10020 EVALUATE(KMCTR) { |
| 10021 UNIMPLEMENTED(); |
| 10022 USE(instr); |
| 10023 return 0; |
| 10024 } |
8633 | 10025 |
8634 EVALUATE(KM) { return DecodeInstructionOriginal(instr); } | 10026 EVALUATE(KM) { |
| 10027 UNIMPLEMENTED(); |
| 10028 USE(instr); |
| 10029 return 0; |
| 10030 } |
8635 | 10031 |
8636 EVALUATE(KMC) { return DecodeInstructionOriginal(instr); } | 10032 EVALUATE(KMC) { |
| 10033 UNIMPLEMENTED(); |
| 10034 USE(instr); |
| 10035 return 0; |
| 10036 } |
8637 | 10037 |
8638 EVALUATE(CGFR) { return DecodeInstructionOriginal(instr); } | 10038 EVALUATE(CGFR) { |
| 10039 UNIMPLEMENTED(); |
| 10040 USE(instr); |
| 10041 return 0; |
| 10042 } |
8639 | 10043 |
8640 EVALUATE(KIMD) { return DecodeInstructionOriginal(instr); } | 10044 EVALUATE(KIMD) { |
| 10045 UNIMPLEMENTED(); |
| 10046 USE(instr); |
| 10047 return 0; |
| 10048 } |
8641 | 10049 |
8642 EVALUATE(KLMD) { return DecodeInstructionOriginal(instr); } | 10050 EVALUATE(KLMD) { |
| 10051 UNIMPLEMENTED(); |
| 10052 USE(instr); |
| 10053 return 0; |
| 10054 } |
8643 | 10055 |
8644 EVALUATE(CFDTR) { return DecodeInstructionOriginal(instr); } | 10056 EVALUATE(CFDTR) { |
| 10057 UNIMPLEMENTED(); |
| 10058 USE(instr); |
| 10059 return 0; |
| 10060 } |
8645 | 10061 |
8646 EVALUATE(CLGDTR) { return DecodeInstructionOriginal(instr); } | 10062 EVALUATE(CLGDTR) { |
| 10063 UNIMPLEMENTED(); |
| 10064 USE(instr); |
| 10065 return 0; |
| 10066 } |
8647 | 10067 |
8648 EVALUATE(CLFDTR) { return DecodeInstructionOriginal(instr); } | 10068 EVALUATE(CLFDTR) { |
| 10069 UNIMPLEMENTED(); |
| 10070 USE(instr); |
| 10071 return 0; |
| 10072 } |
8649 | 10073 |
8650 EVALUATE(BCTGR) { return DecodeInstructionOriginal(instr); } | 10074 EVALUATE(BCTGR) { |
| 10075 UNIMPLEMENTED(); |
| 10076 USE(instr); |
| 10077 return 0; |
| 10078 } |
8651 | 10079 |
8652 EVALUATE(CFXTR) { return DecodeInstructionOriginal(instr); } | 10080 EVALUATE(CFXTR) { |
| 10081 UNIMPLEMENTED(); |
| 10082 USE(instr); |
| 10083 return 0; |
| 10084 } |
8653 | 10085 |
8654 EVALUATE(CLFXTR) { return DecodeInstructionOriginal(instr); } | 10086 EVALUATE(CLFXTR) { |
| 10087 UNIMPLEMENTED(); |
| 10088 USE(instr); |
| 10089 return 0; |
| 10090 } |
8655 | 10091 |
8656 EVALUATE(CDFTR) { return DecodeInstructionOriginal(instr); } | 10092 EVALUATE(CDFTR) { |
| 10093 UNIMPLEMENTED(); |
| 10094 USE(instr); |
| 10095 return 0; |
| 10096 } |
8657 | 10097 |
8658 EVALUATE(CDLGTR) { return DecodeInstructionOriginal(instr); } | 10098 EVALUATE(CDLGTR) { |
| 10099 UNIMPLEMENTED(); |
| 10100 USE(instr); |
| 10101 return 0; |
| 10102 } |
8659 | 10103 |
8660 EVALUATE(CDLFTR) { return DecodeInstructionOriginal(instr); } | 10104 EVALUATE(CDLFTR) { |
| 10105 UNIMPLEMENTED(); |
| 10106 USE(instr); |
| 10107 return 0; |
| 10108 } |
8661 | 10109 |
8662 EVALUATE(CXFTR) { return DecodeInstructionOriginal(instr); } | 10110 EVALUATE(CXFTR) { |
| 10111 UNIMPLEMENTED(); |
| 10112 USE(instr); |
| 10113 return 0; |
| 10114 } |
8663 | 10115 |
8664 EVALUATE(CXLGTR) { return DecodeInstructionOriginal(instr); } | 10116 EVALUATE(CXLGTR) { |
| 10117 UNIMPLEMENTED(); |
| 10118 USE(instr); |
| 10119 return 0; |
| 10120 } |
8665 | 10121 |
8666 EVALUATE(CXLFTR) { return DecodeInstructionOriginal(instr); } | 10122 EVALUATE(CXLFTR) { |
| 10123 UNIMPLEMENTED(); |
| 10124 USE(instr); |
| 10125 return 0; |
| 10126 } |
8667 | 10127 |
8668 EVALUATE(CGRT) { return DecodeInstructionOriginal(instr); } | 10128 EVALUATE(CGRT) { |
| 10129 UNIMPLEMENTED(); |
| 10130 USE(instr); |
| 10131 return 0; |
| 10132 } |
8669 | 10133 |
8670 EVALUATE(NGR) { | 10134 EVALUATE(NGR) { |
8671 DCHECK_OPCODE(NGR); | 10135 DCHECK_OPCODE(NGR); |
8672 DECODE_RRE_INSTRUCTION(r1, r2); | 10136 DECODE_RRE_INSTRUCTION(r1, r2); |
8673 int64_t r1_val = get_register(r1); | 10137 int64_t r1_val = get_register(r1); |
8674 int64_t r2_val = get_register(r2); | 10138 int64_t r2_val = get_register(r2); |
8675 r1_val &= r2_val; | 10139 r1_val &= r2_val; |
8676 SetS390BitWiseConditionCode<uint64_t>(r1_val); | 10140 SetS390BitWiseConditionCode<uint64_t>(r1_val); |
8677 set_register(r1, r1_val); | 10141 set_register(r1, r1_val); |
8678 return length; | 10142 return length; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8715 } | 10179 } |
8716 | 10180 |
8717 r2_val = get_register(r2); | 10181 r2_val = get_register(r2); |
8718 | 10182 |
8719 int64_t mask = ~(1 << (63 - i)); | 10183 int64_t mask = ~(1 << (63 - i)); |
8720 set_register(r1, i); | 10184 set_register(r1, i); |
8721 set_register(r1 + 1, r2_val & mask); | 10185 set_register(r1 + 1, r2_val & mask); |
8722 return length; | 10186 return length; |
8723 } | 10187 } |
8724 | 10188 |
8725 EVALUATE(LLGCR) { return DecodeInstructionOriginal(instr); } | 10189 EVALUATE(LLGCR) { |
| 10190 UNIMPLEMENTED(); |
| 10191 USE(instr); |
| 10192 return 0; |
| 10193 } |
8726 | 10194 |
8727 EVALUATE(LLGHR) { return DecodeInstructionOriginal(instr); } | 10195 EVALUATE(LLGHR) { |
| 10196 UNIMPLEMENTED(); |
| 10197 USE(instr); |
| 10198 return 0; |
| 10199 } |
8728 | 10200 |
8729 EVALUATE(MLGR) { return DecodeInstructionOriginal(instr); } | 10201 EVALUATE(MLGR) { |
| 10202 UNIMPLEMENTED(); |
| 10203 USE(instr); |
| 10204 return 0; |
| 10205 } |
8730 | 10206 |
8731 EVALUATE(DLGR) { | 10207 EVALUATE(DLGR) { |
8732 DCHECK_OPCODE(DLGR); | 10208 DCHECK_OPCODE(DLGR); |
8733 #ifdef V8_TARGET_ARCH_S390X | 10209 #ifdef V8_TARGET_ARCH_S390X |
8734 DECODE_RRE_INSTRUCTION(r1, r2); | 10210 DECODE_RRE_INSTRUCTION(r1, r2); |
8735 uint64_t r1_val = get_register(r1); | 10211 uint64_t r1_val = get_register(r1); |
8736 uint64_t r2_val = get_register(r2); | 10212 uint64_t r2_val = get_register(r2); |
8737 DCHECK(r1 % 2 == 0); | 10213 DCHECK(r1 % 2 == 0); |
8738 unsigned __int128 dividend = static_cast<unsigned __int128>(r1_val) << 64; | 10214 unsigned __int128 dividend = static_cast<unsigned __int128>(r1_val) << 64; |
8739 dividend += get_register(r1 + 1); | 10215 dividend += get_register(r1 + 1); |
8740 uint64_t remainder = dividend % r2_val; | 10216 uint64_t remainder = dividend % r2_val; |
8741 uint64_t quotient = dividend / r2_val; | 10217 uint64_t quotient = dividend / r2_val; |
8742 r1_val = remainder; | 10218 r1_val = remainder; |
8743 set_register(r1, remainder); | 10219 set_register(r1, remainder); |
8744 set_register(r1 + 1, quotient); | 10220 set_register(r1 + 1, quotient); |
8745 return length; | 10221 return length; |
8746 #else | 10222 #else |
8747 UNREACHABLE(); | 10223 UNREACHABLE(); |
8748 #endif | 10224 #endif |
8749 } | 10225 } |
8750 | 10226 |
8751 EVALUATE(ALCGR) { return DecodeInstructionOriginal(instr); } | 10227 EVALUATE(ALCGR) { |
| 10228 UNIMPLEMENTED(); |
| 10229 USE(instr); |
| 10230 return 0; |
| 10231 } |
8752 | 10232 |
8753 EVALUATE(SLBGR) { return DecodeInstructionOriginal(instr); } | 10233 EVALUATE(SLBGR) { |
| 10234 UNIMPLEMENTED(); |
| 10235 USE(instr); |
| 10236 return 0; |
| 10237 } |
8754 | 10238 |
8755 EVALUATE(EPSW) { return DecodeInstructionOriginal(instr); } | 10239 EVALUATE(EPSW) { |
| 10240 UNIMPLEMENTED(); |
| 10241 USE(instr); |
| 10242 return 0; |
| 10243 } |
8756 | 10244 |
8757 EVALUATE(TRTT) { return DecodeInstructionOriginal(instr); } | 10245 EVALUATE(TRTT) { |
| 10246 UNIMPLEMENTED(); |
| 10247 USE(instr); |
| 10248 return 0; |
| 10249 } |
8758 | 10250 |
8759 EVALUATE(TRTO) { return DecodeInstructionOriginal(instr); } | 10251 EVALUATE(TRTO) { |
| 10252 UNIMPLEMENTED(); |
| 10253 USE(instr); |
| 10254 return 0; |
| 10255 } |
8760 | 10256 |
8761 EVALUATE(TROT) { return DecodeInstructionOriginal(instr); } | 10257 EVALUATE(TROT) { |
| 10258 UNIMPLEMENTED(); |
| 10259 USE(instr); |
| 10260 return 0; |
| 10261 } |
8762 | 10262 |
8763 EVALUATE(TROO) { return DecodeInstructionOriginal(instr); } | 10263 EVALUATE(TROO) { |
| 10264 UNIMPLEMENTED(); |
| 10265 USE(instr); |
| 10266 return 0; |
| 10267 } |
8764 | 10268 |
8765 EVALUATE(LLCR) { return DecodeInstructionOriginal(instr); } | 10269 EVALUATE(LLCR) { |
| 10270 UNIMPLEMENTED(); |
| 10271 USE(instr); |
| 10272 return 0; |
| 10273 } |
8766 | 10274 |
8767 EVALUATE(LLHR) { return DecodeInstructionOriginal(instr); } | 10275 EVALUATE(LLHR) { |
| 10276 UNIMPLEMENTED(); |
| 10277 USE(instr); |
| 10278 return 0; |
| 10279 } |
8768 | 10280 |
8769 EVALUATE(MLR) { | 10281 EVALUATE(MLR) { |
8770 DCHECK_OPCODE(MLR); | 10282 DCHECK_OPCODE(MLR); |
8771 DECODE_RRE_INSTRUCTION(r1, r2); | 10283 DECODE_RRE_INSTRUCTION(r1, r2); |
8772 DCHECK(r1 % 2 == 0); | 10284 DCHECK(r1 % 2 == 0); |
8773 | 10285 |
8774 uint32_t r1_val = get_low_register<uint32_t>(r1 + 1); | 10286 uint32_t r1_val = get_low_register<uint32_t>(r1 + 1); |
8775 uint32_t r2_val = get_low_register<uint32_t>(r2); | 10287 uint32_t r2_val = get_low_register<uint32_t>(r2); |
8776 uint64_t product = | 10288 uint64_t product = |
8777 static_cast<uint64_t>(r1_val) * static_cast<uint64_t>(r2_val); | 10289 static_cast<uint64_t>(r1_val) * static_cast<uint64_t>(r2_val); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8833 alu_out = alu_out - 1; | 10345 alu_out = alu_out - 1; |
8834 isOF = isOF_original || CheckOverflowForUIntSub(alu_out, 1); | 10346 isOF = isOF_original || CheckOverflowForUIntSub(alu_out, 1); |
8835 } else { | 10347 } else { |
8836 isOF = isOF_original; | 10348 isOF = isOF_original; |
8837 } | 10349 } |
8838 set_low_register(r1, alu_out); | 10350 set_low_register(r1, alu_out); |
8839 SetS390ConditionCodeCarry<uint32_t>(alu_out, isOF); | 10351 SetS390ConditionCodeCarry<uint32_t>(alu_out, isOF); |
8840 return length; | 10352 return length; |
8841 } | 10353 } |
8842 | 10354 |
8843 EVALUATE(CU14) { return DecodeInstructionOriginal(instr); } | 10355 EVALUATE(CU14) { |
| 10356 UNIMPLEMENTED(); |
| 10357 USE(instr); |
| 10358 return 0; |
| 10359 } |
8844 | 10360 |
8845 EVALUATE(CU24) { return DecodeInstructionOriginal(instr); } | 10361 EVALUATE(CU24) { |
| 10362 UNIMPLEMENTED(); |
| 10363 USE(instr); |
| 10364 return 0; |
| 10365 } |
8846 | 10366 |
8847 EVALUATE(CU41) { return DecodeInstructionOriginal(instr); } | 10367 EVALUATE(CU41) { |
| 10368 UNIMPLEMENTED(); |
| 10369 USE(instr); |
| 10370 return 0; |
| 10371 } |
8848 | 10372 |
8849 EVALUATE(CU42) { return DecodeInstructionOriginal(instr); } | 10373 EVALUATE(CU42) { |
| 10374 UNIMPLEMENTED(); |
| 10375 USE(instr); |
| 10376 return 0; |
| 10377 } |
8850 | 10378 |
8851 EVALUATE(TRTRE) { return DecodeInstructionOriginal(instr); } | 10379 EVALUATE(TRTRE) { |
| 10380 UNIMPLEMENTED(); |
| 10381 USE(instr); |
| 10382 return 0; |
| 10383 } |
8852 | 10384 |
8853 EVALUATE(SRSTU) { return DecodeInstructionOriginal(instr); } | 10385 EVALUATE(SRSTU) { |
| 10386 UNIMPLEMENTED(); |
| 10387 USE(instr); |
| 10388 return 0; |
| 10389 } |
8854 | 10390 |
8855 EVALUATE(TRTE) { return DecodeInstructionOriginal(instr); } | 10391 EVALUATE(TRTE) { |
| 10392 UNIMPLEMENTED(); |
| 10393 USE(instr); |
| 10394 return 0; |
| 10395 } |
8856 | 10396 |
8857 EVALUATE(AHHHR) { return DecodeInstructionOriginal(instr); } | 10397 EVALUATE(AHHHR) { |
| 10398 UNIMPLEMENTED(); |
| 10399 USE(instr); |
| 10400 return 0; |
| 10401 } |
8858 | 10402 |
8859 EVALUATE(SHHHR) { return DecodeInstructionOriginal(instr); } | 10403 EVALUATE(SHHHR) { |
| 10404 UNIMPLEMENTED(); |
| 10405 USE(instr); |
| 10406 return 0; |
| 10407 } |
8860 | 10408 |
8861 EVALUATE(ALHHHR) { return DecodeInstructionOriginal(instr); } | 10409 EVALUATE(ALHHHR) { |
| 10410 UNIMPLEMENTED(); |
| 10411 USE(instr); |
| 10412 return 0; |
| 10413 } |
8862 | 10414 |
8863 EVALUATE(SLHHHR) { return DecodeInstructionOriginal(instr); } | 10415 EVALUATE(SLHHHR) { |
| 10416 UNIMPLEMENTED(); |
| 10417 USE(instr); |
| 10418 return 0; |
| 10419 } |
8864 | 10420 |
8865 EVALUATE(CHHR) { return DecodeInstructionOriginal(instr); } | 10421 EVALUATE(CHHR) { |
| 10422 UNIMPLEMENTED(); |
| 10423 USE(instr); |
| 10424 return 0; |
| 10425 } |
8866 | 10426 |
8867 EVALUATE(AHHLR) { return DecodeInstructionOriginal(instr); } | 10427 EVALUATE(AHHLR) { |
| 10428 UNIMPLEMENTED(); |
| 10429 USE(instr); |
| 10430 return 0; |
| 10431 } |
8868 | 10432 |
8869 EVALUATE(SHHLR) { return DecodeInstructionOriginal(instr); } | 10433 EVALUATE(SHHLR) { |
| 10434 UNIMPLEMENTED(); |
| 10435 USE(instr); |
| 10436 return 0; |
| 10437 } |
8870 | 10438 |
8871 EVALUATE(ALHHLR) { return DecodeInstructionOriginal(instr); } | 10439 EVALUATE(ALHHLR) { |
| 10440 UNIMPLEMENTED(); |
| 10441 USE(instr); |
| 10442 return 0; |
| 10443 } |
8872 | 10444 |
8873 EVALUATE(SLHHLR) { return DecodeInstructionOriginal(instr); } | 10445 EVALUATE(SLHHLR) { |
| 10446 UNIMPLEMENTED(); |
| 10447 USE(instr); |
| 10448 return 0; |
| 10449 } |
8874 | 10450 |
8875 EVALUATE(CHLR) { return DecodeInstructionOriginal(instr); } | 10451 EVALUATE(CHLR) { |
| 10452 UNIMPLEMENTED(); |
| 10453 USE(instr); |
| 10454 return 0; |
| 10455 } |
8876 | 10456 |
8877 EVALUATE(POPCNT_Z) { return DecodeInstructionOriginal(instr); } | 10457 EVALUATE(POPCNT_Z) { |
| 10458 DCHECK_OPCODE(POPCNT_Z); |
| 10459 DECODE_RRE_INSTRUCTION(r1, r2); |
| 10460 int64_t r2_val = get_register(r2); |
| 10461 int64_t r1_val = 0; |
8878 | 10462 |
8879 EVALUATE(LOCGR) { return DecodeInstructionOriginal(instr); } | 10463 uint8_t* r2_val_ptr = reinterpret_cast<uint8_t*>(&r2_val); |
| 10464 uint8_t* r1_val_ptr = reinterpret_cast<uint8_t*>(&r1_val); |
| 10465 for (int i = 0; i < 8; i++) { |
| 10466 uint32_t x = static_cast<uint32_t>(r2_val_ptr[i]); |
| 10467 #if defined(__GNUC__) |
| 10468 r1_val_ptr[i] = __builtin_popcount(x); |
| 10469 #else |
| 10470 #error unsupport __builtin_popcount |
| 10471 #endif |
| 10472 } |
| 10473 set_register(r1, static_cast<uint64_t>(r1_val)); |
| 10474 return length; |
| 10475 } |
| 10476 |
| 10477 EVALUATE(LOCGR) { |
| 10478 UNIMPLEMENTED(); |
| 10479 USE(instr); |
| 10480 return 0; |
| 10481 } |
8880 | 10482 |
8881 EVALUATE(NGRK) { | 10483 EVALUATE(NGRK) { |
8882 DCHECK_OPCODE(NGRK); | 10484 DCHECK_OPCODE(NGRK); |
8883 DECODE_RRF_A_INSTRUCTION(r1, r2, r3); | 10485 DECODE_RRF_A_INSTRUCTION(r1, r2, r3); |
8884 // 64-bit Non-clobbering arithmetics / bitwise ops. | 10486 // 64-bit Non-clobbering arithmetics / bitwise ops. |
8885 int64_t r2_val = get_register(r2); | 10487 int64_t r2_val = get_register(r2); |
8886 int64_t r3_val = get_register(r3); | 10488 int64_t r3_val = get_register(r3); |
8887 uint64_t bitwise_result = 0; | 10489 uint64_t bitwise_result = 0; |
8888 bitwise_result = r2_val & r3_val; | 10490 bitwise_result = r2_val & r3_val; |
8889 SetS390BitWiseConditionCode<uint64_t>(bitwise_result); | 10491 SetS390BitWiseConditionCode<uint64_t>(bitwise_result); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8962 // 64-bit Non-clobbering unsigned arithmetics | 10564 // 64-bit Non-clobbering unsigned arithmetics |
8963 uint64_t r2_val = get_register(r2); | 10565 uint64_t r2_val = get_register(r2); |
8964 uint64_t r3_val = get_register(r3); | 10566 uint64_t r3_val = get_register(r3); |
8965 bool isOF = CheckOverflowForUIntSub(r2_val, r3_val); | 10567 bool isOF = CheckOverflowForUIntSub(r2_val, r3_val); |
8966 SetS390ConditionCode<uint64_t>(r2_val - r3_val, 0); | 10568 SetS390ConditionCode<uint64_t>(r2_val - r3_val, 0); |
8967 SetS390OverflowCode(isOF); | 10569 SetS390OverflowCode(isOF); |
8968 set_register(r1, r2_val - r3_val); | 10570 set_register(r1, r2_val - r3_val); |
8969 return length; | 10571 return length; |
8970 } | 10572 } |
8971 | 10573 |
8972 EVALUATE(LOCR) { return DecodeInstructionOriginal(instr); } | 10574 EVALUATE(LOCR) { |
| 10575 UNIMPLEMENTED(); |
| 10576 USE(instr); |
| 10577 return 0; |
| 10578 } |
8973 | 10579 |
8974 EVALUATE(NRK) { | 10580 EVALUATE(NRK) { |
8975 DCHECK_OPCODE(NRK); | 10581 DCHECK_OPCODE(NRK); |
8976 DECODE_RRF_A_INSTRUCTION(r1, r2, r3); | 10582 DECODE_RRF_A_INSTRUCTION(r1, r2, r3); |
8977 // 32-bit Non-clobbering arithmetics / bitwise ops | 10583 // 32-bit Non-clobbering arithmetics / bitwise ops |
8978 int32_t r2_val = get_low_register<int32_t>(r2); | 10584 int32_t r2_val = get_low_register<int32_t>(r2); |
8979 int32_t r3_val = get_low_register<int32_t>(r3); | 10585 int32_t r3_val = get_low_register<int32_t>(r3); |
8980 // Assume bitwise operation here | 10586 // Assume bitwise operation here |
8981 uint32_t bitwise_result = 0; | 10587 uint32_t bitwise_result = 0; |
8982 bitwise_result = r2_val & r3_val; | 10588 bitwise_result = r2_val & r3_val; |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9070 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 10676 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9071 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 10677 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9072 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 10678 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9073 intptr_t addr = x2_val + b2_val + d2; | 10679 intptr_t addr = x2_val + b2_val + d2; |
9074 int64_t value = ReadDW(addr); | 10680 int64_t value = ReadDW(addr); |
9075 set_register(r1, value); | 10681 set_register(r1, value); |
9076 SetS390ConditionCode<int64_t>(value, 0); | 10682 SetS390ConditionCode<int64_t>(value, 0); |
9077 return length; | 10683 return length; |
9078 } | 10684 } |
9079 | 10685 |
9080 EVALUATE(CVBY) { return DecodeInstructionOriginal(instr); } | 10686 EVALUATE(CVBY) { |
| 10687 UNIMPLEMENTED(); |
| 10688 USE(instr); |
| 10689 return 0; |
| 10690 } |
9081 | 10691 |
9082 EVALUATE(AG) { | 10692 EVALUATE(AG) { |
9083 DCHECK_OPCODE(AG); | 10693 DCHECK_OPCODE(AG); |
9084 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 10694 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9085 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 10695 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9086 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 10696 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9087 int64_t alu_out = get_register(r1); | 10697 int64_t alu_out = get_register(r1); |
9088 int64_t mem_val = ReadDW(b2_val + x2_val + d2); | 10698 int64_t mem_val = ReadDW(b2_val + x2_val + d2); |
9089 alu_out += mem_val; | 10699 alu_out += mem_val; |
9090 SetS390ConditionCode<int32_t>(alu_out, 0); | 10700 SetS390ConditionCode<int32_t>(alu_out, 0); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9146 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 10756 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9147 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 10757 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9148 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 10758 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9149 intptr_t d2_val = d2; | 10759 intptr_t d2_val = d2; |
9150 int64_t mem_val = ReadDW(b2_val + d2_val + x2_val); | 10760 int64_t mem_val = ReadDW(b2_val + d2_val + x2_val); |
9151 int64_t r1_val = get_register(r1); | 10761 int64_t r1_val = get_register(r1); |
9152 set_register(r1, mem_val * r1_val); | 10762 set_register(r1, mem_val * r1_val); |
9153 return length; | 10763 return length; |
9154 } | 10764 } |
9155 | 10765 |
9156 EVALUATE(DSG) { return DecodeInstructionOriginal(instr); } | 10766 EVALUATE(DSG) { |
| 10767 UNIMPLEMENTED(); |
| 10768 USE(instr); |
| 10769 return 0; |
| 10770 } |
9157 | 10771 |
9158 EVALUATE(CVBG) { return DecodeInstructionOriginal(instr); } | 10772 EVALUATE(CVBG) { |
| 10773 UNIMPLEMENTED(); |
| 10774 USE(instr); |
| 10775 return 0; |
| 10776 } |
9159 | 10777 |
9160 EVALUATE(LRVG) { return DecodeInstructionOriginal(instr); } | 10778 EVALUATE(LRVG) { |
| 10779 UNIMPLEMENTED(); |
| 10780 USE(instr); |
| 10781 return 0; |
| 10782 } |
9161 | 10783 |
9162 EVALUATE(LT) { | 10784 EVALUATE(LT) { |
9163 DCHECK_OPCODE(LT); | 10785 DCHECK_OPCODE(LT); |
9164 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 10786 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9165 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 10787 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9166 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 10788 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9167 intptr_t addr = x2_val + b2_val + d2; | 10789 intptr_t addr = x2_val + b2_val + d2; |
9168 int32_t value = ReadW(addr, instr); | 10790 int32_t value = ReadW(addr, instr); |
9169 set_low_register(r1, value); | 10791 set_low_register(r1, value); |
9170 SetS390ConditionCode<int32_t>(value, 0); | 10792 SetS390ConditionCode<int32_t>(value, 0); |
(...skipping 17 matching lines...) Expand all Loading... |
9188 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 10810 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9189 // Miscellaneous Loads and Stores | 10811 // Miscellaneous Loads and Stores |
9190 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 10812 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9191 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 10813 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9192 intptr_t addr = x2_val + b2_val + d2; | 10814 intptr_t addr = x2_val + b2_val + d2; |
9193 uint64_t mem_val = static_cast<uint64_t>(ReadWU(addr, instr)); | 10815 uint64_t mem_val = static_cast<uint64_t>(ReadWU(addr, instr)); |
9194 set_register(r1, mem_val); | 10816 set_register(r1, mem_val); |
9195 return length; | 10817 return length; |
9196 } | 10818 } |
9197 | 10819 |
9198 EVALUATE(LLGT) { return DecodeInstructionOriginal(instr); } | 10820 EVALUATE(LLGT) { |
| 10821 UNIMPLEMENTED(); |
| 10822 USE(instr); |
| 10823 return 0; |
| 10824 } |
9199 | 10825 |
9200 EVALUATE(AGF) { | 10826 EVALUATE(AGF) { |
9201 DCHECK_OPCODE(AGF); | 10827 DCHECK_OPCODE(AGF); |
9202 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 10828 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9203 uint64_t r1_val = get_register(r1); | 10829 uint64_t r1_val = get_register(r1); |
9204 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 10830 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9205 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 10831 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9206 intptr_t d2_val = d2; | 10832 intptr_t d2_val = d2; |
9207 uint64_t alu_out = r1_val; | 10833 uint64_t alu_out = r1_val; |
9208 uint32_t mem_val = ReadW(b2_val + d2_val + x2_val, instr); | 10834 uint32_t mem_val = ReadW(b2_val + d2_val + x2_val, instr); |
(...skipping 11 matching lines...) Expand all Loading... |
9220 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 10846 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9221 intptr_t d2_val = d2; | 10847 intptr_t d2_val = d2; |
9222 uint64_t alu_out = r1_val; | 10848 uint64_t alu_out = r1_val; |
9223 uint32_t mem_val = ReadW(b2_val + d2_val + x2_val, instr); | 10849 uint32_t mem_val = ReadW(b2_val + d2_val + x2_val, instr); |
9224 alu_out -= mem_val; | 10850 alu_out -= mem_val; |
9225 SetS390ConditionCode<int64_t>(alu_out, 0); | 10851 SetS390ConditionCode<int64_t>(alu_out, 0); |
9226 set_register(r1, alu_out); | 10852 set_register(r1, alu_out); |
9227 return length; | 10853 return length; |
9228 } | 10854 } |
9229 | 10855 |
9230 EVALUATE(ALGF) { return DecodeInstructionOriginal(instr); } | 10856 EVALUATE(ALGF) { |
| 10857 UNIMPLEMENTED(); |
| 10858 USE(instr); |
| 10859 return 0; |
| 10860 } |
9231 | 10861 |
9232 EVALUATE(SLGF) { return DecodeInstructionOriginal(instr); } | 10862 EVALUATE(SLGF) { |
| 10863 UNIMPLEMENTED(); |
| 10864 USE(instr); |
| 10865 return 0; |
| 10866 } |
9233 | 10867 |
9234 EVALUATE(MSGF) { return DecodeInstructionOriginal(instr); } | 10868 EVALUATE(MSGF) { |
| 10869 UNIMPLEMENTED(); |
| 10870 USE(instr); |
| 10871 return 0; |
| 10872 } |
9235 | 10873 |
9236 EVALUATE(DSGF) { return DecodeInstructionOriginal(instr); } | 10874 EVALUATE(DSGF) { |
| 10875 UNIMPLEMENTED(); |
| 10876 USE(instr); |
| 10877 return 0; |
| 10878 } |
9237 | 10879 |
9238 EVALUATE(LRV) { | 10880 EVALUATE(LRV) { |
9239 DCHECK_OPCODE(LRV); | 10881 DCHECK_OPCODE(LRV); |
9240 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 10882 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9241 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 10883 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9242 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 10884 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9243 intptr_t mem_addr = b2_val + x2_val + d2; | 10885 intptr_t mem_addr = b2_val + x2_val + d2; |
9244 int32_t mem_val = ReadW(mem_addr, instr); | 10886 int32_t mem_val = ReadW(mem_addr, instr); |
9245 set_low_register(r1, ByteReverse(mem_val)); | 10887 set_low_register(r1, ByteReverse(mem_val)); |
9246 return length; | 10888 return length; |
(...skipping 30 matching lines...) Expand all Loading... |
9277 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 10919 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9278 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 10920 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9279 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 10921 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9280 int64_t alu_out = get_register(r1); | 10922 int64_t alu_out = get_register(r1); |
9281 int64_t mem_val = ReadDW(b2_val + x2_val + d2); | 10923 int64_t mem_val = ReadDW(b2_val + x2_val + d2); |
9282 SetS390ConditionCode<uint64_t>(alu_out, mem_val); | 10924 SetS390ConditionCode<uint64_t>(alu_out, mem_val); |
9283 set_register(r1, alu_out); | 10925 set_register(r1, alu_out); |
9284 return length; | 10926 return length; |
9285 } | 10927 } |
9286 | 10928 |
9287 EVALUATE(NTSTG) { return DecodeInstructionOriginal(instr); } | 10929 EVALUATE(NTSTG) { |
| 10930 UNIMPLEMENTED(); |
| 10931 USE(instr); |
| 10932 return 0; |
| 10933 } |
9288 | 10934 |
9289 EVALUATE(CVDY) { return DecodeInstructionOriginal(instr); } | 10935 EVALUATE(CVDY) { |
| 10936 UNIMPLEMENTED(); |
| 10937 USE(instr); |
| 10938 return 0; |
| 10939 } |
9290 | 10940 |
9291 EVALUATE(CVDG) { return DecodeInstructionOriginal(instr); } | 10941 EVALUATE(CVDG) { |
| 10942 UNIMPLEMENTED(); |
| 10943 USE(instr); |
| 10944 return 0; |
| 10945 } |
9292 | 10946 |
9293 EVALUATE(STRVG) { return DecodeInstructionOriginal(instr); } | 10947 EVALUATE(STRVG) { |
| 10948 UNIMPLEMENTED(); |
| 10949 USE(instr); |
| 10950 return 0; |
| 10951 } |
9294 | 10952 |
9295 EVALUATE(CGF) { return DecodeInstructionOriginal(instr); } | 10953 EVALUATE(CGF) { |
| 10954 UNIMPLEMENTED(); |
| 10955 USE(instr); |
| 10956 return 0; |
| 10957 } |
9296 | 10958 |
9297 EVALUATE(CLGF) { return DecodeInstructionOriginal(instr); } | 10959 EVALUATE(CLGF) { |
| 10960 UNIMPLEMENTED(); |
| 10961 USE(instr); |
| 10962 return 0; |
| 10963 } |
9298 | 10964 |
9299 EVALUATE(LTGF) { return DecodeInstructionOriginal(instr); } | 10965 EVALUATE(LTGF) { |
| 10966 UNIMPLEMENTED(); |
| 10967 USE(instr); |
| 10968 return 0; |
| 10969 } |
9300 | 10970 |
9301 EVALUATE(CGH) { return DecodeInstructionOriginal(instr); } | 10971 EVALUATE(CGH) { |
| 10972 UNIMPLEMENTED(); |
| 10973 USE(instr); |
| 10974 return 0; |
| 10975 } |
9302 | 10976 |
9303 EVALUATE(PFD) { return DecodeInstructionOriginal(instr); } | 10977 EVALUATE(PFD) { |
| 10978 UNIMPLEMENTED(); |
| 10979 USE(instr); |
| 10980 return 0; |
| 10981 } |
9304 | 10982 |
9305 EVALUATE(STRV) { | 10983 EVALUATE(STRV) { |
9306 DCHECK_OPCODE(STRV); | 10984 DCHECK_OPCODE(STRV); |
9307 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 10985 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9308 int32_t r1_val = get_low_register<int32_t>(r1); | 10986 int32_t r1_val = get_low_register<int32_t>(r1); |
9309 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 10987 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9310 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 10988 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9311 intptr_t mem_addr = b2_val + x2_val + d2; | 10989 intptr_t mem_addr = b2_val + x2_val + d2; |
9312 WriteW(mem_addr, ByteReverse(r1_val), instr); | 10990 WriteW(mem_addr, ByteReverse(r1_val), instr); |
9313 return length; | 10991 return length; |
9314 } | 10992 } |
9315 | 10993 |
9316 EVALUATE(STRVH) { | 10994 EVALUATE(STRVH) { |
9317 DCHECK_OPCODE(STRVH); | 10995 DCHECK_OPCODE(STRVH); |
9318 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 10996 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9319 int32_t r1_val = get_low_register<int32_t>(r1); | 10997 int32_t r1_val = get_low_register<int32_t>(r1); |
9320 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 10998 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9321 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 10999 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9322 intptr_t mem_addr = b2_val + x2_val + d2; | 11000 intptr_t mem_addr = b2_val + x2_val + d2; |
9323 int16_t result = static_cast<int16_t>(r1_val >> 16); | 11001 int16_t result = static_cast<int16_t>(r1_val >> 16); |
9324 WriteH(mem_addr, ByteReverse(result), instr); | 11002 WriteH(mem_addr, ByteReverse(result), instr); |
9325 return length; | 11003 return length; |
9326 } | 11004 } |
9327 | 11005 |
9328 EVALUATE(BCTG) { return DecodeInstructionOriginal(instr); } | 11006 EVALUATE(BCTG) { |
| 11007 UNIMPLEMENTED(); |
| 11008 USE(instr); |
| 11009 return 0; |
| 11010 } |
9329 | 11011 |
9330 EVALUATE(MSY) { | 11012 EVALUATE(MSY) { |
9331 DCHECK_OPCODE(MSY); | 11013 DCHECK_OPCODE(MSY); |
9332 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 11014 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9333 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 11015 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9334 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 11016 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9335 intptr_t d2_val = d2; | 11017 intptr_t d2_val = d2; |
9336 int32_t mem_val = ReadW(b2_val + d2_val + x2_val, instr); | 11018 int32_t mem_val = ReadW(b2_val + d2_val + x2_val, instr); |
9337 int32_t r1_val = get_low_register<int32_t>(r1); | 11019 int32_t r1_val = get_low_register<int32_t>(r1); |
9338 set_low_register(r1, mem_val * r1_val); | 11020 set_low_register(r1, mem_val * r1_val); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9425 int32_t mem_val = ReadW(b2_val + x2_val + d2, instr); | 11107 int32_t mem_val = ReadW(b2_val + x2_val + d2, instr); |
9426 bool isOF = false; | 11108 bool isOF = false; |
9427 isOF = CheckOverflowForIntSub(alu_out, mem_val, int32_t); | 11109 isOF = CheckOverflowForIntSub(alu_out, mem_val, int32_t); |
9428 alu_out -= mem_val; | 11110 alu_out -= mem_val; |
9429 SetS390ConditionCode<int32_t>(alu_out, 0); | 11111 SetS390ConditionCode<int32_t>(alu_out, 0); |
9430 SetS390OverflowCode(isOF); | 11112 SetS390OverflowCode(isOF); |
9431 set_low_register(r1, alu_out); | 11113 set_low_register(r1, alu_out); |
9432 return length; | 11114 return length; |
9433 } | 11115 } |
9434 | 11116 |
9435 EVALUATE(MFY) { return DecodeInstructionOriginal(instr); } | 11117 EVALUATE(MFY) { |
| 11118 UNIMPLEMENTED(); |
| 11119 USE(instr); |
| 11120 return 0; |
| 11121 } |
9436 | 11122 |
9437 EVALUATE(ALY) { | 11123 EVALUATE(ALY) { |
9438 DCHECK_OPCODE(ALY); | 11124 DCHECK_OPCODE(ALY); |
9439 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 11125 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9440 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 11126 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9441 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 11127 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9442 uint32_t alu_out = get_low_register<uint32_t>(r1); | 11128 uint32_t alu_out = get_low_register<uint32_t>(r1); |
9443 uint32_t mem_val = ReadWU(b2_val + x2_val + d2, instr); | 11129 uint32_t mem_val = ReadWU(b2_val + x2_val + d2, instr); |
9444 alu_out += mem_val; | 11130 alu_out += mem_val; |
9445 set_low_register(r1, alu_out); | 11131 set_low_register(r1, alu_out); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9490 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 11176 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9491 // Miscellaneous Loads and Stores | 11177 // Miscellaneous Loads and Stores |
9492 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 11178 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9493 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 11179 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9494 intptr_t addr = x2_val + b2_val + d2; | 11180 intptr_t addr = x2_val + b2_val + d2; |
9495 uint8_t value = get_low_register<uint32_t>(r1); | 11181 uint8_t value = get_low_register<uint32_t>(r1); |
9496 WriteB(addr, value); | 11182 WriteB(addr, value); |
9497 return length; | 11183 return length; |
9498 } | 11184 } |
9499 | 11185 |
9500 EVALUATE(ICY) { return DecodeInstructionOriginal(instr); } | 11186 EVALUATE(ICY) { |
| 11187 UNIMPLEMENTED(); |
| 11188 USE(instr); |
| 11189 return 0; |
| 11190 } |
9501 | 11191 |
9502 EVALUATE(LAEY) { return DecodeInstructionOriginal(instr); } | 11192 EVALUATE(LAEY) { |
| 11193 UNIMPLEMENTED(); |
| 11194 USE(instr); |
| 11195 return 0; |
| 11196 } |
9503 | 11197 |
9504 EVALUATE(LB) { | 11198 EVALUATE(LB) { |
9505 DCHECK_OPCODE(LB); | 11199 DCHECK_OPCODE(LB); |
9506 // Miscellaneous Loads and Stores | 11200 // Miscellaneous Loads and Stores |
9507 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 11201 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9508 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 11202 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9509 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 11203 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9510 intptr_t addr = x2_val + b2_val + d2; | 11204 intptr_t addr = x2_val + b2_val + d2; |
9511 int32_t mem_val = ReadB(addr); | 11205 int32_t mem_val = ReadB(addr); |
9512 set_low_register(r1, mem_val); | 11206 set_low_register(r1, mem_val); |
(...skipping 17 matching lines...) Expand all Loading... |
9530 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 11224 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9531 // Miscellaneous Loads and Stores | 11225 // Miscellaneous Loads and Stores |
9532 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 11226 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9533 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 11227 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9534 intptr_t addr = x2_val + b2_val + d2; | 11228 intptr_t addr = x2_val + b2_val + d2; |
9535 int32_t result = static_cast<int32_t>(ReadH(addr, instr)); | 11229 int32_t result = static_cast<int32_t>(ReadH(addr, instr)); |
9536 set_low_register(r1, result); | 11230 set_low_register(r1, result); |
9537 return length; | 11231 return length; |
9538 } | 11232 } |
9539 | 11233 |
9540 EVALUATE(CHY) { return DecodeInstructionOriginal(instr); } | 11234 EVALUATE(CHY) { |
| 11235 UNIMPLEMENTED(); |
| 11236 USE(instr); |
| 11237 return 0; |
| 11238 } |
9541 | 11239 |
9542 EVALUATE(AHY) { | 11240 EVALUATE(AHY) { |
9543 DCHECK_OPCODE(AHY); | 11241 DCHECK_OPCODE(AHY); |
9544 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 11242 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9545 int32_t r1_val = get_low_register<int32_t>(r1); | 11243 int32_t r1_val = get_low_register<int32_t>(r1); |
9546 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 11244 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9547 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 11245 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9548 intptr_t d2_val = d2; | 11246 intptr_t d2_val = d2; |
9549 int32_t mem_val = | 11247 int32_t mem_val = |
9550 static_cast<int32_t>(ReadH(b2_val + d2_val + x2_val, instr)); | 11248 static_cast<int32_t>(ReadH(b2_val + d2_val + x2_val, instr)); |
(...skipping 19 matching lines...) Expand all Loading... |
9570 int32_t alu_out = 0; | 11268 int32_t alu_out = 0; |
9571 bool isOF = false; | 11269 bool isOF = false; |
9572 alu_out = r1_val - mem_val; | 11270 alu_out = r1_val - mem_val; |
9573 isOF = CheckOverflowForIntSub(r1_val, mem_val, int64_t); | 11271 isOF = CheckOverflowForIntSub(r1_val, mem_val, int64_t); |
9574 set_low_register(r1, alu_out); | 11272 set_low_register(r1, alu_out); |
9575 SetS390ConditionCode<int32_t>(alu_out, 0); | 11273 SetS390ConditionCode<int32_t>(alu_out, 0); |
9576 SetS390OverflowCode(isOF); | 11274 SetS390OverflowCode(isOF); |
9577 return length; | 11275 return length; |
9578 } | 11276 } |
9579 | 11277 |
9580 EVALUATE(MHY) { return DecodeInstructionOriginal(instr); } | 11278 EVALUATE(MHY) { |
| 11279 UNIMPLEMENTED(); |
| 11280 USE(instr); |
| 11281 return 0; |
| 11282 } |
9581 | 11283 |
9582 EVALUATE(NG) { | 11284 EVALUATE(NG) { |
9583 DCHECK_OPCODE(NG); | 11285 DCHECK_OPCODE(NG); |
9584 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 11286 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9585 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 11287 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9586 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 11288 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9587 int64_t alu_out = get_register(r1); | 11289 int64_t alu_out = get_register(r1); |
9588 int64_t mem_val = ReadDW(b2_val + x2_val + d2); | 11290 int64_t mem_val = ReadDW(b2_val + x2_val + d2); |
9589 alu_out &= mem_val; | 11291 alu_out &= mem_val; |
9590 SetS390BitWiseConditionCode<uint32_t>(alu_out); | 11292 SetS390BitWiseConditionCode<uint32_t>(alu_out); |
(...skipping 20 matching lines...) Expand all Loading... |
9611 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 11313 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9612 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 11314 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9613 int64_t alu_out = get_register(r1); | 11315 int64_t alu_out = get_register(r1); |
9614 int64_t mem_val = ReadDW(b2_val + x2_val + d2); | 11316 int64_t mem_val = ReadDW(b2_val + x2_val + d2); |
9615 alu_out ^= mem_val; | 11317 alu_out ^= mem_val; |
9616 SetS390BitWiseConditionCode<uint32_t>(alu_out); | 11318 SetS390BitWiseConditionCode<uint32_t>(alu_out); |
9617 set_register(r1, alu_out); | 11319 set_register(r1, alu_out); |
9618 return length; | 11320 return length; |
9619 } | 11321 } |
9620 | 11322 |
9621 EVALUATE(LGAT) { return DecodeInstructionOriginal(instr); } | 11323 EVALUATE(LGAT) { |
| 11324 UNIMPLEMENTED(); |
| 11325 USE(instr); |
| 11326 return 0; |
| 11327 } |
9622 | 11328 |
9623 EVALUATE(MLG) { return DecodeInstructionOriginal(instr); } | 11329 EVALUATE(MLG) { |
| 11330 UNIMPLEMENTED(); |
| 11331 USE(instr); |
| 11332 return 0; |
| 11333 } |
9624 | 11334 |
9625 EVALUATE(DLG) { return DecodeInstructionOriginal(instr); } | 11335 EVALUATE(DLG) { |
| 11336 UNIMPLEMENTED(); |
| 11337 USE(instr); |
| 11338 return 0; |
| 11339 } |
9626 | 11340 |
9627 EVALUATE(ALCG) { return DecodeInstructionOriginal(instr); } | 11341 EVALUATE(ALCG) { |
| 11342 UNIMPLEMENTED(); |
| 11343 USE(instr); |
| 11344 return 0; |
| 11345 } |
9628 | 11346 |
9629 EVALUATE(SLBG) { return DecodeInstructionOriginal(instr); } | 11347 EVALUATE(SLBG) { |
| 11348 UNIMPLEMENTED(); |
| 11349 USE(instr); |
| 11350 return 0; |
| 11351 } |
9630 | 11352 |
9631 EVALUATE(STPQ) { return DecodeInstructionOriginal(instr); } | 11353 EVALUATE(STPQ) { |
| 11354 UNIMPLEMENTED(); |
| 11355 USE(instr); |
| 11356 return 0; |
| 11357 } |
9632 | 11358 |
9633 EVALUATE(LPQ) { return DecodeInstructionOriginal(instr); } | 11359 EVALUATE(LPQ) { |
| 11360 UNIMPLEMENTED(); |
| 11361 USE(instr); |
| 11362 return 0; |
| 11363 } |
9634 | 11364 |
9635 EVALUATE(LLGH) { | 11365 EVALUATE(LLGH) { |
9636 DCHECK_OPCODE(LLGH); | 11366 DCHECK_OPCODE(LLGH); |
9637 // Load Logical Halfword | 11367 // Load Logical Halfword |
9638 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 11368 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9639 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 11369 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9640 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 11370 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9641 intptr_t d2_val = d2; | 11371 intptr_t d2_val = d2; |
9642 uint16_t mem_val = ReadHU(b2_val + d2_val + x2_val, instr); | 11372 uint16_t mem_val = ReadHU(b2_val + d2_val + x2_val, instr); |
9643 set_register(r1, mem_val); | 11373 set_register(r1, mem_val); |
9644 return length; | 11374 return length; |
9645 } | 11375 } |
9646 | 11376 |
9647 EVALUATE(LLH) { | 11377 EVALUATE(LLH) { |
9648 DCHECK_OPCODE(LLH); | 11378 DCHECK_OPCODE(LLH); |
9649 // Load Logical Halfword | 11379 // Load Logical Halfword |
9650 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 11380 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9651 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 11381 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9652 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 11382 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9653 intptr_t d2_val = d2; | 11383 intptr_t d2_val = d2; |
9654 uint16_t mem_val = ReadHU(b2_val + d2_val + x2_val, instr); | 11384 uint16_t mem_val = ReadHU(b2_val + d2_val + x2_val, instr); |
9655 set_low_register(r1, mem_val); | 11385 set_low_register(r1, mem_val); |
9656 return length; | 11386 return length; |
9657 } | 11387 } |
9658 | 11388 |
9659 EVALUATE(ML) { return DecodeInstructionOriginal(instr); } | 11389 EVALUATE(ML) { |
| 11390 UNIMPLEMENTED(); |
| 11391 USE(instr); |
| 11392 return 0; |
| 11393 } |
9660 | 11394 |
9661 EVALUATE(DL) { return DecodeInstructionOriginal(instr); } | 11395 EVALUATE(DL) { |
| 11396 UNIMPLEMENTED(); |
| 11397 USE(instr); |
| 11398 return 0; |
| 11399 } |
9662 | 11400 |
9663 EVALUATE(ALC) { return DecodeInstructionOriginal(instr); } | 11401 EVALUATE(ALC) { |
| 11402 UNIMPLEMENTED(); |
| 11403 USE(instr); |
| 11404 return 0; |
| 11405 } |
9664 | 11406 |
9665 EVALUATE(SLB) { return DecodeInstructionOriginal(instr); } | 11407 EVALUATE(SLB) { |
| 11408 UNIMPLEMENTED(); |
| 11409 USE(instr); |
| 11410 return 0; |
| 11411 } |
9666 | 11412 |
9667 EVALUATE(LLGTAT) { return DecodeInstructionOriginal(instr); } | 11413 EVALUATE(LLGTAT) { |
| 11414 UNIMPLEMENTED(); |
| 11415 USE(instr); |
| 11416 return 0; |
| 11417 } |
9668 | 11418 |
9669 EVALUATE(LLGFAT) { return DecodeInstructionOriginal(instr); } | 11419 EVALUATE(LLGFAT) { |
| 11420 UNIMPLEMENTED(); |
| 11421 USE(instr); |
| 11422 return 0; |
| 11423 } |
9670 | 11424 |
9671 EVALUATE(LAT) { return DecodeInstructionOriginal(instr); } | 11425 EVALUATE(LAT) { |
| 11426 UNIMPLEMENTED(); |
| 11427 USE(instr); |
| 11428 return 0; |
| 11429 } |
9672 | 11430 |
9673 EVALUATE(LBH) { return DecodeInstructionOriginal(instr); } | 11431 EVALUATE(LBH) { |
| 11432 UNIMPLEMENTED(); |
| 11433 USE(instr); |
| 11434 return 0; |
| 11435 } |
9674 | 11436 |
9675 EVALUATE(LLCH) { return DecodeInstructionOriginal(instr); } | 11437 EVALUATE(LLCH) { |
| 11438 UNIMPLEMENTED(); |
| 11439 USE(instr); |
| 11440 return 0; |
| 11441 } |
9676 | 11442 |
9677 EVALUATE(STCH) { return DecodeInstructionOriginal(instr); } | 11443 EVALUATE(STCH) { |
| 11444 UNIMPLEMENTED(); |
| 11445 USE(instr); |
| 11446 return 0; |
| 11447 } |
9678 | 11448 |
9679 EVALUATE(LHH) { return DecodeInstructionOriginal(instr); } | 11449 EVALUATE(LHH) { |
| 11450 UNIMPLEMENTED(); |
| 11451 USE(instr); |
| 11452 return 0; |
| 11453 } |
9680 | 11454 |
9681 EVALUATE(LLHH) { return DecodeInstructionOriginal(instr); } | 11455 EVALUATE(LLHH) { |
| 11456 UNIMPLEMENTED(); |
| 11457 USE(instr); |
| 11458 return 0; |
| 11459 } |
9682 | 11460 |
9683 EVALUATE(STHH) { return DecodeInstructionOriginal(instr); } | 11461 EVALUATE(STHH) { |
| 11462 UNIMPLEMENTED(); |
| 11463 USE(instr); |
| 11464 return 0; |
| 11465 } |
9684 | 11466 |
9685 EVALUATE(LFHAT) { return DecodeInstructionOriginal(instr); } | 11467 EVALUATE(LFHAT) { |
| 11468 UNIMPLEMENTED(); |
| 11469 USE(instr); |
| 11470 return 0; |
| 11471 } |
9686 | 11472 |
9687 EVALUATE(LFH) { return DecodeInstructionOriginal(instr); } | 11473 EVALUATE(LFH) { |
| 11474 UNIMPLEMENTED(); |
| 11475 USE(instr); |
| 11476 return 0; |
| 11477 } |
9688 | 11478 |
9689 EVALUATE(STFH) { return DecodeInstructionOriginal(instr); } | 11479 EVALUATE(STFH) { |
| 11480 UNIMPLEMENTED(); |
| 11481 USE(instr); |
| 11482 return 0; |
| 11483 } |
9690 | 11484 |
9691 EVALUATE(CHF) { return DecodeInstructionOriginal(instr); } | 11485 EVALUATE(CHF) { |
| 11486 UNIMPLEMENTED(); |
| 11487 USE(instr); |
| 11488 return 0; |
| 11489 } |
9692 | 11490 |
9693 EVALUATE(MVCDK) { return DecodeInstructionOriginal(instr); } | 11491 EVALUATE(MVCDK) { |
| 11492 UNIMPLEMENTED(); |
| 11493 USE(instr); |
| 11494 return 0; |
| 11495 } |
9694 | 11496 |
9695 EVALUATE(MVHHI) { return DecodeInstructionOriginal(instr); } | 11497 EVALUATE(MVHHI) { |
| 11498 UNIMPLEMENTED(); |
| 11499 USE(instr); |
| 11500 return 0; |
| 11501 } |
9696 | 11502 |
9697 EVALUATE(MVGHI) { | 11503 EVALUATE(MVGHI) { |
9698 DCHECK_OPCODE(MVGHI); | 11504 DCHECK_OPCODE(MVGHI); |
9699 // Move Integer (64) | 11505 // Move Integer (64) |
9700 DECODE_SIL_INSTRUCTION(b1, d1, i2); | 11506 DECODE_SIL_INSTRUCTION(b1, d1, i2); |
9701 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1); | 11507 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1); |
9702 intptr_t src_addr = b1_val + d1; | 11508 intptr_t src_addr = b1_val + d1; |
9703 WriteDW(src_addr, i2); | 11509 WriteDW(src_addr, i2); |
9704 return length; | 11510 return length; |
9705 } | 11511 } |
9706 | 11512 |
9707 EVALUATE(MVHI) { | 11513 EVALUATE(MVHI) { |
9708 DCHECK_OPCODE(MVHI); | 11514 DCHECK_OPCODE(MVHI); |
9709 // Move Integer (32) | 11515 // Move Integer (32) |
9710 DECODE_SIL_INSTRUCTION(b1, d1, i2); | 11516 DECODE_SIL_INSTRUCTION(b1, d1, i2); |
9711 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1); | 11517 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1); |
9712 intptr_t src_addr = b1_val + d1; | 11518 intptr_t src_addr = b1_val + d1; |
9713 WriteW(src_addr, i2, instr); | 11519 WriteW(src_addr, i2, instr); |
9714 return length; | 11520 return length; |
9715 } | 11521 } |
9716 | 11522 |
9717 EVALUATE(CHHSI) { return DecodeInstructionOriginal(instr); } | 11523 EVALUATE(CHHSI) { |
| 11524 UNIMPLEMENTED(); |
| 11525 USE(instr); |
| 11526 return 0; |
| 11527 } |
9718 | 11528 |
9719 EVALUATE(CGHSI) { return DecodeInstructionOriginal(instr); } | 11529 EVALUATE(CGHSI) { |
| 11530 UNIMPLEMENTED(); |
| 11531 USE(instr); |
| 11532 return 0; |
| 11533 } |
9720 | 11534 |
9721 EVALUATE(CHSI) { return DecodeInstructionOriginal(instr); } | 11535 EVALUATE(CHSI) { |
| 11536 UNIMPLEMENTED(); |
| 11537 USE(instr); |
| 11538 return 0; |
| 11539 } |
9722 | 11540 |
9723 EVALUATE(CLFHSI) { return DecodeInstructionOriginal(instr); } | 11541 EVALUATE(CLFHSI) { |
| 11542 UNIMPLEMENTED(); |
| 11543 USE(instr); |
| 11544 return 0; |
| 11545 } |
9724 | 11546 |
9725 EVALUATE(TBEGIN) { return DecodeInstructionOriginal(instr); } | 11547 EVALUATE(TBEGIN) { |
| 11548 UNIMPLEMENTED(); |
| 11549 USE(instr); |
| 11550 return 0; |
| 11551 } |
9726 | 11552 |
9727 EVALUATE(TBEGINC) { return DecodeInstructionOriginal(instr); } | 11553 EVALUATE(TBEGINC) { |
| 11554 UNIMPLEMENTED(); |
| 11555 USE(instr); |
| 11556 return 0; |
| 11557 } |
9728 | 11558 |
9729 EVALUATE(LMG) { | 11559 EVALUATE(LMG) { |
9730 DCHECK_OPCODE(LMG); | 11560 DCHECK_OPCODE(LMG); |
9731 // Store Multiple 64-bits. | 11561 // Store Multiple 64-bits. |
9732 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); | 11562 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); |
9733 int rb = b2; | 11563 int rb = b2; |
9734 int offset = d2; | 11564 int offset = d2; |
9735 | 11565 |
9736 // Regs roll around if r3 is less than r1. | 11566 // Regs roll around if r3 is less than r1. |
9737 // Artifically increase r3 by 16 so we can calculate | 11567 // Artifically increase r3 by 16 so we can calculate |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9814 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 11644 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9815 int shiftBits = (b2_val + d2) & 0x3F; | 11645 int shiftBits = (b2_val + d2) & 0x3F; |
9816 // unsigned | 11646 // unsigned |
9817 uint64_t r3_val = get_register(r3); | 11647 uint64_t r3_val = get_register(r3); |
9818 uint64_t alu_out = 0; | 11648 uint64_t alu_out = 0; |
9819 alu_out = r3_val << shiftBits; | 11649 alu_out = r3_val << shiftBits; |
9820 set_register(r1, alu_out); | 11650 set_register(r1, alu_out); |
9821 return length; | 11651 return length; |
9822 } | 11652 } |
9823 | 11653 |
9824 EVALUATE(CSY) { return DecodeInstructionOriginal(instr); } | 11654 EVALUATE(CSY) { |
| 11655 UNIMPLEMENTED(); |
| 11656 USE(instr); |
| 11657 return 0; |
| 11658 } |
9825 | 11659 |
9826 EVALUATE(RLLG) { | 11660 EVALUATE(RLLG) { |
9827 DCHECK_OPCODE(RLLG); | 11661 DCHECK_OPCODE(RLLG); |
9828 // For SLLG/SRLG, the 64-bit third operand is shifted the number | 11662 // For SLLG/SRLG, the 64-bit third operand is shifted the number |
9829 // of bits specified by the second-operand address, and the result is | 11663 // of bits specified by the second-operand address, and the result is |
9830 // placed at the first-operand location. Except for when the R1 and R3 | 11664 // placed at the first-operand location. Except for when the R1 and R3 |
9831 // fields designate the same register, the third operand remains | 11665 // fields designate the same register, the third operand remains |
9832 // unchanged in general register R3. | 11666 // unchanged in general register R3. |
9833 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); | 11667 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); |
9834 // only takes rightmost 6 bits | 11668 // only takes rightmost 6 bits |
(...skipping 22 matching lines...) Expand all Loading... |
9857 int64_t rb_val = (rb == 0) ? 0 : get_register(rb); | 11691 int64_t rb_val = (rb == 0) ? 0 : get_register(rb); |
9858 | 11692 |
9859 // Store each register in ascending order. | 11693 // Store each register in ascending order. |
9860 for (int i = 0; i <= r3 - r1; i++) { | 11694 for (int i = 0; i <= r3 - r1; i++) { |
9861 int64_t value = get_register((r1 + i) % 16); | 11695 int64_t value = get_register((r1 + i) % 16); |
9862 WriteDW(rb_val + offset + 8 * i, value); | 11696 WriteDW(rb_val + offset + 8 * i, value); |
9863 } | 11697 } |
9864 return length; | 11698 return length; |
9865 } | 11699 } |
9866 | 11700 |
9867 EVALUATE(STMH) { return DecodeInstructionOriginal(instr); } | 11701 EVALUATE(STMH) { |
| 11702 UNIMPLEMENTED(); |
| 11703 USE(instr); |
| 11704 return 0; |
| 11705 } |
9868 | 11706 |
9869 EVALUATE(STCMH) { return DecodeInstructionOriginal(instr); } | 11707 EVALUATE(STCMH) { |
| 11708 UNIMPLEMENTED(); |
| 11709 USE(instr); |
| 11710 return 0; |
| 11711 } |
9870 | 11712 |
9871 EVALUATE(STCMY) { return DecodeInstructionOriginal(instr); } | 11713 EVALUATE(STCMY) { |
| 11714 UNIMPLEMENTED(); |
| 11715 USE(instr); |
| 11716 return 0; |
| 11717 } |
9872 | 11718 |
9873 EVALUATE(CDSY) { return DecodeInstructionOriginal(instr); } | 11719 EVALUATE(CDSY) { |
| 11720 UNIMPLEMENTED(); |
| 11721 USE(instr); |
| 11722 return 0; |
| 11723 } |
9874 | 11724 |
9875 EVALUATE(CDSG) { return DecodeInstructionOriginal(instr); } | 11725 EVALUATE(CDSG) { |
| 11726 UNIMPLEMENTED(); |
| 11727 USE(instr); |
| 11728 return 0; |
| 11729 } |
9876 | 11730 |
9877 EVALUATE(BXHG) { return DecodeInstructionOriginal(instr); } | 11731 EVALUATE(BXHG) { |
| 11732 UNIMPLEMENTED(); |
| 11733 USE(instr); |
| 11734 return 0; |
| 11735 } |
9878 | 11736 |
9879 EVALUATE(BXLEG) { return DecodeInstructionOriginal(instr); } | 11737 EVALUATE(BXLEG) { |
| 11738 UNIMPLEMENTED(); |
| 11739 USE(instr); |
| 11740 return 0; |
| 11741 } |
9880 | 11742 |
9881 EVALUATE(ECAG) { return DecodeInstructionOriginal(instr); } | 11743 EVALUATE(ECAG) { |
| 11744 UNIMPLEMENTED(); |
| 11745 USE(instr); |
| 11746 return 0; |
| 11747 } |
9882 | 11748 |
9883 EVALUATE(TMY) { | 11749 EVALUATE(TMY) { |
9884 DCHECK_OPCODE(TMY); | 11750 DCHECK_OPCODE(TMY); |
9885 // Test Under Mask (Mem - Imm) (8) | 11751 // Test Under Mask (Mem - Imm) (8) |
9886 DECODE_SIY_INSTRUCTION(b1, d1, i2); | 11752 DECODE_SIY_INSTRUCTION(b1, d1, i2); |
9887 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1); | 11753 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1); |
9888 intptr_t d1_val = d1; | 11754 intptr_t d1_val = d1; |
9889 intptr_t addr = b1_val + d1_val; | 11755 intptr_t addr = b1_val + d1_val; |
9890 uint8_t mem_val = ReadB(addr); | 11756 uint8_t mem_val = ReadB(addr); |
9891 uint8_t imm_val = i2; | 11757 uint8_t imm_val = i2; |
9892 uint8_t selected_bits = mem_val & imm_val; | 11758 uint8_t selected_bits = mem_val & imm_val; |
9893 // CC0: Selected bits are zero | 11759 // CC0: Selected bits are zero |
9894 // CC1: Selected bits mixed zeros and ones | 11760 // CC1: Selected bits mixed zeros and ones |
9895 // CC3: Selected bits all ones | 11761 // CC3: Selected bits all ones |
9896 if (0 == selected_bits) { | 11762 if (0 == selected_bits) { |
9897 condition_reg_ = CC_EQ; // CC0 | 11763 condition_reg_ = CC_EQ; // CC0 |
9898 } else if (selected_bits == imm_val) { | 11764 } else if (selected_bits == imm_val) { |
9899 condition_reg_ = 0x1; // CC3 | 11765 condition_reg_ = 0x1; // CC3 |
9900 } else { | 11766 } else { |
9901 condition_reg_ = 0x4; // CC1 | 11767 condition_reg_ = 0x4; // CC1 |
9902 } | 11768 } |
9903 return length; | 11769 return length; |
9904 } | 11770 } |
9905 | 11771 |
9906 EVALUATE(MVIY) { return DecodeInstructionOriginal(instr); } | 11772 EVALUATE(MVIY) { |
| 11773 UNIMPLEMENTED(); |
| 11774 USE(instr); |
| 11775 return 0; |
| 11776 } |
9907 | 11777 |
9908 EVALUATE(NIY) { return DecodeInstructionOriginal(instr); } | 11778 EVALUATE(NIY) { |
| 11779 UNIMPLEMENTED(); |
| 11780 USE(instr); |
| 11781 return 0; |
| 11782 } |
9909 | 11783 |
9910 EVALUATE(CLIY) { | 11784 EVALUATE(CLIY) { |
9911 DCHECK_OPCODE(CLIY); | 11785 DCHECK_OPCODE(CLIY); |
9912 DECODE_SIY_INSTRUCTION(b1, d1, i2); | 11786 DECODE_SIY_INSTRUCTION(b1, d1, i2); |
9913 // Compare Immediate (Mem - Imm) (8) | 11787 // Compare Immediate (Mem - Imm) (8) |
9914 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1); | 11788 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1); |
9915 intptr_t d1_val = d1; | 11789 intptr_t d1_val = d1; |
9916 intptr_t addr = b1_val + d1_val; | 11790 intptr_t addr = b1_val + d1_val; |
9917 uint8_t mem_val = ReadB(addr); | 11791 uint8_t mem_val = ReadB(addr); |
9918 uint8_t imm_val = i2; | 11792 uint8_t imm_val = i2; |
9919 SetS390ConditionCode<uint8_t>(mem_val, imm_val); | 11793 SetS390ConditionCode<uint8_t>(mem_val, imm_val); |
9920 return length; | 11794 return length; |
9921 } | 11795 } |
9922 | 11796 |
9923 EVALUATE(OIY) { return DecodeInstructionOriginal(instr); } | 11797 EVALUATE(OIY) { |
| 11798 UNIMPLEMENTED(); |
| 11799 USE(instr); |
| 11800 return 0; |
| 11801 } |
9924 | 11802 |
9925 EVALUATE(XIY) { return DecodeInstructionOriginal(instr); } | 11803 EVALUATE(XIY) { |
| 11804 UNIMPLEMENTED(); |
| 11805 USE(instr); |
| 11806 return 0; |
| 11807 } |
9926 | 11808 |
9927 EVALUATE(ASI) { | 11809 EVALUATE(ASI) { |
9928 DCHECK_OPCODE(ASI); | 11810 DCHECK_OPCODE(ASI); |
9929 // TODO(bcleung): Change all fooInstr->I2Value() to template functions. | 11811 // TODO(bcleung): Change all fooInstr->I2Value() to template functions. |
9930 // The below static cast to 8 bit and then to 32 bit is necessary | 11812 // The below static cast to 8 bit and then to 32 bit is necessary |
9931 // because siyInstr->I2Value() returns a uint8_t, which a direct | 11813 // because siyInstr->I2Value() returns a uint8_t, which a direct |
9932 // cast to int32_t could incorrectly interpret. | 11814 // cast to int32_t could incorrectly interpret. |
9933 DECODE_SIY_INSTRUCTION(b1, d1, i2_unsigned); | 11815 DECODE_SIY_INSTRUCTION(b1, d1, i2_unsigned); |
9934 int8_t i2_8bit = static_cast<int8_t>(i2_unsigned); | 11816 int8_t i2_8bit = static_cast<int8_t>(i2_unsigned); |
9935 int32_t i2 = static_cast<int32_t>(i2_8bit); | 11817 int32_t i2 = static_cast<int32_t>(i2_8bit); |
9936 intptr_t b1_val = (b1 == 0) ? 0 : get_register(b1); | 11818 intptr_t b1_val = (b1 == 0) ? 0 : get_register(b1); |
9937 | 11819 |
9938 int d1_val = d1; | 11820 int d1_val = d1; |
9939 intptr_t addr = b1_val + d1_val; | 11821 intptr_t addr = b1_val + d1_val; |
9940 | 11822 |
9941 int32_t mem_val = ReadW(addr, instr); | 11823 int32_t mem_val = ReadW(addr, instr); |
9942 bool isOF = CheckOverflowForIntAdd(mem_val, i2, int32_t); | 11824 bool isOF = CheckOverflowForIntAdd(mem_val, i2, int32_t); |
9943 int32_t alu_out = mem_val + i2; | 11825 int32_t alu_out = mem_val + i2; |
9944 SetS390ConditionCode<int32_t>(alu_out, 0); | 11826 SetS390ConditionCode<int32_t>(alu_out, 0); |
9945 SetS390OverflowCode(isOF); | 11827 SetS390OverflowCode(isOF); |
9946 WriteW(addr, alu_out, instr); | 11828 WriteW(addr, alu_out, instr); |
9947 return length; | 11829 return length; |
9948 } | 11830 } |
9949 | 11831 |
9950 EVALUATE(ALSI) { return DecodeInstructionOriginal(instr); } | 11832 EVALUATE(ALSI) { |
| 11833 UNIMPLEMENTED(); |
| 11834 USE(instr); |
| 11835 return 0; |
| 11836 } |
9951 | 11837 |
9952 EVALUATE(AGSI) { | 11838 EVALUATE(AGSI) { |
9953 DCHECK_OPCODE(AGSI); | 11839 DCHECK_OPCODE(AGSI); |
9954 // TODO(bcleung): Change all fooInstr->I2Value() to template functions. | 11840 // TODO(bcleung): Change all fooInstr->I2Value() to template functions. |
9955 // The below static cast to 8 bit and then to 32 bit is necessary | 11841 // The below static cast to 8 bit and then to 32 bit is necessary |
9956 // because siyInstr->I2Value() returns a uint8_t, which a direct | 11842 // because siyInstr->I2Value() returns a uint8_t, which a direct |
9957 // cast to int32_t could incorrectly interpret. | 11843 // cast to int32_t could incorrectly interpret. |
9958 DECODE_SIY_INSTRUCTION(b1, d1, i2_unsigned); | 11844 DECODE_SIY_INSTRUCTION(b1, d1, i2_unsigned); |
9959 int8_t i2_8bit = static_cast<int8_t>(i2_unsigned); | 11845 int8_t i2_8bit = static_cast<int8_t>(i2_unsigned); |
9960 int64_t i2 = static_cast<int64_t>(i2_8bit); | 11846 int64_t i2 = static_cast<int64_t>(i2_8bit); |
9961 intptr_t b1_val = (b1 == 0) ? 0 : get_register(b1); | 11847 intptr_t b1_val = (b1 == 0) ? 0 : get_register(b1); |
9962 | 11848 |
9963 int d1_val = d1; | 11849 int d1_val = d1; |
9964 intptr_t addr = b1_val + d1_val; | 11850 intptr_t addr = b1_val + d1_val; |
9965 | 11851 |
9966 int64_t mem_val = ReadDW(addr); | 11852 int64_t mem_val = ReadDW(addr); |
9967 int isOF = CheckOverflowForIntAdd(mem_val, i2, int64_t); | 11853 int isOF = CheckOverflowForIntAdd(mem_val, i2, int64_t); |
9968 int64_t alu_out = mem_val + i2; | 11854 int64_t alu_out = mem_val + i2; |
9969 SetS390ConditionCode<uint64_t>(alu_out, 0); | 11855 SetS390ConditionCode<uint64_t>(alu_out, 0); |
9970 SetS390OverflowCode(isOF); | 11856 SetS390OverflowCode(isOF); |
9971 WriteDW(addr, alu_out); | 11857 WriteDW(addr, alu_out); |
9972 return length; | 11858 return length; |
9973 } | 11859 } |
9974 | 11860 |
9975 EVALUATE(ALGSI) { return DecodeInstructionOriginal(instr); } | 11861 EVALUATE(ALGSI) { |
| 11862 UNIMPLEMENTED(); |
| 11863 USE(instr); |
| 11864 return 0; |
| 11865 } |
9976 | 11866 |
9977 EVALUATE(ICMH) { return DecodeInstructionOriginal(instr); } | 11867 EVALUATE(ICMH) { |
| 11868 UNIMPLEMENTED(); |
| 11869 USE(instr); |
| 11870 return 0; |
| 11871 } |
9978 | 11872 |
9979 EVALUATE(ICMY) { return DecodeInstructionOriginal(instr); } | 11873 EVALUATE(ICMY) { |
| 11874 UNIMPLEMENTED(); |
| 11875 USE(instr); |
| 11876 return 0; |
| 11877 } |
9980 | 11878 |
9981 EVALUATE(MVCLU) { return DecodeInstructionOriginal(instr); } | 11879 EVALUATE(MVCLU) { |
| 11880 UNIMPLEMENTED(); |
| 11881 USE(instr); |
| 11882 return 0; |
| 11883 } |
9982 | 11884 |
9983 EVALUATE(CLCLU) { return DecodeInstructionOriginal(instr); } | 11885 EVALUATE(CLCLU) { |
| 11886 UNIMPLEMENTED(); |
| 11887 USE(instr); |
| 11888 return 0; |
| 11889 } |
9984 | 11890 |
9985 EVALUATE(STMY) { | 11891 EVALUATE(STMY) { |
9986 DCHECK_OPCODE(STMY); | 11892 DCHECK_OPCODE(STMY); |
9987 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); | 11893 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); |
9988 // Load/Store Multiple (32) | 11894 // Load/Store Multiple (32) |
9989 int offset = d2; | 11895 int offset = d2; |
9990 | 11896 |
9991 // Regs roll around if r3 is less than r1. | 11897 // Regs roll around if r3 is less than r1. |
9992 // Artifically increase r3 by 16 so we can calculate | 11898 // Artifically increase r3 by 16 so we can calculate |
9993 // the number of regs stored properly. | 11899 // the number of regs stored properly. |
9994 if (r3 < r1) r3 += 16; | 11900 if (r3 < r1) r3 += 16; |
9995 | 11901 |
9996 int32_t b2_val = (b2 == 0) ? 0 : get_low_register<int32_t>(b2); | 11902 int32_t b2_val = (b2 == 0) ? 0 : get_low_register<int32_t>(b2); |
9997 | 11903 |
9998 // Store each register in ascending order. | 11904 // Store each register in ascending order. |
9999 for (int i = 0; i <= r3 - r1; i++) { | 11905 for (int i = 0; i <= r3 - r1; i++) { |
10000 int32_t value = get_low_register<int32_t>((r1 + i) % 16); | 11906 int32_t value = get_low_register<int32_t>((r1 + i) % 16); |
10001 WriteW(b2_val + offset + 4 * i, value, instr); | 11907 WriteW(b2_val + offset + 4 * i, value, instr); |
10002 } | 11908 } |
10003 return length; | 11909 return length; |
10004 } | 11910 } |
10005 | 11911 |
10006 EVALUATE(LMH) { return DecodeInstructionOriginal(instr); } | 11912 EVALUATE(LMH) { |
| 11913 UNIMPLEMENTED(); |
| 11914 USE(instr); |
| 11915 return 0; |
| 11916 } |
10007 | 11917 |
10008 EVALUATE(LMY) { | 11918 EVALUATE(LMY) { |
10009 DCHECK_OPCODE(LMY); | 11919 DCHECK_OPCODE(LMY); |
10010 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); | 11920 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); |
10011 // Load/Store Multiple (32) | 11921 // Load/Store Multiple (32) |
10012 int offset = d2; | 11922 int offset = d2; |
10013 | 11923 |
10014 // Regs roll around if r3 is less than r1. | 11924 // Regs roll around if r3 is less than r1. |
10015 // Artifically increase r3 by 16 so we can calculate | 11925 // Artifically increase r3 by 16 so we can calculate |
10016 // the number of regs stored properly. | 11926 // the number of regs stored properly. |
10017 if (r3 < r1) r3 += 16; | 11927 if (r3 < r1) r3 += 16; |
10018 | 11928 |
10019 int32_t b2_val = (b2 == 0) ? 0 : get_low_register<int32_t>(b2); | 11929 int32_t b2_val = (b2 == 0) ? 0 : get_low_register<int32_t>(b2); |
10020 | 11930 |
10021 // Store each register in ascending order. | 11931 // Store each register in ascending order. |
10022 for (int i = 0; i <= r3 - r1; i++) { | 11932 for (int i = 0; i <= r3 - r1; i++) { |
10023 int32_t value = ReadW(b2_val + offset + 4 * i, instr); | 11933 int32_t value = ReadW(b2_val + offset + 4 * i, instr); |
10024 set_low_register((r1 + i) % 16, value); | 11934 set_low_register((r1 + i) % 16, value); |
10025 } | 11935 } |
10026 return length; | 11936 return length; |
10027 } | 11937 } |
10028 | 11938 |
10029 EVALUATE(TP) { return DecodeInstructionOriginal(instr); } | 11939 EVALUATE(TP) { |
| 11940 UNIMPLEMENTED(); |
| 11941 USE(instr); |
| 11942 return 0; |
| 11943 } |
10030 | 11944 |
10031 EVALUATE(SRAK) { | 11945 EVALUATE(SRAK) { |
10032 DCHECK_OPCODE(SRAK); | 11946 DCHECK_OPCODE(SRAK); |
10033 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); | 11947 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); |
10034 // 32-bit non-clobbering shift-left/right arithmetic | 11948 // 32-bit non-clobbering shift-left/right arithmetic |
10035 // only takes rightmost 6 bits | 11949 // only takes rightmost 6 bits |
10036 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 11950 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
10037 int shiftBits = (b2_val + d2) & 0x3F; | 11951 int shiftBits = (b2_val + d2) & 0x3F; |
10038 int32_t r3_val = get_low_register<int32_t>(r3); | 11952 int32_t r3_val = get_low_register<int32_t>(r3); |
10039 int32_t alu_out = 0; | 11953 int32_t alu_out = 0; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10094 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 12008 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
10095 int shiftBits = (b2_val + d2) & 0x3F; | 12009 int shiftBits = (b2_val + d2) & 0x3F; |
10096 // unsigned | 12010 // unsigned |
10097 uint32_t r3_val = get_low_register<uint32_t>(r3); | 12011 uint32_t r3_val = get_low_register<uint32_t>(r3); |
10098 uint32_t alu_out = 0; | 12012 uint32_t alu_out = 0; |
10099 alu_out = r3_val << shiftBits; | 12013 alu_out = r3_val << shiftBits; |
10100 set_low_register(r1, alu_out); | 12014 set_low_register(r1, alu_out); |
10101 return length; | 12015 return length; |
10102 } | 12016 } |
10103 | 12017 |
10104 EVALUATE(LOCG) { return DecodeInstructionOriginal(instr); } | 12018 EVALUATE(LOCG) { |
10105 | 12019 UNIMPLEMENTED(); |
10106 EVALUATE(STOCG) { return DecodeInstructionOriginal(instr); } | 12020 USE(instr); |
10107 | 12021 return 0; |
10108 EVALUATE(LANG) { return DecodeInstructionOriginal(instr); } | 12022 } |
10109 | 12023 |
10110 EVALUATE(LAOG) { return DecodeInstructionOriginal(instr); } | 12024 EVALUATE(STOCG) { |
10111 | 12025 UNIMPLEMENTED(); |
10112 EVALUATE(LAXG) { return DecodeInstructionOriginal(instr); } | 12026 USE(instr); |
10113 | 12027 return 0; |
10114 EVALUATE(LAAG) { return DecodeInstructionOriginal(instr); } | 12028 } |
10115 | 12029 |
10116 EVALUATE(LAALG) { return DecodeInstructionOriginal(instr); } | 12030 EVALUATE(LANG) { |
10117 | 12031 UNIMPLEMENTED(); |
10118 EVALUATE(LOC) { return DecodeInstructionOriginal(instr); } | 12032 USE(instr); |
10119 | 12033 return 0; |
10120 EVALUATE(STOC) { return DecodeInstructionOriginal(instr); } | 12034 } |
10121 | 12035 |
10122 EVALUATE(LAN) { return DecodeInstructionOriginal(instr); } | 12036 EVALUATE(LAOG) { |
10123 | 12037 UNIMPLEMENTED(); |
10124 EVALUATE(LAO) { return DecodeInstructionOriginal(instr); } | 12038 USE(instr); |
10125 | 12039 return 0; |
10126 EVALUATE(LAX) { return DecodeInstructionOriginal(instr); } | 12040 } |
10127 | 12041 |
10128 EVALUATE(LAA) { return DecodeInstructionOriginal(instr); } | 12042 EVALUATE(LAXG) { |
10129 | 12043 UNIMPLEMENTED(); |
10130 EVALUATE(LAAL) { return DecodeInstructionOriginal(instr); } | 12044 USE(instr); |
10131 | 12045 return 0; |
10132 EVALUATE(BRXHG) { return DecodeInstructionOriginal(instr); } | 12046 } |
10133 | 12047 |
10134 EVALUATE(BRXLG) { return DecodeInstructionOriginal(instr); } | 12048 EVALUATE(LAAG) { |
10135 | 12049 UNIMPLEMENTED(); |
10136 EVALUATE(RISBLG) { return DecodeInstructionOriginal(instr); } | 12050 USE(instr); |
10137 | 12051 return 0; |
10138 EVALUATE(RNSBG) { return DecodeInstructionOriginal(instr); } | 12052 } |
10139 | 12053 |
10140 EVALUATE(ROSBG) { return DecodeInstructionOriginal(instr); } | 12054 EVALUATE(LAALG) { |
10141 | 12055 UNIMPLEMENTED(); |
10142 EVALUATE(RXSBG) { return DecodeInstructionOriginal(instr); } | 12056 USE(instr); |
10143 | 12057 return 0; |
10144 EVALUATE(RISBGN) { return DecodeInstructionOriginal(instr); } | 12058 } |
10145 | 12059 |
10146 EVALUATE(RISBHG) { return DecodeInstructionOriginal(instr); } | 12060 EVALUATE(LOC) { |
10147 | 12061 UNIMPLEMENTED(); |
10148 EVALUATE(CGRJ) { return DecodeInstructionOriginal(instr); } | 12062 USE(instr); |
10149 | 12063 return 0; |
10150 EVALUATE(CGIT) { return DecodeInstructionOriginal(instr); } | 12064 } |
10151 | 12065 |
10152 EVALUATE(CIT) { return DecodeInstructionOriginal(instr); } | 12066 EVALUATE(STOC) { |
10153 | 12067 UNIMPLEMENTED(); |
10154 EVALUATE(CLFIT) { return DecodeInstructionOriginal(instr); } | 12068 USE(instr); |
10155 | 12069 return 0; |
10156 EVALUATE(CGIJ) { return DecodeInstructionOriginal(instr); } | 12070 } |
10157 | 12071 |
10158 EVALUATE(CIJ) { return DecodeInstructionOriginal(instr); } | 12072 EVALUATE(LAN) { |
10159 | 12073 UNIMPLEMENTED(); |
10160 EVALUATE(ALHSIK) { return DecodeInstructionOriginal(instr); } | 12074 USE(instr); |
10161 | 12075 return 0; |
10162 EVALUATE(ALGHSIK) { return DecodeInstructionOriginal(instr); } | 12076 } |
10163 | 12077 |
10164 EVALUATE(CGRB) { return DecodeInstructionOriginal(instr); } | 12078 EVALUATE(LAO) { |
10165 | 12079 UNIMPLEMENTED(); |
10166 EVALUATE(CGIB) { return DecodeInstructionOriginal(instr); } | 12080 USE(instr); |
10167 | 12081 return 0; |
10168 EVALUATE(CIB) { return DecodeInstructionOriginal(instr); } | 12082 } |
| 12083 |
| 12084 EVALUATE(LAX) { |
| 12085 UNIMPLEMENTED(); |
| 12086 USE(instr); |
| 12087 return 0; |
| 12088 } |
| 12089 |
| 12090 EVALUATE(LAA) { |
| 12091 UNIMPLEMENTED(); |
| 12092 USE(instr); |
| 12093 return 0; |
| 12094 } |
| 12095 |
| 12096 EVALUATE(LAAL) { |
| 12097 UNIMPLEMENTED(); |
| 12098 USE(instr); |
| 12099 return 0; |
| 12100 } |
| 12101 |
| 12102 EVALUATE(BRXHG) { |
| 12103 UNIMPLEMENTED(); |
| 12104 USE(instr); |
| 12105 return 0; |
| 12106 } |
| 12107 |
| 12108 EVALUATE(BRXLG) { |
| 12109 UNIMPLEMENTED(); |
| 12110 USE(instr); |
| 12111 return 0; |
| 12112 } |
| 12113 |
| 12114 EVALUATE(RISBLG) { |
| 12115 UNIMPLEMENTED(); |
| 12116 USE(instr); |
| 12117 return 0; |
| 12118 } |
| 12119 |
| 12120 EVALUATE(RNSBG) { |
| 12121 UNIMPLEMENTED(); |
| 12122 USE(instr); |
| 12123 return 0; |
| 12124 } |
| 12125 |
| 12126 EVALUATE(ROSBG) { |
| 12127 UNIMPLEMENTED(); |
| 12128 USE(instr); |
| 12129 return 0; |
| 12130 } |
| 12131 |
| 12132 EVALUATE(RXSBG) { |
| 12133 UNIMPLEMENTED(); |
| 12134 USE(instr); |
| 12135 return 0; |
| 12136 } |
| 12137 |
| 12138 EVALUATE(RISBGN) { |
| 12139 UNIMPLEMENTED(); |
| 12140 USE(instr); |
| 12141 return 0; |
| 12142 } |
| 12143 |
| 12144 EVALUATE(RISBHG) { |
| 12145 UNIMPLEMENTED(); |
| 12146 USE(instr); |
| 12147 return 0; |
| 12148 } |
| 12149 |
| 12150 EVALUATE(CGRJ) { |
| 12151 UNIMPLEMENTED(); |
| 12152 USE(instr); |
| 12153 return 0; |
| 12154 } |
| 12155 |
| 12156 EVALUATE(CGIT) { |
| 12157 UNIMPLEMENTED(); |
| 12158 USE(instr); |
| 12159 return 0; |
| 12160 } |
| 12161 |
| 12162 EVALUATE(CIT) { |
| 12163 UNIMPLEMENTED(); |
| 12164 USE(instr); |
| 12165 return 0; |
| 12166 } |
| 12167 |
| 12168 EVALUATE(CLFIT) { |
| 12169 UNIMPLEMENTED(); |
| 12170 USE(instr); |
| 12171 return 0; |
| 12172 } |
| 12173 |
| 12174 EVALUATE(CGIJ) { |
| 12175 UNIMPLEMENTED(); |
| 12176 USE(instr); |
| 12177 return 0; |
| 12178 } |
| 12179 |
| 12180 EVALUATE(CIJ) { |
| 12181 UNIMPLEMENTED(); |
| 12182 USE(instr); |
| 12183 return 0; |
| 12184 } |
| 12185 |
| 12186 EVALUATE(ALHSIK) { |
| 12187 UNIMPLEMENTED(); |
| 12188 USE(instr); |
| 12189 return 0; |
| 12190 } |
| 12191 |
| 12192 EVALUATE(ALGHSIK) { |
| 12193 UNIMPLEMENTED(); |
| 12194 USE(instr); |
| 12195 return 0; |
| 12196 } |
| 12197 |
| 12198 EVALUATE(CGRB) { |
| 12199 UNIMPLEMENTED(); |
| 12200 USE(instr); |
| 12201 return 0; |
| 12202 } |
| 12203 |
| 12204 EVALUATE(CGIB) { |
| 12205 UNIMPLEMENTED(); |
| 12206 USE(instr); |
| 12207 return 0; |
| 12208 } |
| 12209 |
| 12210 EVALUATE(CIB) { |
| 12211 UNIMPLEMENTED(); |
| 12212 USE(instr); |
| 12213 return 0; |
| 12214 } |
10169 | 12215 |
10170 EVALUATE(LDEB) { | 12216 EVALUATE(LDEB) { |
10171 DCHECK_OPCODE(LDEB); | 12217 DCHECK_OPCODE(LDEB); |
10172 // Load Float | 12218 // Load Float |
10173 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2); | 12219 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2); |
10174 int rb = b2; | 12220 int rb = b2; |
10175 int rx = x2; | 12221 int rx = x2; |
10176 int offset = d2; | 12222 int offset = d2; |
10177 int64_t rb_val = (rb == 0) ? 0 : get_register(rb); | 12223 int64_t rb_val = (rb == 0) ? 0 : get_register(rb); |
10178 int64_t rx_val = (rx == 0) ? 0 : get_register(rx); | 12224 int64_t rx_val = (rx == 0) ? 0 : get_register(rx); |
10179 double ret = | 12225 double ret = |
10180 static_cast<double>(*reinterpret_cast<float*>(rx_val + rb_val + offset)); | 12226 static_cast<double>(*reinterpret_cast<float*>(rx_val + rb_val + offset)); |
10181 set_d_register_from_double(r1, ret); | 12227 set_d_register_from_double(r1, ret); |
10182 return length; | 12228 return length; |
10183 } | 12229 } |
10184 | 12230 |
10185 EVALUATE(LXDB) { return DecodeInstructionOriginal(instr); } | 12231 EVALUATE(LXDB) { |
| 12232 UNIMPLEMENTED(); |
| 12233 USE(instr); |
| 12234 return 0; |
| 12235 } |
10186 | 12236 |
10187 EVALUATE(LXEB) { return DecodeInstructionOriginal(instr); } | 12237 EVALUATE(LXEB) { |
| 12238 UNIMPLEMENTED(); |
| 12239 USE(instr); |
| 12240 return 0; |
| 12241 } |
10188 | 12242 |
10189 EVALUATE(MXDB) { return DecodeInstructionOriginal(instr); } | 12243 EVALUATE(MXDB) { |
| 12244 UNIMPLEMENTED(); |
| 12245 USE(instr); |
| 12246 return 0; |
| 12247 } |
10190 | 12248 |
10191 EVALUATE(KEB) { return DecodeInstructionOriginal(instr); } | 12249 EVALUATE(KEB) { |
| 12250 UNIMPLEMENTED(); |
| 12251 USE(instr); |
| 12252 return 0; |
| 12253 } |
10192 | 12254 |
10193 EVALUATE(CEB) { return DecodeInstructionOriginal(instr); } | 12255 EVALUATE(CEB) { |
| 12256 UNIMPLEMENTED(); |
| 12257 USE(instr); |
| 12258 return 0; |
| 12259 } |
10194 | 12260 |
10195 EVALUATE(AEB) { return DecodeInstructionOriginal(instr); } | 12261 EVALUATE(AEB) { |
| 12262 UNIMPLEMENTED(); |
| 12263 USE(instr); |
| 12264 return 0; |
| 12265 } |
10196 | 12266 |
10197 EVALUATE(SEB) { return DecodeInstructionOriginal(instr); } | 12267 EVALUATE(SEB) { |
| 12268 UNIMPLEMENTED(); |
| 12269 USE(instr); |
| 12270 return 0; |
| 12271 } |
10198 | 12272 |
10199 EVALUATE(MDEB) { return DecodeInstructionOriginal(instr); } | 12273 EVALUATE(MDEB) { |
| 12274 UNIMPLEMENTED(); |
| 12275 USE(instr); |
| 12276 return 0; |
| 12277 } |
10200 | 12278 |
10201 EVALUATE(DEB) { return DecodeInstructionOriginal(instr); } | 12279 EVALUATE(DEB) { |
| 12280 UNIMPLEMENTED(); |
| 12281 USE(instr); |
| 12282 return 0; |
| 12283 } |
10202 | 12284 |
10203 EVALUATE(MAEB) { return DecodeInstructionOriginal(instr); } | 12285 EVALUATE(MAEB) { |
| 12286 UNIMPLEMENTED(); |
| 12287 USE(instr); |
| 12288 return 0; |
| 12289 } |
10204 | 12290 |
10205 EVALUATE(MSEB) { return DecodeInstructionOriginal(instr); } | 12291 EVALUATE(MSEB) { |
| 12292 UNIMPLEMENTED(); |
| 12293 USE(instr); |
| 12294 return 0; |
| 12295 } |
10206 | 12296 |
10207 EVALUATE(TCEB) { return DecodeInstructionOriginal(instr); } | 12297 EVALUATE(TCEB) { |
| 12298 UNIMPLEMENTED(); |
| 12299 USE(instr); |
| 12300 return 0; |
| 12301 } |
10208 | 12302 |
10209 EVALUATE(TCDB) { return DecodeInstructionOriginal(instr); } | 12303 EVALUATE(TCDB) { |
| 12304 UNIMPLEMENTED(); |
| 12305 USE(instr); |
| 12306 return 0; |
| 12307 } |
10210 | 12308 |
10211 EVALUATE(TCXB) { return DecodeInstructionOriginal(instr); } | 12309 EVALUATE(TCXB) { |
| 12310 UNIMPLEMENTED(); |
| 12311 USE(instr); |
| 12312 return 0; |
| 12313 } |
10212 | 12314 |
10213 EVALUATE(SQEB) { return DecodeInstructionOriginal(instr); } | 12315 EVALUATE(SQEB) { |
| 12316 UNIMPLEMENTED(); |
| 12317 USE(instr); |
| 12318 return 0; |
| 12319 } |
10214 | 12320 |
10215 EVALUATE(SQDB) { | 12321 EVALUATE(SQDB) { |
10216 DCHECK_OPCODE(SQDB); | 12322 DCHECK_OPCODE(SQDB); |
10217 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2); | 12323 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2); |
10218 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 12324 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
10219 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 12325 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
10220 intptr_t d2_val = d2; | 12326 intptr_t d2_val = d2; |
10221 double r1_val = get_double_from_d_register(r1); | 12327 double r1_val = get_double_from_d_register(r1); |
10222 double dbl_val = ReadDouble(b2_val + x2_val + d2_val); | 12328 double dbl_val = ReadDouble(b2_val + x2_val + d2_val); |
10223 r1_val = std::sqrt(dbl_val); | 12329 r1_val = std::sqrt(dbl_val); |
10224 set_d_register_from_double(r1, r1_val); | 12330 set_d_register_from_double(r1, r1_val); |
10225 return length; | 12331 return length; |
10226 } | 12332 } |
10227 | 12333 |
10228 EVALUATE(MEEB) { return DecodeInstructionOriginal(instr); } | 12334 EVALUATE(MEEB) { |
| 12335 UNIMPLEMENTED(); |
| 12336 USE(instr); |
| 12337 return 0; |
| 12338 } |
10229 | 12339 |
10230 EVALUATE(KDB) { return DecodeInstructionOriginal(instr); } | 12340 EVALUATE(KDB) { |
| 12341 UNIMPLEMENTED(); |
| 12342 USE(instr); |
| 12343 return 0; |
| 12344 } |
10231 | 12345 |
10232 EVALUATE(CDB) { | 12346 EVALUATE(CDB) { |
10233 DCHECK_OPCODE(CDB); | 12347 DCHECK_OPCODE(CDB); |
10234 | 12348 |
10235 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2); | 12349 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2); |
10236 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 12350 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
10237 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 12351 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
10238 intptr_t d2_val = d2; | 12352 intptr_t d2_val = d2; |
10239 double r1_val = get_double_from_d_register(r1); | 12353 double r1_val = get_double_from_d_register(r1); |
10240 double dbl_val = ReadDouble(b2_val + x2_val + d2_val); | 12354 double dbl_val = ReadDouble(b2_val + x2_val + d2_val); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10292 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 12406 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
10293 intptr_t d2_val = d2; | 12407 intptr_t d2_val = d2; |
10294 double r1_val = get_double_from_d_register(r1); | 12408 double r1_val = get_double_from_d_register(r1); |
10295 double dbl_val = ReadDouble(b2_val + x2_val + d2_val); | 12409 double dbl_val = ReadDouble(b2_val + x2_val + d2_val); |
10296 r1_val /= dbl_val; | 12410 r1_val /= dbl_val; |
10297 set_d_register_from_double(r1, r1_val); | 12411 set_d_register_from_double(r1, r1_val); |
10298 SetS390ConditionCode<double>(r1_val, 0); | 12412 SetS390ConditionCode<double>(r1_val, 0); |
10299 return length; | 12413 return length; |
10300 } | 12414 } |
10301 | 12415 |
10302 EVALUATE(MADB) { return DecodeInstructionOriginal(instr); } | 12416 EVALUATE(MADB) { |
| 12417 UNIMPLEMENTED(); |
| 12418 USE(instr); |
| 12419 return 0; |
| 12420 } |
10303 | 12421 |
10304 EVALUATE(MSDB) { return DecodeInstructionOriginal(instr); } | 12422 EVALUATE(MSDB) { |
| 12423 UNIMPLEMENTED(); |
| 12424 USE(instr); |
| 12425 return 0; |
| 12426 } |
10305 | 12427 |
10306 EVALUATE(SLDT) { return DecodeInstructionOriginal(instr); } | 12428 EVALUATE(SLDT) { |
| 12429 UNIMPLEMENTED(); |
| 12430 USE(instr); |
| 12431 return 0; |
| 12432 } |
10307 | 12433 |
10308 EVALUATE(SRDT) { return DecodeInstructionOriginal(instr); } | 12434 EVALUATE(SRDT) { |
| 12435 UNIMPLEMENTED(); |
| 12436 USE(instr); |
| 12437 return 0; |
| 12438 } |
10309 | 12439 |
10310 EVALUATE(SLXT) { return DecodeInstructionOriginal(instr); } | 12440 EVALUATE(SLXT) { |
| 12441 UNIMPLEMENTED(); |
| 12442 USE(instr); |
| 12443 return 0; |
| 12444 } |
10311 | 12445 |
10312 EVALUATE(SRXT) { return DecodeInstructionOriginal(instr); } | 12446 EVALUATE(SRXT) { |
| 12447 UNIMPLEMENTED(); |
| 12448 USE(instr); |
| 12449 return 0; |
| 12450 } |
10313 | 12451 |
10314 EVALUATE(TDCET) { return DecodeInstructionOriginal(instr); } | 12452 EVALUATE(TDCET) { |
| 12453 UNIMPLEMENTED(); |
| 12454 USE(instr); |
| 12455 return 0; |
| 12456 } |
10315 | 12457 |
10316 EVALUATE(TDGET) { return DecodeInstructionOriginal(instr); } | 12458 EVALUATE(TDGET) { |
| 12459 UNIMPLEMENTED(); |
| 12460 USE(instr); |
| 12461 return 0; |
| 12462 } |
10317 | 12463 |
10318 EVALUATE(TDCDT) { return DecodeInstructionOriginal(instr); } | 12464 EVALUATE(TDCDT) { |
| 12465 UNIMPLEMENTED(); |
| 12466 USE(instr); |
| 12467 return 0; |
| 12468 } |
10319 | 12469 |
10320 EVALUATE(TDGDT) { return DecodeInstructionOriginal(instr); } | 12470 EVALUATE(TDGDT) { |
| 12471 UNIMPLEMENTED(); |
| 12472 USE(instr); |
| 12473 return 0; |
| 12474 } |
10321 | 12475 |
10322 EVALUATE(TDCXT) { return DecodeInstructionOriginal(instr); } | 12476 EVALUATE(TDCXT) { |
| 12477 UNIMPLEMENTED(); |
| 12478 USE(instr); |
| 12479 return 0; |
| 12480 } |
10323 | 12481 |
10324 EVALUATE(TDGXT) { return DecodeInstructionOriginal(instr); } | 12482 EVALUATE(TDGXT) { |
| 12483 UNIMPLEMENTED(); |
| 12484 USE(instr); |
| 12485 return 0; |
| 12486 } |
10325 | 12487 |
10326 EVALUATE(LEY) { | 12488 EVALUATE(LEY) { |
10327 DCHECK_OPCODE(LEY); | 12489 DCHECK_OPCODE(LEY); |
10328 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 12490 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
10329 // Miscellaneous Loads and Stores | 12491 // Miscellaneous Loads and Stores |
10330 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 12492 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
10331 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 12493 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
10332 intptr_t addr = x2_val + b2_val + d2; | 12494 intptr_t addr = x2_val + b2_val + d2; |
10333 float float_val = *reinterpret_cast<float*>(addr); | 12495 float float_val = *reinterpret_cast<float*>(addr); |
10334 set_d_register_from_float32(r1, float_val); | 12496 set_d_register_from_float32(r1, float_val); |
(...skipping 29 matching lines...) Expand all Loading... |
10364 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 12526 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
10365 // Miscellaneous Loads and Stores | 12527 // Miscellaneous Loads and Stores |
10366 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 12528 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
10367 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 12529 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
10368 intptr_t addr = x2_val + b2_val + d2; | 12530 intptr_t addr = x2_val + b2_val + d2; |
10369 int64_t frs_val = get_d_register(r1); | 12531 int64_t frs_val = get_d_register(r1); |
10370 WriteDW(addr, frs_val); | 12532 WriteDW(addr, frs_val); |
10371 return length; | 12533 return length; |
10372 } | 12534 } |
10373 | 12535 |
10374 EVALUATE(CZDT) { return DecodeInstructionOriginal(instr); } | 12536 EVALUATE(CZDT) { |
| 12537 UNIMPLEMENTED(); |
| 12538 USE(instr); |
| 12539 return 0; |
| 12540 } |
10375 | 12541 |
10376 EVALUATE(CZXT) { return DecodeInstructionOriginal(instr); } | 12542 EVALUATE(CZXT) { |
| 12543 UNIMPLEMENTED(); |
| 12544 USE(instr); |
| 12545 return 0; |
| 12546 } |
10377 | 12547 |
10378 EVALUATE(CDZT) { return DecodeInstructionOriginal(instr); } | 12548 EVALUATE(CDZT) { |
| 12549 UNIMPLEMENTED(); |
| 12550 USE(instr); |
| 12551 return 0; |
| 12552 } |
10379 | 12553 |
10380 EVALUATE(CXZT) { return DecodeInstructionOriginal(instr); } | 12554 EVALUATE(CXZT) { |
| 12555 UNIMPLEMENTED(); |
| 12556 USE(instr); |
| 12557 return 0; |
| 12558 } |
10381 | 12559 |
10382 #undef EVALUATE | 12560 #undef EVALUATE |
10383 | 12561 |
10384 } // namespace internal | 12562 } // namespace internal |
10385 } // namespace v8 | 12563 } // namespace v8 |
10386 | 12564 |
10387 #endif // USE_SIMULATOR | 12565 #endif // USE_SIMULATOR |
10388 #endif // V8_TARGET_ARCH_S390 | 12566 #endif // V8_TARGET_ARCH_S390 |
OLD | NEW |