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 5935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5946 int b1 = AS(SIInstruction)->B1Value(); \ | 5946 int b1 = AS(SIInstruction)->B1Value(); \ |
5947 intptr_t d1_val = AS(SIInstruction)->D1Value(); \ | 5947 intptr_t d1_val = AS(SIInstruction)->D1Value(); \ |
5948 uint8_t imm_val = AS(SIInstruction)->I2Value(); \ | 5948 uint8_t imm_val = AS(SIInstruction)->I2Value(); \ |
5949 int length = 4; | 5949 int length = 4; |
5950 | 5950 |
5951 #define DECODE_RRE_INSTRUCTION(r1, r2) \ | 5951 #define DECODE_RRE_INSTRUCTION(r1, r2) \ |
5952 int r1 = AS(RREInstruction)->R1Value(); \ | 5952 int r1 = AS(RREInstruction)->R1Value(); \ |
5953 int r2 = AS(RREInstruction)->R2Value(); \ | 5953 int r2 = AS(RREInstruction)->R2Value(); \ |
5954 int length = 4; | 5954 int length = 4; |
5955 | 5955 |
| 5956 #define DECODE_RRE_INSTRUCTION_NO_R2(r1) \ |
| 5957 int r1 = AS(RREInstruction)->R1Value(); \ |
| 5958 int length = 4; |
| 5959 |
| 5960 #define DECODE_RRD_INSTRUCTION(r1, r2, r3) \ |
| 5961 int r1 = AS(RRDInstruction)->R1Value(); \ |
| 5962 int r2 = AS(RRDInstruction)->R2Value(); \ |
| 5963 int r3 = AS(RRDInstruction)->R3Value(); \ |
| 5964 int length = 4; |
| 5965 |
| 5966 #define DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4) \ |
| 5967 int r1 = AS(RRFInstruction)->R1Value(); \ |
| 5968 int r2 = AS(RRFInstruction)->R2Value(); \ |
| 5969 int m3 = AS(RRFInstruction)->M3Value(); \ |
| 5970 int m4 = AS(RRFInstruction)->M4Value(); \ |
| 5971 int length = 4; |
| 5972 |
| 5973 #define DECODE_RRF_A_INSTRUCTION(r1, r2, r3) \ |
| 5974 int r1 = AS(RRFInstruction)->R1Value(); \ |
| 5975 int r2 = AS(RRFInstruction)->R2Value(); \ |
| 5976 int r3 = AS(RRFInstruction)->R3Value(); \ |
| 5977 int length = 4; |
| 5978 |
5956 #define DECODE_RR_INSTRUCTION(r1, r2) \ | 5979 #define DECODE_RR_INSTRUCTION(r1, r2) \ |
5957 int r1 = AS(RRInstruction)->R1Value(); \ | 5980 int r1 = AS(RRInstruction)->R1Value(); \ |
5958 int r2 = AS(RRInstruction)->R2Value(); \ | 5981 int r2 = AS(RRInstruction)->R2Value(); \ |
5959 int length = 2; | 5982 int length = 2; |
5960 | 5983 |
5961 #define DECODE_RIE_D_INSTRUCTION(r1, r2, i2) \ | 5984 #define DECODE_RIE_D_INSTRUCTION(r1, r2, i2) \ |
5962 int r1 = AS(RIEInstruction)->R1Value(); \ | 5985 int r1 = AS(RIEInstruction)->R1Value(); \ |
5963 int r2 = AS(RIEInstruction)->R2Value(); \ | 5986 int r2 = AS(RIEInstruction)->R2Value(); \ |
5964 int32_t i2 = AS(RIEInstruction)->I6Value(); \ | 5987 int32_t i2 = AS(RIEInstruction)->I6Value(); \ |
5965 int length = 6; | 5988 int length = 6; |
(...skipping 1988 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7954 } else if (r2_val == 0) { | 7977 } else if (r2_val == 0) { |
7955 condition_reg_ = CC_EQ; | 7978 condition_reg_ = CC_EQ; |
7956 } else if (r2_val < 0) { | 7979 } else if (r2_val < 0) { |
7957 condition_reg_ = CC_LT; | 7980 condition_reg_ = CC_LT; |
7958 } else if (r2_val > 0) { | 7981 } else if (r2_val > 0) { |
7959 condition_reg_ = CC_GT; | 7982 condition_reg_ = CC_GT; |
7960 } | 7983 } |
7961 return length; | 7984 return length; |
7962 } | 7985 } |
7963 | 7986 |
7964 EVALUATE(SQEBR) { return DecodeInstructionOriginal(instr); } | 7987 EVALUATE(SQEBR) { |
| 7988 DCHECK_OPCODE(SQEBR); |
| 7989 DECODE_RRE_INSTRUCTION(r1, r2); |
| 7990 float fr1_val = get_float32_from_d_register(r1); |
| 7991 float fr2_val = get_float32_from_d_register(r2); |
| 7992 fr1_val = std::sqrt(fr2_val); |
| 7993 set_d_register_from_float32(r1, fr1_val); |
| 7994 return length; |
| 7995 } |
7965 | 7996 |
7966 EVALUATE(SQDBR) { return DecodeInstructionOriginal(instr); } | 7997 EVALUATE(SQDBR) { |
| 7998 DCHECK_OPCODE(SQDBR); |
| 7999 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8000 double r1_val = get_double_from_d_register(r1); |
| 8001 double r2_val = get_double_from_d_register(r2); |
| 8002 r1_val = std::sqrt(r2_val); |
| 8003 set_d_register_from_double(r1, r1_val); |
| 8004 return length; |
| 8005 } |
7967 | 8006 |
7968 EVALUATE(SQXBR) { return DecodeInstructionOriginal(instr); } | 8007 EVALUATE(SQXBR) { return DecodeInstructionOriginal(instr); } |
7969 | 8008 |
7970 EVALUATE(MEEBR) { return DecodeInstructionOriginal(instr); } | 8009 EVALUATE(MEEBR) { |
| 8010 DCHECK_OPCODE(MEEBR); |
| 8011 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8012 float fr1_val = get_float32_from_d_register(r1); |
| 8013 float fr2_val = get_float32_from_d_register(r2); |
| 8014 fr1_val *= fr2_val; |
| 8015 set_d_register_from_float32(r1, fr1_val); |
| 8016 SetS390ConditionCode<float>(fr1_val, 0); |
| 8017 return length; |
| 8018 } |
7971 | 8019 |
7972 EVALUATE(KDBR) { return DecodeInstructionOriginal(instr); } | 8020 EVALUATE(KDBR) { return DecodeInstructionOriginal(instr); } |
7973 | 8021 |
7974 EVALUATE(CDBR) { return DecodeInstructionOriginal(instr); } | 8022 EVALUATE(CDBR) { |
| 8023 DCHECK_OPCODE(CDBR); |
| 8024 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8025 double r1_val = get_double_from_d_register(r1); |
| 8026 double r2_val = get_double_from_d_register(r2); |
| 8027 if (isNaN(r1_val) || isNaN(r2_val)) { |
| 8028 condition_reg_ = CC_OF; |
| 8029 } else { |
| 8030 SetS390ConditionCode<double>(r1_val, r2_val); |
| 8031 } |
| 8032 return length; |
| 8033 } |
7975 | 8034 |
7976 EVALUATE(ADBR) { return DecodeInstructionOriginal(instr); } | 8035 EVALUATE(ADBR) { |
| 8036 DCHECK_OPCODE(ADBR); |
| 8037 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8038 double r1_val = get_double_from_d_register(r1); |
| 8039 double r2_val = get_double_from_d_register(r2); |
| 8040 r1_val += r2_val; |
| 8041 set_d_register_from_double(r1, r1_val); |
| 8042 SetS390ConditionCode<double>(r1_val, 0); |
| 8043 return length; |
| 8044 } |
7977 | 8045 |
7978 EVALUATE(SDBR) { return DecodeInstructionOriginal(instr); } | 8046 EVALUATE(SDBR) { |
| 8047 DCHECK_OPCODE(SDBR); |
| 8048 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8049 double r1_val = get_double_from_d_register(r1); |
| 8050 double r2_val = get_double_from_d_register(r2); |
| 8051 r1_val -= r2_val; |
| 8052 set_d_register_from_double(r1, r1_val); |
| 8053 SetS390ConditionCode<double>(r1_val, 0); |
| 8054 return length; |
| 8055 } |
7979 | 8056 |
7980 EVALUATE(MDBR) { return DecodeInstructionOriginal(instr); } | 8057 EVALUATE(MDBR) { |
| 8058 DCHECK_OPCODE(MDBR); |
| 8059 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8060 double r1_val = get_double_from_d_register(r1); |
| 8061 double r2_val = get_double_from_d_register(r2); |
| 8062 r1_val *= r2_val; |
| 8063 set_d_register_from_double(r1, r1_val); |
| 8064 SetS390ConditionCode<double>(r1_val, 0); |
| 8065 return length; |
| 8066 } |
7981 | 8067 |
7982 EVALUATE(DDBR) { return DecodeInstructionOriginal(instr); } | 8068 EVALUATE(DDBR) { |
| 8069 DCHECK_OPCODE(DDBR); |
| 8070 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8071 double r1_val = get_double_from_d_register(r1); |
| 8072 double r2_val = get_double_from_d_register(r2); |
| 8073 r1_val /= r2_val; |
| 8074 set_d_register_from_double(r1, r1_val); |
| 8075 SetS390ConditionCode<double>(r1_val, 0); |
| 8076 return length; |
| 8077 } |
7983 | 8078 |
7984 EVALUATE(MADBR) { return DecodeInstructionOriginal(instr); } | 8079 EVALUATE(MADBR) { |
| 8080 DCHECK_OPCODE(MADBR); |
| 8081 DECODE_RRD_INSTRUCTION(r1, r2, r3); |
| 8082 double r1_val = get_double_from_d_register(r1); |
| 8083 double r2_val = get_double_from_d_register(r2); |
| 8084 double r3_val = get_double_from_d_register(r3); |
| 8085 r1_val += r2_val * r3_val; |
| 8086 set_d_register_from_double(r1, r1_val); |
| 8087 SetS390ConditionCode<double>(r1_val, 0); |
| 8088 return length; |
| 8089 } |
7985 | 8090 |
7986 EVALUATE(MSDBR) { return DecodeInstructionOriginal(instr); } | 8091 EVALUATE(MSDBR) { return DecodeInstructionOriginal(instr); } |
7987 | 8092 |
7988 EVALUATE(LPXBR) { return DecodeInstructionOriginal(instr); } | 8093 EVALUATE(LPXBR) { return DecodeInstructionOriginal(instr); } |
7989 | 8094 |
7990 EVALUATE(LNXBR) { return DecodeInstructionOriginal(instr); } | 8095 EVALUATE(LNXBR) { return DecodeInstructionOriginal(instr); } |
7991 | 8096 |
7992 EVALUATE(LTXBR) { return DecodeInstructionOriginal(instr); } | 8097 EVALUATE(LTXBR) { return DecodeInstructionOriginal(instr); } |
7993 | 8098 |
7994 EVALUATE(LCXBR) { return DecodeInstructionOriginal(instr); } | 8099 EVALUATE(LCXBR) { return DecodeInstructionOriginal(instr); } |
(...skipping 17 matching lines...) Expand all Loading... |
8012 EVALUATE(MXBR) { return DecodeInstructionOriginal(instr); } | 8117 EVALUATE(MXBR) { return DecodeInstructionOriginal(instr); } |
8013 | 8118 |
8014 EVALUATE(DXBR) { return DecodeInstructionOriginal(instr); } | 8119 EVALUATE(DXBR) { return DecodeInstructionOriginal(instr); } |
8015 | 8120 |
8016 EVALUATE(TBEDR) { return DecodeInstructionOriginal(instr); } | 8121 EVALUATE(TBEDR) { return DecodeInstructionOriginal(instr); } |
8017 | 8122 |
8018 EVALUATE(TBDR) { return DecodeInstructionOriginal(instr); } | 8123 EVALUATE(TBDR) { return DecodeInstructionOriginal(instr); } |
8019 | 8124 |
8020 EVALUATE(DIEBR) { return DecodeInstructionOriginal(instr); } | 8125 EVALUATE(DIEBR) { return DecodeInstructionOriginal(instr); } |
8021 | 8126 |
8022 EVALUATE(FIEBRA) { return DecodeInstructionOriginal(instr); } | 8127 EVALUATE(FIEBRA) { |
| 8128 DCHECK_OPCODE(FIEBRA); |
| 8129 DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4); |
| 8130 float r2_val = get_float32_from_d_register(r2); |
| 8131 CHECK(m4 == 0); |
| 8132 switch (m3) { |
| 8133 case Assembler::FIDBRA_ROUND_TO_NEAREST_AWAY_FROM_0: |
| 8134 set_d_register_from_float32(r1, round(r2_val)); |
| 8135 break; |
| 8136 case Assembler::FIDBRA_ROUND_TOWARD_0: |
| 8137 set_d_register_from_float32(r1, trunc(r2_val)); |
| 8138 break; |
| 8139 case Assembler::FIDBRA_ROUND_TOWARD_POS_INF: |
| 8140 set_d_register_from_float32(r1, std::ceil(r2_val)); |
| 8141 break; |
| 8142 case Assembler::FIDBRA_ROUND_TOWARD_NEG_INF: |
| 8143 set_d_register_from_float32(r1, std::floor(r2_val)); |
| 8144 break; |
| 8145 default: |
| 8146 UNIMPLEMENTED(); |
| 8147 break; |
| 8148 } |
| 8149 return length; |
| 8150 } |
8023 | 8151 |
8024 EVALUATE(THDER) { return DecodeInstructionOriginal(instr); } | 8152 EVALUATE(THDER) { return DecodeInstructionOriginal(instr); } |
8025 | 8153 |
8026 EVALUATE(THDR) { return DecodeInstructionOriginal(instr); } | 8154 EVALUATE(THDR) { return DecodeInstructionOriginal(instr); } |
8027 | 8155 |
8028 EVALUATE(DIDBR) { return DecodeInstructionOriginal(instr); } | 8156 EVALUATE(DIDBR) { return DecodeInstructionOriginal(instr); } |
8029 | 8157 |
8030 EVALUATE(FIDBRA) { return DecodeInstructionOriginal(instr); } | 8158 EVALUATE(FIDBRA) { |
| 8159 DCHECK_OPCODE(FIDBRA); |
| 8160 DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4); |
| 8161 double r2_val = get_double_from_d_register(r2); |
| 8162 CHECK(m4 == 0); |
| 8163 switch (m3) { |
| 8164 case Assembler::FIDBRA_ROUND_TO_NEAREST_AWAY_FROM_0: |
| 8165 set_d_register_from_double(r1, round(r2_val)); |
| 8166 break; |
| 8167 case Assembler::FIDBRA_ROUND_TOWARD_0: |
| 8168 set_d_register_from_double(r1, trunc(r2_val)); |
| 8169 break; |
| 8170 case Assembler::FIDBRA_ROUND_TOWARD_POS_INF: |
| 8171 set_d_register_from_double(r1, std::ceil(r2_val)); |
| 8172 break; |
| 8173 case Assembler::FIDBRA_ROUND_TOWARD_NEG_INF: |
| 8174 set_d_register_from_double(r1, std::floor(r2_val)); |
| 8175 break; |
| 8176 default: |
| 8177 UNIMPLEMENTED(); |
| 8178 break; |
| 8179 } |
| 8180 return length; |
| 8181 } |
8031 | 8182 |
8032 EVALUATE(LXR) { return DecodeInstructionOriginal(instr); } | 8183 EVALUATE(LXR) { return DecodeInstructionOriginal(instr); } |
8033 | 8184 |
8034 EVALUATE(LPDFR) { return DecodeInstructionOriginal(instr); } | 8185 EVALUATE(LPDFR) { return DecodeInstructionOriginal(instr); } |
8035 | 8186 |
8036 EVALUATE(LNDFR) { return DecodeInstructionOriginal(instr); } | 8187 EVALUATE(LNDFR) { return DecodeInstructionOriginal(instr); } |
8037 | 8188 |
8038 EVALUATE(LCDFR) { return DecodeInstructionOriginal(instr); } | 8189 EVALUATE(LCDFR) { return DecodeInstructionOriginal(instr); } |
8039 | 8190 |
8040 EVALUATE(LZER) { return DecodeInstructionOriginal(instr); } | 8191 EVALUATE(LZER) { return DecodeInstructionOriginal(instr); } |
8041 | 8192 |
8042 EVALUATE(LZDR) { return DecodeInstructionOriginal(instr); } | 8193 EVALUATE(LZDR) { |
| 8194 DCHECK_OPCODE(LZDR); |
| 8195 DECODE_RRE_INSTRUCTION_NO_R2(r1); |
| 8196 set_d_register_from_double(r1, 0.0); |
| 8197 return length; |
| 8198 } |
8043 | 8199 |
8044 EVALUATE(LZXR) { return DecodeInstructionOriginal(instr); } | 8200 EVALUATE(LZXR) { return DecodeInstructionOriginal(instr); } |
8045 | 8201 |
8046 EVALUATE(SFPC) { return DecodeInstructionOriginal(instr); } | 8202 EVALUATE(SFPC) { return DecodeInstructionOriginal(instr); } |
8047 | 8203 |
8048 EVALUATE(SFASR) { return DecodeInstructionOriginal(instr); } | 8204 EVALUATE(SFASR) { return DecodeInstructionOriginal(instr); } |
8049 | 8205 |
8050 EVALUATE(EFPC) { return DecodeInstructionOriginal(instr); } | 8206 EVALUATE(EFPC) { return DecodeInstructionOriginal(instr); } |
8051 | 8207 |
8052 EVALUATE(CELFBR) { return DecodeInstructionOriginal(instr); } | 8208 EVALUATE(CELFBR) { |
| 8209 DCHECK_OPCODE(CELFBR); |
| 8210 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8211 uint32_t r2_val = get_low_register<uint32_t>(r2); |
| 8212 float r1_val = static_cast<float>(r2_val); |
| 8213 set_d_register_from_float32(r1, r1_val); |
| 8214 return length; |
| 8215 } |
8053 | 8216 |
8054 EVALUATE(CDLFBR) { return DecodeInstructionOriginal(instr); } | 8217 EVALUATE(CDLFBR) { |
| 8218 DCHECK_OPCODE(CDLFBR); |
| 8219 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8220 uint32_t r2_val = get_low_register<uint32_t>(r2); |
| 8221 double r1_val = static_cast<double>(r2_val); |
| 8222 set_d_register_from_double(r1, r1_val); |
| 8223 return length; |
| 8224 } |
8055 | 8225 |
8056 EVALUATE(CXLFBR) { return DecodeInstructionOriginal(instr); } | 8226 EVALUATE(CXLFBR) { return DecodeInstructionOriginal(instr); } |
8057 | 8227 |
8058 EVALUATE(CEFBRA) { return DecodeInstructionOriginal(instr); } | 8228 EVALUATE(CEFBRA) { return DecodeInstructionOriginal(instr); } |
8059 | 8229 |
8060 EVALUATE(CDFBRA) { return DecodeInstructionOriginal(instr); } | 8230 EVALUATE(CDFBRA) { return DecodeInstructionOriginal(instr); } |
8061 | 8231 |
8062 EVALUATE(CXFBRA) { return DecodeInstructionOriginal(instr); } | 8232 EVALUATE(CXFBRA) { return DecodeInstructionOriginal(instr); } |
8063 | 8233 |
8064 EVALUATE(CFEBRA) { return DecodeInstructionOriginal(instr); } | 8234 EVALUATE(CFEBRA) { return DecodeInstructionOriginal(instr); } |
8065 | 8235 |
8066 EVALUATE(CFDBRA) { return DecodeInstructionOriginal(instr); } | 8236 EVALUATE(CFDBRA) { return DecodeInstructionOriginal(instr); } |
8067 | 8237 |
8068 EVALUATE(CFXBRA) { return DecodeInstructionOriginal(instr); } | 8238 EVALUATE(CFXBRA) { return DecodeInstructionOriginal(instr); } |
8069 | 8239 |
8070 EVALUATE(CLFEBR) { return DecodeInstructionOriginal(instr); } | 8240 EVALUATE(CLFEBR) { |
| 8241 DCHECK_OPCODE(CLFEBR); |
| 8242 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8243 float r2_val = get_float32_from_d_register(r2); |
| 8244 uint32_t r1_val = static_cast<uint32_t>(r2_val); |
| 8245 set_low_register(r1, r1_val); |
| 8246 SetS390ConvertConditionCode<double>(r2_val, r1_val, UINT32_MAX); |
| 8247 return length; |
| 8248 } |
8071 | 8249 |
8072 EVALUATE(CLFDBR) { return DecodeInstructionOriginal(instr); } | 8250 EVALUATE(CLFDBR) { |
| 8251 DCHECK_OPCODE(CLFDBR); |
| 8252 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8253 double r2_val = get_double_from_d_register(r2); |
| 8254 uint32_t r1_val = static_cast<uint32_t>(r2_val); |
| 8255 set_low_register(r1, r1_val); |
| 8256 SetS390ConvertConditionCode<double>(r2_val, r1_val, UINT32_MAX); |
| 8257 return length; |
| 8258 } |
8073 | 8259 |
8074 EVALUATE(CLFXBR) { return DecodeInstructionOriginal(instr); } | 8260 EVALUATE(CLFXBR) { return DecodeInstructionOriginal(instr); } |
8075 | 8261 |
8076 EVALUATE(CELGBR) { return DecodeInstructionOriginal(instr); } | 8262 EVALUATE(CELGBR) { |
| 8263 DCHECK_OPCODE(CELGBR); |
| 8264 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8265 uint64_t r2_val = get_register(r2); |
| 8266 float r1_val = static_cast<float>(r2_val); |
| 8267 set_d_register_from_float32(r1, r1_val); |
| 8268 return length; |
| 8269 } |
8077 | 8270 |
8078 EVALUATE(CDLGBR) { return DecodeInstructionOriginal(instr); } | 8271 EVALUATE(CDLGBR) { |
| 8272 DCHECK_OPCODE(CDLGBR); |
| 8273 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8274 uint64_t r2_val = get_register(r2); |
| 8275 double r1_val = static_cast<double>(r2_val); |
| 8276 set_d_register_from_double(r1, r1_val); |
| 8277 return length; |
| 8278 } |
8079 | 8279 |
8080 EVALUATE(CXLGBR) { return DecodeInstructionOriginal(instr); } | 8280 EVALUATE(CXLGBR) { return DecodeInstructionOriginal(instr); } |
8081 | 8281 |
8082 EVALUATE(CEGBRA) { return DecodeInstructionOriginal(instr); } | 8282 EVALUATE(CEGBRA) { return DecodeInstructionOriginal(instr); } |
8083 | 8283 |
8084 EVALUATE(CDGBRA) { return DecodeInstructionOriginal(instr); } | 8284 EVALUATE(CDGBRA) { return DecodeInstructionOriginal(instr); } |
8085 | 8285 |
8086 EVALUATE(CXGBRA) { return DecodeInstructionOriginal(instr); } | 8286 EVALUATE(CXGBRA) { return DecodeInstructionOriginal(instr); } |
8087 | 8287 |
8088 EVALUATE(CGEBRA) { return DecodeInstructionOriginal(instr); } | 8288 EVALUATE(CGEBRA) { return DecodeInstructionOriginal(instr); } |
8089 | 8289 |
8090 EVALUATE(CGDBRA) { return DecodeInstructionOriginal(instr); } | 8290 EVALUATE(CGDBRA) { return DecodeInstructionOriginal(instr); } |
8091 | 8291 |
8092 EVALUATE(CGXBRA) { return DecodeInstructionOriginal(instr); } | 8292 EVALUATE(CGXBRA) { return DecodeInstructionOriginal(instr); } |
8093 | 8293 |
8094 EVALUATE(CLGEBR) { return DecodeInstructionOriginal(instr); } | 8294 EVALUATE(CLGEBR) { |
| 8295 DCHECK_OPCODE(CLGEBR); |
| 8296 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8297 float r2_val = get_float32_from_d_register(r2); |
| 8298 uint64_t r1_val = static_cast<uint64_t>(r2_val); |
| 8299 set_register(r1, r1_val); |
| 8300 SetS390ConvertConditionCode<double>(r2_val, r1_val, UINT64_MAX); |
| 8301 return length; |
| 8302 } |
8095 | 8303 |
8096 EVALUATE(CLGDBR) { return DecodeInstructionOriginal(instr); } | 8304 EVALUATE(CLGDBR) { |
| 8305 DCHECK_OPCODE(CLGDBR); |
| 8306 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8307 double r2_val = get_double_from_d_register(r2); |
| 8308 uint64_t r1_val = static_cast<uint64_t>(r2_val); |
| 8309 set_register(r1, r1_val); |
| 8310 SetS390ConvertConditionCode<double>(r2_val, r1_val, UINT64_MAX); |
| 8311 return length; |
| 8312 } |
8097 | 8313 |
8098 EVALUATE(CFER) { return DecodeInstructionOriginal(instr); } | 8314 EVALUATE(CFER) { return DecodeInstructionOriginal(instr); } |
8099 | 8315 |
8100 EVALUATE(CFDR) { return DecodeInstructionOriginal(instr); } | 8316 EVALUATE(CFDR) { return DecodeInstructionOriginal(instr); } |
8101 | 8317 |
8102 EVALUATE(CFXR) { return DecodeInstructionOriginal(instr); } | 8318 EVALUATE(CFXR) { return DecodeInstructionOriginal(instr); } |
8103 | 8319 |
8104 EVALUATE(LDGR) { return DecodeInstructionOriginal(instr); } | 8320 EVALUATE(LDGR) { |
| 8321 DCHECK_OPCODE(LDGR); |
| 8322 // Load FPR from GPR (L <- 64) |
| 8323 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8324 uint64_t int_val = get_register(r2); |
| 8325 // double double_val = bit_cast<double, uint64_t>(int_val); |
| 8326 // set_d_register_from_double(rreInst->R1Value(), double_val); |
| 8327 set_d_register(r1, int_val); |
| 8328 return length; |
| 8329 } |
8105 | 8330 |
8106 EVALUATE(CGER) { return DecodeInstructionOriginal(instr); } | 8331 EVALUATE(CGER) { return DecodeInstructionOriginal(instr); } |
8107 | 8332 |
8108 EVALUATE(CGDR) { return DecodeInstructionOriginal(instr); } | 8333 EVALUATE(CGDR) { return DecodeInstructionOriginal(instr); } |
8109 | 8334 |
8110 EVALUATE(CGXR) { return DecodeInstructionOriginal(instr); } | 8335 EVALUATE(CGXR) { return DecodeInstructionOriginal(instr); } |
8111 | 8336 |
8112 EVALUATE(LGDR) { return DecodeInstructionOriginal(instr); } | 8337 EVALUATE(LGDR) { |
| 8338 DCHECK_OPCODE(LGDR); |
| 8339 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8340 // Load GPR from FPR (64 <- L) |
| 8341 int64_t double_val = get_d_register(r2); |
| 8342 set_register(r1, double_val); |
| 8343 return length; |
| 8344 } |
8113 | 8345 |
8114 EVALUATE(MDTR) { return DecodeInstructionOriginal(instr); } | 8346 EVALUATE(MDTR) { return DecodeInstructionOriginal(instr); } |
8115 | 8347 |
8116 EVALUATE(MDTRA) { return DecodeInstructionOriginal(instr); } | 8348 EVALUATE(MDTRA) { return DecodeInstructionOriginal(instr); } |
8117 | 8349 |
8118 EVALUATE(DDTRA) { return DecodeInstructionOriginal(instr); } | 8350 EVALUATE(DDTRA) { return DecodeInstructionOriginal(instr); } |
8119 | 8351 |
8120 EVALUATE(ADTRA) { return DecodeInstructionOriginal(instr); } | 8352 EVALUATE(ADTRA) { return DecodeInstructionOriginal(instr); } |
8121 | 8353 |
8122 EVALUATE(SDTRA) { return DecodeInstructionOriginal(instr); } | 8354 EVALUATE(SDTRA) { return DecodeInstructionOriginal(instr); } |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8194 EVALUATE(CEXTR) { return DecodeInstructionOriginal(instr); } | 8426 EVALUATE(CEXTR) { return DecodeInstructionOriginal(instr); } |
8195 | 8427 |
8196 EVALUATE(QAXTR) { return DecodeInstructionOriginal(instr); } | 8428 EVALUATE(QAXTR) { return DecodeInstructionOriginal(instr); } |
8197 | 8429 |
8198 EVALUATE(IEXTR) { return DecodeInstructionOriginal(instr); } | 8430 EVALUATE(IEXTR) { return DecodeInstructionOriginal(instr); } |
8199 | 8431 |
8200 EVALUATE(RRXTR) { return DecodeInstructionOriginal(instr); } | 8432 EVALUATE(RRXTR) { return DecodeInstructionOriginal(instr); } |
8201 | 8433 |
8202 EVALUATE(LPGR) { return DecodeInstructionOriginal(instr); } | 8434 EVALUATE(LPGR) { return DecodeInstructionOriginal(instr); } |
8203 | 8435 |
8204 EVALUATE(LNGR) { return DecodeInstructionOriginal(instr); } | 8436 EVALUATE(LNGR) { |
| 8437 DCHECK_OPCODE(LNGR); |
| 8438 // Load Negative (64) |
| 8439 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8440 int64_t r2_val = get_register(r2); |
| 8441 r2_val = (r2_val >= 0) ? -r2_val : r2_val; // If pos, then negate it. |
| 8442 set_register(r1, r2_val); |
| 8443 condition_reg_ = (r2_val == 0) ? CC_EQ : CC_LT; // CC0 - result is zero |
| 8444 // CC1 - result is negative |
| 8445 return length; |
| 8446 } |
8205 | 8447 |
8206 EVALUATE(LTGR) { return DecodeInstructionOriginal(instr); } | 8448 EVALUATE(LTGR) { |
| 8449 DCHECK_OPCODE(LTGR); |
| 8450 // Load Register (64) |
| 8451 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8452 int64_t r2_val = get_register(r2); |
| 8453 SetS390ConditionCode<int64_t>(r2_val, 0); |
| 8454 set_register(r1, get_register(r2)); |
| 8455 return length; |
| 8456 } |
8207 | 8457 |
8208 EVALUATE(LCGR) { return DecodeInstructionOriginal(instr); } | 8458 EVALUATE(LCGR) { |
| 8459 DCHECK_OPCODE(LCGR); |
| 8460 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8461 int64_t r2_val = get_register(r2); |
| 8462 r2_val = ~r2_val; |
| 8463 r2_val = r2_val + 1; |
| 8464 set_register(r1, r2_val); |
| 8465 SetS390ConditionCode<int64_t>(r2_val, 0); |
| 8466 // if the input is INT_MIN, loading its compliment would be overflowing |
| 8467 if (r2_val < 0 && (r2_val + 1) > 0) { |
| 8468 SetS390OverflowCode(true); |
| 8469 } |
| 8470 return length; |
| 8471 } |
8209 | 8472 |
8210 EVALUATE(SGR) { return DecodeInstructionOriginal(instr); } | 8473 EVALUATE(SGR) { |
| 8474 DCHECK_OPCODE(SGR); |
| 8475 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8476 int64_t r1_val = get_register(r1); |
| 8477 int64_t r2_val = get_register(r2); |
| 8478 bool isOF = false; |
| 8479 isOF = CheckOverflowForIntSub(r1_val, r2_val, int64_t); |
| 8480 r1_val -= r2_val; |
| 8481 SetS390ConditionCode<int64_t>(r1_val, 0); |
| 8482 SetS390OverflowCode(isOF); |
| 8483 set_register(r1, r1_val); |
| 8484 return length; |
| 8485 } |
8211 | 8486 |
8212 EVALUATE(ALGR) { return DecodeInstructionOriginal(instr); } | 8487 EVALUATE(ALGR) { return DecodeInstructionOriginal(instr); } |
8213 | 8488 |
8214 EVALUATE(SLGR) { return DecodeInstructionOriginal(instr); } | 8489 EVALUATE(SLGR) { return DecodeInstructionOriginal(instr); } |
8215 | 8490 |
8216 EVALUATE(MSGR) { return DecodeInstructionOriginal(instr); } | 8491 EVALUATE(MSGR) { |
| 8492 DCHECK_OPCODE(MSGR); |
| 8493 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8494 int64_t r1_val = get_register(r1); |
| 8495 int64_t r2_val = get_register(r2); |
| 8496 set_register(r1, r1_val * r2_val); |
| 8497 return length; |
| 8498 } |
8217 | 8499 |
8218 EVALUATE(DSGR) { return DecodeInstructionOriginal(instr); } | 8500 EVALUATE(DSGR) { |
| 8501 DCHECK_OPCODE(DSGR); |
| 8502 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8503 |
| 8504 DCHECK(r1 % 2 == 0); |
| 8505 |
| 8506 int64_t dividend = get_register(r1 + 1); |
| 8507 int64_t divisor = get_register(r2); |
| 8508 set_register(r1, dividend % divisor); |
| 8509 set_register(r1 + 1, dividend / divisor); |
| 8510 return length; |
| 8511 } |
8219 | 8512 |
8220 EVALUATE(LRVGR) { return DecodeInstructionOriginal(instr); } | 8513 EVALUATE(LRVGR) { return DecodeInstructionOriginal(instr); } |
8221 | 8514 |
8222 EVALUATE(LPGFR) { return DecodeInstructionOriginal(instr); } | 8515 EVALUATE(LPGFR) { return DecodeInstructionOriginal(instr); } |
8223 | 8516 |
8224 EVALUATE(LNGFR) { return DecodeInstructionOriginal(instr); } | 8517 EVALUATE(LNGFR) { return DecodeInstructionOriginal(instr); } |
8225 | 8518 |
8226 EVALUATE(LTGFR) { return DecodeInstructionOriginal(instr); } | 8519 EVALUATE(LTGFR) { |
| 8520 DCHECK_OPCODE(LTGFR); |
| 8521 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8522 // Load and Test Register (64 <- 32) (Sign Extends 32-bit val) |
| 8523 // Load Register (64 <- 32) (Sign Extends 32-bit val) |
| 8524 int32_t r2_val = get_low_register<int32_t>(r2); |
| 8525 int64_t result = static_cast<int64_t>(r2_val); |
| 8526 set_register(r1, result); |
| 8527 SetS390ConditionCode<int64_t>(result, 0); |
| 8528 return length; |
| 8529 } |
8227 | 8530 |
8228 EVALUATE(LCGFR) { return DecodeInstructionOriginal(instr); } | 8531 EVALUATE(LCGFR) { |
| 8532 DCHECK_OPCODE(LCGFR); |
| 8533 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8534 // Load and Test Register (64 <- 32) (Sign Extends 32-bit val) |
| 8535 // Load Register (64 <- 32) (Sign Extends 32-bit val) |
| 8536 int32_t r2_val = get_low_register<int32_t>(r2); |
| 8537 int64_t result = static_cast<int64_t>(r2_val); |
| 8538 set_register(r1, result); |
| 8539 return length; |
| 8540 } |
8229 | 8541 |
8230 EVALUATE(LLGFR) { return DecodeInstructionOriginal(instr); } | 8542 EVALUATE(LLGFR) { return DecodeInstructionOriginal(instr); } |
8231 | 8543 |
8232 EVALUATE(LLGTR) { return DecodeInstructionOriginal(instr); } | 8544 EVALUATE(LLGTR) { return DecodeInstructionOriginal(instr); } |
8233 | 8545 |
8234 EVALUATE(AGFR) { return DecodeInstructionOriginal(instr); } | 8546 EVALUATE(AGFR) { |
| 8547 DCHECK_OPCODE(AGFR); |
| 8548 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8549 // Add Register (64 <- 32) (Sign Extends 32-bit val) |
| 8550 int64_t r1_val = get_register(r1); |
| 8551 int64_t r2_val = static_cast<int64_t>(get_low_register<int32_t>(r2)); |
| 8552 bool isOF = CheckOverflowForIntAdd(r1_val, r2_val, int64_t); |
| 8553 r1_val += r2_val; |
| 8554 SetS390ConditionCode<int64_t>(r1_val, 0); |
| 8555 SetS390OverflowCode(isOF); |
| 8556 set_register(r1, r1_val); |
| 8557 return length; |
| 8558 } |
8235 | 8559 |
8236 EVALUATE(SGFR) { return DecodeInstructionOriginal(instr); } | 8560 EVALUATE(SGFR) { |
| 8561 DCHECK_OPCODE(SGFR); |
| 8562 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8563 // Sub Reg (64 <- 32) |
| 8564 int64_t r1_val = get_register(r1); |
| 8565 int64_t r2_val = static_cast<int64_t>(get_low_register<int32_t>(r2)); |
| 8566 bool isOF = false; |
| 8567 isOF = CheckOverflowForIntSub(r1_val, r2_val, int64_t); |
| 8568 r1_val -= r2_val; |
| 8569 SetS390ConditionCode<int64_t>(r1_val, 0); |
| 8570 SetS390OverflowCode(isOF); |
| 8571 set_register(r1, r1_val); |
| 8572 return length; |
| 8573 } |
8237 | 8574 |
8238 EVALUATE(ALGFR) { return DecodeInstructionOriginal(instr); } | 8575 EVALUATE(ALGFR) { return DecodeInstructionOriginal(instr); } |
8239 | 8576 |
8240 EVALUATE(SLGFR) { return DecodeInstructionOriginal(instr); } | 8577 EVALUATE(SLGFR) { return DecodeInstructionOriginal(instr); } |
8241 | 8578 |
8242 EVALUATE(MSGFR) { return DecodeInstructionOriginal(instr); } | 8579 EVALUATE(MSGFR) { return DecodeInstructionOriginal(instr); } |
8243 | 8580 |
8244 EVALUATE(DSGFR) { return DecodeInstructionOriginal(instr); } | 8581 EVALUATE(DSGFR) { return DecodeInstructionOriginal(instr); } |
8245 | 8582 |
8246 EVALUATE(KMAC) { return DecodeInstructionOriginal(instr); } | 8583 EVALUATE(KMAC) { return DecodeInstructionOriginal(instr); } |
8247 | 8584 |
8248 EVALUATE(LRVR) { return DecodeInstructionOriginal(instr); } | 8585 EVALUATE(LRVR) { return DecodeInstructionOriginal(instr); } |
8249 | 8586 |
8250 EVALUATE(CGR) { return DecodeInstructionOriginal(instr); } | 8587 EVALUATE(CGR) { |
| 8588 DCHECK_OPCODE(CGR); |
| 8589 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8590 // Compare (64) |
| 8591 int64_t r1_val = get_register(r1); |
| 8592 int64_t r2_val = get_register(r2); |
| 8593 SetS390ConditionCode<int64_t>(r1_val, r2_val); |
| 8594 return length; |
| 8595 } |
8251 | 8596 |
8252 EVALUATE(CLGR) { return DecodeInstructionOriginal(instr); } | 8597 EVALUATE(CLGR) { |
| 8598 DCHECK_OPCODE(CLGR); |
| 8599 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8600 // Compare Logical (64) |
| 8601 uint64_t r1_val = static_cast<uint64_t>(get_register(r1)); |
| 8602 uint64_t r2_val = static_cast<uint64_t>(get_register(r2)); |
| 8603 SetS390ConditionCode<uint64_t>(r1_val, r2_val); |
| 8604 return length; |
| 8605 } |
8253 | 8606 |
8254 EVALUATE(KMF) { return DecodeInstructionOriginal(instr); } | 8607 EVALUATE(KMF) { return DecodeInstructionOriginal(instr); } |
8255 | 8608 |
8256 EVALUATE(KMO) { return DecodeInstructionOriginal(instr); } | 8609 EVALUATE(KMO) { return DecodeInstructionOriginal(instr); } |
8257 | 8610 |
8258 EVALUATE(PCC) { return DecodeInstructionOriginal(instr); } | 8611 EVALUATE(PCC) { return DecodeInstructionOriginal(instr); } |
8259 | 8612 |
8260 EVALUATE(KMCTR) { return DecodeInstructionOriginal(instr); } | 8613 EVALUATE(KMCTR) { return DecodeInstructionOriginal(instr); } |
8261 | 8614 |
8262 EVALUATE(KM) { return DecodeInstructionOriginal(instr); } | 8615 EVALUATE(KM) { return DecodeInstructionOriginal(instr); } |
(...skipping 25 matching lines...) Expand all Loading... |
8288 EVALUATE(CDLFTR) { return DecodeInstructionOriginal(instr); } | 8641 EVALUATE(CDLFTR) { return DecodeInstructionOriginal(instr); } |
8289 | 8642 |
8290 EVALUATE(CXFTR) { return DecodeInstructionOriginal(instr); } | 8643 EVALUATE(CXFTR) { return DecodeInstructionOriginal(instr); } |
8291 | 8644 |
8292 EVALUATE(CXLGTR) { return DecodeInstructionOriginal(instr); } | 8645 EVALUATE(CXLGTR) { return DecodeInstructionOriginal(instr); } |
8293 | 8646 |
8294 EVALUATE(CXLFTR) { return DecodeInstructionOriginal(instr); } | 8647 EVALUATE(CXLFTR) { return DecodeInstructionOriginal(instr); } |
8295 | 8648 |
8296 EVALUATE(CGRT) { return DecodeInstructionOriginal(instr); } | 8649 EVALUATE(CGRT) { return DecodeInstructionOriginal(instr); } |
8297 | 8650 |
8298 EVALUATE(NGR) { return DecodeInstructionOriginal(instr); } | 8651 EVALUATE(NGR) { |
| 8652 DCHECK_OPCODE(NGR); |
| 8653 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8654 int64_t r1_val = get_register(r1); |
| 8655 int64_t r2_val = get_register(r2); |
| 8656 r1_val &= r2_val; |
| 8657 SetS390BitWiseConditionCode<uint64_t>(r1_val); |
| 8658 set_register(r1, r1_val); |
| 8659 return length; |
| 8660 } |
8299 | 8661 |
8300 EVALUATE(OGR) { return DecodeInstructionOriginal(instr); } | 8662 EVALUATE(OGR) { |
| 8663 DCHECK_OPCODE(OGR); |
| 8664 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8665 int64_t r1_val = get_register(r1); |
| 8666 int64_t r2_val = get_register(r2); |
| 8667 r1_val |= r2_val; |
| 8668 SetS390BitWiseConditionCode<uint64_t>(r1_val); |
| 8669 set_register(r1, r1_val); |
| 8670 return length; |
| 8671 } |
8301 | 8672 |
8302 EVALUATE(XGR) { return DecodeInstructionOriginal(instr); } | 8673 EVALUATE(XGR) { |
| 8674 DCHECK_OPCODE(XGR); |
| 8675 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8676 int64_t r1_val = get_register(r1); |
| 8677 int64_t r2_val = get_register(r2); |
| 8678 r1_val ^= r2_val; |
| 8679 SetS390BitWiseConditionCode<uint64_t>(r1_val); |
| 8680 set_register(r1, r1_val); |
| 8681 return length; |
| 8682 } |
8303 | 8683 |
8304 EVALUATE(FLOGR) { return DecodeInstructionOriginal(instr); } | 8684 EVALUATE(FLOGR) { |
| 8685 DCHECK_OPCODE(FLOGR); |
| 8686 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8687 |
| 8688 DCHECK(r1 % 2 == 0); |
| 8689 |
| 8690 int64_t r2_val = get_register(r2); |
| 8691 |
| 8692 int i = 0; |
| 8693 for (; i < 64; i++) { |
| 8694 if (r2_val < 0) break; |
| 8695 r2_val <<= 1; |
| 8696 } |
| 8697 |
| 8698 r2_val = get_register(r2); |
| 8699 |
| 8700 int64_t mask = ~(1 << (63 - i)); |
| 8701 set_register(r1, i); |
| 8702 set_register(r1 + 1, r2_val & mask); |
| 8703 return length; |
| 8704 } |
8305 | 8705 |
8306 EVALUATE(LLGCR) { return DecodeInstructionOriginal(instr); } | 8706 EVALUATE(LLGCR) { return DecodeInstructionOriginal(instr); } |
8307 | 8707 |
8308 EVALUATE(LLGHR) { return DecodeInstructionOriginal(instr); } | 8708 EVALUATE(LLGHR) { return DecodeInstructionOriginal(instr); } |
8309 | 8709 |
8310 EVALUATE(MLGR) { return DecodeInstructionOriginal(instr); } | 8710 EVALUATE(MLGR) { return DecodeInstructionOriginal(instr); } |
8311 | 8711 |
8312 EVALUATE(DLGR) { return DecodeInstructionOriginal(instr); } | 8712 EVALUATE(DLGR) { |
| 8713 DCHECK_OPCODE(DLGR); |
| 8714 #ifdef V8_TARGET_ARCH_S390X |
| 8715 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8716 uint64_t r1_val = get_register(r1); |
| 8717 uint64_t r2_val = get_register(r2); |
| 8718 DCHECK(r1 % 2 == 0); |
| 8719 unsigned __int128 dividend = static_cast<unsigned __int128>(r1_val) << 64; |
| 8720 dividend += get_register(r1 + 1); |
| 8721 uint64_t remainder = dividend % r2_val; |
| 8722 uint64_t quotient = dividend / r2_val; |
| 8723 r1_val = remainder; |
| 8724 set_register(r1, remainder); |
| 8725 set_register(r1 + 1, quotient); |
| 8726 return length; |
| 8727 #else |
| 8728 UNREACHABLE(); |
| 8729 #endif |
| 8730 } |
8313 | 8731 |
8314 EVALUATE(ALCGR) { return DecodeInstructionOriginal(instr); } | 8732 EVALUATE(ALCGR) { return DecodeInstructionOriginal(instr); } |
8315 | 8733 |
8316 EVALUATE(SLBGR) { return DecodeInstructionOriginal(instr); } | 8734 EVALUATE(SLBGR) { return DecodeInstructionOriginal(instr); } |
8317 | 8735 |
8318 EVALUATE(EPSW) { return DecodeInstructionOriginal(instr); } | 8736 EVALUATE(EPSW) { return DecodeInstructionOriginal(instr); } |
8319 | 8737 |
8320 EVALUATE(TRTT) { return DecodeInstructionOriginal(instr); } | 8738 EVALUATE(TRTT) { return DecodeInstructionOriginal(instr); } |
8321 | 8739 |
8322 EVALUATE(TRTO) { return DecodeInstructionOriginal(instr); } | 8740 EVALUATE(TRTO) { return DecodeInstructionOriginal(instr); } |
8323 | 8741 |
8324 EVALUATE(TROT) { return DecodeInstructionOriginal(instr); } | 8742 EVALUATE(TROT) { return DecodeInstructionOriginal(instr); } |
8325 | 8743 |
8326 EVALUATE(TROO) { return DecodeInstructionOriginal(instr); } | 8744 EVALUATE(TROO) { return DecodeInstructionOriginal(instr); } |
8327 | 8745 |
8328 EVALUATE(LLCR) { return DecodeInstructionOriginal(instr); } | 8746 EVALUATE(LLCR) { return DecodeInstructionOriginal(instr); } |
8329 | 8747 |
8330 EVALUATE(LLHR) { return DecodeInstructionOriginal(instr); } | 8748 EVALUATE(LLHR) { return DecodeInstructionOriginal(instr); } |
8331 | 8749 |
8332 EVALUATE(MLR) { return DecodeInstructionOriginal(instr); } | 8750 EVALUATE(MLR) { |
| 8751 DCHECK_OPCODE(MLR); |
| 8752 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8753 DCHECK(r1 % 2 == 0); |
8333 | 8754 |
8334 EVALUATE(DLR) { return DecodeInstructionOriginal(instr); } | 8755 uint32_t r1_val = get_low_register<uint32_t>(r1 + 1); |
| 8756 uint32_t r2_val = get_low_register<uint32_t>(r2); |
| 8757 uint64_t product = |
| 8758 static_cast<uint64_t>(r1_val) * static_cast<uint64_t>(r2_val); |
| 8759 int32_t high_bits = product >> 32; |
| 8760 int32_t low_bits = product & 0x00000000FFFFFFFF; |
| 8761 set_low_register(r1, high_bits); |
| 8762 set_low_register(r1 + 1, low_bits); |
| 8763 return length; |
| 8764 } |
8335 | 8765 |
8336 EVALUATE(ALCR) { return DecodeInstructionOriginal(instr); } | 8766 EVALUATE(DLR) { |
| 8767 DCHECK_OPCODE(DLR); |
| 8768 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8769 uint32_t r1_val = get_low_register<uint32_t>(r1); |
| 8770 uint32_t r2_val = get_low_register<uint32_t>(r2); |
| 8771 DCHECK(r1 % 2 == 0); |
| 8772 uint64_t dividend = static_cast<uint64_t>(r1_val) << 32; |
| 8773 dividend += get_low_register<uint32_t>(r1 + 1); |
| 8774 uint32_t remainder = dividend % r2_val; |
| 8775 uint32_t quotient = dividend / r2_val; |
| 8776 r1_val = remainder; |
| 8777 set_low_register(r1, remainder); |
| 8778 set_low_register(r1 + 1, quotient); |
| 8779 return length; |
| 8780 } |
8337 | 8781 |
8338 EVALUATE(SLBR) { return DecodeInstructionOriginal(instr); } | 8782 EVALUATE(ALCR) { |
| 8783 DCHECK_OPCODE(ALCR); |
| 8784 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8785 uint32_t r1_val = get_low_register<uint32_t>(r1); |
| 8786 uint32_t r2_val = get_low_register<uint32_t>(r2); |
| 8787 uint32_t alu_out = 0; |
| 8788 bool isOF = false; |
| 8789 |
| 8790 alu_out = r1_val + r2_val; |
| 8791 bool isOF_original = CheckOverflowForUIntAdd(r1_val, r2_val); |
| 8792 if (TestConditionCode((Condition)2) || TestConditionCode((Condition)3)) { |
| 8793 alu_out = alu_out + 1; |
| 8794 isOF = isOF_original || CheckOverflowForUIntAdd(alu_out, 1); |
| 8795 } else { |
| 8796 isOF = isOF_original; |
| 8797 } |
| 8798 set_low_register(r1, alu_out); |
| 8799 SetS390ConditionCodeCarry<uint32_t>(alu_out, isOF); |
| 8800 return length; |
| 8801 } |
| 8802 |
| 8803 EVALUATE(SLBR) { |
| 8804 DCHECK_OPCODE(SLBR); |
| 8805 DECODE_RRE_INSTRUCTION(r1, r2); |
| 8806 uint32_t r1_val = get_low_register<uint32_t>(r1); |
| 8807 uint32_t r2_val = get_low_register<uint32_t>(r2); |
| 8808 uint32_t alu_out = 0; |
| 8809 bool isOF = false; |
| 8810 |
| 8811 alu_out = r1_val - r2_val; |
| 8812 bool isOF_original = CheckOverflowForUIntSub(r1_val, r2_val); |
| 8813 if (TestConditionCode((Condition)2) || TestConditionCode((Condition)3)) { |
| 8814 alu_out = alu_out - 1; |
| 8815 isOF = isOF_original || CheckOverflowForUIntSub(alu_out, 1); |
| 8816 } else { |
| 8817 isOF = isOF_original; |
| 8818 } |
| 8819 set_low_register(r1, alu_out); |
| 8820 SetS390ConditionCodeCarry<uint32_t>(alu_out, isOF); |
| 8821 return length; |
| 8822 } |
8339 | 8823 |
8340 EVALUATE(CU14) { return DecodeInstructionOriginal(instr); } | 8824 EVALUATE(CU14) { return DecodeInstructionOriginal(instr); } |
8341 | 8825 |
8342 EVALUATE(CU24) { return DecodeInstructionOriginal(instr); } | 8826 EVALUATE(CU24) { return DecodeInstructionOriginal(instr); } |
8343 | 8827 |
8344 EVALUATE(CU41) { return DecodeInstructionOriginal(instr); } | 8828 EVALUATE(CU41) { return DecodeInstructionOriginal(instr); } |
8345 | 8829 |
8346 EVALUATE(CU42) { return DecodeInstructionOriginal(instr); } | 8830 EVALUATE(CU42) { return DecodeInstructionOriginal(instr); } |
8347 | 8831 |
8348 EVALUATE(TRTRE) { return DecodeInstructionOriginal(instr); } | 8832 EVALUATE(TRTRE) { return DecodeInstructionOriginal(instr); } |
(...skipping 19 matching lines...) Expand all Loading... |
8368 EVALUATE(ALHHLR) { return DecodeInstructionOriginal(instr); } | 8852 EVALUATE(ALHHLR) { return DecodeInstructionOriginal(instr); } |
8369 | 8853 |
8370 EVALUATE(SLHHLR) { return DecodeInstructionOriginal(instr); } | 8854 EVALUATE(SLHHLR) { return DecodeInstructionOriginal(instr); } |
8371 | 8855 |
8372 EVALUATE(CHLR) { return DecodeInstructionOriginal(instr); } | 8856 EVALUATE(CHLR) { return DecodeInstructionOriginal(instr); } |
8373 | 8857 |
8374 EVALUATE(POPCNT_Z) { return DecodeInstructionOriginal(instr); } | 8858 EVALUATE(POPCNT_Z) { return DecodeInstructionOriginal(instr); } |
8375 | 8859 |
8376 EVALUATE(LOCGR) { return DecodeInstructionOriginal(instr); } | 8860 EVALUATE(LOCGR) { return DecodeInstructionOriginal(instr); } |
8377 | 8861 |
8378 EVALUATE(NGRK) { return DecodeInstructionOriginal(instr); } | 8862 EVALUATE(NGRK) { |
8379 | 8863 DCHECK_OPCODE(NGRK); |
8380 EVALUATE(OGRK) { return DecodeInstructionOriginal(instr); } | 8864 DECODE_RRF_A_INSTRUCTION(r1, r2, r3); |
8381 | 8865 // 64-bit Non-clobbering arithmetics / bitwise ops. |
8382 EVALUATE(XGRK) { return DecodeInstructionOriginal(instr); } | 8866 int64_t r2_val = get_register(r2); |
8383 | 8867 int64_t r3_val = get_register(r3); |
8384 EVALUATE(AGRK) { return DecodeInstructionOriginal(instr); } | 8868 uint64_t bitwise_result = 0; |
8385 | 8869 bitwise_result = r2_val & r3_val; |
8386 EVALUATE(SGRK) { return DecodeInstructionOriginal(instr); } | 8870 SetS390BitWiseConditionCode<uint64_t>(bitwise_result); |
8387 | 8871 set_register(r1, bitwise_result); |
8388 EVALUATE(ALGRK) { return DecodeInstructionOriginal(instr); } | 8872 return length; |
8389 | 8873 } |
8390 EVALUATE(SLGRK) { return DecodeInstructionOriginal(instr); } | 8874 |
| 8875 EVALUATE(OGRK) { |
| 8876 DCHECK_OPCODE(OGRK); |
| 8877 DECODE_RRF_A_INSTRUCTION(r1, r2, r3); |
| 8878 // 64-bit Non-clobbering arithmetics / bitwise ops. |
| 8879 int64_t r2_val = get_register(r2); |
| 8880 int64_t r3_val = get_register(r3); |
| 8881 uint64_t bitwise_result = 0; |
| 8882 bitwise_result = r2_val | r3_val; |
| 8883 SetS390BitWiseConditionCode<uint64_t>(bitwise_result); |
| 8884 set_register(r1, bitwise_result); |
| 8885 return length; |
| 8886 } |
| 8887 |
| 8888 EVALUATE(XGRK) { |
| 8889 DCHECK_OPCODE(XGRK); |
| 8890 DECODE_RRF_A_INSTRUCTION(r1, r2, r3); |
| 8891 // 64-bit Non-clobbering arithmetics / bitwise ops. |
| 8892 int64_t r2_val = get_register(r2); |
| 8893 int64_t r3_val = get_register(r3); |
| 8894 uint64_t bitwise_result = 0; |
| 8895 bitwise_result = r2_val ^ r3_val; |
| 8896 SetS390BitWiseConditionCode<uint64_t>(bitwise_result); |
| 8897 set_register(r1, bitwise_result); |
| 8898 return length; |
| 8899 } |
| 8900 |
| 8901 EVALUATE(AGRK) { |
| 8902 DCHECK_OPCODE(AGRK); |
| 8903 DECODE_RRF_A_INSTRUCTION(r1, r2, r3); |
| 8904 // 64-bit Non-clobbering arithmetics / bitwise ops. |
| 8905 int64_t r2_val = get_register(r2); |
| 8906 int64_t r3_val = get_register(r3); |
| 8907 bool isOF = CheckOverflowForIntAdd(r2_val, r3_val, int64_t); |
| 8908 SetS390ConditionCode<int64_t>(r2_val + r3_val, 0); |
| 8909 SetS390OverflowCode(isOF); |
| 8910 set_register(r1, r2_val + r3_val); |
| 8911 return length; |
| 8912 } |
| 8913 |
| 8914 EVALUATE(SGRK) { |
| 8915 DCHECK_OPCODE(SGRK); |
| 8916 DECODE_RRF_A_INSTRUCTION(r1, r2, r3); |
| 8917 // 64-bit Non-clobbering arithmetics / bitwise ops. |
| 8918 int64_t r2_val = get_register(r2); |
| 8919 int64_t r3_val = get_register(r3); |
| 8920 bool isOF = CheckOverflowForIntSub(r2_val, r3_val, int64_t); |
| 8921 SetS390ConditionCode<int64_t>(r2_val - r3_val, 0); |
| 8922 SetS390OverflowCode(isOF); |
| 8923 set_register(r1, r2_val - r3_val); |
| 8924 return length; |
| 8925 } |
| 8926 |
| 8927 EVALUATE(ALGRK) { |
| 8928 DCHECK_OPCODE(ALGRK); |
| 8929 DECODE_RRF_A_INSTRUCTION(r1, r2, r3); |
| 8930 // 64-bit Non-clobbering unsigned arithmetics |
| 8931 uint64_t r2_val = get_register(r2); |
| 8932 uint64_t r3_val = get_register(r3); |
| 8933 bool isOF = CheckOverflowForUIntAdd(r2_val, r3_val); |
| 8934 SetS390ConditionCode<uint64_t>(r2_val + r3_val, 0); |
| 8935 SetS390OverflowCode(isOF); |
| 8936 set_register(r1, r2_val + r3_val); |
| 8937 return length; |
| 8938 } |
| 8939 |
| 8940 EVALUATE(SLGRK) { |
| 8941 DCHECK_OPCODE(SLGRK); |
| 8942 DECODE_RRF_A_INSTRUCTION(r1, r2, r3); |
| 8943 // 64-bit Non-clobbering unsigned arithmetics |
| 8944 uint64_t r2_val = get_register(r2); |
| 8945 uint64_t r3_val = get_register(r3); |
| 8946 bool isOF = CheckOverflowForUIntSub(r2_val, r3_val); |
| 8947 SetS390ConditionCode<uint64_t>(r2_val - r3_val, 0); |
| 8948 SetS390OverflowCode(isOF); |
| 8949 set_register(r1, r2_val - r3_val); |
| 8950 return length; |
| 8951 } |
8391 | 8952 |
8392 EVALUATE(LOCR) { return DecodeInstructionOriginal(instr); } | 8953 EVALUATE(LOCR) { return DecodeInstructionOriginal(instr); } |
8393 | 8954 |
8394 EVALUATE(NRK) { return DecodeInstructionOriginal(instr); } | 8955 EVALUATE(NRK) { |
8395 | 8956 DCHECK_OPCODE(NRK); |
8396 EVALUATE(ORK) { return DecodeInstructionOriginal(instr); } | 8957 DECODE_RRF_A_INSTRUCTION(r1, r2, r3); |
8397 | 8958 // 32-bit Non-clobbering arithmetics / bitwise ops |
8398 EVALUATE(XRK) { return DecodeInstructionOriginal(instr); } | 8959 int32_t r2_val = get_low_register<int32_t>(r2); |
8399 | 8960 int32_t r3_val = get_low_register<int32_t>(r3); |
8400 EVALUATE(ARK) { return DecodeInstructionOriginal(instr); } | 8961 // Assume bitwise operation here |
8401 | 8962 uint32_t bitwise_result = 0; |
8402 EVALUATE(SRK) { return DecodeInstructionOriginal(instr); } | 8963 bitwise_result = r2_val & r3_val; |
8403 | 8964 SetS390BitWiseConditionCode<uint32_t>(bitwise_result); |
8404 EVALUATE(ALRK) { return DecodeInstructionOriginal(instr); } | 8965 set_low_register(r1, bitwise_result); |
8405 | 8966 return length; |
8406 EVALUATE(SLRK) { return DecodeInstructionOriginal(instr); } | 8967 } |
8407 | 8968 |
8408 EVALUATE(LTG) { return DecodeInstructionOriginal(instr); } | 8969 EVALUATE(ORK) { |
| 8970 DCHECK_OPCODE(ORK); |
| 8971 DECODE_RRF_A_INSTRUCTION(r1, r2, r3); |
| 8972 // 32-bit Non-clobbering arithmetics / bitwise ops |
| 8973 int32_t r2_val = get_low_register<int32_t>(r2); |
| 8974 int32_t r3_val = get_low_register<int32_t>(r3); |
| 8975 // Assume bitwise operation here |
| 8976 uint32_t bitwise_result = 0; |
| 8977 bitwise_result = r2_val | r3_val; |
| 8978 SetS390BitWiseConditionCode<uint32_t>(bitwise_result); |
| 8979 set_low_register(r1, bitwise_result); |
| 8980 return length; |
| 8981 } |
| 8982 |
| 8983 EVALUATE(XRK) { |
| 8984 DCHECK_OPCODE(XRK); |
| 8985 DECODE_RRF_A_INSTRUCTION(r1, r2, r3); |
| 8986 // 32-bit Non-clobbering arithmetics / bitwise ops |
| 8987 int32_t r2_val = get_low_register<int32_t>(r2); |
| 8988 int32_t r3_val = get_low_register<int32_t>(r3); |
| 8989 // Assume bitwise operation here |
| 8990 uint32_t bitwise_result = 0; |
| 8991 bitwise_result = r2_val ^ r3_val; |
| 8992 SetS390BitWiseConditionCode<uint32_t>(bitwise_result); |
| 8993 set_low_register(r1, bitwise_result); |
| 8994 return length; |
| 8995 } |
| 8996 |
| 8997 EVALUATE(ARK) { |
| 8998 DCHECK_OPCODE(ARK); |
| 8999 DECODE_RRF_A_INSTRUCTION(r1, r2, r3); |
| 9000 // 32-bit Non-clobbering arithmetics / bitwise ops |
| 9001 int32_t r2_val = get_low_register<int32_t>(r2); |
| 9002 int32_t r3_val = get_low_register<int32_t>(r3); |
| 9003 bool isOF = CheckOverflowForIntAdd(r2_val, r3_val, int32_t); |
| 9004 SetS390ConditionCode<int32_t>(r2_val + r3_val, 0); |
| 9005 SetS390OverflowCode(isOF); |
| 9006 set_low_register(r1, r2_val + r3_val); |
| 9007 return length; |
| 9008 } |
| 9009 |
| 9010 EVALUATE(SRK) { |
| 9011 DCHECK_OPCODE(SRK); |
| 9012 DECODE_RRF_A_INSTRUCTION(r1, r2, r3); |
| 9013 // 32-bit Non-clobbering arithmetics / bitwise ops |
| 9014 int32_t r2_val = get_low_register<int32_t>(r2); |
| 9015 int32_t r3_val = get_low_register<int32_t>(r3); |
| 9016 bool isOF = CheckOverflowForIntSub(r2_val, r3_val, int32_t); |
| 9017 SetS390ConditionCode<int32_t>(r2_val - r3_val, 0); |
| 9018 SetS390OverflowCode(isOF); |
| 9019 set_low_register(r1, r2_val - r3_val); |
| 9020 return length; |
| 9021 } |
| 9022 |
| 9023 EVALUATE(ALRK) { |
| 9024 DCHECK_OPCODE(ALRK); |
| 9025 DECODE_RRF_A_INSTRUCTION(r1, r2, r3); |
| 9026 // 32-bit Non-clobbering unsigned arithmetics |
| 9027 uint32_t r2_val = get_low_register<uint32_t>(r2); |
| 9028 uint32_t r3_val = get_low_register<uint32_t>(r3); |
| 9029 bool isOF = CheckOverflowForUIntAdd(r2_val, r3_val); |
| 9030 SetS390ConditionCode<uint32_t>(r2_val + r3_val, 0); |
| 9031 SetS390OverflowCode(isOF); |
| 9032 set_low_register(r1, r2_val + r3_val); |
| 9033 return length; |
| 9034 } |
| 9035 |
| 9036 EVALUATE(SLRK) { |
| 9037 DCHECK_OPCODE(SLRK); |
| 9038 DECODE_RRF_A_INSTRUCTION(r1, r2, r3); |
| 9039 // 32-bit Non-clobbering unsigned arithmetics |
| 9040 uint32_t r2_val = get_low_register<uint32_t>(r2); |
| 9041 uint32_t r3_val = get_low_register<uint32_t>(r3); |
| 9042 bool isOF = CheckOverflowForUIntSub(r2_val, r3_val); |
| 9043 SetS390ConditionCode<uint32_t>(r2_val - r3_val, 0); |
| 9044 SetS390OverflowCode(isOF); |
| 9045 set_low_register(r1, r2_val - r3_val); |
| 9046 return length; |
| 9047 } |
| 9048 |
| 9049 EVALUATE(LTG) { |
| 9050 DCHECK_OPCODE(LTG); |
| 9051 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9052 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9053 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9054 intptr_t addr = x2_val + b2_val + d2; |
| 9055 int64_t value = ReadDW(addr); |
| 9056 set_register(r1, value); |
| 9057 SetS390ConditionCode<int64_t>(value, 0); |
| 9058 return length; |
| 9059 } |
8409 | 9060 |
8410 EVALUATE(CVBY) { return DecodeInstructionOriginal(instr); } | 9061 EVALUATE(CVBY) { return DecodeInstructionOriginal(instr); } |
8411 | 9062 |
8412 EVALUATE(AG) { return DecodeInstructionOriginal(instr); } | 9063 EVALUATE(AG) { |
8413 | 9064 DCHECK_OPCODE(AG); |
8414 EVALUATE(SG) { return DecodeInstructionOriginal(instr); } | 9065 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
8415 | 9066 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
8416 EVALUATE(ALG) { return DecodeInstructionOriginal(instr); } | 9067 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
8417 | 9068 int64_t alu_out = get_register(r1); |
8418 EVALUATE(SLG) { return DecodeInstructionOriginal(instr); } | 9069 int64_t mem_val = ReadDW(b2_val + x2_val + d2); |
8419 | 9070 alu_out += mem_val; |
8420 EVALUATE(MSG) { return DecodeInstructionOriginal(instr); } | 9071 SetS390ConditionCode<int32_t>(alu_out, 0); |
| 9072 set_register(r1, alu_out); |
| 9073 return length; |
| 9074 } |
| 9075 |
| 9076 EVALUATE(SG) { |
| 9077 DCHECK_OPCODE(SG); |
| 9078 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9079 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9080 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9081 int64_t alu_out = get_register(r1); |
| 9082 int64_t mem_val = ReadDW(b2_val + x2_val + d2); |
| 9083 alu_out -= mem_val; |
| 9084 SetS390ConditionCode<int32_t>(alu_out, 0); |
| 9085 set_register(r1, alu_out); |
| 9086 return length; |
| 9087 } |
| 9088 |
| 9089 EVALUATE(ALG) { |
| 9090 DCHECK_OPCODE(ALG); |
| 9091 #ifndef V8_TARGET_ARCH_S390X |
| 9092 DCHECK(false); |
| 9093 #endif |
| 9094 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9095 uint64_t r1_val = get_register(r1); |
| 9096 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9097 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9098 intptr_t d2_val = d2; |
| 9099 uint64_t alu_out = r1_val; |
| 9100 uint64_t mem_val = static_cast<uint64_t>(ReadDW(b2_val + d2_val + x2_val)); |
| 9101 alu_out += mem_val; |
| 9102 SetS390ConditionCode<uint64_t>(alu_out, 0); |
| 9103 set_register(r1, alu_out); |
| 9104 return length; |
| 9105 } |
| 9106 |
| 9107 EVALUATE(SLG) { |
| 9108 DCHECK_OPCODE(SLG); |
| 9109 #ifndef V8_TARGET_ARCH_S390X |
| 9110 DCHECK(false); |
| 9111 #endif |
| 9112 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9113 uint64_t r1_val = get_register(r1); |
| 9114 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9115 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9116 intptr_t d2_val = d2; |
| 9117 uint64_t alu_out = r1_val; |
| 9118 uint64_t mem_val = static_cast<uint64_t>(ReadDW(b2_val + d2_val + x2_val)); |
| 9119 alu_out -= mem_val; |
| 9120 SetS390ConditionCode<uint64_t>(alu_out, 0); |
| 9121 set_register(r1, alu_out); |
| 9122 return length; |
| 9123 } |
| 9124 |
| 9125 EVALUATE(MSG) { |
| 9126 DCHECK_OPCODE(MSG); |
| 9127 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9128 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9129 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9130 intptr_t d2_val = d2; |
| 9131 int64_t mem_val = ReadDW(b2_val + d2_val + x2_val); |
| 9132 int64_t r1_val = get_register(r1); |
| 9133 set_register(r1, mem_val * r1_val); |
| 9134 return length; |
| 9135 } |
8421 | 9136 |
8422 EVALUATE(DSG) { return DecodeInstructionOriginal(instr); } | 9137 EVALUATE(DSG) { return DecodeInstructionOriginal(instr); } |
8423 | 9138 |
8424 EVALUATE(CVBG) { return DecodeInstructionOriginal(instr); } | 9139 EVALUATE(CVBG) { return DecodeInstructionOriginal(instr); } |
8425 | 9140 |
8426 EVALUATE(LRVG) { return DecodeInstructionOriginal(instr); } | 9141 EVALUATE(LRVG) { return DecodeInstructionOriginal(instr); } |
8427 | 9142 |
8428 EVALUATE(LT) { return DecodeInstructionOriginal(instr); } | 9143 EVALUATE(LT) { |
| 9144 DCHECK_OPCODE(LT); |
| 9145 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9146 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9147 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9148 intptr_t addr = x2_val + b2_val + d2; |
| 9149 int32_t value = ReadW(addr, instr); |
| 9150 set_low_register(r1, value); |
| 9151 SetS390ConditionCode<int32_t>(value, 0); |
| 9152 return length; |
| 9153 } |
8429 | 9154 |
8430 EVALUATE(LGH) { return DecodeInstructionOriginal(instr); } | 9155 EVALUATE(LGH) { |
| 9156 DCHECK_OPCODE(LGH); |
| 9157 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9158 // Miscellaneous Loads and Stores |
| 9159 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9160 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9161 intptr_t addr = x2_val + b2_val + d2; |
| 9162 int64_t mem_val = static_cast<int64_t>(ReadH(addr, instr)); |
| 9163 set_register(r1, mem_val); |
| 9164 return length; |
| 9165 } |
8431 | 9166 |
8432 EVALUATE(LLGF) { return DecodeInstructionOriginal(instr); } | 9167 EVALUATE(LLGF) { return DecodeInstructionOriginal(instr); } |
8433 | 9168 |
8434 EVALUATE(LLGT) { return DecodeInstructionOriginal(instr); } | 9169 EVALUATE(LLGT) { return DecodeInstructionOriginal(instr); } |
8435 | 9170 |
8436 EVALUATE(AGF) { return DecodeInstructionOriginal(instr); } | 9171 EVALUATE(AGF) { return DecodeInstructionOriginal(instr); } |
8437 | 9172 |
8438 EVALUATE(SGF) { return DecodeInstructionOriginal(instr); } | 9173 EVALUATE(SGF) { return DecodeInstructionOriginal(instr); } |
8439 | 9174 |
8440 EVALUATE(ALGF) { return DecodeInstructionOriginal(instr); } | 9175 EVALUATE(ALGF) { return DecodeInstructionOriginal(instr); } |
(...skipping 29 matching lines...) Expand all Loading... |
8470 EVALUATE(CGH) { return DecodeInstructionOriginal(instr); } | 9205 EVALUATE(CGH) { return DecodeInstructionOriginal(instr); } |
8471 | 9206 |
8472 EVALUATE(PFD) { return DecodeInstructionOriginal(instr); } | 9207 EVALUATE(PFD) { return DecodeInstructionOriginal(instr); } |
8473 | 9208 |
8474 EVALUATE(STRV) { return DecodeInstructionOriginal(instr); } | 9209 EVALUATE(STRV) { return DecodeInstructionOriginal(instr); } |
8475 | 9210 |
8476 EVALUATE(STRVH) { return DecodeInstructionOriginal(instr); } | 9211 EVALUATE(STRVH) { return DecodeInstructionOriginal(instr); } |
8477 | 9212 |
8478 EVALUATE(BCTG) { return DecodeInstructionOriginal(instr); } | 9213 EVALUATE(BCTG) { return DecodeInstructionOriginal(instr); } |
8479 | 9214 |
8480 EVALUATE(MSY) { return DecodeInstructionOriginal(instr); } | 9215 EVALUATE(MSY) { |
| 9216 DCHECK_OPCODE(MSY); |
| 9217 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9218 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9219 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9220 intptr_t d2_val = d2; |
| 9221 int32_t mem_val = ReadW(b2_val + d2_val + x2_val, instr); |
| 9222 int32_t r1_val = get_low_register<int32_t>(r1); |
| 9223 set_low_register(r1, mem_val * r1_val); |
| 9224 return length; |
| 9225 } |
8481 | 9226 |
8482 EVALUATE(NY) { return DecodeInstructionOriginal(instr); } | 9227 EVALUATE(NY) { return DecodeInstructionOriginal(instr); } |
8483 | 9228 |
8484 EVALUATE(CLY) { return DecodeInstructionOriginal(instr); } | 9229 EVALUATE(CLY) { return DecodeInstructionOriginal(instr); } |
8485 | 9230 |
8486 EVALUATE(OY) { return DecodeInstructionOriginal(instr); } | 9231 EVALUATE(OY) { return DecodeInstructionOriginal(instr); } |
8487 | 9232 |
8488 EVALUATE(XY) { return DecodeInstructionOriginal(instr); } | 9233 EVALUATE(XY) { return DecodeInstructionOriginal(instr); } |
8489 | 9234 |
8490 EVALUATE(CY) { return DecodeInstructionOriginal(instr); } | 9235 EVALUATE(CY) { return DecodeInstructionOriginal(instr); } |
8491 | 9236 |
8492 EVALUATE(AY) { return DecodeInstructionOriginal(instr); } | 9237 EVALUATE(AY) { return DecodeInstructionOriginal(instr); } |
8493 | 9238 |
8494 EVALUATE(SY) { return DecodeInstructionOriginal(instr); } | 9239 EVALUATE(SY) { return DecodeInstructionOriginal(instr); } |
8495 | 9240 |
8496 EVALUATE(MFY) { return DecodeInstructionOriginal(instr); } | 9241 EVALUATE(MFY) { return DecodeInstructionOriginal(instr); } |
8497 | 9242 |
8498 EVALUATE(ALY) { return DecodeInstructionOriginal(instr); } | 9243 EVALUATE(ALY) { return DecodeInstructionOriginal(instr); } |
8499 | 9244 |
8500 EVALUATE(SLY) { return DecodeInstructionOriginal(instr); } | 9245 EVALUATE(SLY) { return DecodeInstructionOriginal(instr); } |
8501 | 9246 |
8502 EVALUATE(STHY) { return DecodeInstructionOriginal(instr); } | 9247 EVALUATE(STHY) { |
| 9248 DCHECK_OPCODE(STHY); |
| 9249 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9250 // Miscellaneous Loads and Stores |
| 9251 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9252 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9253 intptr_t addr = x2_val + b2_val + d2; |
| 9254 uint16_t value = get_low_register<uint32_t>(r1); |
| 9255 WriteH(addr, value, instr); |
| 9256 return length; |
| 9257 } |
8503 | 9258 |
8504 EVALUATE(LAY) { return DecodeInstructionOriginal(instr); } | 9259 EVALUATE(LAY) { return DecodeInstructionOriginal(instr); } |
8505 | 9260 |
8506 EVALUATE(STCY) { return DecodeInstructionOriginal(instr); } | 9261 EVALUATE(STCY) { |
| 9262 DCHECK_OPCODE(STCY); |
| 9263 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9264 // Miscellaneous Loads and Stores |
| 9265 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9266 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9267 intptr_t addr = x2_val + b2_val + d2; |
| 9268 uint8_t value = get_low_register<uint32_t>(r1); |
| 9269 WriteB(addr, value); |
| 9270 return length; |
| 9271 } |
8507 | 9272 |
8508 EVALUATE(ICY) { return DecodeInstructionOriginal(instr); } | 9273 EVALUATE(ICY) { return DecodeInstructionOriginal(instr); } |
8509 | 9274 |
8510 EVALUATE(LAEY) { return DecodeInstructionOriginal(instr); } | 9275 EVALUATE(LAEY) { return DecodeInstructionOriginal(instr); } |
8511 | 9276 |
8512 EVALUATE(LB) { return DecodeInstructionOriginal(instr); } | 9277 EVALUATE(LB) { return DecodeInstructionOriginal(instr); } |
8513 | 9278 |
8514 EVALUATE(LGB) { return DecodeInstructionOriginal(instr); } | 9279 EVALUATE(LGB) { |
| 9280 DCHECK_OPCODE(LGB); |
| 9281 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9282 // Miscellaneous Loads and Stores |
| 9283 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9284 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9285 intptr_t addr = x2_val + b2_val + d2; |
| 9286 int64_t mem_val = ReadB(addr); |
| 9287 set_register(r1, mem_val); |
| 9288 return length; |
| 9289 } |
8515 | 9290 |
8516 EVALUATE(LHY) { return DecodeInstructionOriginal(instr); } | 9291 EVALUATE(LHY) { |
| 9292 DCHECK_OPCODE(LHY); |
| 9293 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9294 // Miscellaneous Loads and Stores |
| 9295 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9296 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9297 intptr_t addr = x2_val + b2_val + d2; |
| 9298 int32_t result = static_cast<int32_t>(ReadH(addr, instr)); |
| 9299 set_low_register(r1, result); |
| 9300 return length; |
| 9301 } |
8517 | 9302 |
8518 EVALUATE(CHY) { return DecodeInstructionOriginal(instr); } | 9303 EVALUATE(CHY) { return DecodeInstructionOriginal(instr); } |
8519 | 9304 |
8520 EVALUATE(AHY) { return DecodeInstructionOriginal(instr); } | 9305 EVALUATE(AHY) { return DecodeInstructionOriginal(instr); } |
8521 | 9306 |
8522 EVALUATE(SHY) { return DecodeInstructionOriginal(instr); } | 9307 EVALUATE(SHY) { return DecodeInstructionOriginal(instr); } |
8523 | 9308 |
8524 EVALUATE(MHY) { return DecodeInstructionOriginal(instr); } | 9309 EVALUATE(MHY) { return DecodeInstructionOriginal(instr); } |
8525 | 9310 |
8526 EVALUATE(NG) { return DecodeInstructionOriginal(instr); } | 9311 EVALUATE(NG) { return DecodeInstructionOriginal(instr); } |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8808 EVALUATE(TDGET) { return DecodeInstructionOriginal(instr); } | 9593 EVALUATE(TDGET) { return DecodeInstructionOriginal(instr); } |
8809 | 9594 |
8810 EVALUATE(TDCDT) { return DecodeInstructionOriginal(instr); } | 9595 EVALUATE(TDCDT) { return DecodeInstructionOriginal(instr); } |
8811 | 9596 |
8812 EVALUATE(TDGDT) { return DecodeInstructionOriginal(instr); } | 9597 EVALUATE(TDGDT) { return DecodeInstructionOriginal(instr); } |
8813 | 9598 |
8814 EVALUATE(TDCXT) { return DecodeInstructionOriginal(instr); } | 9599 EVALUATE(TDCXT) { return DecodeInstructionOriginal(instr); } |
8815 | 9600 |
8816 EVALUATE(TDGXT) { return DecodeInstructionOriginal(instr); } | 9601 EVALUATE(TDGXT) { return DecodeInstructionOriginal(instr); } |
8817 | 9602 |
8818 EVALUATE(LEY) { return DecodeInstructionOriginal(instr); } | 9603 EVALUATE(LEY) { |
| 9604 DCHECK_OPCODE(LEY); |
| 9605 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9606 // Miscellaneous Loads and Stores |
| 9607 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9608 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9609 intptr_t addr = x2_val + b2_val + d2; |
| 9610 float float_val = *reinterpret_cast<float*>(addr); |
| 9611 set_d_register_from_float32(r1, float_val); |
| 9612 return length; |
| 9613 } |
8819 | 9614 |
8820 EVALUATE(LDY) { return DecodeInstructionOriginal(instr); } | 9615 EVALUATE(LDY) { |
| 9616 DCHECK_OPCODE(LDY); |
| 9617 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9618 // Miscellaneous Loads and Stores |
| 9619 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9620 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9621 intptr_t addr = x2_val + b2_val + d2; |
| 9622 uint64_t dbl_val = *reinterpret_cast<uint64_t*>(addr); |
| 9623 set_d_register(r1, dbl_val); |
| 9624 return length; |
| 9625 } |
8821 | 9626 |
8822 EVALUATE(STEY) { return DecodeInstructionOriginal(instr); } | 9627 EVALUATE(STEY) { |
| 9628 DCHECK_OPCODE(STEY); |
| 9629 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9630 // Miscellaneous Loads and Stores |
| 9631 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9632 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9633 intptr_t addr = x2_val + b2_val + d2; |
| 9634 int64_t frs_val = get_d_register(r1) >> 32; |
| 9635 WriteW(addr, static_cast<int32_t>(frs_val), instr); |
| 9636 return length; |
| 9637 } |
8823 | 9638 |
8824 EVALUATE(STDY) { return DecodeInstructionOriginal(instr); } | 9639 EVALUATE(STDY) { |
| 9640 DCHECK_OPCODE(STDY); |
| 9641 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9642 // Miscellaneous Loads and Stores |
| 9643 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9644 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9645 intptr_t addr = x2_val + b2_val + d2; |
| 9646 int64_t frs_val = get_d_register(r1); |
| 9647 WriteDW(addr, frs_val); |
| 9648 return length; |
| 9649 } |
8825 | 9650 |
8826 EVALUATE(CZDT) { return DecodeInstructionOriginal(instr); } | 9651 EVALUATE(CZDT) { return DecodeInstructionOriginal(instr); } |
8827 | 9652 |
8828 EVALUATE(CZXT) { return DecodeInstructionOriginal(instr); } | 9653 EVALUATE(CZXT) { return DecodeInstructionOriginal(instr); } |
8829 | 9654 |
8830 EVALUATE(CDZT) { return DecodeInstructionOriginal(instr); } | 9655 EVALUATE(CDZT) { return DecodeInstructionOriginal(instr); } |
8831 | 9656 |
8832 EVALUATE(CXZT) { return DecodeInstructionOriginal(instr); } | 9657 EVALUATE(CXZT) { return DecodeInstructionOriginal(instr); } |
8833 | 9658 |
8834 #undef EVALUATE | 9659 #undef EVALUATE |
8835 | 9660 |
8836 } // namespace internal | 9661 } // namespace internal |
8837 } // namespace v8 | 9662 } // namespace v8 |
8838 | 9663 |
8839 #endif // USE_SIMULATOR | 9664 #endif // USE_SIMULATOR |
8840 #endif // V8_TARGET_ARCH_S390 | 9665 #endif // V8_TARGET_ARCH_S390 |
OLD | NEW |