| 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 |