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 <assert.h> // For assert | 5 #include <assert.h> // For assert |
6 #include <limits.h> // For LONG_MIN, LONG_MAX. | 6 #include <limits.h> // For LONG_MIN, LONG_MAX. |
7 | 7 |
8 #if V8_TARGET_ARCH_S390 | 8 #if V8_TARGET_ARCH_S390 |
9 | 9 |
10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
(...skipping 3263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3274 UNIMPLEMENTED(); | 3274 UNIMPLEMENTED(); |
3275 } | 3275 } |
3276 } | 3276 } |
3277 | 3277 |
3278 void MacroAssembler::Mul32(Register dst, Register src1) { msr(dst, src1); } | 3278 void MacroAssembler::Mul32(Register dst, Register src1) { msr(dst, src1); } |
3279 | 3279 |
3280 void MacroAssembler::Mul32(Register dst, const Operand& src1) { | 3280 void MacroAssembler::Mul32(Register dst, const Operand& src1) { |
3281 msfi(dst, src1); | 3281 msfi(dst, src1); |
3282 } | 3282 } |
3283 | 3283 |
| 3284 #define Generate_MulHigh32(instr) \ |
| 3285 { \ |
| 3286 lgfr(dst, src1); \ |
| 3287 instr(dst, src2); \ |
| 3288 srlg(dst, dst, Operand(32)); \ |
| 3289 } |
| 3290 |
3284 void MacroAssembler::MulHigh32(Register dst, Register src1, | 3291 void MacroAssembler::MulHigh32(Register dst, Register src1, |
3285 const MemOperand& src2) { | 3292 const MemOperand& src2) { |
3286 lgfr(dst, src1); | 3293 Generate_MulHigh32(msgf); |
3287 msgf(dst, src2); | |
3288 srlg(dst, dst, Operand(32)); | |
3289 } | 3294 } |
3290 | 3295 |
3291 void MacroAssembler::MulHigh32(Register dst, Register src1, Register src2) { | 3296 void MacroAssembler::MulHigh32(Register dst, Register src1, Register src2) { |
3292 if (dst.is(src2)) { | 3297 if (dst.is(src2)) { |
3293 std::swap(src1, src2); | 3298 std::swap(src1, src2); |
3294 } | 3299 } |
3295 lgfr(dst, src1); | 3300 Generate_MulHigh32(msgfr); |
3296 msgfr(dst, src2); | |
3297 srlg(dst, dst, Operand(32)); | |
3298 } | 3301 } |
3299 | 3302 |
3300 void MacroAssembler::MulHigh32(Register dst, Register src1, | 3303 void MacroAssembler::MulHigh32(Register dst, Register src1, |
3301 const Operand& src2) { | 3304 const Operand& src2) { |
3302 lgfr(dst, src1); | 3305 Generate_MulHigh32(msgfi); |
3303 msgfi(dst, src2); | 3306 } |
3304 srlg(dst, dst, Operand(32)); | 3307 |
| 3308 #undef Generate_MulHigh32 |
| 3309 |
| 3310 #define Generate_MulHighU32(instr) \ |
| 3311 { \ |
| 3312 lr(r1, src1); \ |
| 3313 instr(r0, src2); \ |
| 3314 LoadlW(dst, r0); \ |
| 3315 } |
| 3316 |
| 3317 void MacroAssembler::MulHighU32(Register dst, Register src1, |
| 3318 const MemOperand& src2) { |
| 3319 Generate_MulHighU32(ml); |
| 3320 } |
| 3321 |
| 3322 void MacroAssembler::MulHighU32(Register dst, Register src1, Register src2) { |
| 3323 Generate_MulHighU32(mlr); |
| 3324 } |
| 3325 |
| 3326 void MacroAssembler::MulHighU32(Register dst, Register src1, |
| 3327 const Operand& src2) { |
| 3328 USE(dst); |
| 3329 USE(src1); |
| 3330 USE(src2); |
| 3331 UNREACHABLE(); |
| 3332 } |
| 3333 |
| 3334 #undef Generate_MulHighU32 |
| 3335 |
| 3336 #define Generate_Mul32WithOverflowIfCCUnequal(instr) \ |
| 3337 { \ |
| 3338 lgfr(dst, src1); \ |
| 3339 instr(dst, src2); \ |
| 3340 cgfr(dst, dst); \ |
| 3341 } |
| 3342 |
| 3343 void MacroAssembler::Mul32WithOverflowIfCCUnequal(Register dst, Register src1, |
| 3344 const MemOperand& src2) { |
| 3345 Generate_Mul32WithOverflowIfCCUnequal(msgf); |
3305 } | 3346 } |
3306 | 3347 |
3307 void MacroAssembler::Mul32WithOverflowIfCCUnequal(Register dst, Register src1, | 3348 void MacroAssembler::Mul32WithOverflowIfCCUnequal(Register dst, Register src1, |
3308 const MemOperand& src2) { | |
3309 lgfr(dst, src1); | |
3310 msgf(dst, src2); | |
3311 cgfr(dst, dst); | |
3312 } | |
3313 | |
3314 void MacroAssembler::Mul32WithOverflowIfCCUnequal(Register dst, Register src1, | |
3315 Register src2) { | 3349 Register src2) { |
3316 if (dst.is(src2)) { | 3350 if (dst.is(src2)) { |
3317 std::swap(src1, src2); | 3351 std::swap(src1, src2); |
3318 } | 3352 } |
3319 lgfr(dst, src1); | 3353 Generate_Mul32WithOverflowIfCCUnequal(msgfr); |
3320 msgfr(dst, src2); | |
3321 cgfr(dst, dst); | |
3322 } | 3354 } |
3323 | 3355 |
3324 void MacroAssembler::Mul32WithOverflowIfCCUnequal(Register dst, Register src1, | 3356 void MacroAssembler::Mul32WithOverflowIfCCUnequal(Register dst, Register src1, |
3325 const Operand& src2) { | 3357 const Operand& src2) { |
3326 lgfr(dst, src1); | 3358 Generate_Mul32WithOverflowIfCCUnequal(msgfi); |
3327 msgfi(dst, src2); | |
3328 cgfr(dst, dst); | |
3329 } | 3359 } |
3330 | 3360 |
| 3361 #undef Generate_Mul32WithOverflowIfCCUnequal |
| 3362 |
3331 void MacroAssembler::Mul64(Register dst, const MemOperand& src1) { | 3363 void MacroAssembler::Mul64(Register dst, const MemOperand& src1) { |
3332 if (is_int20(src1.offset())) { | 3364 if (is_int20(src1.offset())) { |
3333 msg(dst, src1); | 3365 msg(dst, src1); |
3334 } else { | 3366 } else { |
3335 UNIMPLEMENTED(); | 3367 UNIMPLEMENTED(); |
3336 } | 3368 } |
3337 } | 3369 } |
3338 | 3370 |
3339 void MacroAssembler::Mul64(Register dst, Register src1) { msgr(dst, src1); } | 3371 void MacroAssembler::Mul64(Register dst, Register src1) { msgr(dst, src1); } |
3340 | 3372 |
(...skipping 15 matching lines...) Expand all Loading... |
3356 void MacroAssembler::DivP(Register dividend, Register divider) { | 3388 void MacroAssembler::DivP(Register dividend, Register divider) { |
3357 // have to make sure the src and dst are reg pairs | 3389 // have to make sure the src and dst are reg pairs |
3358 DCHECK(dividend.code() % 2 == 0); | 3390 DCHECK(dividend.code() % 2 == 0); |
3359 #if V8_TARGET_ARCH_S390X | 3391 #if V8_TARGET_ARCH_S390X |
3360 dsgr(dividend, divider); | 3392 dsgr(dividend, divider); |
3361 #else | 3393 #else |
3362 dr(dividend, divider); | 3394 dr(dividend, divider); |
3363 #endif | 3395 #endif |
3364 } | 3396 } |
3365 | 3397 |
| 3398 #define Generate_Div32(instr) \ |
| 3399 { \ |
| 3400 lgfr(r1, src1); \ |
| 3401 instr(r0, src2); \ |
| 3402 LoadlW(dst, r1); \ |
| 3403 } |
| 3404 |
| 3405 void MacroAssembler::Div32(Register dst, Register src1, |
| 3406 const MemOperand& src2) { |
| 3407 Generate_Div32(dsgf); |
| 3408 } |
| 3409 |
| 3410 void MacroAssembler::Div32(Register dst, Register src1, Register src2) { |
| 3411 Generate_Div32(dsgfr); |
| 3412 } |
| 3413 |
| 3414 void MacroAssembler::Div32(Register dst, Register src1, const Operand& src2) { |
| 3415 USE(dst); |
| 3416 USE(src1); |
| 3417 USE(src2); |
| 3418 UNREACHABLE(); |
| 3419 } |
| 3420 |
| 3421 #undef Generate_Div32 |
| 3422 |
| 3423 #define Generate_DivU32(instr) \ |
| 3424 { \ |
| 3425 lr(r0, src1); \ |
| 3426 srdl(r0, Operand(32)); \ |
| 3427 instr(r0, src2); \ |
| 3428 LoadlW(dst, r1); \ |
| 3429 } |
| 3430 |
| 3431 void MacroAssembler::DivU32(Register dst, Register src1, |
| 3432 const MemOperand& src2) { |
| 3433 Generate_DivU32(dl); |
| 3434 } |
| 3435 |
| 3436 void MacroAssembler::DivU32(Register dst, Register src1, Register src2) { |
| 3437 Generate_DivU32(dlr); |
| 3438 } |
| 3439 |
| 3440 void MacroAssembler::DivU32(Register dst, Register src1, const Operand& src2) { |
| 3441 USE(dst); |
| 3442 USE(src1); |
| 3443 USE(src2); |
| 3444 UNREACHABLE(); |
| 3445 } |
| 3446 |
| 3447 #undef Generate_DivU32 |
| 3448 |
| 3449 #define Generate_Mod32(instr) \ |
| 3450 { \ |
| 3451 lgfr(r1, src1); \ |
| 3452 instr(r0, src2); \ |
| 3453 LoadlW(dst, r0); \ |
| 3454 } |
| 3455 |
| 3456 void MacroAssembler::Mod32(Register dst, Register src1, |
| 3457 const MemOperand& src2) { |
| 3458 Generate_Mod32(dsgf); |
| 3459 } |
| 3460 |
| 3461 void MacroAssembler::Mod32(Register dst, Register src1, Register src2) { |
| 3462 Generate_Mod32(dsgfr); |
| 3463 } |
| 3464 |
| 3465 void MacroAssembler::Mod32(Register dst, Register src1, const Operand& src2) { |
| 3466 USE(dst); |
| 3467 USE(src1); |
| 3468 USE(src2); |
| 3469 UNREACHABLE(); |
| 3470 } |
| 3471 |
| 3472 #undef Generate_Mod32 |
| 3473 |
| 3474 #define Generate_ModU32(instr) \ |
| 3475 { \ |
| 3476 lr(r0, src1); \ |
| 3477 srdl(r0, Operand(32)); \ |
| 3478 instr(r0, src2); \ |
| 3479 LoadlW(dst, r0); \ |
| 3480 } |
| 3481 |
| 3482 void MacroAssembler::ModU32(Register dst, Register src1, |
| 3483 const MemOperand& src2) { |
| 3484 Generate_ModU32(dl); |
| 3485 } |
| 3486 |
| 3487 void MacroAssembler::ModU32(Register dst, Register src1, Register src2) { |
| 3488 Generate_ModU32(dlr); |
| 3489 } |
| 3490 |
| 3491 void MacroAssembler::ModU32(Register dst, Register src1, const Operand& src2) { |
| 3492 USE(dst); |
| 3493 USE(src1); |
| 3494 USE(src2); |
| 3495 UNREACHABLE(); |
| 3496 } |
| 3497 |
| 3498 #undef Generate_ModU32 |
| 3499 |
3366 void MacroAssembler::MulP(Register dst, const Operand& opnd) { | 3500 void MacroAssembler::MulP(Register dst, const Operand& opnd) { |
3367 #if V8_TARGET_ARCH_S390X | 3501 #if V8_TARGET_ARCH_S390X |
3368 msgfi(dst, opnd); | 3502 msgfi(dst, opnd); |
3369 #else | 3503 #else |
3370 msfi(dst, opnd); | 3504 msfi(dst, opnd); |
3371 #endif | 3505 #endif |
3372 } | 3506 } |
3373 | 3507 |
3374 void MacroAssembler::MulP(Register dst, Register src) { | 3508 void MacroAssembler::MulP(Register dst, Register src) { |
3375 #if V8_TARGET_ARCH_S390X | 3509 #if V8_TARGET_ARCH_S390X |
(...skipping 1383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4759 } | 4893 } |
4760 | 4894 |
4761 void MacroAssembler::LoadlB(Register dst, const MemOperand& mem) { | 4895 void MacroAssembler::LoadlB(Register dst, const MemOperand& mem) { |
4762 #if V8_TARGET_ARCH_S390X | 4896 #if V8_TARGET_ARCH_S390X |
4763 llgc(dst, mem); | 4897 llgc(dst, mem); |
4764 #else | 4898 #else |
4765 llc(dst, mem); | 4899 llc(dst, mem); |
4766 #endif | 4900 #endif |
4767 } | 4901 } |
4768 | 4902 |
| 4903 void MacroAssembler::LoadlB(Register dst, Register src) { |
| 4904 #if V8_TARGET_ARCH_S390X |
| 4905 llgcr(dst, src); |
| 4906 #else |
| 4907 llcr(dst, src); |
| 4908 #endif |
| 4909 } |
| 4910 |
4769 void MacroAssembler::LoadLogicalReversedWordP(Register dst, | 4911 void MacroAssembler::LoadLogicalReversedWordP(Register dst, |
4770 const MemOperand& mem) { | 4912 const MemOperand& mem) { |
4771 lrv(dst, mem); | 4913 lrv(dst, mem); |
4772 LoadlW(dst, dst); | 4914 LoadlW(dst, dst); |
4773 } | 4915 } |
4774 | 4916 |
4775 | 4917 |
4776 void MacroAssembler::LoadLogicalReversedHalfWordP(Register dst, | 4918 void MacroAssembler::LoadLogicalReversedHalfWordP(Register dst, |
4777 const MemOperand& mem) { | 4919 const MemOperand& mem) { |
4778 lrvh(dst, mem); | 4920 lrvh(dst, mem); |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5114 | 5256 |
5115 void MacroAssembler::Popcnt32(Register dst, Register src) { | 5257 void MacroAssembler::Popcnt32(Register dst, Register src) { |
5116 DCHECK(!src.is(r0)); | 5258 DCHECK(!src.is(r0)); |
5117 DCHECK(!dst.is(r0)); | 5259 DCHECK(!dst.is(r0)); |
5118 | 5260 |
5119 popcnt(dst, src); | 5261 popcnt(dst, src); |
5120 ShiftRight(r0, dst, Operand(16)); | 5262 ShiftRight(r0, dst, Operand(16)); |
5121 ar(dst, r0); | 5263 ar(dst, r0); |
5122 ShiftRight(r0, dst, Operand(8)); | 5264 ShiftRight(r0, dst, Operand(8)); |
5123 ar(dst, r0); | 5265 ar(dst, r0); |
5124 LoadB(dst, dst); | 5266 LoadlB(dst, dst); |
5125 } | 5267 } |
5126 | 5268 |
5127 #ifdef V8_TARGET_ARCH_S390X | 5269 #ifdef V8_TARGET_ARCH_S390X |
5128 void MacroAssembler::Popcnt64(Register dst, Register src) { | 5270 void MacroAssembler::Popcnt64(Register dst, Register src) { |
5129 DCHECK(!src.is(r0)); | 5271 DCHECK(!src.is(r0)); |
5130 DCHECK(!dst.is(r0)); | 5272 DCHECK(!dst.is(r0)); |
5131 | 5273 |
5132 popcnt(dst, src); | 5274 popcnt(dst, src); |
5133 ShiftRightP(r0, dst, Operand(32)); | 5275 ShiftRightP(r0, dst, Operand(32)); |
5134 AddP(dst, r0); | 5276 AddP(dst, r0); |
5135 ShiftRightP(r0, dst, Operand(16)); | 5277 ShiftRightP(r0, dst, Operand(16)); |
5136 AddP(dst, r0); | 5278 AddP(dst, r0); |
5137 ShiftRightP(r0, dst, Operand(8)); | 5279 ShiftRightP(r0, dst, Operand(8)); |
5138 AddP(dst, r0); | 5280 AddP(dst, r0); |
5139 LoadB(dst, dst); | 5281 LoadlB(dst, dst); |
5140 } | 5282 } |
5141 #endif | 5283 #endif |
5142 | 5284 |
5143 #ifdef DEBUG | 5285 #ifdef DEBUG |
5144 bool AreAliased(Register reg1, Register reg2, Register reg3, Register reg4, | 5286 bool AreAliased(Register reg1, Register reg2, Register reg3, Register reg4, |
5145 Register reg5, Register reg6, Register reg7, Register reg8, | 5287 Register reg5, Register reg6, Register reg7, Register reg8, |
5146 Register reg9, Register reg10) { | 5288 Register reg9, Register reg10) { |
5147 int n_of_valid_regs = reg1.is_valid() + reg2.is_valid() + reg3.is_valid() + | 5289 int n_of_valid_regs = reg1.is_valid() + reg2.is_valid() + reg3.is_valid() + |
5148 reg4.is_valid() + reg5.is_valid() + reg6.is_valid() + | 5290 reg4.is_valid() + reg5.is_valid() + reg6.is_valid() + |
5149 reg7.is_valid() + reg8.is_valid() + reg9.is_valid() + | 5291 reg7.is_valid() + reg8.is_valid() + reg9.is_valid() + |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5221 } | 5363 } |
5222 if (mag.shift > 0) ShiftRightArith(result, result, Operand(mag.shift)); | 5364 if (mag.shift > 0) ShiftRightArith(result, result, Operand(mag.shift)); |
5223 ExtractBit(r0, dividend, 31); | 5365 ExtractBit(r0, dividend, 31); |
5224 AddP(result, r0); | 5366 AddP(result, r0); |
5225 } | 5367 } |
5226 | 5368 |
5227 } // namespace internal | 5369 } // namespace internal |
5228 } // namespace v8 | 5370 } // namespace v8 |
5229 | 5371 |
5230 #endif // V8_TARGET_ARCH_S390 | 5372 #endif // V8_TARGET_ARCH_S390 |
OLD | NEW |