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 5930 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5941 int r1 = AS(RSInstruction)->R1Value(); \ | 5941 int r1 = AS(RSInstruction)->R1Value(); \ |
5942 int d2 = AS(RSInstruction)->D2Value(); \ | 5942 int d2 = AS(RSInstruction)->D2Value(); \ |
5943 int length = 4; | 5943 int length = 4; |
5944 | 5944 |
5945 #define DECODE_SI_INSTRUCTION_I_UINT8(b1, d1_val, imm_val) \ | 5945 #define DECODE_SI_INSTRUCTION_I_UINT8(b1, d1_val, imm_val) \ |
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_SIL_INSTRUCTION(b1, d1, i2) \ |
| 5952 int b1 = AS(SILInstruction)->B1Value(); \ |
| 5953 intptr_t d1 = AS(SILInstruction)->D1Value(); \ |
| 5954 int16_t i2 = AS(SILInstruction)->I2Value(); \ |
| 5955 int length = 6; |
| 5956 |
| 5957 #define DECODE_SIY_INSTRUCTION(b1, d1, i2) \ |
| 5958 int b1 = AS(SIYInstruction)->B1Value(); \ |
| 5959 intptr_t d1 = AS(SIYInstruction)->D1Value(); \ |
| 5960 uint8_t i2 = AS(SIYInstruction)->I2Value(); \ |
| 5961 int length = 6; |
| 5962 |
5951 #define DECODE_RRE_INSTRUCTION(r1, r2) \ | 5963 #define DECODE_RRE_INSTRUCTION(r1, r2) \ |
5952 int r1 = AS(RREInstruction)->R1Value(); \ | 5964 int r1 = AS(RREInstruction)->R1Value(); \ |
5953 int r2 = AS(RREInstruction)->R2Value(); \ | 5965 int r2 = AS(RREInstruction)->R2Value(); \ |
5954 int length = 4; | 5966 int length = 4; |
5955 | 5967 |
5956 #define DECODE_RRE_INSTRUCTION_NO_R2(r1) \ | 5968 #define DECODE_RRE_INSTRUCTION_NO_R2(r1) \ |
5957 int r1 = AS(RREInstruction)->R1Value(); \ | 5969 int r1 = AS(RREInstruction)->R1Value(); \ |
5958 int length = 4; | 5970 int length = 4; |
5959 | 5971 |
5960 #define DECODE_RRD_INSTRUCTION(r1, r2, r3) \ | 5972 #define DECODE_RRD_INSTRUCTION(r1, r2, r3) \ |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6010 #define DECODE_RI_B_INSTRUCTION(instr, r1, i2) \ | 6022 #define DECODE_RI_B_INSTRUCTION(instr, r1, i2) \ |
6011 int32_t r1 = AS(RILInstruction)->R1Value(); \ | 6023 int32_t r1 = AS(RILInstruction)->R1Value(); \ |
6012 int16_t i2 = AS(RILInstruction)->I2Value(); \ | 6024 int16_t i2 = AS(RILInstruction)->I2Value(); \ |
6013 int length = 4; | 6025 int length = 4; |
6014 | 6026 |
6015 #define DECODE_RI_C_INSTRUCTION(instr, m1, i2) \ | 6027 #define DECODE_RI_C_INSTRUCTION(instr, m1, i2) \ |
6016 Condition m1 = static_cast<Condition>(AS(RIInstruction)->R1Value()); \ | 6028 Condition m1 = static_cast<Condition>(AS(RIInstruction)->R1Value()); \ |
6017 int16_t i2 = AS(RIInstruction)->I2Value(); \ | 6029 int16_t i2 = AS(RIInstruction)->I2Value(); \ |
6018 int length = 4; | 6030 int length = 4; |
6019 | 6031 |
| 6032 #define DECODE_RXE_INSTRUCTION(r1, b2, x2, d2) \ |
| 6033 int r1 = AS(RXEInstruction)->R1Value(); \ |
| 6034 int b2 = AS(RXEInstruction)->B2Value(); \ |
| 6035 int x2 = AS(RXEInstruction)->X2Value(); \ |
| 6036 int d2 = AS(RXEInstruction)->D2Value(); \ |
| 6037 int length = 6; |
| 6038 |
6020 #define GET_ADDRESS(index_reg, base_reg, offset) \ | 6039 #define GET_ADDRESS(index_reg, base_reg, offset) \ |
6021 (((index_reg) == 0) ? 0 : get_register(index_reg)) + \ | 6040 (((index_reg) == 0) ? 0 : get_register(index_reg)) + \ |
6022 (((base_reg) == 0) ? 0 : get_register(base_reg)) + offset | 6041 (((base_reg) == 0) ? 0 : get_register(base_reg)) + offset |
6023 | 6042 |
6024 int Simulator::Evaluate_Unknown(Instruction* instr) { | 6043 int Simulator::Evaluate_Unknown(Instruction* instr) { |
6025 UNREACHABLE(); | 6044 UNREACHABLE(); |
6026 return 0; | 6045 return 0; |
6027 } | 6046 } |
6028 | 6047 |
6029 EVALUATE(CLR) { | 6048 EVALUATE(CLR) { |
(...skipping 3127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9157 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 9176 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9158 // Miscellaneous Loads and Stores | 9177 // Miscellaneous Loads and Stores |
9159 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 9178 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9160 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 9179 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9161 intptr_t addr = x2_val + b2_val + d2; | 9180 intptr_t addr = x2_val + b2_val + d2; |
9162 int64_t mem_val = static_cast<int64_t>(ReadH(addr, instr)); | 9181 int64_t mem_val = static_cast<int64_t>(ReadH(addr, instr)); |
9163 set_register(r1, mem_val); | 9182 set_register(r1, mem_val); |
9164 return length; | 9183 return length; |
9165 } | 9184 } |
9166 | 9185 |
9167 EVALUATE(LLGF) { return DecodeInstructionOriginal(instr); } | 9186 EVALUATE(LLGF) { |
| 9187 DCHECK_OPCODE(LLGF); |
| 9188 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9189 // Miscellaneous Loads and Stores |
| 9190 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9191 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9192 intptr_t addr = x2_val + b2_val + d2; |
| 9193 uint64_t mem_val = static_cast<uint64_t>(ReadWU(addr, instr)); |
| 9194 set_register(r1, mem_val); |
| 9195 return length; |
| 9196 } |
9168 | 9197 |
9169 EVALUATE(LLGT) { return DecodeInstructionOriginal(instr); } | 9198 EVALUATE(LLGT) { return DecodeInstructionOriginal(instr); } |
9170 | 9199 |
9171 EVALUATE(AGF) { return DecodeInstructionOriginal(instr); } | 9200 EVALUATE(AGF) { |
| 9201 DCHECK_OPCODE(AGF); |
| 9202 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9203 uint64_t r1_val = get_register(r1); |
| 9204 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9205 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9206 intptr_t d2_val = d2; |
| 9207 uint64_t alu_out = r1_val; |
| 9208 uint32_t mem_val = ReadW(b2_val + d2_val + x2_val, instr); |
| 9209 alu_out += mem_val; |
| 9210 SetS390ConditionCode<int64_t>(alu_out, 0); |
| 9211 set_register(r1, alu_out); |
| 9212 return length; |
| 9213 } |
9172 | 9214 |
9173 EVALUATE(SGF) { return DecodeInstructionOriginal(instr); } | 9215 EVALUATE(SGF) { |
| 9216 DCHECK_OPCODE(SGF); |
| 9217 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9218 uint64_t r1_val = get_register(r1); |
| 9219 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9220 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9221 intptr_t d2_val = d2; |
| 9222 uint64_t alu_out = r1_val; |
| 9223 uint32_t mem_val = ReadW(b2_val + d2_val + x2_val, instr); |
| 9224 alu_out -= mem_val; |
| 9225 SetS390ConditionCode<int64_t>(alu_out, 0); |
| 9226 set_register(r1, alu_out); |
| 9227 return length; |
| 9228 } |
9174 | 9229 |
9175 EVALUATE(ALGF) { return DecodeInstructionOriginal(instr); } | 9230 EVALUATE(ALGF) { return DecodeInstructionOriginal(instr); } |
9176 | 9231 |
9177 EVALUATE(SLGF) { return DecodeInstructionOriginal(instr); } | 9232 EVALUATE(SLGF) { return DecodeInstructionOriginal(instr); } |
9178 | 9233 |
9179 EVALUATE(MSGF) { return DecodeInstructionOriginal(instr); } | 9234 EVALUATE(MSGF) { return DecodeInstructionOriginal(instr); } |
9180 | 9235 |
9181 EVALUATE(DSGF) { return DecodeInstructionOriginal(instr); } | 9236 EVALUATE(DSGF) { return DecodeInstructionOriginal(instr); } |
9182 | 9237 |
9183 EVALUATE(LRV) { return DecodeInstructionOriginal(instr); } | 9238 EVALUATE(LRV) { |
| 9239 DCHECK_OPCODE(LRV); |
| 9240 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9241 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9242 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9243 intptr_t mem_addr = b2_val + x2_val + d2; |
| 9244 int32_t mem_val = ReadW(mem_addr, instr); |
| 9245 set_low_register(r1, ByteReverse(mem_val)); |
| 9246 return length; |
| 9247 } |
9184 | 9248 |
9185 EVALUATE(LRVH) { return DecodeInstructionOriginal(instr); } | 9249 EVALUATE(LRVH) { |
| 9250 DCHECK_OPCODE(LRVH); |
| 9251 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9252 int32_t r1_val = get_low_register<int32_t>(r1); |
| 9253 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9254 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9255 intptr_t mem_addr = b2_val + x2_val + d2; |
| 9256 int16_t mem_val = ReadH(mem_addr, instr); |
| 9257 int32_t result = ByteReverse(mem_val) & 0x0000ffff; |
| 9258 result |= r1_val & 0xffff0000; |
| 9259 set_low_register(r1, result); |
| 9260 return length; |
| 9261 } |
9186 | 9262 |
9187 EVALUATE(CG) { return DecodeInstructionOriginal(instr); } | 9263 EVALUATE(CG) { |
| 9264 DCHECK_OPCODE(CG); |
| 9265 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9266 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9267 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9268 int64_t alu_out = get_register(r1); |
| 9269 int64_t mem_val = ReadDW(b2_val + x2_val + d2); |
| 9270 SetS390ConditionCode<int64_t>(alu_out, mem_val); |
| 9271 set_register(r1, alu_out); |
| 9272 return length; |
| 9273 } |
9188 | 9274 |
9189 EVALUATE(CLG) { return DecodeInstructionOriginal(instr); } | 9275 EVALUATE(CLG) { |
| 9276 DCHECK_OPCODE(CLG); |
| 9277 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9278 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9279 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9280 int64_t alu_out = get_register(r1); |
| 9281 int64_t mem_val = ReadDW(b2_val + x2_val + d2); |
| 9282 SetS390ConditionCode<uint64_t>(alu_out, mem_val); |
| 9283 set_register(r1, alu_out); |
| 9284 return length; |
| 9285 } |
9190 | 9286 |
9191 EVALUATE(NTSTG) { return DecodeInstructionOriginal(instr); } | 9287 EVALUATE(NTSTG) { return DecodeInstructionOriginal(instr); } |
9192 | 9288 |
9193 EVALUATE(CVDY) { return DecodeInstructionOriginal(instr); } | 9289 EVALUATE(CVDY) { return DecodeInstructionOriginal(instr); } |
9194 | 9290 |
9195 EVALUATE(CVDG) { return DecodeInstructionOriginal(instr); } | 9291 EVALUATE(CVDG) { return DecodeInstructionOriginal(instr); } |
9196 | 9292 |
9197 EVALUATE(STRVG) { return DecodeInstructionOriginal(instr); } | 9293 EVALUATE(STRVG) { return DecodeInstructionOriginal(instr); } |
9198 | 9294 |
9199 EVALUATE(CGF) { return DecodeInstructionOriginal(instr); } | 9295 EVALUATE(CGF) { return DecodeInstructionOriginal(instr); } |
9200 | 9296 |
9201 EVALUATE(CLGF) { return DecodeInstructionOriginal(instr); } | 9297 EVALUATE(CLGF) { return DecodeInstructionOriginal(instr); } |
9202 | 9298 |
9203 EVALUATE(LTGF) { return DecodeInstructionOriginal(instr); } | 9299 EVALUATE(LTGF) { return DecodeInstructionOriginal(instr); } |
9204 | 9300 |
9205 EVALUATE(CGH) { return DecodeInstructionOriginal(instr); } | 9301 EVALUATE(CGH) { return DecodeInstructionOriginal(instr); } |
9206 | 9302 |
9207 EVALUATE(PFD) { return DecodeInstructionOriginal(instr); } | 9303 EVALUATE(PFD) { return DecodeInstructionOriginal(instr); } |
9208 | 9304 |
9209 EVALUATE(STRV) { return DecodeInstructionOriginal(instr); } | 9305 EVALUATE(STRV) { |
| 9306 DCHECK_OPCODE(STRV); |
| 9307 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9308 int32_t r1_val = get_low_register<int32_t>(r1); |
| 9309 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9310 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9311 intptr_t mem_addr = b2_val + x2_val + d2; |
| 9312 WriteW(mem_addr, ByteReverse(r1_val), instr); |
| 9313 return length; |
| 9314 } |
9210 | 9315 |
9211 EVALUATE(STRVH) { return DecodeInstructionOriginal(instr); } | 9316 EVALUATE(STRVH) { |
| 9317 DCHECK_OPCODE(STRVH); |
| 9318 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9319 int32_t r1_val = get_low_register<int32_t>(r1); |
| 9320 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9321 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9322 intptr_t mem_addr = b2_val + x2_val + d2; |
| 9323 int16_t result = static_cast<int16_t>(r1_val >> 16); |
| 9324 WriteH(mem_addr, ByteReverse(result), instr); |
| 9325 return length; |
| 9326 } |
9212 | 9327 |
9213 EVALUATE(BCTG) { return DecodeInstructionOriginal(instr); } | 9328 EVALUATE(BCTG) { return DecodeInstructionOriginal(instr); } |
9214 | 9329 |
9215 EVALUATE(MSY) { | 9330 EVALUATE(MSY) { |
9216 DCHECK_OPCODE(MSY); | 9331 DCHECK_OPCODE(MSY); |
9217 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 9332 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9218 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 9333 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9219 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 9334 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9220 intptr_t d2_val = d2; | 9335 intptr_t d2_val = d2; |
9221 int32_t mem_val = ReadW(b2_val + d2_val + x2_val, instr); | 9336 int32_t mem_val = ReadW(b2_val + d2_val + x2_val, instr); |
9222 int32_t r1_val = get_low_register<int32_t>(r1); | 9337 int32_t r1_val = get_low_register<int32_t>(r1); |
9223 set_low_register(r1, mem_val * r1_val); | 9338 set_low_register(r1, mem_val * r1_val); |
9224 return length; | 9339 return length; |
9225 } | 9340 } |
9226 | 9341 |
9227 EVALUATE(NY) { return DecodeInstructionOriginal(instr); } | 9342 EVALUATE(NY) { |
| 9343 DCHECK_OPCODE(NY); |
| 9344 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9345 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9346 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9347 int32_t alu_out = get_low_register<int32_t>(r1); |
| 9348 int32_t mem_val = ReadW(b2_val + x2_val + d2, instr); |
| 9349 alu_out &= mem_val; |
| 9350 SetS390BitWiseConditionCode<uint32_t>(alu_out); |
| 9351 set_low_register(r1, alu_out); |
| 9352 return length; |
| 9353 } |
9228 | 9354 |
9229 EVALUATE(CLY) { return DecodeInstructionOriginal(instr); } | 9355 EVALUATE(CLY) { |
| 9356 DCHECK_OPCODE(CLY); |
| 9357 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9358 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9359 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9360 uint32_t alu_out = get_low_register<uint32_t>(r1); |
| 9361 uint32_t mem_val = ReadWU(b2_val + x2_val + d2, instr); |
| 9362 SetS390ConditionCode<uint32_t>(alu_out, mem_val); |
| 9363 return length; |
| 9364 } |
9230 | 9365 |
9231 EVALUATE(OY) { return DecodeInstructionOriginal(instr); } | 9366 EVALUATE(OY) { |
| 9367 DCHECK_OPCODE(OY); |
| 9368 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9369 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9370 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9371 int32_t alu_out = get_low_register<int32_t>(r1); |
| 9372 int32_t mem_val = ReadW(b2_val + x2_val + d2, instr); |
| 9373 alu_out |= mem_val; |
| 9374 SetS390BitWiseConditionCode<uint32_t>(alu_out); |
| 9375 set_low_register(r1, alu_out); |
| 9376 return length; |
| 9377 } |
9232 | 9378 |
9233 EVALUATE(XY) { return DecodeInstructionOriginal(instr); } | 9379 EVALUATE(XY) { |
| 9380 DCHECK_OPCODE(XY); |
| 9381 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9382 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9383 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9384 int32_t alu_out = get_low_register<int32_t>(r1); |
| 9385 int32_t mem_val = ReadW(b2_val + x2_val + d2, instr); |
| 9386 alu_out ^= mem_val; |
| 9387 SetS390BitWiseConditionCode<uint32_t>(alu_out); |
| 9388 set_low_register(r1, alu_out); |
| 9389 return length; |
| 9390 } |
9234 | 9391 |
9235 EVALUATE(CY) { return DecodeInstructionOriginal(instr); } | 9392 EVALUATE(CY) { |
| 9393 DCHECK_OPCODE(CY); |
| 9394 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9395 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9396 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9397 int32_t alu_out = get_low_register<int32_t>(r1); |
| 9398 int32_t mem_val = ReadW(b2_val + x2_val + d2, instr); |
| 9399 SetS390ConditionCode<int32_t>(alu_out, mem_val); |
| 9400 return length; |
| 9401 } |
9236 | 9402 |
9237 EVALUATE(AY) { return DecodeInstructionOriginal(instr); } | 9403 EVALUATE(AY) { |
| 9404 DCHECK_OPCODE(AY); |
| 9405 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9406 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9407 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9408 int32_t alu_out = get_low_register<int32_t>(r1); |
| 9409 int32_t mem_val = ReadW(b2_val + x2_val + d2, instr); |
| 9410 bool isOF = false; |
| 9411 isOF = CheckOverflowForIntAdd(alu_out, mem_val, int32_t); |
| 9412 alu_out += mem_val; |
| 9413 SetS390ConditionCode<int32_t>(alu_out, 0); |
| 9414 SetS390OverflowCode(isOF); |
| 9415 set_low_register(r1, alu_out); |
| 9416 return length; |
| 9417 } |
9238 | 9418 |
9239 EVALUATE(SY) { return DecodeInstructionOriginal(instr); } | 9419 EVALUATE(SY) { |
| 9420 DCHECK_OPCODE(SY); |
| 9421 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9422 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9423 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9424 int32_t alu_out = get_low_register<int32_t>(r1); |
| 9425 int32_t mem_val = ReadW(b2_val + x2_val + d2, instr); |
| 9426 bool isOF = false; |
| 9427 isOF = CheckOverflowForIntSub(alu_out, mem_val, int32_t); |
| 9428 alu_out -= mem_val; |
| 9429 SetS390ConditionCode<int32_t>(alu_out, 0); |
| 9430 SetS390OverflowCode(isOF); |
| 9431 set_low_register(r1, alu_out); |
| 9432 return length; |
| 9433 } |
9240 | 9434 |
9241 EVALUATE(MFY) { return DecodeInstructionOriginal(instr); } | 9435 EVALUATE(MFY) { return DecodeInstructionOriginal(instr); } |
9242 | 9436 |
9243 EVALUATE(ALY) { return DecodeInstructionOriginal(instr); } | 9437 EVALUATE(ALY) { |
| 9438 DCHECK_OPCODE(ALY); |
| 9439 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9440 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9441 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9442 uint32_t alu_out = get_low_register<uint32_t>(r1); |
| 9443 uint32_t mem_val = ReadWU(b2_val + x2_val + d2, instr); |
| 9444 alu_out += mem_val; |
| 9445 set_low_register(r1, alu_out); |
| 9446 SetS390ConditionCode<uint32_t>(alu_out, 0); |
| 9447 return length; |
| 9448 } |
9244 | 9449 |
9245 EVALUATE(SLY) { return DecodeInstructionOriginal(instr); } | 9450 EVALUATE(SLY) { |
| 9451 DCHECK_OPCODE(SLY); |
| 9452 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9453 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9454 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9455 uint32_t alu_out = get_low_register<uint32_t>(r1); |
| 9456 uint32_t mem_val = ReadWU(b2_val + x2_val + d2, instr); |
| 9457 alu_out -= mem_val; |
| 9458 set_low_register(r1, alu_out); |
| 9459 SetS390ConditionCode<uint32_t>(alu_out, 0); |
| 9460 return length; |
| 9461 } |
9246 | 9462 |
9247 EVALUATE(STHY) { | 9463 EVALUATE(STHY) { |
9248 DCHECK_OPCODE(STHY); | 9464 DCHECK_OPCODE(STHY); |
9249 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 9465 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9250 // Miscellaneous Loads and Stores | 9466 // Miscellaneous Loads and Stores |
9251 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 9467 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9252 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 9468 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9253 intptr_t addr = x2_val + b2_val + d2; | 9469 intptr_t addr = x2_val + b2_val + d2; |
9254 uint16_t value = get_low_register<uint32_t>(r1); | 9470 uint16_t value = get_low_register<uint32_t>(r1); |
9255 WriteH(addr, value, instr); | 9471 WriteH(addr, value, instr); |
9256 return length; | 9472 return length; |
9257 } | 9473 } |
9258 | 9474 |
9259 EVALUATE(LAY) { return DecodeInstructionOriginal(instr); } | 9475 EVALUATE(LAY) { |
| 9476 DCHECK_OPCODE(LAY); |
| 9477 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9478 // Load Address |
| 9479 int rb = b2; |
| 9480 int rx = x2; |
| 9481 int offset = d2; |
| 9482 int64_t rb_val = (rb == 0) ? 0 : get_register(rb); |
| 9483 int64_t rx_val = (rx == 0) ? 0 : get_register(rx); |
| 9484 set_register(r1, rx_val + rb_val + offset); |
| 9485 return length; |
| 9486 } |
9260 | 9487 |
9261 EVALUATE(STCY) { | 9488 EVALUATE(STCY) { |
9262 DCHECK_OPCODE(STCY); | 9489 DCHECK_OPCODE(STCY); |
9263 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 9490 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9264 // Miscellaneous Loads and Stores | 9491 // Miscellaneous Loads and Stores |
9265 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 9492 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9266 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 9493 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9267 intptr_t addr = x2_val + b2_val + d2; | 9494 intptr_t addr = x2_val + b2_val + d2; |
9268 uint8_t value = get_low_register<uint32_t>(r1); | 9495 uint8_t value = get_low_register<uint32_t>(r1); |
9269 WriteB(addr, value); | 9496 WriteB(addr, value); |
9270 return length; | 9497 return length; |
9271 } | 9498 } |
9272 | 9499 |
9273 EVALUATE(ICY) { return DecodeInstructionOriginal(instr); } | 9500 EVALUATE(ICY) { return DecodeInstructionOriginal(instr); } |
9274 | 9501 |
9275 EVALUATE(LAEY) { return DecodeInstructionOriginal(instr); } | 9502 EVALUATE(LAEY) { return DecodeInstructionOriginal(instr); } |
9276 | 9503 |
9277 EVALUATE(LB) { return DecodeInstructionOriginal(instr); } | 9504 EVALUATE(LB) { |
| 9505 DCHECK_OPCODE(LB); |
| 9506 // Miscellaneous Loads and Stores |
| 9507 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9508 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9509 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9510 intptr_t addr = x2_val + b2_val + d2; |
| 9511 int32_t mem_val = ReadB(addr); |
| 9512 set_low_register(r1, mem_val); |
| 9513 return length; |
| 9514 } |
9278 | 9515 |
9279 EVALUATE(LGB) { | 9516 EVALUATE(LGB) { |
9280 DCHECK_OPCODE(LGB); | 9517 DCHECK_OPCODE(LGB); |
9281 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 9518 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9282 // Miscellaneous Loads and Stores | 9519 // Miscellaneous Loads and Stores |
9283 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 9520 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9284 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 9521 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9285 intptr_t addr = x2_val + b2_val + d2; | 9522 intptr_t addr = x2_val + b2_val + d2; |
9286 int64_t mem_val = ReadB(addr); | 9523 int64_t mem_val = ReadB(addr); |
9287 set_register(r1, mem_val); | 9524 set_register(r1, mem_val); |
9288 return length; | 9525 return length; |
9289 } | 9526 } |
9290 | 9527 |
9291 EVALUATE(LHY) { | 9528 EVALUATE(LHY) { |
9292 DCHECK_OPCODE(LHY); | 9529 DCHECK_OPCODE(LHY); |
9293 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); | 9530 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
9294 // Miscellaneous Loads and Stores | 9531 // Miscellaneous Loads and Stores |
9295 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); | 9532 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
9296 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); | 9533 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
9297 intptr_t addr = x2_val + b2_val + d2; | 9534 intptr_t addr = x2_val + b2_val + d2; |
9298 int32_t result = static_cast<int32_t>(ReadH(addr, instr)); | 9535 int32_t result = static_cast<int32_t>(ReadH(addr, instr)); |
9299 set_low_register(r1, result); | 9536 set_low_register(r1, result); |
9300 return length; | 9537 return length; |
9301 } | 9538 } |
9302 | 9539 |
9303 EVALUATE(CHY) { return DecodeInstructionOriginal(instr); } | 9540 EVALUATE(CHY) { return DecodeInstructionOriginal(instr); } |
9304 | 9541 |
9305 EVALUATE(AHY) { return DecodeInstructionOriginal(instr); } | 9542 EVALUATE(AHY) { |
| 9543 DCHECK_OPCODE(AHY); |
| 9544 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9545 int32_t r1_val = get_low_register<int32_t>(r1); |
| 9546 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9547 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9548 intptr_t d2_val = d2; |
| 9549 int32_t mem_val = |
| 9550 static_cast<int32_t>(ReadH(b2_val + d2_val + x2_val, instr)); |
| 9551 int32_t alu_out = 0; |
| 9552 bool isOF = false; |
| 9553 alu_out = r1_val + mem_val; |
| 9554 isOF = CheckOverflowForIntAdd(r1_val, mem_val, int32_t); |
| 9555 set_low_register(r1, alu_out); |
| 9556 SetS390ConditionCode<int32_t>(alu_out, 0); |
| 9557 SetS390OverflowCode(isOF); |
| 9558 return length; |
| 9559 } |
9306 | 9560 |
9307 EVALUATE(SHY) { return DecodeInstructionOriginal(instr); } | 9561 EVALUATE(SHY) { |
| 9562 DCHECK_OPCODE(SHY); |
| 9563 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9564 int32_t r1_val = get_low_register<int32_t>(r1); |
| 9565 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9566 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9567 intptr_t d2_val = d2; |
| 9568 int32_t mem_val = |
| 9569 static_cast<int32_t>(ReadH(b2_val + d2_val + x2_val, instr)); |
| 9570 int32_t alu_out = 0; |
| 9571 bool isOF = false; |
| 9572 alu_out = r1_val - mem_val; |
| 9573 isOF = CheckOverflowForIntSub(r1_val, mem_val, int64_t); |
| 9574 set_low_register(r1, alu_out); |
| 9575 SetS390ConditionCode<int32_t>(alu_out, 0); |
| 9576 SetS390OverflowCode(isOF); |
| 9577 return length; |
| 9578 } |
9308 | 9579 |
9309 EVALUATE(MHY) { return DecodeInstructionOriginal(instr); } | 9580 EVALUATE(MHY) { return DecodeInstructionOriginal(instr); } |
9310 | 9581 |
9311 EVALUATE(NG) { return DecodeInstructionOriginal(instr); } | 9582 EVALUATE(NG) { |
| 9583 DCHECK_OPCODE(NG); |
| 9584 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9585 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9586 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9587 int64_t alu_out = get_register(r1); |
| 9588 int64_t mem_val = ReadDW(b2_val + x2_val + d2); |
| 9589 alu_out &= mem_val; |
| 9590 SetS390BitWiseConditionCode<uint32_t>(alu_out); |
| 9591 set_register(r1, alu_out); |
| 9592 return length; |
| 9593 } |
9312 | 9594 |
9313 EVALUATE(OG) { return DecodeInstructionOriginal(instr); } | 9595 EVALUATE(OG) { |
| 9596 DCHECK_OPCODE(OG); |
| 9597 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9598 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9599 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9600 int64_t alu_out = get_register(r1); |
| 9601 int64_t mem_val = ReadDW(b2_val + x2_val + d2); |
| 9602 alu_out |= mem_val; |
| 9603 SetS390BitWiseConditionCode<uint32_t>(alu_out); |
| 9604 set_register(r1, alu_out); |
| 9605 return length; |
| 9606 } |
9314 | 9607 |
9315 EVALUATE(XG) { return DecodeInstructionOriginal(instr); } | 9608 EVALUATE(XG) { |
| 9609 DCHECK_OPCODE(XG); |
| 9610 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9611 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9612 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9613 int64_t alu_out = get_register(r1); |
| 9614 int64_t mem_val = ReadDW(b2_val + x2_val + d2); |
| 9615 alu_out ^= mem_val; |
| 9616 SetS390BitWiseConditionCode<uint32_t>(alu_out); |
| 9617 set_register(r1, alu_out); |
| 9618 return length; |
| 9619 } |
9316 | 9620 |
9317 EVALUATE(LGAT) { return DecodeInstructionOriginal(instr); } | 9621 EVALUATE(LGAT) { return DecodeInstructionOriginal(instr); } |
9318 | 9622 |
9319 EVALUATE(MLG) { return DecodeInstructionOriginal(instr); } | 9623 EVALUATE(MLG) { return DecodeInstructionOriginal(instr); } |
9320 | 9624 |
9321 EVALUATE(DLG) { return DecodeInstructionOriginal(instr); } | 9625 EVALUATE(DLG) { return DecodeInstructionOriginal(instr); } |
9322 | 9626 |
9323 EVALUATE(ALCG) { return DecodeInstructionOriginal(instr); } | 9627 EVALUATE(ALCG) { return DecodeInstructionOriginal(instr); } |
9324 | 9628 |
9325 EVALUATE(SLBG) { return DecodeInstructionOriginal(instr); } | 9629 EVALUATE(SLBG) { return DecodeInstructionOriginal(instr); } |
9326 | 9630 |
9327 EVALUATE(STPQ) { return DecodeInstructionOriginal(instr); } | 9631 EVALUATE(STPQ) { return DecodeInstructionOriginal(instr); } |
9328 | 9632 |
9329 EVALUATE(LPQ) { return DecodeInstructionOriginal(instr); } | 9633 EVALUATE(LPQ) { return DecodeInstructionOriginal(instr); } |
9330 | 9634 |
9331 EVALUATE(LLGH) { return DecodeInstructionOriginal(instr); } | 9635 EVALUATE(LLGH) { |
| 9636 DCHECK_OPCODE(LLGH); |
| 9637 // Load Logical Halfword |
| 9638 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9639 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9640 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9641 intptr_t d2_val = d2; |
| 9642 uint16_t mem_val = ReadHU(b2_val + d2_val + x2_val, instr); |
| 9643 set_register(r1, mem_val); |
| 9644 return length; |
| 9645 } |
9332 | 9646 |
9333 EVALUATE(LLH) { return DecodeInstructionOriginal(instr); } | 9647 EVALUATE(LLH) { |
| 9648 DCHECK_OPCODE(LLH); |
| 9649 // Load Logical Halfword |
| 9650 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
| 9651 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9652 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 9653 intptr_t d2_val = d2; |
| 9654 uint16_t mem_val = ReadHU(b2_val + d2_val + x2_val, instr); |
| 9655 set_low_register(r1, mem_val); |
| 9656 return length; |
| 9657 } |
9334 | 9658 |
9335 EVALUATE(ML) { return DecodeInstructionOriginal(instr); } | 9659 EVALUATE(ML) { return DecodeInstructionOriginal(instr); } |
9336 | 9660 |
9337 EVALUATE(DL) { return DecodeInstructionOriginal(instr); } | 9661 EVALUATE(DL) { return DecodeInstructionOriginal(instr); } |
9338 | 9662 |
9339 EVALUATE(ALC) { return DecodeInstructionOriginal(instr); } | 9663 EVALUATE(ALC) { return DecodeInstructionOriginal(instr); } |
9340 | 9664 |
9341 EVALUATE(SLB) { return DecodeInstructionOriginal(instr); } | 9665 EVALUATE(SLB) { return DecodeInstructionOriginal(instr); } |
9342 | 9666 |
9343 EVALUATE(LLGTAT) { return DecodeInstructionOriginal(instr); } | 9667 EVALUATE(LLGTAT) { return DecodeInstructionOriginal(instr); } |
(...skipping 19 matching lines...) Expand all Loading... |
9363 EVALUATE(LFH) { return DecodeInstructionOriginal(instr); } | 9687 EVALUATE(LFH) { return DecodeInstructionOriginal(instr); } |
9364 | 9688 |
9365 EVALUATE(STFH) { return DecodeInstructionOriginal(instr); } | 9689 EVALUATE(STFH) { return DecodeInstructionOriginal(instr); } |
9366 | 9690 |
9367 EVALUATE(CHF) { return DecodeInstructionOriginal(instr); } | 9691 EVALUATE(CHF) { return DecodeInstructionOriginal(instr); } |
9368 | 9692 |
9369 EVALUATE(MVCDK) { return DecodeInstructionOriginal(instr); } | 9693 EVALUATE(MVCDK) { return DecodeInstructionOriginal(instr); } |
9370 | 9694 |
9371 EVALUATE(MVHHI) { return DecodeInstructionOriginal(instr); } | 9695 EVALUATE(MVHHI) { return DecodeInstructionOriginal(instr); } |
9372 | 9696 |
9373 EVALUATE(MVGHI) { return DecodeInstructionOriginal(instr); } | 9697 EVALUATE(MVGHI) { |
| 9698 DCHECK_OPCODE(MVGHI); |
| 9699 // Move Integer (64) |
| 9700 DECODE_SIL_INSTRUCTION(b1, d1, i2); |
| 9701 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1); |
| 9702 intptr_t src_addr = b1_val + d1; |
| 9703 WriteDW(src_addr, i2); |
| 9704 return length; |
| 9705 } |
9374 | 9706 |
9375 EVALUATE(MVHI) { return DecodeInstructionOriginal(instr); } | 9707 EVALUATE(MVHI) { |
| 9708 DCHECK_OPCODE(MVHI); |
| 9709 // Move Integer (32) |
| 9710 DECODE_SIL_INSTRUCTION(b1, d1, i2); |
| 9711 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1); |
| 9712 intptr_t src_addr = b1_val + d1; |
| 9713 WriteW(src_addr, i2, instr); |
| 9714 return length; |
| 9715 } |
9376 | 9716 |
9377 EVALUATE(CHHSI) { return DecodeInstructionOriginal(instr); } | 9717 EVALUATE(CHHSI) { return DecodeInstructionOriginal(instr); } |
9378 | 9718 |
9379 EVALUATE(CGHSI) { return DecodeInstructionOriginal(instr); } | 9719 EVALUATE(CGHSI) { return DecodeInstructionOriginal(instr); } |
9380 | 9720 |
9381 EVALUATE(CHSI) { return DecodeInstructionOriginal(instr); } | 9721 EVALUATE(CHSI) { return DecodeInstructionOriginal(instr); } |
9382 | 9722 |
9383 EVALUATE(CLFHSI) { return DecodeInstructionOriginal(instr); } | 9723 EVALUATE(CLFHSI) { return DecodeInstructionOriginal(instr); } |
9384 | 9724 |
9385 EVALUATE(TBEGIN) { return DecodeInstructionOriginal(instr); } | 9725 EVALUATE(TBEGIN) { return DecodeInstructionOriginal(instr); } |
9386 | 9726 |
9387 EVALUATE(TBEGINC) { return DecodeInstructionOriginal(instr); } | 9727 EVALUATE(TBEGINC) { return DecodeInstructionOriginal(instr); } |
9388 | 9728 |
9389 EVALUATE(LMG) { return DecodeInstructionOriginal(instr); } | 9729 EVALUATE(LMG) { |
| 9730 DCHECK_OPCODE(LMG); |
| 9731 // Store Multiple 64-bits. |
| 9732 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); |
| 9733 int rb = b2; |
| 9734 int offset = d2; |
9390 | 9735 |
9391 EVALUATE(SRAG) { return DecodeInstructionOriginal(instr); } | 9736 // Regs roll around if r3 is less than r1. |
| 9737 // Artifically increase r3 by 16 so we can calculate |
| 9738 // the number of regs stored properly. |
| 9739 if (r3 < r1) r3 += 16; |
9392 | 9740 |
9393 EVALUATE(SLAG) { return DecodeInstructionOriginal(instr); } | 9741 int64_t rb_val = (rb == 0) ? 0 : get_register(rb); |
9394 | 9742 |
9395 EVALUATE(SRLG) { return DecodeInstructionOriginal(instr); } | 9743 // Store each register in ascending order. |
| 9744 for (int i = 0; i <= r3 - r1; i++) { |
| 9745 int64_t value = ReadDW(rb_val + offset + 8 * i); |
| 9746 set_register((r1 + i) % 16, value); |
| 9747 } |
| 9748 return length; |
| 9749 } |
9396 | 9750 |
9397 EVALUATE(SLLG) { return DecodeInstructionOriginal(instr); } | 9751 EVALUATE(SRAG) { |
| 9752 DCHECK_OPCODE(SRAG); |
| 9753 // 64-bit non-clobbering shift-left/right arithmetic |
| 9754 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); |
| 9755 // only takes rightmost 6 bits |
| 9756 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9757 int shiftBits = (b2_val + d2) & 0x3F; |
| 9758 int64_t r3_val = get_register(r3); |
| 9759 intptr_t alu_out = 0; |
| 9760 bool isOF = false; |
| 9761 alu_out = r3_val >> shiftBits; |
| 9762 set_register(r1, alu_out); |
| 9763 SetS390ConditionCode<intptr_t>(alu_out, 0); |
| 9764 SetS390OverflowCode(isOF); |
| 9765 return length; |
| 9766 } |
| 9767 |
| 9768 EVALUATE(SLAG) { |
| 9769 DCHECK_OPCODE(SLAG); |
| 9770 // 64-bit non-clobbering shift-left/right arithmetic |
| 9771 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); |
| 9772 // only takes rightmost 6 bits |
| 9773 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9774 int shiftBits = (b2_val + d2) & 0x3F; |
| 9775 int64_t r3_val = get_register(r3); |
| 9776 intptr_t alu_out = 0; |
| 9777 bool isOF = false; |
| 9778 isOF = CheckOverflowForShiftLeft(r3_val, shiftBits); |
| 9779 alu_out = r3_val << shiftBits; |
| 9780 set_register(r1, alu_out); |
| 9781 SetS390ConditionCode<intptr_t>(alu_out, 0); |
| 9782 SetS390OverflowCode(isOF); |
| 9783 return length; |
| 9784 } |
| 9785 |
| 9786 EVALUATE(SRLG) { |
| 9787 DCHECK_OPCODE(SRLG); |
| 9788 // For SLLG/SRLG, the 64-bit third operand is shifted the number |
| 9789 // of bits specified by the second-operand address, and the result is |
| 9790 // placed at the first-operand location. Except for when the R1 and R3 |
| 9791 // fields designate the same register, the third operand remains |
| 9792 // unchanged in general register R3. |
| 9793 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); |
| 9794 // only takes rightmost 6 bits |
| 9795 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9796 int shiftBits = (b2_val + d2) & 0x3F; |
| 9797 // unsigned |
| 9798 uint64_t r3_val = get_register(r3); |
| 9799 uint64_t alu_out = 0; |
| 9800 alu_out = r3_val >> shiftBits; |
| 9801 set_register(r1, alu_out); |
| 9802 return length; |
| 9803 } |
| 9804 |
| 9805 EVALUATE(SLLG) { |
| 9806 DCHECK_OPCODE(SLLG); |
| 9807 // For SLLG/SRLG, the 64-bit third operand is shifted the number |
| 9808 // of bits specified by the second-operand address, and the result is |
| 9809 // placed at the first-operand location. Except for when the R1 and R3 |
| 9810 // fields designate the same register, the third operand remains |
| 9811 // unchanged in general register R3. |
| 9812 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); |
| 9813 // only takes rightmost 6 bits |
| 9814 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9815 int shiftBits = (b2_val + d2) & 0x3F; |
| 9816 // unsigned |
| 9817 uint64_t r3_val = get_register(r3); |
| 9818 uint64_t alu_out = 0; |
| 9819 alu_out = r3_val << shiftBits; |
| 9820 set_register(r1, alu_out); |
| 9821 return length; |
| 9822 } |
9398 | 9823 |
9399 EVALUATE(CSY) { return DecodeInstructionOriginal(instr); } | 9824 EVALUATE(CSY) { return DecodeInstructionOriginal(instr); } |
9400 | 9825 |
9401 EVALUATE(RLLG) { return DecodeInstructionOriginal(instr); } | 9826 EVALUATE(RLLG) { |
| 9827 DCHECK_OPCODE(RLLG); |
| 9828 // 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 |
| 9830 // placed at the first-operand location. Except for when the R1 and R3 |
| 9831 // fields designate the same register, the third operand remains |
| 9832 // unchanged in general register R3. |
| 9833 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); |
| 9834 // only takes rightmost 6 bits |
| 9835 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 9836 int shiftBits = (b2_val + d2) & 0x3F; |
| 9837 // unsigned |
| 9838 uint64_t r3_val = get_register(r3); |
| 9839 uint64_t alu_out = 0; |
| 9840 uint64_t rotateBits = r3_val >> (64 - shiftBits); |
| 9841 alu_out = (r3_val << shiftBits) | (rotateBits); |
| 9842 set_register(r1, alu_out); |
| 9843 return length; |
| 9844 } |
9402 | 9845 |
9403 EVALUATE(STMG) { return DecodeInstructionOriginal(instr); } | 9846 EVALUATE(STMG) { |
| 9847 DCHECK_OPCODE(STMG); |
| 9848 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); |
| 9849 int rb = b2; |
| 9850 int offset = d2; |
| 9851 |
| 9852 // Regs roll around if r3 is less than r1. |
| 9853 // Artifically increase r3 by 16 so we can calculate |
| 9854 // the number of regs stored properly. |
| 9855 if (r3 < r1) r3 += 16; |
| 9856 |
| 9857 int64_t rb_val = (rb == 0) ? 0 : get_register(rb); |
| 9858 |
| 9859 // Store each register in ascending order. |
| 9860 for (int i = 0; i <= r3 - r1; i++) { |
| 9861 int64_t value = get_register((r1 + i) % 16); |
| 9862 WriteDW(rb_val + offset + 8 * i, value); |
| 9863 } |
| 9864 return length; |
| 9865 } |
9404 | 9866 |
9405 EVALUATE(STMH) { return DecodeInstructionOriginal(instr); } | 9867 EVALUATE(STMH) { return DecodeInstructionOriginal(instr); } |
9406 | 9868 |
9407 EVALUATE(STCMH) { return DecodeInstructionOriginal(instr); } | 9869 EVALUATE(STCMH) { return DecodeInstructionOriginal(instr); } |
9408 | 9870 |
9409 EVALUATE(STCMY) { return DecodeInstructionOriginal(instr); } | 9871 EVALUATE(STCMY) { return DecodeInstructionOriginal(instr); } |
9410 | 9872 |
9411 EVALUATE(CDSY) { return DecodeInstructionOriginal(instr); } | 9873 EVALUATE(CDSY) { return DecodeInstructionOriginal(instr); } |
9412 | 9874 |
9413 EVALUATE(CDSG) { return DecodeInstructionOriginal(instr); } | 9875 EVALUATE(CDSG) { return DecodeInstructionOriginal(instr); } |
9414 | 9876 |
9415 EVALUATE(BXHG) { return DecodeInstructionOriginal(instr); } | 9877 EVALUATE(BXHG) { return DecodeInstructionOriginal(instr); } |
9416 | 9878 |
9417 EVALUATE(BXLEG) { return DecodeInstructionOriginal(instr); } | 9879 EVALUATE(BXLEG) { return DecodeInstructionOriginal(instr); } |
9418 | 9880 |
9419 EVALUATE(ECAG) { return DecodeInstructionOriginal(instr); } | 9881 EVALUATE(ECAG) { return DecodeInstructionOriginal(instr); } |
9420 | 9882 |
9421 EVALUATE(TMY) { return DecodeInstructionOriginal(instr); } | 9883 EVALUATE(TMY) { |
| 9884 DCHECK_OPCODE(TMY); |
| 9885 // Test Under Mask (Mem - Imm) (8) |
| 9886 DECODE_SIY_INSTRUCTION(b1, d1, i2); |
| 9887 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1); |
| 9888 intptr_t d1_val = d1; |
| 9889 intptr_t addr = b1_val + d1_val; |
| 9890 uint8_t mem_val = ReadB(addr); |
| 9891 uint8_t imm_val = i2; |
| 9892 uint8_t selected_bits = mem_val & imm_val; |
| 9893 // CC0: Selected bits are zero |
| 9894 // CC1: Selected bits mixed zeros and ones |
| 9895 // CC3: Selected bits all ones |
| 9896 if (0 == selected_bits) { |
| 9897 condition_reg_ = CC_EQ; // CC0 |
| 9898 } else if (selected_bits == imm_val) { |
| 9899 condition_reg_ = 0x1; // CC3 |
| 9900 } else { |
| 9901 condition_reg_ = 0x4; // CC1 |
| 9902 } |
| 9903 return length; |
| 9904 } |
9422 | 9905 |
9423 EVALUATE(MVIY) { return DecodeInstructionOriginal(instr); } | 9906 EVALUATE(MVIY) { return DecodeInstructionOriginal(instr); } |
9424 | 9907 |
9425 EVALUATE(NIY) { return DecodeInstructionOriginal(instr); } | 9908 EVALUATE(NIY) { return DecodeInstructionOriginal(instr); } |
9426 | 9909 |
9427 EVALUATE(CLIY) { return DecodeInstructionOriginal(instr); } | 9910 EVALUATE(CLIY) { |
| 9911 DCHECK_OPCODE(CLIY); |
| 9912 DECODE_SIY_INSTRUCTION(b1, d1, i2); |
| 9913 // Compare Immediate (Mem - Imm) (8) |
| 9914 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1); |
| 9915 intptr_t d1_val = d1; |
| 9916 intptr_t addr = b1_val + d1_val; |
| 9917 uint8_t mem_val = ReadB(addr); |
| 9918 uint8_t imm_val = i2; |
| 9919 SetS390ConditionCode<uint8_t>(mem_val, imm_val); |
| 9920 return length; |
| 9921 } |
9428 | 9922 |
9429 EVALUATE(OIY) { return DecodeInstructionOriginal(instr); } | 9923 EVALUATE(OIY) { return DecodeInstructionOriginal(instr); } |
9430 | 9924 |
9431 EVALUATE(XIY) { return DecodeInstructionOriginal(instr); } | 9925 EVALUATE(XIY) { return DecodeInstructionOriginal(instr); } |
9432 | 9926 |
9433 EVALUATE(ASI) { return DecodeInstructionOriginal(instr); } | 9927 EVALUATE(ASI) { |
| 9928 DCHECK_OPCODE(ASI); |
| 9929 // TODO(bcleung): Change all fooInstr->I2Value() to template functions. |
| 9930 // 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 |
| 9932 // cast to int32_t could incorrectly interpret. |
| 9933 DECODE_SIY_INSTRUCTION(b1, d1, i2_unsigned); |
| 9934 int8_t i2_8bit = static_cast<int8_t>(i2_unsigned); |
| 9935 int32_t i2 = static_cast<int32_t>(i2_8bit); |
| 9936 intptr_t b1_val = (b1 == 0) ? 0 : get_register(b1); |
| 9937 |
| 9938 int d1_val = d1; |
| 9939 intptr_t addr = b1_val + d1_val; |
| 9940 |
| 9941 int32_t mem_val = ReadW(addr, instr); |
| 9942 bool isOF = CheckOverflowForIntAdd(mem_val, i2, int32_t); |
| 9943 int32_t alu_out = mem_val + i2; |
| 9944 SetS390ConditionCode<int32_t>(alu_out, 0); |
| 9945 SetS390OverflowCode(isOF); |
| 9946 WriteW(addr, alu_out, instr); |
| 9947 return length; |
| 9948 } |
9434 | 9949 |
9435 EVALUATE(ALSI) { return DecodeInstructionOriginal(instr); } | 9950 EVALUATE(ALSI) { return DecodeInstructionOriginal(instr); } |
9436 | 9951 |
9437 EVALUATE(AGSI) { return DecodeInstructionOriginal(instr); } | 9952 EVALUATE(AGSI) { |
| 9953 DCHECK_OPCODE(AGSI); |
| 9954 // TODO(bcleung): Change all fooInstr->I2Value() to template functions. |
| 9955 // 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 |
| 9957 // cast to int32_t could incorrectly interpret. |
| 9958 DECODE_SIY_INSTRUCTION(b1, d1, i2_unsigned); |
| 9959 int8_t i2_8bit = static_cast<int8_t>(i2_unsigned); |
| 9960 int64_t i2 = static_cast<int64_t>(i2_8bit); |
| 9961 intptr_t b1_val = (b1 == 0) ? 0 : get_register(b1); |
| 9962 |
| 9963 int d1_val = d1; |
| 9964 intptr_t addr = b1_val + d1_val; |
| 9965 |
| 9966 int64_t mem_val = ReadDW(addr); |
| 9967 int isOF = CheckOverflowForIntAdd(mem_val, i2, int64_t); |
| 9968 int64_t alu_out = mem_val + i2; |
| 9969 SetS390ConditionCode<uint64_t>(alu_out, 0); |
| 9970 SetS390OverflowCode(isOF); |
| 9971 WriteDW(addr, alu_out); |
| 9972 return length; |
| 9973 } |
9438 | 9974 |
9439 EVALUATE(ALGSI) { return DecodeInstructionOriginal(instr); } | 9975 EVALUATE(ALGSI) { return DecodeInstructionOriginal(instr); } |
9440 | 9976 |
9441 EVALUATE(ICMH) { return DecodeInstructionOriginal(instr); } | 9977 EVALUATE(ICMH) { return DecodeInstructionOriginal(instr); } |
9442 | 9978 |
9443 EVALUATE(ICMY) { return DecodeInstructionOriginal(instr); } | 9979 EVALUATE(ICMY) { return DecodeInstructionOriginal(instr); } |
9444 | 9980 |
9445 EVALUATE(MVCLU) { return DecodeInstructionOriginal(instr); } | 9981 EVALUATE(MVCLU) { return DecodeInstructionOriginal(instr); } |
9446 | 9982 |
9447 EVALUATE(CLCLU) { return DecodeInstructionOriginal(instr); } | 9983 EVALUATE(CLCLU) { return DecodeInstructionOriginal(instr); } |
9448 | 9984 |
9449 EVALUATE(STMY) { return DecodeInstructionOriginal(instr); } | 9985 EVALUATE(STMY) { |
| 9986 DCHECK_OPCODE(STMY); |
| 9987 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); |
| 9988 // Load/Store Multiple (32) |
| 9989 int offset = d2; |
| 9990 |
| 9991 // Regs roll around if r3 is less than r1. |
| 9992 // Artifically increase r3 by 16 so we can calculate |
| 9993 // the number of regs stored properly. |
| 9994 if (r3 < r1) r3 += 16; |
| 9995 |
| 9996 int32_t b2_val = (b2 == 0) ? 0 : get_low_register<int32_t>(b2); |
| 9997 |
| 9998 // Store each register in ascending order. |
| 9999 for (int i = 0; i <= r3 - r1; i++) { |
| 10000 int32_t value = get_low_register<int32_t>((r1 + i) % 16); |
| 10001 WriteW(b2_val + offset + 4 * i, value, instr); |
| 10002 } |
| 10003 return length; |
| 10004 } |
9450 | 10005 |
9451 EVALUATE(LMH) { return DecodeInstructionOriginal(instr); } | 10006 EVALUATE(LMH) { return DecodeInstructionOriginal(instr); } |
9452 | 10007 |
9453 EVALUATE(LMY) { return DecodeInstructionOriginal(instr); } | 10008 EVALUATE(LMY) { |
| 10009 DCHECK_OPCODE(LMY); |
| 10010 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); |
| 10011 // Load/Store Multiple (32) |
| 10012 int offset = d2; |
| 10013 |
| 10014 // Regs roll around if r3 is less than r1. |
| 10015 // Artifically increase r3 by 16 so we can calculate |
| 10016 // the number of regs stored properly. |
| 10017 if (r3 < r1) r3 += 16; |
| 10018 |
| 10019 int32_t b2_val = (b2 == 0) ? 0 : get_low_register<int32_t>(b2); |
| 10020 |
| 10021 // Store each register in ascending order. |
| 10022 for (int i = 0; i <= r3 - r1; i++) { |
| 10023 int32_t value = ReadW(b2_val + offset + 4 * i, instr); |
| 10024 set_low_register((r1 + i) % 16, value); |
| 10025 } |
| 10026 return length; |
| 10027 } |
9454 | 10028 |
9455 EVALUATE(TP) { return DecodeInstructionOriginal(instr); } | 10029 EVALUATE(TP) { return DecodeInstructionOriginal(instr); } |
9456 | 10030 |
9457 EVALUATE(SRAK) { return DecodeInstructionOriginal(instr); } | 10031 EVALUATE(SRAK) { |
| 10032 DCHECK_OPCODE(SRAK); |
| 10033 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); |
| 10034 // 32-bit non-clobbering shift-left/right arithmetic |
| 10035 // only takes rightmost 6 bits |
| 10036 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 10037 int shiftBits = (b2_val + d2) & 0x3F; |
| 10038 int32_t r3_val = get_low_register<int32_t>(r3); |
| 10039 int32_t alu_out = 0; |
| 10040 bool isOF = false; |
| 10041 alu_out = r3_val >> shiftBits; |
| 10042 set_low_register(r1, alu_out); |
| 10043 SetS390ConditionCode<int32_t>(alu_out, 0); |
| 10044 SetS390OverflowCode(isOF); |
| 10045 return length; |
| 10046 } |
9458 | 10047 |
9459 EVALUATE(SLAK) { return DecodeInstructionOriginal(instr); } | 10048 EVALUATE(SLAK) { |
| 10049 DCHECK_OPCODE(SLAK); |
| 10050 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); |
| 10051 // 32-bit non-clobbering shift-left/right arithmetic |
| 10052 // only takes rightmost 6 bits |
| 10053 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 10054 int shiftBits = (b2_val + d2) & 0x3F; |
| 10055 int32_t r3_val = get_low_register<int32_t>(r3); |
| 10056 int32_t alu_out = 0; |
| 10057 bool isOF = false; |
| 10058 isOF = CheckOverflowForShiftLeft(r3_val, shiftBits); |
| 10059 alu_out = r3_val << shiftBits; |
| 10060 set_low_register(r1, alu_out); |
| 10061 SetS390ConditionCode<int32_t>(alu_out, 0); |
| 10062 SetS390OverflowCode(isOF); |
| 10063 return length; |
| 10064 } |
9460 | 10065 |
9461 EVALUATE(SRLK) { return DecodeInstructionOriginal(instr); } | 10066 EVALUATE(SRLK) { |
| 10067 DCHECK_OPCODE(SRLK); |
| 10068 // For SLLK/SRLL, the 32-bit third operand is shifted the number |
| 10069 // of bits specified by the second-operand address, and the result is |
| 10070 // placed at the first-operand location. Except for when the R1 and R3 |
| 10071 // fields designate the same register, the third operand remains |
| 10072 // unchanged in general register R3. |
| 10073 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); |
| 10074 // only takes rightmost 6 bits |
| 10075 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 10076 int shiftBits = (b2_val + d2) & 0x3F; |
| 10077 // unsigned |
| 10078 uint32_t r3_val = get_low_register<uint32_t>(r3); |
| 10079 uint32_t alu_out = 0; |
| 10080 alu_out = r3_val >> shiftBits; |
| 10081 set_low_register(r1, alu_out); |
| 10082 return length; |
| 10083 } |
9462 | 10084 |
9463 EVALUATE(SLLK) { return DecodeInstructionOriginal(instr); } | 10085 EVALUATE(SLLK) { |
| 10086 DCHECK_OPCODE(SLLK); |
| 10087 // For SLLK/SRLL, the 32-bit third operand is shifted the number |
| 10088 // of bits specified by the second-operand address, and the result is |
| 10089 // placed at the first-operand location. Except for when the R1 and R3 |
| 10090 // fields designate the same register, the third operand remains |
| 10091 // unchanged in general register R3. |
| 10092 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); |
| 10093 // only takes rightmost 6 bits |
| 10094 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 10095 int shiftBits = (b2_val + d2) & 0x3F; |
| 10096 // unsigned |
| 10097 uint32_t r3_val = get_low_register<uint32_t>(r3); |
| 10098 uint32_t alu_out = 0; |
| 10099 alu_out = r3_val << shiftBits; |
| 10100 set_low_register(r1, alu_out); |
| 10101 return length; |
| 10102 } |
9464 | 10103 |
9465 EVALUATE(LOCG) { return DecodeInstructionOriginal(instr); } | 10104 EVALUATE(LOCG) { return DecodeInstructionOriginal(instr); } |
9466 | 10105 |
9467 EVALUATE(STOCG) { return DecodeInstructionOriginal(instr); } | 10106 EVALUATE(STOCG) { return DecodeInstructionOriginal(instr); } |
9468 | 10107 |
9469 EVALUATE(LANG) { return DecodeInstructionOriginal(instr); } | 10108 EVALUATE(LANG) { return DecodeInstructionOriginal(instr); } |
9470 | 10109 |
9471 EVALUATE(LAOG) { return DecodeInstructionOriginal(instr); } | 10110 EVALUATE(LAOG) { return DecodeInstructionOriginal(instr); } |
9472 | 10111 |
9473 EVALUATE(LAXG) { return DecodeInstructionOriginal(instr); } | 10112 EVALUATE(LAXG) { return DecodeInstructionOriginal(instr); } |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9521 EVALUATE(ALHSIK) { return DecodeInstructionOriginal(instr); } | 10160 EVALUATE(ALHSIK) { return DecodeInstructionOriginal(instr); } |
9522 | 10161 |
9523 EVALUATE(ALGHSIK) { return DecodeInstructionOriginal(instr); } | 10162 EVALUATE(ALGHSIK) { return DecodeInstructionOriginal(instr); } |
9524 | 10163 |
9525 EVALUATE(CGRB) { return DecodeInstructionOriginal(instr); } | 10164 EVALUATE(CGRB) { return DecodeInstructionOriginal(instr); } |
9526 | 10165 |
9527 EVALUATE(CGIB) { return DecodeInstructionOriginal(instr); } | 10166 EVALUATE(CGIB) { return DecodeInstructionOriginal(instr); } |
9528 | 10167 |
9529 EVALUATE(CIB) { return DecodeInstructionOriginal(instr); } | 10168 EVALUATE(CIB) { return DecodeInstructionOriginal(instr); } |
9530 | 10169 |
9531 EVALUATE(LDEB) { return DecodeInstructionOriginal(instr); } | 10170 EVALUATE(LDEB) { |
| 10171 DCHECK_OPCODE(LDEB); |
| 10172 // Load Float |
| 10173 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2); |
| 10174 int rb = b2; |
| 10175 int rx = x2; |
| 10176 int offset = d2; |
| 10177 int64_t rb_val = (rb == 0) ? 0 : get_register(rb); |
| 10178 int64_t rx_val = (rx == 0) ? 0 : get_register(rx); |
| 10179 double ret = |
| 10180 static_cast<double>(*reinterpret_cast<float*>(rx_val + rb_val + offset)); |
| 10181 set_d_register_from_double(r1, ret); |
| 10182 return length; |
| 10183 } |
9532 | 10184 |
9533 EVALUATE(LXDB) { return DecodeInstructionOriginal(instr); } | 10185 EVALUATE(LXDB) { return DecodeInstructionOriginal(instr); } |
9534 | 10186 |
9535 EVALUATE(LXEB) { return DecodeInstructionOriginal(instr); } | 10187 EVALUATE(LXEB) { return DecodeInstructionOriginal(instr); } |
9536 | 10188 |
9537 EVALUATE(MXDB) { return DecodeInstructionOriginal(instr); } | 10189 EVALUATE(MXDB) { return DecodeInstructionOriginal(instr); } |
9538 | 10190 |
9539 EVALUATE(KEB) { return DecodeInstructionOriginal(instr); } | 10191 EVALUATE(KEB) { return DecodeInstructionOriginal(instr); } |
9540 | 10192 |
9541 EVALUATE(CEB) { return DecodeInstructionOriginal(instr); } | 10193 EVALUATE(CEB) { return DecodeInstructionOriginal(instr); } |
(...skipping 11 matching lines...) Expand all Loading... |
9553 EVALUATE(MSEB) { return DecodeInstructionOriginal(instr); } | 10205 EVALUATE(MSEB) { return DecodeInstructionOriginal(instr); } |
9554 | 10206 |
9555 EVALUATE(TCEB) { return DecodeInstructionOriginal(instr); } | 10207 EVALUATE(TCEB) { return DecodeInstructionOriginal(instr); } |
9556 | 10208 |
9557 EVALUATE(TCDB) { return DecodeInstructionOriginal(instr); } | 10209 EVALUATE(TCDB) { return DecodeInstructionOriginal(instr); } |
9558 | 10210 |
9559 EVALUATE(TCXB) { return DecodeInstructionOriginal(instr); } | 10211 EVALUATE(TCXB) { return DecodeInstructionOriginal(instr); } |
9560 | 10212 |
9561 EVALUATE(SQEB) { return DecodeInstructionOriginal(instr); } | 10213 EVALUATE(SQEB) { return DecodeInstructionOriginal(instr); } |
9562 | 10214 |
9563 EVALUATE(SQDB) { return DecodeInstructionOriginal(instr); } | 10215 EVALUATE(SQDB) { |
| 10216 DCHECK_OPCODE(SQDB); |
| 10217 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2); |
| 10218 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 10219 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 10220 intptr_t d2_val = d2; |
| 10221 double r1_val = get_double_from_d_register(r1); |
| 10222 double dbl_val = ReadDouble(b2_val + x2_val + d2_val); |
| 10223 r1_val = std::sqrt(dbl_val); |
| 10224 set_d_register_from_double(r1, r1_val); |
| 10225 return length; |
| 10226 } |
9564 | 10227 |
9565 EVALUATE(MEEB) { return DecodeInstructionOriginal(instr); } | 10228 EVALUATE(MEEB) { return DecodeInstructionOriginal(instr); } |
9566 | 10229 |
9567 EVALUATE(KDB) { return DecodeInstructionOriginal(instr); } | 10230 EVALUATE(KDB) { return DecodeInstructionOriginal(instr); } |
9568 | 10231 |
9569 EVALUATE(CDB) { return DecodeInstructionOriginal(instr); } | 10232 EVALUATE(CDB) { |
| 10233 DCHECK_OPCODE(CDB); |
9570 | 10234 |
9571 EVALUATE(ADB) { return DecodeInstructionOriginal(instr); } | 10235 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2); |
| 10236 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 10237 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 10238 intptr_t d2_val = d2; |
| 10239 double r1_val = get_double_from_d_register(r1); |
| 10240 double dbl_val = ReadDouble(b2_val + x2_val + d2_val); |
| 10241 SetS390ConditionCode<double>(r1_val, dbl_val); |
| 10242 return length; |
| 10243 } |
9572 | 10244 |
9573 EVALUATE(SDB) { return DecodeInstructionOriginal(instr); } | 10245 EVALUATE(ADB) { |
| 10246 DCHECK_OPCODE(ADB); |
9574 | 10247 |
9575 EVALUATE(MDB) { return DecodeInstructionOriginal(instr); } | 10248 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2); |
| 10249 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 10250 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 10251 intptr_t d2_val = d2; |
| 10252 double r1_val = get_double_from_d_register(r1); |
| 10253 double dbl_val = ReadDouble(b2_val + x2_val + d2_val); |
| 10254 r1_val += dbl_val; |
| 10255 set_d_register_from_double(r1, r1_val); |
| 10256 SetS390ConditionCode<double>(r1_val, 0); |
| 10257 return length; |
| 10258 } |
9576 | 10259 |
9577 EVALUATE(DDB) { return DecodeInstructionOriginal(instr); } | 10260 EVALUATE(SDB) { |
| 10261 DCHECK_OPCODE(SDB); |
| 10262 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2); |
| 10263 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 10264 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 10265 intptr_t d2_val = d2; |
| 10266 double r1_val = get_double_from_d_register(r1); |
| 10267 double dbl_val = ReadDouble(b2_val + x2_val + d2_val); |
| 10268 r1_val -= dbl_val; |
| 10269 set_d_register_from_double(r1, r1_val); |
| 10270 SetS390ConditionCode<double>(r1_val, 0); |
| 10271 return length; |
| 10272 } |
| 10273 |
| 10274 EVALUATE(MDB) { |
| 10275 DCHECK_OPCODE(MDB); |
| 10276 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2); |
| 10277 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 10278 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 10279 intptr_t d2_val = d2; |
| 10280 double r1_val = get_double_from_d_register(r1); |
| 10281 double dbl_val = ReadDouble(b2_val + x2_val + d2_val); |
| 10282 r1_val *= dbl_val; |
| 10283 set_d_register_from_double(r1, r1_val); |
| 10284 SetS390ConditionCode<double>(r1_val, 0); |
| 10285 return length; |
| 10286 } |
| 10287 |
| 10288 EVALUATE(DDB) { |
| 10289 DCHECK_OPCODE(DDB); |
| 10290 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2); |
| 10291 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
| 10292 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
| 10293 intptr_t d2_val = d2; |
| 10294 double r1_val = get_double_from_d_register(r1); |
| 10295 double dbl_val = ReadDouble(b2_val + x2_val + d2_val); |
| 10296 r1_val /= dbl_val; |
| 10297 set_d_register_from_double(r1, r1_val); |
| 10298 SetS390ConditionCode<double>(r1_val, 0); |
| 10299 return length; |
| 10300 } |
9578 | 10301 |
9579 EVALUATE(MADB) { return DecodeInstructionOriginal(instr); } | 10302 EVALUATE(MADB) { return DecodeInstructionOriginal(instr); } |
9580 | 10303 |
9581 EVALUATE(MSDB) { return DecodeInstructionOriginal(instr); } | 10304 EVALUATE(MSDB) { return DecodeInstructionOriginal(instr); } |
9582 | 10305 |
9583 EVALUATE(SLDT) { return DecodeInstructionOriginal(instr); } | 10306 EVALUATE(SLDT) { return DecodeInstructionOriginal(instr); } |
9584 | 10307 |
9585 EVALUATE(SRDT) { return DecodeInstructionOriginal(instr); } | 10308 EVALUATE(SRDT) { return DecodeInstructionOriginal(instr); } |
9586 | 10309 |
9587 EVALUATE(SLXT) { return DecodeInstructionOriginal(instr); } | 10310 EVALUATE(SLXT) { return DecodeInstructionOriginal(instr); } |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9656 | 10379 |
9657 EVALUATE(CXZT) { return DecodeInstructionOriginal(instr); } | 10380 EVALUATE(CXZT) { return DecodeInstructionOriginal(instr); } |
9658 | 10381 |
9659 #undef EVALUATE | 10382 #undef EVALUATE |
9660 | 10383 |
9661 } // namespace internal | 10384 } // namespace internal |
9662 } // namespace v8 | 10385 } // namespace v8 |
9663 | 10386 |
9664 #endif // USE_SIMULATOR | 10387 #endif // USE_SIMULATOR |
9665 #endif // V8_TARGET_ARCH_S390 | 10388 #endif // V8_TARGET_ARCH_S390 |
OLD | NEW |