OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 "src/compiler/code-generator.h" | 5 #include "src/compiler/code-generator.h" |
6 | 6 |
7 #include "src/compilation-info.h" | 7 #include "src/compilation-info.h" |
8 #include "src/compiler/code-generator-impl.h" | 8 #include "src/compiler/code-generator-impl.h" |
9 #include "src/compiler/gap-resolver.h" | 9 #include "src/compiler/gap-resolver.h" |
10 #include "src/compiler/node-matchers.h" | 10 #include "src/compiler/node-matchers.h" |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
295 break; | 295 break; |
296 } | 296 } |
297 break; | 297 break; |
298 default: | 298 default: |
299 break; | 299 break; |
300 } | 300 } |
301 UNREACHABLE(); | 301 UNREACHABLE(); |
302 return kNoCondition; | 302 return kNoCondition; |
303 } | 303 } |
304 | 304 |
| 305 typedef void (MacroAssembler::*RRTypeInstr)(Register, Register); |
| 306 typedef void (MacroAssembler::*RMTypeInstr)(Register, const MemOperand&); |
| 307 typedef void (MacroAssembler::*RITypeInstr)(Register, const Operand&); |
| 308 typedef void (MacroAssembler::*RRRTypeInstr)(Register, Register, Register); |
| 309 typedef void (MacroAssembler::*RRMTypeInstr)(Register, Register, |
| 310 const MemOperand&); |
| 311 typedef void (MacroAssembler::*RRITypeInstr)(Register, Register, |
| 312 const Operand&); |
| 313 |
| 314 #define CHECK_AND_ZERO_EXT_OUTPUT(num) \ |
| 315 { \ |
| 316 CHECK(HasImmediateInput(instr, (num))); \ |
| 317 int doZeroExt = i.InputInt32(num); \ |
| 318 if (doZeroExt) masm->LoadlW(i.OutputRegister(), i.OutputRegister()); \ |
| 319 } |
| 320 |
| 321 void AssembleBinOp(S390OperandConverter& i, MacroAssembler* masm, |
| 322 Instruction* instr, RRTypeInstr rr_instr, |
| 323 RMTypeInstr rm_instr, RITypeInstr ri_instr) { |
| 324 CHECK(i.OutputRegister().is(i.InputRegister(0))); |
| 325 AddressingMode mode = AddressingModeField::decode(instr->opcode()); |
| 326 int zeroExtIndex = 2; |
| 327 if (mode != kMode_None) { |
| 328 size_t first_index = 1; |
| 329 MemOperand operand = i.MemoryOperand(&mode, &first_index); |
| 330 zeroExtIndex = first_index; |
| 331 CHECK(rm_instr != NULL); |
| 332 (masm->*rm_instr)(i.OutputRegister(), operand); |
| 333 } else if (HasRegisterInput(instr, 1)) { |
| 334 (masm->*rr_instr)(i.OutputRegister(), i.InputRegister(1)); |
| 335 } else if (HasImmediateInput(instr, 1)) { |
| 336 (masm->*ri_instr)(i.OutputRegister(), i.InputImmediate(1)); |
| 337 } else if (HasStackSlotInput(instr, 1)) { |
| 338 (masm->*rm_instr)(i.OutputRegister(), i.InputStackSlot32(1)); |
| 339 } else { |
| 340 UNREACHABLE(); |
| 341 } |
| 342 CHECK_AND_ZERO_EXT_OUTPUT(zeroExtIndex); |
| 343 } |
| 344 |
| 345 void AssembleBinOp(S390OperandConverter& i, MacroAssembler* masm, |
| 346 Instruction* instr, RRRTypeInstr rrr_instr, |
| 347 RMTypeInstr rm_instr, RITypeInstr ri_instr) { |
| 348 AddressingMode mode = AddressingModeField::decode(instr->opcode()); |
| 349 int zeroExtIndex = 2; |
| 350 if (mode != kMode_None) { |
| 351 CHECK(i.OutputRegister().is(i.InputRegister(0))); |
| 352 size_t first_index = 1; |
| 353 MemOperand operand = i.MemoryOperand(&mode, &first_index); |
| 354 zeroExtIndex = first_index; |
| 355 CHECK(rm_instr != NULL); |
| 356 (masm->*rm_instr)(i.OutputRegister(), operand); |
| 357 } else if (HasRegisterInput(instr, 1)) { |
| 358 (masm->*rrr_instr)(i.OutputRegister(), i.InputRegister(0), |
| 359 i.InputRegister(1)); |
| 360 } else if (HasImmediateInput(instr, 1)) { |
| 361 CHECK(i.OutputRegister().is(i.InputRegister(0))); |
| 362 (masm->*ri_instr)(i.OutputRegister(), i.InputImmediate(1)); |
| 363 } else if (HasStackSlotInput(instr, 1)) { |
| 364 CHECK(i.OutputRegister().is(i.InputRegister(0))); |
| 365 (masm->*rm_instr)(i.OutputRegister(), i.InputStackSlot32(1)); |
| 366 } else { |
| 367 UNREACHABLE(); |
| 368 } |
| 369 CHECK_AND_ZERO_EXT_OUTPUT(zeroExtIndex); |
| 370 } |
| 371 |
| 372 void AssembleBinOp(S390OperandConverter& i, MacroAssembler* masm, |
| 373 Instruction* instr, RRRTypeInstr rrr_instr, |
| 374 RMTypeInstr rm_instr, RRITypeInstr rri_instr) { |
| 375 AddressingMode mode = AddressingModeField::decode(instr->opcode()); |
| 376 int zeroExtIndex = 2; |
| 377 if (mode != kMode_None) { |
| 378 CHECK(i.OutputRegister().is(i.InputRegister(0))); |
| 379 size_t first_index = 1; |
| 380 MemOperand operand = i.MemoryOperand(&mode, &first_index); |
| 381 zeroExtIndex = first_index; |
| 382 CHECK(rm_instr != NULL); |
| 383 (masm->*rm_instr)(i.OutputRegister(), operand); |
| 384 } else if (HasRegisterInput(instr, 1)) { |
| 385 (masm->*rrr_instr)(i.OutputRegister(), i.InputRegister(0), |
| 386 i.InputRegister(1)); |
| 387 } else if (HasImmediateInput(instr, 1)) { |
| 388 (masm->*rri_instr)(i.OutputRegister(), i.InputRegister(0), |
| 389 i.InputImmediate(1)); |
| 390 } else if (HasStackSlotInput(instr, 1)) { |
| 391 CHECK(i.OutputRegister().is(i.InputRegister(0))); |
| 392 (masm->*rm_instr)(i.OutputRegister(), i.InputStackSlot32(1)); |
| 393 } else { |
| 394 UNREACHABLE(); |
| 395 } |
| 396 CHECK_AND_ZERO_EXT_OUTPUT(zeroExtIndex); |
| 397 } |
| 398 |
| 399 void AssembleBinOp(S390OperandConverter& i, MacroAssembler* masm, |
| 400 Instruction* instr, RRRTypeInstr rrr_instr, |
| 401 RRMTypeInstr rrm_instr, RRITypeInstr rri_instr) { |
| 402 AddressingMode mode = AddressingModeField::decode(instr->opcode()); |
| 403 int zeroExtIndex = 2; |
| 404 if (mode != kMode_None) { |
| 405 size_t first_index = 1; |
| 406 MemOperand operand = i.MemoryOperand(&mode, &first_index); |
| 407 zeroExtIndex = first_index; |
| 408 CHECK(rrm_instr != NULL); |
| 409 (masm->*rrm_instr)(i.OutputRegister(), i.InputRegister(0), operand); |
| 410 } else if (HasRegisterInput(instr, 1)) { |
| 411 (masm->*rrr_instr)(i.OutputRegister(), i.InputRegister(0), |
| 412 i.InputRegister(1)); |
| 413 } else if (HasImmediateInput(instr, 1)) { |
| 414 (masm->*rri_instr)(i.OutputRegister(), i.InputRegister(0), |
| 415 i.InputImmediate(1)); |
| 416 } else if (HasStackSlotInput(instr, 1)) { |
| 417 (masm->*rrm_instr)(i.OutputRegister(), i.InputRegister(0), |
| 418 i.InputStackSlot32(1)); |
| 419 } else { |
| 420 UNREACHABLE(); |
| 421 } |
| 422 CHECK_AND_ZERO_EXT_OUTPUT(zeroExtIndex); |
| 423 } |
| 424 |
| 425 void AssembleBinOp(S390OperandConverter& i, MacroAssembler* masm, |
| 426 Instruction* instr, RRRTypeInstr rrr_instr, |
| 427 RRITypeInstr rri_instr) { |
| 428 AddressingMode mode = AddressingModeField::decode(instr->opcode()); |
| 429 CHECK(mode == kMode_None); |
| 430 int zeroExtIndex = 2; |
| 431 if (HasRegisterInput(instr, 1)) { |
| 432 (masm->*rrr_instr)(i.OutputRegister(), i.InputRegister(0), |
| 433 i.InputRegister(1)); |
| 434 } else if (HasImmediateInput(instr, 1)) { |
| 435 (masm->*rri_instr)(i.OutputRegister(), i.InputRegister(0), |
| 436 i.InputImmediate(1)); |
| 437 } else { |
| 438 UNREACHABLE(); |
| 439 } |
| 440 CHECK_AND_ZERO_EXT_OUTPUT(zeroExtIndex); |
| 441 } |
| 442 |
| 443 void AssembleBinOp(S390OperandConverter& i, MacroAssembler* masm, |
| 444 Instruction* instr, RRTypeInstr rr_instr, |
| 445 RITypeInstr ri_instr) { |
| 446 AddressingMode mode = AddressingModeField::decode(instr->opcode()); |
| 447 CHECK(mode == kMode_None); |
| 448 CHECK(i.OutputRegister().is(i.InputRegister(0))); |
| 449 int zeroExtIndex = 2; |
| 450 if (HasRegisterInput(instr, 1)) { |
| 451 (masm->*rr_instr)(i.OutputRegister(), i.InputRegister(1)); |
| 452 } else if (HasImmediateInput(instr, 1)) { |
| 453 (masm->*ri_instr)(i.OutputRegister(), i.InputImmediate(1)); |
| 454 } else { |
| 455 UNREACHABLE(); |
| 456 } |
| 457 CHECK_AND_ZERO_EXT_OUTPUT(zeroExtIndex); |
| 458 } |
| 459 |
| 460 #define ASSEMBLE_BIN_OP(instr1, instr2, instr3) \ |
| 461 AssembleBinOp(i, masm(), instr, &MacroAssembler::instr1, \ |
| 462 &MacroAssembler::instr2, &MacroAssembler::instr3) |
| 463 |
| 464 #undef CHECK_AND_ZERO_EXT_OUTPUT |
| 465 |
305 } // namespace | 466 } // namespace |
306 | 467 |
| 468 #define CHECK_AND_ZERO_EXT_OUTPUT(num) \ |
| 469 { \ |
| 470 CHECK(HasImmediateInput(instr, (num))); \ |
| 471 int doZeroExt = i.InputInt32(num); \ |
| 472 if (doZeroExt) __ LoadlW(i.OutputRegister(), i.OutputRegister()); \ |
| 473 } |
| 474 |
307 #define ASSEMBLE_FLOAT_UNOP(asm_instr) \ | 475 #define ASSEMBLE_FLOAT_UNOP(asm_instr) \ |
308 do { \ | 476 do { \ |
309 __ asm_instr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); \ | 477 __ asm_instr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); \ |
310 } while (0) | 478 } while (0) |
311 | 479 |
312 #define ASSEMBLE_FLOAT_BINOP(asm_instr) \ | 480 #define ASSEMBLE_FLOAT_BINOP(asm_instr) \ |
313 do { \ | 481 do { \ |
314 __ asm_instr(i.OutputDoubleRegister(), i.InputDoubleRegister(0), \ | 482 __ asm_instr(i.OutputDoubleRegister(), i.InputDoubleRegister(0), \ |
315 i.InputDoubleRegister(1)); \ | 483 i.InputDoubleRegister(1)); \ |
316 } while (0) | 484 } while (0) |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
352 | 520 |
353 // Divide instruction dr will implicity use register pair | 521 // Divide instruction dr will implicity use register pair |
354 // r0 & r1 below. | 522 // r0 & r1 below. |
355 // R0:R1 = R1 / divisor - R0 remainder | 523 // R0:R1 = R1 / divisor - R0 remainder |
356 // Copy remainder to output reg | 524 // Copy remainder to output reg |
357 #define ASSEMBLE_MODULO(div_instr, shift_instr) \ | 525 #define ASSEMBLE_MODULO(div_instr, shift_instr) \ |
358 do { \ | 526 do { \ |
359 __ LoadRR(r0, i.InputRegister(0)); \ | 527 __ LoadRR(r0, i.InputRegister(0)); \ |
360 __ shift_instr(r0, Operand(32)); \ | 528 __ shift_instr(r0, Operand(32)); \ |
361 __ div_instr(r0, i.InputRegister(1)); \ | 529 __ div_instr(r0, i.InputRegister(1)); \ |
362 __ ltr(i.OutputRegister(), r0); \ | 530 __ LoadlW(i.OutputRegister(), r0); \ |
363 } while (0) | 531 } while (0) |
364 | 532 |
365 #define ASSEMBLE_FLOAT_MODULO() \ | 533 #define ASSEMBLE_FLOAT_MODULO() \ |
366 do { \ | 534 do { \ |
367 FrameScope scope(masm(), StackFrame::MANUAL); \ | 535 FrameScope scope(masm(), StackFrame::MANUAL); \ |
368 __ PrepareCallCFunction(0, 2, kScratchReg); \ | 536 __ PrepareCallCFunction(0, 2, kScratchReg); \ |
369 __ MovToFloatParameters(i.InputDoubleRegister(0), \ | 537 __ MovToFloatParameters(i.InputDoubleRegister(0), \ |
370 i.InputDoubleRegister(1)); \ | 538 i.InputDoubleRegister(1)); \ |
371 __ CallCFunction(ExternalReference::mod_two_doubles_operation(isolate()), \ | 539 __ CallCFunction(ExternalReference::mod_two_doubles_operation(isolate()), \ |
372 0, 2); \ | 540 0, 2); \ |
(...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1051 break; | 1219 break; |
1052 } | 1220 } |
1053 case kArchStackSlot: { | 1221 case kArchStackSlot: { |
1054 FrameOffset offset = | 1222 FrameOffset offset = |
1055 frame_access_state()->GetFrameOffset(i.InputInt32(0)); | 1223 frame_access_state()->GetFrameOffset(i.InputInt32(0)); |
1056 __ AddP(i.OutputRegister(), offset.from_stack_pointer() ? sp : fp, | 1224 __ AddP(i.OutputRegister(), offset.from_stack_pointer() ? sp : fp, |
1057 Operand(offset.offset())); | 1225 Operand(offset.offset())); |
1058 break; | 1226 break; |
1059 } | 1227 } |
1060 case kS390_And32: | 1228 case kS390_And32: |
1061 ASSEMBLE_BINOP(And); | 1229 if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
| 1230 ASSEMBLE_BIN_OP(nrk, And, nilf); |
| 1231 } else { |
| 1232 ASSEMBLE_BIN_OP(nr, And, nilf); |
| 1233 } |
1062 break; | 1234 break; |
1063 case kS390_And64: | 1235 case kS390_And64: |
1064 ASSEMBLE_BINOP(AndP); | 1236 ASSEMBLE_BINOP(AndP); |
1065 break; | 1237 break; |
1066 case kS390_Or32: | 1238 case kS390_Or32: |
1067 ASSEMBLE_BINOP(Or); | 1239 if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
| 1240 ASSEMBLE_BIN_OP(ork, Or, oilf); |
| 1241 } else { |
| 1242 ASSEMBLE_BIN_OP(or_z, Or, oilf); |
| 1243 } |
| 1244 break; |
1068 case kS390_Or64: | 1245 case kS390_Or64: |
1069 ASSEMBLE_BINOP(OrP); | 1246 ASSEMBLE_BINOP(OrP); |
1070 break; | 1247 break; |
1071 case kS390_Xor32: | 1248 case kS390_Xor32: |
1072 ASSEMBLE_BINOP(Xor); | 1249 if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
| 1250 ASSEMBLE_BIN_OP(xrk, Xor, xilf); |
| 1251 } else { |
| 1252 ASSEMBLE_BIN_OP(xr, Xor, xilf); |
| 1253 } |
1073 break; | 1254 break; |
1074 case kS390_Xor64: | 1255 case kS390_Xor64: |
1075 ASSEMBLE_BINOP(XorP); | 1256 ASSEMBLE_BINOP(XorP); |
1076 break; | 1257 break; |
1077 case kS390_ShiftLeft32: | 1258 case kS390_ShiftLeft32: |
1078 if (HasRegisterInput(instr, 1)) { | 1259 if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
1079 if (i.OutputRegister().is(i.InputRegister(1)) && | 1260 AssembleBinOp(i, masm(), instr, &MacroAssembler::sllk, |
1080 !CpuFeatures::IsSupported(DISTINCT_OPS)) { | 1261 &MacroAssembler::sllk); |
1081 __ LoadRR(kScratchReg, i.InputRegister(1)); | |
1082 __ ShiftLeft(i.OutputRegister(), i.InputRegister(0), kScratchReg); | |
1083 } else { | |
1084 ASSEMBLE_BINOP(ShiftLeft); | |
1085 } | |
1086 } else { | 1262 } else { |
1087 ASSEMBLE_BINOP(ShiftLeft); | 1263 AssembleBinOp(i, masm(), instr, &MacroAssembler::sll, |
| 1264 &MacroAssembler::sll); |
1088 } | 1265 } |
1089 __ LoadlW(i.OutputRegister(0), i.OutputRegister(0)); | |
1090 break; | 1266 break; |
1091 #if V8_TARGET_ARCH_S390X | 1267 #if V8_TARGET_ARCH_S390X |
1092 case kS390_ShiftLeft64: | 1268 case kS390_ShiftLeft64: |
1093 ASSEMBLE_BINOP(sllg); | 1269 ASSEMBLE_BINOP(sllg); |
1094 break; | 1270 break; |
1095 #endif | 1271 #endif |
1096 case kS390_ShiftRight32: | 1272 case kS390_ShiftRight32: |
1097 if (HasRegisterInput(instr, 1)) { | 1273 if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
1098 if (i.OutputRegister().is(i.InputRegister(1)) && | 1274 AssembleBinOp(i, masm(), instr, &MacroAssembler::srlk, |
1099 !CpuFeatures::IsSupported(DISTINCT_OPS)) { | 1275 &MacroAssembler::srlk); |
1100 __ LoadRR(kScratchReg, i.InputRegister(1)); | |
1101 __ ShiftRight(i.OutputRegister(), i.InputRegister(0), kScratchReg); | |
1102 } else { | |
1103 ASSEMBLE_BINOP(ShiftRight); | |
1104 } | |
1105 } else { | 1276 } else { |
1106 ASSEMBLE_BINOP(ShiftRight); | 1277 AssembleBinOp(i, masm(), instr, &MacroAssembler::srl, |
| 1278 &MacroAssembler::srl); |
1107 } | 1279 } |
1108 __ LoadlW(i.OutputRegister(0), i.OutputRegister(0)); | |
1109 break; | 1280 break; |
1110 #if V8_TARGET_ARCH_S390X | 1281 #if V8_TARGET_ARCH_S390X |
1111 case kS390_ShiftRight64: | 1282 case kS390_ShiftRight64: |
1112 ASSEMBLE_BINOP(srlg); | 1283 ASSEMBLE_BINOP(srlg); |
1113 break; | 1284 break; |
1114 #endif | 1285 #endif |
1115 case kS390_ShiftRightArith32: | 1286 case kS390_ShiftRightArith32: |
1116 if (HasRegisterInput(instr, 1)) { | 1287 if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
1117 if (i.OutputRegister().is(i.InputRegister(1)) && | 1288 AssembleBinOp(i, masm(), instr, &MacroAssembler::srak, |
1118 !CpuFeatures::IsSupported(DISTINCT_OPS)) { | 1289 &MacroAssembler::srak); |
1119 __ LoadRR(kScratchReg, i.InputRegister(1)); | |
1120 __ ShiftRightArith(i.OutputRegister(), i.InputRegister(0), | |
1121 kScratchReg); | |
1122 } else { | |
1123 ASSEMBLE_BINOP(ShiftRightArith); | |
1124 } | |
1125 } else { | 1290 } else { |
1126 ASSEMBLE_BINOP(ShiftRightArith); | 1291 AssembleBinOp(i, masm(), instr, &MacroAssembler::sra, |
| 1292 &MacroAssembler::sra); |
1127 } | 1293 } |
1128 __ LoadlW(i.OutputRegister(), i.OutputRegister()); | |
1129 break; | 1294 break; |
1130 #if V8_TARGET_ARCH_S390X | 1295 #if V8_TARGET_ARCH_S390X |
1131 case kS390_ShiftRightArith64: | 1296 case kS390_ShiftRightArith64: |
1132 ASSEMBLE_BINOP(srag); | 1297 ASSEMBLE_BINOP(srag); |
1133 break; | 1298 break; |
1134 #endif | 1299 #endif |
1135 #if !V8_TARGET_ARCH_S390X | 1300 #if !V8_TARGET_ARCH_S390X |
1136 case kS390_AddPair: | 1301 case kS390_AddPair: |
1137 // i.InputRegister(0) ... left low word. | 1302 // i.InputRegister(0) ... left low word. |
1138 // i.InputRegister(1) ... left high word. | 1303 // i.InputRegister(1) ... left high word. |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1200 i.InputRegister(0), i.InputRegister(1), | 1365 i.InputRegister(0), i.InputRegister(1), |
1201 i.InputInt32(2)); | 1366 i.InputInt32(2)); |
1202 } else { | 1367 } else { |
1203 __ ShiftRightArithPair(i.OutputRegister(0), second_output, | 1368 __ ShiftRightArithPair(i.OutputRegister(0), second_output, |
1204 i.InputRegister(0), i.InputRegister(1), | 1369 i.InputRegister(0), i.InputRegister(1), |
1205 kScratchReg, i.InputRegister(2)); | 1370 kScratchReg, i.InputRegister(2)); |
1206 } | 1371 } |
1207 break; | 1372 break; |
1208 } | 1373 } |
1209 #endif | 1374 #endif |
1210 case kS390_RotRight32: | 1375 case kS390_RotRight32: { |
1211 if (HasRegisterInput(instr, 1)) { | 1376 if (HasRegisterInput(instr, 1)) { |
1212 __ LoadComplementRR(kScratchReg, i.InputRegister(1)); | 1377 __ LoadComplementRR(kScratchReg, i.InputRegister(1)); |
1213 __ rll(i.OutputRegister(), i.InputRegister(0), kScratchReg); | 1378 __ rll(i.OutputRegister(), i.InputRegister(0), kScratchReg); |
1214 } else { | 1379 } else { |
1215 __ rll(i.OutputRegister(), i.InputRegister(0), | 1380 __ rll(i.OutputRegister(), i.InputRegister(0), |
1216 Operand(32 - i.InputInt32(1))); | 1381 Operand(32 - i.InputInt32(1))); |
1217 } | 1382 } |
| 1383 CHECK_AND_ZERO_EXT_OUTPUT(2); |
1218 break; | 1384 break; |
| 1385 } |
1219 #if V8_TARGET_ARCH_S390X | 1386 #if V8_TARGET_ARCH_S390X |
1220 case kS390_RotRight64: | 1387 case kS390_RotRight64: |
1221 if (HasRegisterInput(instr, 1)) { | 1388 if (HasRegisterInput(instr, 1)) { |
1222 __ LoadComplementRR(kScratchReg, i.InputRegister(1)); | 1389 __ LoadComplementRR(kScratchReg, i.InputRegister(1)); |
1223 __ rllg(i.OutputRegister(), i.InputRegister(0), kScratchReg); | 1390 __ rllg(i.OutputRegister(), i.InputRegister(0), kScratchReg); |
1224 } else { | 1391 } else { |
1225 __ rllg(i.OutputRegister(), i.InputRegister(0), | 1392 __ rllg(i.OutputRegister(), i.InputRegister(0), |
1226 Operand(64 - i.InputInt32(1))); | 1393 Operand(64 - i.InputInt32(1))); |
1227 } | 1394 } |
1228 break; | 1395 break; |
1229 #endif | |
1230 case kS390_Not32: | |
1231 __ Not32(i.OutputRegister(), i.InputRegister(0)); | |
1232 break; | |
1233 case kS390_Not64: | |
1234 __ Not64(i.OutputRegister(), i.InputRegister(0)); | |
1235 break; | |
1236 #if V8_TARGET_ARCH_S390X | |
1237 case kS390_RotLeftAndClear64: | 1396 case kS390_RotLeftAndClear64: |
1238 if (CpuFeatures::IsSupported(GENERAL_INSTR_EXT)) { | 1397 if (CpuFeatures::IsSupported(GENERAL_INSTR_EXT)) { |
1239 int shiftAmount = i.InputInt32(1); | 1398 int shiftAmount = i.InputInt32(1); |
1240 int endBit = 63 - shiftAmount; | 1399 int endBit = 63 - shiftAmount; |
1241 int startBit = 63 - i.InputInt32(2); | 1400 int startBit = 63 - i.InputInt32(2); |
1242 __ risbg(i.OutputRegister(), i.InputRegister(0), Operand(startBit), | 1401 __ risbg(i.OutputRegister(), i.InputRegister(0), Operand(startBit), |
1243 Operand(endBit), Operand(shiftAmount), true); | 1402 Operand(endBit), Operand(shiftAmount), true); |
1244 } else { | 1403 } else { |
1245 int shiftAmount = i.InputInt32(1); | 1404 int shiftAmount = i.InputInt32(1); |
1246 int clearBit = 63 - i.InputInt32(2); | 1405 int clearBit = 63 - i.InputInt32(2); |
(...skipping 28 matching lines...) Expand all Loading... |
1275 Operand(endBit), Operand(shiftAmount), true); | 1434 Operand(endBit), Operand(shiftAmount), true); |
1276 } else { | 1435 } else { |
1277 int shiftAmount = i.InputInt32(1); | 1436 int shiftAmount = i.InputInt32(1); |
1278 int clearBit = i.InputInt32(2); | 1437 int clearBit = i.InputInt32(2); |
1279 __ rllg(i.OutputRegister(), i.InputRegister(0), Operand(shiftAmount)); | 1438 __ rllg(i.OutputRegister(), i.InputRegister(0), Operand(shiftAmount)); |
1280 __ srlg(i.OutputRegister(), i.OutputRegister(), Operand(clearBit)); | 1439 __ srlg(i.OutputRegister(), i.OutputRegister(), Operand(clearBit)); |
1281 __ sllg(i.OutputRegister(), i.OutputRegister(), Operand(clearBit)); | 1440 __ sllg(i.OutputRegister(), i.OutputRegister(), Operand(clearBit)); |
1282 } | 1441 } |
1283 break; | 1442 break; |
1284 #endif | 1443 #endif |
1285 case kS390_Add32: | 1444 case kS390_Add32: { |
1286 ASSEMBLE_BINOP(Add32); | 1445 if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
1287 __ LoadW(i.OutputRegister(), i.OutputRegister()); | 1446 ASSEMBLE_BIN_OP(ark, Add32, Add32_RRI); |
| 1447 } else { |
| 1448 ASSEMBLE_BIN_OP(ar, Add32, Add32_RI); |
| 1449 } |
1288 break; | 1450 break; |
| 1451 } |
1289 case kS390_Add64: | 1452 case kS390_Add64: |
1290 ASSEMBLE_BINOP(AddP); | 1453 ASSEMBLE_BINOP(AddP); |
1291 break; | 1454 break; |
1292 case kS390_AddFloat: | 1455 case kS390_AddFloat: |
1293 // Ensure we don't clobber right/InputReg(1) | 1456 // Ensure we don't clobber right/InputReg(1) |
1294 if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { | 1457 if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { |
1295 ASSEMBLE_FLOAT_UNOP(aebr); | 1458 ASSEMBLE_FLOAT_UNOP(aebr); |
1296 } else { | 1459 } else { |
1297 if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) | 1460 if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) |
1298 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 1461 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
1299 __ aebr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); | 1462 __ aebr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
1300 } | 1463 } |
1301 break; | 1464 break; |
1302 case kS390_AddDouble: | 1465 case kS390_AddDouble: |
1303 // Ensure we don't clobber right/InputReg(1) | 1466 // Ensure we don't clobber right/InputReg(1) |
1304 if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { | 1467 if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { |
1305 ASSEMBLE_FLOAT_UNOP(adbr); | 1468 ASSEMBLE_FLOAT_UNOP(adbr); |
1306 } else { | 1469 } else { |
1307 if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) | 1470 if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) |
1308 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 1471 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
1309 __ adbr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); | 1472 __ adbr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
1310 } | 1473 } |
1311 break; | 1474 break; |
1312 case kS390_Sub32: | 1475 case kS390_Sub32: |
1313 ASSEMBLE_BINOP(Sub32); | 1476 if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
1314 __ LoadW(i.OutputRegister(), i.OutputRegister()); | 1477 ASSEMBLE_BIN_OP(srk, Sub32, Sub32_RRI); |
| 1478 } else { |
| 1479 ASSEMBLE_BIN_OP(sr, Sub32, Sub32_RI); |
| 1480 } |
1315 break; | 1481 break; |
1316 case kS390_Sub64: | 1482 case kS390_Sub64: |
1317 ASSEMBLE_BINOP(SubP); | 1483 ASSEMBLE_BINOP(SubP); |
1318 break; | 1484 break; |
1319 case kS390_SubFloat: | 1485 case kS390_SubFloat: |
1320 // OutputDoubleReg() = i.InputDoubleRegister(0) - i.InputDoubleRegister(1) | 1486 // OutputDoubleReg() = i.InputDoubleRegister(0) - i.InputDoubleRegister(1) |
1321 if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { | 1487 if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { |
1322 __ ldr(kScratchDoubleReg, i.InputDoubleRegister(1)); | 1488 __ ldr(kScratchDoubleReg, i.InputDoubleRegister(1)); |
1323 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 1489 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
1324 __ sebr(i.OutputDoubleRegister(), kScratchDoubleReg); | 1490 __ sebr(i.OutputDoubleRegister(), kScratchDoubleReg); |
(...skipping 11 matching lines...) Expand all Loading... |
1336 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 1502 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
1337 __ sdbr(i.OutputDoubleRegister(), kScratchDoubleReg); | 1503 __ sdbr(i.OutputDoubleRegister(), kScratchDoubleReg); |
1338 } else { | 1504 } else { |
1339 if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) { | 1505 if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) { |
1340 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 1506 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
1341 } | 1507 } |
1342 __ sdbr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); | 1508 __ sdbr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
1343 } | 1509 } |
1344 break; | 1510 break; |
1345 case kS390_Mul32: | 1511 case kS390_Mul32: |
1346 if (HasRegisterInput(instr, 1)) { | 1512 ASSEMBLE_BIN_OP(Mul32, Mul32, Mul32); |
1347 __ Mul32(i.InputRegister(0), i.InputRegister(1)); | 1513 break; |
1348 } else if (HasImmediateInput(instr, 1)) { | 1514 case kS390_Mul32WithOverflow: |
1349 __ Mul32(i.InputRegister(0), i.InputImmediate(1)); | 1515 ASSEMBLE_BIN_OP(Mul32WithOverflowIfCCUnequal, |
1350 } else if (HasStackSlotInput(instr, 1)) { | 1516 Mul32WithOverflowIfCCUnequal, |
1351 __ Mul32(i.InputRegister(0), i.InputStackSlot32(1)); | 1517 Mul32WithOverflowIfCCUnequal); |
1352 } else { | |
1353 UNIMPLEMENTED(); | |
1354 } | |
1355 break; | 1518 break; |
1356 case kS390_Mul64: | 1519 case kS390_Mul64: |
| 1520 CHECK(i.OutputRegister().is(i.InputRegister(0))); |
1357 if (HasRegisterInput(instr, 1)) { | 1521 if (HasRegisterInput(instr, 1)) { |
1358 __ Mul64(i.InputRegister(0), i.InputRegister(1)); | 1522 __ Mul64(i.InputRegister(0), i.InputRegister(1)); |
1359 } else if (HasImmediateInput(instr, 1)) { | 1523 } else if (HasImmediateInput(instr, 1)) { |
1360 __ Mul64(i.InputRegister(0), i.InputImmediate(1)); | 1524 __ Mul64(i.InputRegister(0), i.InputImmediate(1)); |
1361 } else if (HasStackSlotInput(instr, 1)) { | 1525 } else if (HasStackSlotInput(instr, 1)) { |
1362 __ Mul64(i.InputRegister(0), i.InputStackSlot(1)); | 1526 __ Mul64(i.InputRegister(0), i.InputStackSlot(1)); |
1363 } else { | 1527 } else { |
1364 UNIMPLEMENTED(); | 1528 UNIMPLEMENTED(); |
1365 } | 1529 } |
1366 break; | 1530 break; |
1367 case kS390_MulHigh32: | 1531 case kS390_MulHigh32: |
1368 __ LoadRR(r1, i.InputRegister(0)); | 1532 ASSEMBLE_BIN_OP(MulHigh32, MulHigh32, MulHigh32); |
1369 if (HasRegisterInput(instr, 1)) { | |
1370 __ mr_z(r0, i.InputRegister(1)); | |
1371 } else if (HasStackSlotInput(instr, 1)) { | |
1372 __ mfy(r0, i.InputStackSlot32(1)); | |
1373 } else { | |
1374 UNIMPLEMENTED(); | |
1375 } | |
1376 __ LoadW(i.OutputRegister(), r0); | |
1377 break; | 1533 break; |
1378 case kS390_Mul32WithHigh32: | 1534 case kS390_Mul32WithHigh32: |
1379 __ LoadRR(r1, i.InputRegister(0)); | 1535 __ LoadRR(r1, i.InputRegister(0)); |
1380 __ mr_z(r0, i.InputRegister(1)); | 1536 __ mr_z(r0, i.InputRegister(1)); |
1381 __ LoadW(i.OutputRegister(0), r1); // low | 1537 __ LoadW(i.OutputRegister(0), r1); // low |
1382 __ LoadW(i.OutputRegister(1), r0); // high | 1538 __ LoadW(i.OutputRegister(1), r0); // high |
1383 break; | 1539 break; |
1384 case kS390_MulHighU32: | 1540 case kS390_MulHighU32: |
1385 __ LoadRR(r1, i.InputRegister(0)); | 1541 __ LoadRR(r1, i.InputRegister(0)); |
1386 if (HasRegisterInput(instr, 1)) { | 1542 if (HasRegisterInput(instr, 1)) { |
(...skipping 25 matching lines...) Expand all Loading... |
1412 __ mdbr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); | 1568 __ mdbr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
1413 } | 1569 } |
1414 break; | 1570 break; |
1415 #if V8_TARGET_ARCH_S390X | 1571 #if V8_TARGET_ARCH_S390X |
1416 case kS390_Div64: | 1572 case kS390_Div64: |
1417 __ LoadRR(r1, i.InputRegister(0)); | 1573 __ LoadRR(r1, i.InputRegister(0)); |
1418 __ dsgr(r0, i.InputRegister(1)); // R1: Dividend | 1574 __ dsgr(r0, i.InputRegister(1)); // R1: Dividend |
1419 __ ltgr(i.OutputRegister(), r1); // Copy R1: Quotient to output | 1575 __ ltgr(i.OutputRegister(), r1); // Copy R1: Quotient to output |
1420 break; | 1576 break; |
1421 #endif | 1577 #endif |
1422 case kS390_Div32: | 1578 case kS390_Div32: { |
1423 __ LoadRR(r0, i.InputRegister(0)); | 1579 AddressingMode mode = AddressingModeField::decode(instr->opcode()); |
1424 __ srda(r0, Operand(32)); | 1580 __ lgfr(r1, i.InputRegister(0)); |
1425 __ dr(r0, i.InputRegister(1)); | 1581 if (mode != kMode_None) { |
1426 __ LoadAndTestP_ExtendSrc(i.OutputRegister(), | 1582 size_t first_index = 1; |
1427 r1); // Copy R1: Quotient to output | 1583 MemOperand operand = i.MemoryOperand(&mode, &first_index); |
| 1584 __ dsgf(r0, operand); |
| 1585 } else if (HasRegisterInput(instr, 1)) { |
| 1586 __ dsgfr(r0, i.InputRegister(1)); |
| 1587 } else if (HasStackSlotInput(instr, 1)) { |
| 1588 __ dsgf(r0, i.InputStackSlot32(1)); |
| 1589 } else { |
| 1590 UNREACHABLE(); |
| 1591 } |
| 1592 __ LoadlW(i.OutputRegister(), r1); |
1428 break; | 1593 break; |
| 1594 } |
1429 #if V8_TARGET_ARCH_S390X | 1595 #if V8_TARGET_ARCH_S390X |
1430 case kS390_DivU64: | 1596 case kS390_DivU64: |
1431 __ LoadRR(r1, i.InputRegister(0)); | 1597 __ LoadRR(r1, i.InputRegister(0)); |
1432 __ LoadImmP(r0, Operand::Zero()); | 1598 __ LoadImmP(r0, Operand::Zero()); |
1433 __ dlgr(r0, i.InputRegister(1)); // R0:R1: Dividend | 1599 __ dlgr(r0, i.InputRegister(1)); // R0:R1: Dividend |
1434 __ ltgr(i.OutputRegister(), r1); // Copy R1: Quotient to output | 1600 __ ltgr(i.OutputRegister(), r1); // Copy R1: Quotient to output |
1435 break; | 1601 break; |
1436 #endif | 1602 #endif |
1437 case kS390_DivU32: | 1603 case kS390_DivU32: { |
1438 __ LoadRR(r0, i.InputRegister(0)); | 1604 __ lr(r0, i.InputRegister(0)); |
1439 __ srdl(r0, Operand(32)); | 1605 __ srdl(r0, Operand(32)); |
1440 __ dlr(r0, i.InputRegister(1)); // R0:R1: Dividend | 1606 AddressingMode mode = AddressingModeField::decode(instr->opcode()); |
1441 __ LoadlW(i.OutputRegister(), r1); // Copy R1: Quotient to output | 1607 if (mode != kMode_None) { |
1442 __ LoadAndTestP_ExtendSrc(r1, r1); | 1608 size_t first_index = 1; |
| 1609 MemOperand operand = i.MemoryOperand(&mode, &first_index); |
| 1610 __ dl(r0, operand); |
| 1611 } else if (HasRegisterInput(instr, 1)) { |
| 1612 __ dlr(r0, i.InputRegister(1)); |
| 1613 } else if (HasStackSlotInput(instr, 1)) { |
| 1614 __ dl(r0, i.InputStackSlot32(1)); |
| 1615 } else { |
| 1616 UNREACHABLE(); |
| 1617 } |
| 1618 __ LoadlW(i.OutputRegister(), r1); |
1443 break; | 1619 break; |
1444 | 1620 } |
1445 case kS390_DivFloat: | 1621 case kS390_DivFloat: |
1446 // InputDoubleRegister(1)=InputDoubleRegister(0)/InputDoubleRegister(1) | 1622 // InputDoubleRegister(1)=InputDoubleRegister(0)/InputDoubleRegister(1) |
1447 if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { | 1623 if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { |
1448 __ ldr(kScratchDoubleReg, i.InputDoubleRegister(1)); | 1624 __ ldr(kScratchDoubleReg, i.InputDoubleRegister(1)); |
1449 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 1625 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
1450 __ debr(i.OutputDoubleRegister(), kScratchDoubleReg); | 1626 __ debr(i.OutputDoubleRegister(), kScratchDoubleReg); |
1451 } else { | 1627 } else { |
1452 if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) | 1628 if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) |
1453 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 1629 __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
1454 __ debr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); | 1630 __ debr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1568 ASSEMBLE_IEEE754_UNOP(log10); | 1744 ASSEMBLE_IEEE754_UNOP(log10); |
1569 break; | 1745 break; |
1570 case kIeee754Float64Pow: { | 1746 case kIeee754Float64Pow: { |
1571 MathPowStub stub(isolate(), MathPowStub::DOUBLE); | 1747 MathPowStub stub(isolate(), MathPowStub::DOUBLE); |
1572 __ CallStub(&stub); | 1748 __ CallStub(&stub); |
1573 __ Move(d1, d3); | 1749 __ Move(d1, d3); |
1574 break; | 1750 break; |
1575 } | 1751 } |
1576 case kS390_Neg32: | 1752 case kS390_Neg32: |
1577 __ lcr(i.OutputRegister(), i.InputRegister(0)); | 1753 __ lcr(i.OutputRegister(), i.InputRegister(0)); |
1578 __ LoadW(i.OutputRegister(), i.OutputRegister()); | 1754 CHECK_AND_ZERO_EXT_OUTPUT(1); |
1579 break; | 1755 break; |
1580 case kS390_Neg64: | 1756 case kS390_Neg64: |
1581 __ lcgr(i.OutputRegister(), i.InputRegister(0)); | 1757 __ lcgr(i.OutputRegister(), i.InputRegister(0)); |
1582 break; | 1758 break; |
1583 case kS390_MaxFloat: | 1759 case kS390_MaxFloat: |
1584 ASSEMBLE_FLOAT_MAX(); | 1760 ASSEMBLE_FLOAT_MAX(); |
1585 break; | 1761 break; |
1586 case kS390_MaxDouble: | 1762 case kS390_MaxDouble: |
1587 ASSEMBLE_DOUBLE_MAX(); | 1763 ASSEMBLE_DOUBLE_MAX(); |
1588 break; | 1764 break; |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1724 DCHECK(op->representation() == MachineRepresentation::kFloat32); | 1900 DCHECK(op->representation() == MachineRepresentation::kFloat32); |
1725 __ StoreFloat32(i.InputDoubleRegister(0), | 1901 __ StoreFloat32(i.InputDoubleRegister(0), |
1726 MemOperand(sp, slot * kPointerSize)); | 1902 MemOperand(sp, slot * kPointerSize)); |
1727 } | 1903 } |
1728 } else { | 1904 } else { |
1729 __ StoreP(i.InputRegister(0), MemOperand(sp, slot * kPointerSize)); | 1905 __ StoreP(i.InputRegister(0), MemOperand(sp, slot * kPointerSize)); |
1730 } | 1906 } |
1731 break; | 1907 break; |
1732 } | 1908 } |
1733 case kS390_ExtendSignWord8: | 1909 case kS390_ExtendSignWord8: |
1734 #if V8_TARGET_ARCH_S390X | |
1735 __ lgbr(i.OutputRegister(), i.InputRegister(0)); | |
1736 #else | |
1737 __ lbr(i.OutputRegister(), i.InputRegister(0)); | 1910 __ lbr(i.OutputRegister(), i.InputRegister(0)); |
1738 #endif | 1911 CHECK_AND_ZERO_EXT_OUTPUT(1); |
1739 break; | 1912 break; |
1740 case kS390_ExtendSignWord16: | 1913 case kS390_ExtendSignWord16: |
1741 #if V8_TARGET_ARCH_S390X | |
1742 __ lghr(i.OutputRegister(), i.InputRegister(0)); | |
1743 #else | |
1744 __ lhr(i.OutputRegister(), i.InputRegister(0)); | 1914 __ lhr(i.OutputRegister(), i.InputRegister(0)); |
1745 #endif | 1915 CHECK_AND_ZERO_EXT_OUTPUT(1); |
1746 break; | 1916 break; |
1747 #if V8_TARGET_ARCH_S390X | 1917 #if V8_TARGET_ARCH_S390X |
1748 case kS390_ExtendSignWord32: | 1918 case kS390_ExtendSignWord32: |
1749 __ lgfr(i.OutputRegister(), i.InputRegister(0)); | 1919 __ lgfr(i.OutputRegister(), i.InputRegister(0)); |
1750 break; | 1920 break; |
1751 case kS390_Uint32ToUint64: | 1921 case kS390_Uint32ToUint64: |
1752 // Zero extend | 1922 // Zero extend |
1753 __ llgfr(i.OutputRegister(), i.InputRegister(0)); | 1923 __ llgfr(i.OutputRegister(), i.InputRegister(0)); |
1754 break; | 1924 break; |
1755 case kS390_Int64ToInt32: | 1925 case kS390_Int64ToInt32: |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2006 break; | 2176 break; |
2007 case kS390_StoreReverse64: | 2177 case kS390_StoreReverse64: |
2008 ASSEMBLE_STORE_INTEGER(strvg); | 2178 ASSEMBLE_STORE_INTEGER(strvg); |
2009 break; | 2179 break; |
2010 case kS390_StoreFloat32: | 2180 case kS390_StoreFloat32: |
2011 ASSEMBLE_STORE_FLOAT32(); | 2181 ASSEMBLE_STORE_FLOAT32(); |
2012 break; | 2182 break; |
2013 case kS390_StoreDouble: | 2183 case kS390_StoreDouble: |
2014 ASSEMBLE_STORE_DOUBLE(); | 2184 ASSEMBLE_STORE_DOUBLE(); |
2015 break; | 2185 break; |
| 2186 case kS390_Lay: |
| 2187 __ lay(i.OutputRegister(), i.MemoryOperand()); |
| 2188 break; |
2016 case kCheckedLoadInt8: | 2189 case kCheckedLoadInt8: |
2017 ASSEMBLE_CHECKED_LOAD_INTEGER(LoadlB); | 2190 ASSEMBLE_CHECKED_LOAD_INTEGER(LoadlB); |
2018 #if V8_TARGET_ARCH_S390X | 2191 #if V8_TARGET_ARCH_S390X |
2019 __ lgbr(i.OutputRegister(), i.OutputRegister()); | 2192 __ lgbr(i.OutputRegister(), i.OutputRegister()); |
2020 #else | 2193 #else |
2021 __ lbr(i.OutputRegister(), i.OutputRegister()); | 2194 __ lbr(i.OutputRegister(), i.OutputRegister()); |
2022 #endif | 2195 #endif |
2023 break; | 2196 break; |
2024 case kCheckedLoadUint8: | 2197 case kCheckedLoadUint8: |
2025 ASSEMBLE_CHECKED_LOAD_INTEGER(LoadlB); | 2198 ASSEMBLE_CHECKED_LOAD_INTEGER(LoadlB); |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2354 destination->IsRegister() ? g.ToRegister(destination) : kScratchReg; | 2527 destination->IsRegister() ? g.ToRegister(destination) : kScratchReg; |
2355 switch (src.type()) { | 2528 switch (src.type()) { |
2356 case Constant::kInt32: | 2529 case Constant::kInt32: |
2357 #if V8_TARGET_ARCH_S390X | 2530 #if V8_TARGET_ARCH_S390X |
2358 if (RelocInfo::IsWasmSizeReference(src.rmode())) { | 2531 if (RelocInfo::IsWasmSizeReference(src.rmode())) { |
2359 #else | 2532 #else |
2360 if (RelocInfo::IsWasmReference(src.rmode())) { | 2533 if (RelocInfo::IsWasmReference(src.rmode())) { |
2361 #endif | 2534 #endif |
2362 __ mov(dst, Operand(src.ToInt32(), src.rmode())); | 2535 __ mov(dst, Operand(src.ToInt32(), src.rmode())); |
2363 } else { | 2536 } else { |
2364 __ mov(dst, Operand(src.ToInt32())); | 2537 __ Load(dst, Operand(src.ToInt32())); |
2365 } | 2538 } |
2366 break; | 2539 break; |
2367 case Constant::kInt64: | 2540 case Constant::kInt64: |
2368 #if V8_TARGET_ARCH_S390X | 2541 #if V8_TARGET_ARCH_S390X |
2369 if (RelocInfo::IsWasmPtrReference(src.rmode())) { | 2542 if (RelocInfo::IsWasmPtrReference(src.rmode())) { |
2370 __ mov(dst, Operand(src.ToInt64(), src.rmode())); | 2543 __ mov(dst, Operand(src.ToInt64(), src.rmode())); |
2371 } else { | 2544 } else { |
2372 DCHECK(!RelocInfo::IsWasmSizeReference(src.rmode())); | 2545 DCHECK(!RelocInfo::IsWasmSizeReference(src.rmode())); |
2373 __ mov(dst, Operand(src.ToInt64())); | 2546 __ Load(dst, Operand(src.ToInt64())); |
2374 } | 2547 } |
2375 #else | 2548 #else |
2376 __ mov(dst, Operand(src.ToInt64())); | 2549 __ mov(dst, Operand(src.ToInt64())); |
2377 #endif // V8_TARGET_ARCH_S390X | 2550 #endif // V8_TARGET_ARCH_S390X |
2378 break; | 2551 break; |
2379 case Constant::kFloat32: | 2552 case Constant::kFloat32: |
2380 __ Move(dst, | 2553 __ Move(dst, |
2381 isolate()->factory()->NewNumber(src.ToFloat32(), TENURED)); | 2554 isolate()->factory()->NewNumber(src.ToFloat32(), TENURED)); |
2382 break; | 2555 break; |
2383 case Constant::kFloat64: | 2556 case Constant::kFloat64: |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2552 padding_size -= 2; | 2725 padding_size -= 2; |
2553 } | 2726 } |
2554 } | 2727 } |
2555 } | 2728 } |
2556 | 2729 |
2557 #undef __ | 2730 #undef __ |
2558 | 2731 |
2559 } // namespace compiler | 2732 } // namespace compiler |
2560 } // namespace internal | 2733 } // namespace internal |
2561 } // namespace v8 | 2734 } // namespace v8 |
OLD | NEW |