Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/mips/macro-assembler-mips.cc

Issue 1431813002: Adapt long branches to use bc & balc on r6. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix variable name. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/mips/macro-assembler-mips.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 // Copyright 2012 the V8 project authors. All rights reserved. 2 // Copyright 2012 the V8 project authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be 3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file. 4 // found in the LICENSE file.
5 5
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_MIPS 8 #if V8_TARGET_ARCH_MIPS
9 9
10 #include "src/base/bits.h" 10 #include "src/base/bits.h"
(...skipping 1423 matching lines...) Expand 10 before | Expand all | Expand 10 after
1434 // Check for unordered (NaN) cases. 1434 // Check for unordered (NaN) cases.
1435 if (nan) { 1435 if (nan) {
1436 bool long_branch = 1436 bool long_branch =
1437 nan->is_bound() ? is_near(nan) : is_trampoline_emitted(); 1437 nan->is_bound() ? is_near(nan) : is_trampoline_emitted();
1438 if (!IsMipsArchVariant(kMips32r6)) { 1438 if (!IsMipsArchVariant(kMips32r6)) {
1439 if (long_branch) { 1439 if (long_branch) {
1440 Label skip; 1440 Label skip;
1441 c(UN, D, cmp1, cmp2); 1441 c(UN, D, cmp1, cmp2);
1442 bc1f(&skip); 1442 bc1f(&skip);
1443 nop(); 1443 nop();
1444 Jr(nan, bd); 1444 BranchLong(nan, bd);
1445 bind(&skip); 1445 bind(&skip);
1446 } else { 1446 } else {
1447 c(UN, D, cmp1, cmp2); 1447 c(UN, D, cmp1, cmp2);
1448 bc1t(nan); 1448 bc1t(nan);
1449 if (bd == PROTECT) { 1449 if (bd == PROTECT) {
1450 nop(); 1450 nop();
1451 } 1451 }
1452 } 1452 }
1453 } else { 1453 } else {
1454 // Use kDoubleCompareReg for comparison result. It has to be unavailable 1454 // Use kDoubleCompareReg for comparison result. It has to be unavailable
1455 // to lithium register allocator. 1455 // to lithium register allocator.
1456 DCHECK(!cmp1.is(kDoubleCompareReg) && !cmp2.is(kDoubleCompareReg)); 1456 DCHECK(!cmp1.is(kDoubleCompareReg) && !cmp2.is(kDoubleCompareReg));
1457 if (long_branch) { 1457 if (long_branch) {
1458 Label skip; 1458 Label skip;
1459 cmp(UN, L, kDoubleCompareReg, cmp1, cmp2); 1459 cmp(UN, L, kDoubleCompareReg, cmp1, cmp2);
1460 bc1eqz(&skip, kDoubleCompareReg); 1460 bc1eqz(&skip, kDoubleCompareReg);
1461 nop(); 1461 nop();
1462 Jr(nan, bd); 1462 BranchLong(nan, bd);
1463 bind(&skip); 1463 bind(&skip);
1464 } else { 1464 } else {
1465 cmp(UN, L, kDoubleCompareReg, cmp1, cmp2); 1465 cmp(UN, L, kDoubleCompareReg, cmp1, cmp2);
1466 bc1nez(nan, kDoubleCompareReg); 1466 bc1nez(nan, kDoubleCompareReg);
1467 if (bd == PROTECT) { 1467 if (bd == PROTECT) {
1468 nop(); 1468 nop();
1469 } 1469 }
1470 } 1470 }
1471 } 1471 }
1472 } 1472 }
1473 1473
1474 if (target) { 1474 if (target) {
1475 bool long_branch = 1475 bool long_branch =
1476 target->is_bound() ? is_near(target) : is_trampoline_emitted(); 1476 target->is_bound() ? is_near(target) : is_trampoline_emitted();
1477 if (long_branch) { 1477 if (long_branch) {
1478 Label skip; 1478 Label skip;
1479 Condition neg_cond = NegateFpuCondition(cond); 1479 Condition neg_cond = NegateFpuCondition(cond);
1480 BranchShortF(sizeField, &skip, neg_cond, cmp1, cmp2, bd); 1480 BranchShortF(sizeField, &skip, neg_cond, cmp1, cmp2, bd);
1481 Jr(target, bd); 1481 BranchLong(target, bd);
1482 bind(&skip); 1482 bind(&skip);
1483 } else { 1483 } else {
1484 BranchShortF(sizeField, target, cond, cmp1, cmp2, bd); 1484 BranchShortF(sizeField, target, cond, cmp1, cmp2, bd);
1485 } 1485 }
1486 } 1486 }
1487 } 1487 }
1488 } 1488 }
1489 1489
1490 void MacroAssembler::BranchShortF(SecondaryField sizeField, Label* target, 1490 void MacroAssembler::BranchShortF(SecondaryField sizeField, Label* target,
1491 Condition cc, FPURegister cmp1, 1491 Condition cc, FPURegister cmp1,
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after
1950 DCHECK(is_near); 1950 DCHECK(is_near);
1951 USE(is_near); 1951 USE(is_near);
1952 } 1952 }
1953 1953
1954 1954
1955 void MacroAssembler::Branch(Label* L, BranchDelaySlot bdslot) { 1955 void MacroAssembler::Branch(Label* L, BranchDelaySlot bdslot) {
1956 if (L->is_bound()) { 1956 if (L->is_bound()) {
1957 if (is_near_branch(L)) { 1957 if (is_near_branch(L)) {
1958 BranchShort(L, bdslot); 1958 BranchShort(L, bdslot);
1959 } else { 1959 } else {
1960 Jr(L, bdslot); 1960 BranchLong(L, bdslot);
1961 } 1961 }
1962 } else { 1962 } else {
1963 if (is_trampoline_emitted()) { 1963 if (is_trampoline_emitted()) {
1964 Jr(L, bdslot); 1964 BranchLong(L, bdslot);
1965 } else { 1965 } else {
1966 BranchShort(L, bdslot); 1966 BranchShort(L, bdslot);
1967 } 1967 }
1968 } 1968 }
1969 } 1969 }
1970 1970
1971 1971
1972 void MacroAssembler::Branch(Label* L, Condition cond, Register rs, 1972 void MacroAssembler::Branch(Label* L, Condition cond, Register rs,
1973 const Operand& rt, 1973 const Operand& rt,
1974 BranchDelaySlot bdslot) { 1974 BranchDelaySlot bdslot) {
1975 if (L->is_bound()) { 1975 if (L->is_bound()) {
1976 if (!BranchShortCheck(0, L, cond, rs, rt, bdslot)) { 1976 if (!BranchShortCheck(0, L, cond, rs, rt, bdslot)) {
1977 if (cond != cc_always) { 1977 if (cond != cc_always) {
1978 Label skip; 1978 Label skip;
1979 Condition neg_cond = NegateCondition(cond); 1979 Condition neg_cond = NegateCondition(cond);
1980 BranchShort(&skip, neg_cond, rs, rt); 1980 BranchShort(&skip, neg_cond, rs, rt);
1981 Jr(L, bdslot); 1981 BranchLong(L, bdslot);
1982 bind(&skip); 1982 bind(&skip);
1983 } else { 1983 } else {
1984 Jr(L, bdslot); 1984 BranchLong(L, bdslot);
1985 } 1985 }
1986 } 1986 }
1987 } else { 1987 } else {
1988 if (is_trampoline_emitted()) { 1988 if (is_trampoline_emitted()) {
1989 if (cond != cc_always) { 1989 if (cond != cc_always) {
1990 Label skip; 1990 Label skip;
1991 Condition neg_cond = NegateCondition(cond); 1991 Condition neg_cond = NegateCondition(cond);
1992 BranchShort(&skip, neg_cond, rs, rt); 1992 BranchShort(&skip, neg_cond, rs, rt);
1993 Jr(L, bdslot); 1993 BranchLong(L, bdslot);
1994 bind(&skip); 1994 bind(&skip);
1995 } else { 1995 } else {
1996 Jr(L, bdslot); 1996 BranchLong(L, bdslot);
1997 } 1997 }
1998 } else { 1998 } else {
1999 BranchShort(L, cond, rs, rt, bdslot); 1999 BranchShort(L, cond, rs, rt, bdslot);
2000 } 2000 }
2001 } 2001 }
2002 } 2002 }
2003 2003
2004 2004
2005 void MacroAssembler::Branch(Label* L, 2005 void MacroAssembler::Branch(Label* L,
2006 Condition cond, 2006 Condition cond,
2007 Register rs, 2007 Register rs,
2008 Heap::RootListIndex index, 2008 Heap::RootListIndex index,
2009 BranchDelaySlot bdslot) { 2009 BranchDelaySlot bdslot) {
2010 LoadRoot(at, index); 2010 LoadRoot(at, index);
2011 Branch(L, cond, rs, Operand(at), bdslot); 2011 Branch(L, cond, rs, Operand(at), bdslot);
2012 } 2012 }
2013 2013
2014 2014
2015 void MacroAssembler::BranchShortHelper(int16_t offset, Label* L, 2015 void MacroAssembler::BranchShortHelper(int16_t offset, Label* L,
2016 BranchDelaySlot bdslot) { 2016 BranchDelaySlot bdslot) {
2017 DCHECK(L == nullptr || offset == 0);
2017 offset = GetOffset(offset, L, OffsetSize::kOffset16); 2018 offset = GetOffset(offset, L, OffsetSize::kOffset16);
2018 b(offset); 2019 b(offset);
2019 2020
2020 // Emit a nop in the branch delay slot if required. 2021 // Emit a nop in the branch delay slot if required.
2021 if (bdslot == PROTECT) 2022 if (bdslot == PROTECT)
2022 nop(); 2023 nop();
2023 } 2024 }
2024 2025
2025 2026
2026 void MacroAssembler::BranchShortHelperR6(int32_t offset, Label* L) { 2027 void MacroAssembler::BranchShortHelperR6(int32_t offset, Label* L) {
2028 DCHECK(L == nullptr || offset == 0);
2027 offset = GetOffset(offset, L, OffsetSize::kOffset26); 2029 offset = GetOffset(offset, L, OffsetSize::kOffset26);
2028 bc(offset); 2030 bc(offset);
2029 } 2031 }
2030 2032
2031 2033
2032 void MacroAssembler::BranchShort(int32_t offset, BranchDelaySlot bdslot) { 2034 void MacroAssembler::BranchShort(int32_t offset, BranchDelaySlot bdslot) {
2033 if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT) { 2035 if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT) {
2034 DCHECK(is_int26(offset)); 2036 DCHECK(is_int26(offset));
2035 BranchShortHelperR6(offset, nullptr); 2037 BranchShortHelperR6(offset, nullptr);
2036 } else { 2038 } else {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2078 li(r2, rt); 2080 li(r2, rt);
2079 } 2081 }
2080 2082
2081 return r2; 2083 return r2;
2082 } 2084 }
2083 2085
2084 2086
2085 bool MacroAssembler::BranchShortHelperR6(int32_t offset, Label* L, 2087 bool MacroAssembler::BranchShortHelperR6(int32_t offset, Label* L,
2086 Condition cond, Register rs, 2088 Condition cond, Register rs,
2087 const Operand& rt) { 2089 const Operand& rt) {
2090 DCHECK(L == nullptr || offset == 0);
2088 Register scratch = rs.is(at) ? t8 : at; 2091 Register scratch = rs.is(at) ? t8 : at;
2089 OffsetSize bits = OffsetSize::kOffset16; 2092 OffsetSize bits = OffsetSize::kOffset16;
2090 2093
2091 // Be careful to always use shifted_branch_offset only just before the 2094 // Be careful to always use shifted_branch_offset only just before the
2092 // branch instruction, as the location will be remember for patching the 2095 // branch instruction, as the location will be remember for patching the
2093 // target. 2096 // target.
2094 BlockTrampolinePoolScope block_trampoline_pool(this); 2097 BlockTrampolinePoolScope block_trampoline_pool(this);
2095 switch (cond) { 2098 switch (cond) {
2096 case cc_always: 2099 case cc_always:
2097 bits = OffsetSize::kOffset26; 2100 bits = OffsetSize::kOffset26;
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
2355 default: 2358 default:
2356 UNREACHABLE(); 2359 UNREACHABLE();
2357 } 2360 }
2358 return true; 2361 return true;
2359 } 2362 }
2360 2363
2361 2364
2362 bool MacroAssembler::BranchShortHelper(int16_t offset, Label* L, Condition cond, 2365 bool MacroAssembler::BranchShortHelper(int16_t offset, Label* L, Condition cond,
2363 Register rs, const Operand& rt, 2366 Register rs, const Operand& rt,
2364 BranchDelaySlot bdslot) { 2367 BranchDelaySlot bdslot) {
2368 DCHECK(L == nullptr || offset == 0);
2365 if (!is_near(L, OffsetSize::kOffset16)) return false; 2369 if (!is_near(L, OffsetSize::kOffset16)) return false;
2366 2370
2367 Register scratch = at; 2371 Register scratch = at;
2368 int32_t offset32; 2372 int32_t offset32;
2369 2373
2370 // Be careful to always use shifted_branch_offset only just before the 2374 // Be careful to always use shifted_branch_offset only just before the
2371 // branch instruction, as the location will be remember for patching the 2375 // branch instruction, as the location will be remember for patching the
2372 // target. 2376 // target.
2373 BlockTrampolinePoolScope block_trampoline_pool(this); 2377 BlockTrampolinePoolScope block_trampoline_pool(this);
2374 switch (cond) { 2378 switch (cond) {
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
2541 DCHECK(is_near); 2545 DCHECK(is_near);
2542 USE(is_near); 2546 USE(is_near);
2543 } 2547 }
2544 2548
2545 2549
2546 void MacroAssembler::BranchAndLink(Label* L, BranchDelaySlot bdslot) { 2550 void MacroAssembler::BranchAndLink(Label* L, BranchDelaySlot bdslot) {
2547 if (L->is_bound()) { 2551 if (L->is_bound()) {
2548 if (is_near_branch(L)) { 2552 if (is_near_branch(L)) {
2549 BranchAndLinkShort(L, bdslot); 2553 BranchAndLinkShort(L, bdslot);
2550 } else { 2554 } else {
2551 Jalr(L, bdslot); 2555 BranchAndLinkLong(L, bdslot);
2552 } 2556 }
2553 } else { 2557 } else {
2554 if (is_trampoline_emitted()) { 2558 if (is_trampoline_emitted()) {
2555 Jalr(L, bdslot); 2559 BranchAndLinkLong(L, bdslot);
2556 } else { 2560 } else {
2557 BranchAndLinkShort(L, bdslot); 2561 BranchAndLinkShort(L, bdslot);
2558 } 2562 }
2559 } 2563 }
2560 } 2564 }
2561 2565
2562 2566
2563 void MacroAssembler::BranchAndLink(Label* L, Condition cond, Register rs, 2567 void MacroAssembler::BranchAndLink(Label* L, Condition cond, Register rs,
2564 const Operand& rt, 2568 const Operand& rt,
2565 BranchDelaySlot bdslot) { 2569 BranchDelaySlot bdslot) {
2566 if (L->is_bound()) { 2570 if (L->is_bound()) {
2567 if (!BranchAndLinkShortCheck(0, L, cond, rs, rt, bdslot)) { 2571 if (!BranchAndLinkShortCheck(0, L, cond, rs, rt, bdslot)) {
2568 Label skip; 2572 Label skip;
2569 Condition neg_cond = NegateCondition(cond); 2573 Condition neg_cond = NegateCondition(cond);
2570 BranchShort(&skip, neg_cond, rs, rt); 2574 BranchShort(&skip, neg_cond, rs, rt);
2571 Jalr(L, bdslot); 2575 BranchAndLinkLong(L, bdslot);
2572 bind(&skip); 2576 bind(&skip);
2573 } 2577 }
2574 } else { 2578 } else {
2575 if (is_trampoline_emitted()) { 2579 if (is_trampoline_emitted()) {
2576 Label skip; 2580 Label skip;
2577 Condition neg_cond = NegateCondition(cond); 2581 Condition neg_cond = NegateCondition(cond);
2578 BranchShort(&skip, neg_cond, rs, rt); 2582 BranchShort(&skip, neg_cond, rs, rt);
2579 Jalr(L, bdslot); 2583 BranchAndLinkLong(L, bdslot);
2580 bind(&skip); 2584 bind(&skip);
2581 } else { 2585 } else {
2582 BranchAndLinkShortCheck(0, L, cond, rs, rt, bdslot); 2586 BranchAndLinkShortCheck(0, L, cond, rs, rt, bdslot);
2583 } 2587 }
2584 } 2588 }
2585 } 2589 }
2586 2590
2587 2591
2588 void MacroAssembler::BranchAndLinkShortHelper(int16_t offset, Label* L, 2592 void MacroAssembler::BranchAndLinkShortHelper(int16_t offset, Label* L,
2589 BranchDelaySlot bdslot) { 2593 BranchDelaySlot bdslot) {
2594 DCHECK(L == nullptr || offset == 0);
2590 offset = GetOffset(offset, L, OffsetSize::kOffset16); 2595 offset = GetOffset(offset, L, OffsetSize::kOffset16);
2591 bal(offset); 2596 bal(offset);
2592 2597
2593 // Emit a nop in the branch delay slot if required. 2598 // Emit a nop in the branch delay slot if required.
2594 if (bdslot == PROTECT) 2599 if (bdslot == PROTECT)
2595 nop(); 2600 nop();
2596 } 2601 }
2597 2602
2598 2603
2599 void MacroAssembler::BranchAndLinkShortHelperR6(int32_t offset, Label* L) { 2604 void MacroAssembler::BranchAndLinkShortHelperR6(int32_t offset, Label* L) {
2605 DCHECK(L == nullptr || offset == 0);
2600 offset = GetOffset(offset, L, OffsetSize::kOffset26); 2606 offset = GetOffset(offset, L, OffsetSize::kOffset26);
2601 balc(offset); 2607 balc(offset);
2602 } 2608 }
2603 2609
2604 2610
2605 void MacroAssembler::BranchAndLinkShort(int32_t offset, 2611 void MacroAssembler::BranchAndLinkShort(int32_t offset,
2606 BranchDelaySlot bdslot) { 2612 BranchDelaySlot bdslot) {
2607 if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT) { 2613 if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT) {
2608 DCHECK(is_int26(offset)); 2614 DCHECK(is_int26(offset));
2609 BranchAndLinkShortHelperR6(offset, nullptr); 2615 BranchAndLinkShortHelperR6(offset, nullptr);
2610 } else { 2616 } else {
2611 DCHECK(is_int16(offset)); 2617 DCHECK(is_int16(offset));
2612 BranchAndLinkShortHelper(offset, nullptr, bdslot); 2618 BranchAndLinkShortHelper(offset, nullptr, bdslot);
2613 } 2619 }
2614 } 2620 }
2615 2621
2616 2622
2617 void MacroAssembler::BranchAndLinkShort(Label* L, BranchDelaySlot bdslot) { 2623 void MacroAssembler::BranchAndLinkShort(Label* L, BranchDelaySlot bdslot) {
2618 if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT) { 2624 if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT) {
2619 BranchAndLinkShortHelperR6(0, L); 2625 BranchAndLinkShortHelperR6(0, L);
2620 } else { 2626 } else {
2621 BranchAndLinkShortHelper(0, L, bdslot); 2627 BranchAndLinkShortHelper(0, L, bdslot);
2622 } 2628 }
2623 } 2629 }
2624 2630
2625 2631
2626 bool MacroAssembler::BranchAndLinkShortHelperR6(int32_t offset, Label* L, 2632 bool MacroAssembler::BranchAndLinkShortHelperR6(int32_t offset, Label* L,
2627 Condition cond, Register rs, 2633 Condition cond, Register rs,
2628 const Operand& rt) { 2634 const Operand& rt) {
2635 DCHECK(L == nullptr || offset == 0);
2629 Register scratch = rs.is(at) ? t8 : at; 2636 Register scratch = rs.is(at) ? t8 : at;
2630 OffsetSize bits = OffsetSize::kOffset16; 2637 OffsetSize bits = OffsetSize::kOffset16;
2631 2638
2632 BlockTrampolinePoolScope block_trampoline_pool(this); 2639 BlockTrampolinePoolScope block_trampoline_pool(this);
2633 DCHECK((cond == cc_always && is_int26(offset)) || is_int16(offset)); 2640 DCHECK((cond == cc_always && is_int26(offset)) || is_int16(offset));
2634 switch (cond) { 2641 switch (cond) {
2635 case cc_always: 2642 case cc_always:
2636 bits = OffsetSize::kOffset26; 2643 bits = OffsetSize::kOffset26;
2637 if (!is_near(L, bits)) return false; 2644 if (!is_near(L, bits)) return false;
2638 offset = GetOffset(offset, L, bits); 2645 offset = GetOffset(offset, L, bits);
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
2776 } 2783 }
2777 2784
2778 2785
2779 // Pre r6 we need to use a bgezal or bltzal, but they can't be used directly 2786 // Pre r6 we need to use a bgezal or bltzal, but they can't be used directly
2780 // with the slt instructions. We could use sub or add instead but we would miss 2787 // with the slt instructions. We could use sub or add instead but we would miss
2781 // overflow cases, so we keep slt and add an intermediate third instruction. 2788 // overflow cases, so we keep slt and add an intermediate third instruction.
2782 bool MacroAssembler::BranchAndLinkShortHelper(int16_t offset, Label* L, 2789 bool MacroAssembler::BranchAndLinkShortHelper(int16_t offset, Label* L,
2783 Condition cond, Register rs, 2790 Condition cond, Register rs,
2784 const Operand& rt, 2791 const Operand& rt,
2785 BranchDelaySlot bdslot) { 2792 BranchDelaySlot bdslot) {
2793 DCHECK(L == nullptr || offset == 0);
2786 if (!is_near(L, OffsetSize::kOffset16)) return false; 2794 if (!is_near(L, OffsetSize::kOffset16)) return false;
2787 2795
2788 Register scratch = t8; 2796 Register scratch = t8;
2789 BlockTrampolinePoolScope block_trampoline_pool(this); 2797 BlockTrampolinePoolScope block_trampoline_pool(this);
2790 2798
2791 switch (cond) { 2799 switch (cond) {
2792 case cc_always: 2800 case cc_always:
2793 offset = GetOffset(offset, L, OffsetSize::kOffset16); 2801 offset = GetOffset(offset, L, OffsetSize::kOffset16);
2794 bal(offset); 2802 bal(offset);
2795 break; 2803 break;
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
3074 3082
3075 3083
3076 void MacroAssembler::Ret(Condition cond, 3084 void MacroAssembler::Ret(Condition cond,
3077 Register rs, 3085 Register rs,
3078 const Operand& rt, 3086 const Operand& rt,
3079 BranchDelaySlot bd) { 3087 BranchDelaySlot bd) {
3080 Jump(ra, cond, rs, rt, bd); 3088 Jump(ra, cond, rs, rt, bd);
3081 } 3089 }
3082 3090
3083 3091
3084 void MacroAssembler::Jr(Label* L, BranchDelaySlot bdslot) { 3092 void MacroAssembler::BranchLong(Label* L, BranchDelaySlot bdslot) {
3085 BlockTrampolinePoolScope block_trampoline_pool(this); 3093 if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT &&
3094 (!L->is_bound() || is_near_r6(L))) {
3095 BranchShortHelperR6(0, L);
3096 } else {
3097 BlockTrampolinePoolScope block_trampoline_pool(this);
3098 uint32_t imm32;
3099 imm32 = jump_address(L);
3100 {
3101 BlockGrowBufferScope block_buf_growth(this);
3102 // Buffer growth (and relocation) must be blocked for internal references
3103 // until associated instructions are emitted and available to be patched.
3104 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED);
3105 lui(at, (imm32 & kHiMask) >> kLuiShift);
3106 ori(at, at, (imm32 & kImm16Mask));
3107 }
3108 jr(at);
3086 3109
3087 uint32_t imm32; 3110 // Emit a nop in the branch delay slot if required.
3088 imm32 = jump_address(L); 3111 if (bdslot == PROTECT) nop();
3089 { BlockGrowBufferScope block_buf_growth(this);
3090 // Buffer growth (and relocation) must be blocked for internal references
3091 // until associated instructions are emitted and available to be patched.
3092 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED);
3093 lui(at, (imm32 & kHiMask) >> kLuiShift);
3094 ori(at, at, (imm32 & kImm16Mask));
3095 } 3112 }
3096 jr(at);
3097
3098 // Emit a nop in the branch delay slot if required.
3099 if (bdslot == PROTECT)
3100 nop();
3101 } 3113 }
3102 3114
3103 3115
3104 void MacroAssembler::Jalr(Label* L, BranchDelaySlot bdslot) { 3116 void MacroAssembler::BranchAndLinkLong(Label* L, BranchDelaySlot bdslot) {
3105 BlockTrampolinePoolScope block_trampoline_pool(this); 3117 if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT &&
3118 (!L->is_bound() || is_near_r6(L))) {
3119 BranchAndLinkShortHelperR6(0, L);
3120 } else {
3121 BlockTrampolinePoolScope block_trampoline_pool(this);
3122 uint32_t imm32;
3123 imm32 = jump_address(L);
3124 {
3125 BlockGrowBufferScope block_buf_growth(this);
3126 // Buffer growth (and relocation) must be blocked for internal references
3127 // until associated instructions are emitted and available to be patched.
3128 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED);
3129 lui(at, (imm32 & kHiMask) >> kLuiShift);
3130 ori(at, at, (imm32 & kImm16Mask));
3131 }
3132 jalr(at);
3106 3133
3107 uint32_t imm32; 3134 // Emit a nop in the branch delay slot if required.
3108 imm32 = jump_address(L); 3135 if (bdslot == PROTECT) nop();
3109 { BlockGrowBufferScope block_buf_growth(this);
3110 // Buffer growth (and relocation) must be blocked for internal references
3111 // until associated instructions are emitted and available to be patched.
3112 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED);
3113 lui(at, (imm32 & kHiMask) >> kLuiShift);
3114 ori(at, at, (imm32 & kImm16Mask));
3115 } 3136 }
3116 jalr(at);
3117
3118 // Emit a nop in the branch delay slot if required.
3119 if (bdslot == PROTECT)
3120 nop();
3121 } 3137 }
3122 3138
3123 3139
3124 void MacroAssembler::DropAndRet(int drop) { 3140 void MacroAssembler::DropAndRet(int drop) {
3125 DCHECK(is_int16(drop * kPointerSize)); 3141 DCHECK(is_int16(drop * kPointerSize));
3126 Ret(USE_DELAY_SLOT); 3142 Ret(USE_DELAY_SLOT);
3127 addiu(sp, sp, drop * kPointerSize); 3143 addiu(sp, sp, drop * kPointerSize);
3128 } 3144 }
3129 3145
3130 void MacroAssembler::DropAndRet(int drop, 3146 void MacroAssembler::DropAndRet(int drop,
(...skipping 2706 matching lines...) Expand 10 before | Expand all | Expand 10 after
5837 if (mag.shift > 0) sra(result, result, mag.shift); 5853 if (mag.shift > 0) sra(result, result, mag.shift);
5838 srl(at, dividend, 31); 5854 srl(at, dividend, 31);
5839 Addu(result, result, Operand(at)); 5855 Addu(result, result, Operand(at));
5840 } 5856 }
5841 5857
5842 5858
5843 } // namespace internal 5859 } // namespace internal
5844 } // namespace v8 5860 } // namespace v8
5845 5861
5846 #endif // V8_TARGET_ARCH_MIPS 5862 #endif // V8_TARGET_ARCH_MIPS
OLDNEW
« no previous file with comments | « src/mips/macro-assembler-mips.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698