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 "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 774 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
785 Register value = i.InputRegister(index); \ | 785 Register value = i.InputRegister(index); \ |
786 __ lwsync(); \ | 786 __ lwsync(); \ |
787 if (mode == kMode_MRI) { \ | 787 if (mode == kMode_MRI) { \ |
788 __ asm_instr(value, operand); \ | 788 __ asm_instr(value, operand); \ |
789 } else { \ | 789 } else { \ |
790 __ asm_instrx(value, operand); \ | 790 __ asm_instrx(value, operand); \ |
791 } \ | 791 } \ |
792 __ sync(); \ | 792 __ sync(); \ |
793 DCHECK_EQ(LeaveRC, i.OutputRCBit()); \ | 793 DCHECK_EQ(LeaveRC, i.OutputRCBit()); \ |
794 } while (0) | 794 } while (0) |
| 795 #define ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(load_instr, store_instr) \ |
| 796 do { \ |
| 797 Label exchange; \ |
| 798 __ bind(&exchange); \ |
| 799 __ load_instr(i.OutputRegister(0), \ |
| 800 MemOperand(i.InputRegister(0), i.InputRegister(1))); \ |
| 801 __ store_instr(i.InputRegister(2), \ |
| 802 MemOperand(i.InputRegister(0), i.InputRegister(1))); \ |
| 803 __ bne(&exchange, cr0); \ |
| 804 } while (0) |
795 | 805 |
796 void CodeGenerator::AssembleDeconstructFrame() { | 806 void CodeGenerator::AssembleDeconstructFrame() { |
797 __ LeaveFrame(StackFrame::MANUAL); | 807 __ LeaveFrame(StackFrame::MANUAL); |
798 } | 808 } |
799 | 809 |
800 void CodeGenerator::AssemblePrepareTailCall() { | 810 void CodeGenerator::AssemblePrepareTailCall() { |
801 if (frame_access_state()->has_frame()) { | 811 if (frame_access_state()->has_frame()) { |
802 __ RestoreFrameStateForTailCall(); | 812 __ RestoreFrameStateForTailCall(); |
803 } | 813 } |
804 frame_access_state()->SetFrameAccessToSP(); | 814 frame_access_state()->SetFrameAccessToSP(); |
(...skipping 1167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1972 case kAtomicStoreWord8: | 1982 case kAtomicStoreWord8: |
1973 ASSEMBLE_ATOMIC_STORE_INTEGER(stb, stbx); | 1983 ASSEMBLE_ATOMIC_STORE_INTEGER(stb, stbx); |
1974 break; | 1984 break; |
1975 case kAtomicStoreWord16: | 1985 case kAtomicStoreWord16: |
1976 ASSEMBLE_ATOMIC_STORE_INTEGER(sth, sthx); | 1986 ASSEMBLE_ATOMIC_STORE_INTEGER(sth, sthx); |
1977 break; | 1987 break; |
1978 case kAtomicStoreWord32: | 1988 case kAtomicStoreWord32: |
1979 ASSEMBLE_ATOMIC_STORE_INTEGER(stw, stwx); | 1989 ASSEMBLE_ATOMIC_STORE_INTEGER(stw, stwx); |
1980 break; | 1990 break; |
1981 case kAtomicExchangeInt8: | 1991 case kAtomicExchangeInt8: |
| 1992 ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(lbarx, stbcx); |
| 1993 __ extsb(i.OutputRegister(0), i.OutputRegister(0)); |
| 1994 break; |
1982 case kAtomicExchangeUint8: | 1995 case kAtomicExchangeUint8: |
| 1996 ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(lbarx, stbcx); |
| 1997 break; |
1983 case kAtomicExchangeInt16: | 1998 case kAtomicExchangeInt16: |
| 1999 ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(lharx, sthcx); |
| 2000 __ extsh(i.OutputRegister(0), i.OutputRegister(0)); |
| 2001 break; |
1984 case kAtomicExchangeUint16: | 2002 case kAtomicExchangeUint16: |
| 2003 ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(lharx, sthcx); |
| 2004 break; |
1985 case kAtomicExchangeWord32: | 2005 case kAtomicExchangeWord32: |
| 2006 ASSEMBLE_ATOMIC_EXCHANGE_INTEGER(lwarx, stwcx); |
| 2007 break; |
1986 case kAtomicCompareExchangeInt8: | 2008 case kAtomicCompareExchangeInt8: |
1987 case kAtomicCompareExchangeUint8: | 2009 case kAtomicCompareExchangeUint8: |
1988 case kAtomicCompareExchangeInt16: | 2010 case kAtomicCompareExchangeInt16: |
1989 case kAtomicCompareExchangeUint16: | 2011 case kAtomicCompareExchangeUint16: |
1990 case kAtomicCompareExchangeWord32: | 2012 case kAtomicCompareExchangeWord32: |
1991 UNREACHABLE(); | 2013 UNREACHABLE(); |
1992 break; | 2014 break; |
1993 default: | 2015 default: |
1994 UNREACHABLE(); | 2016 UNREACHABLE(); |
1995 break; | 2017 break; |
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2596 padding_size -= v8::internal::Assembler::kInstrSize; | 2618 padding_size -= v8::internal::Assembler::kInstrSize; |
2597 } | 2619 } |
2598 } | 2620 } |
2599 } | 2621 } |
2600 | 2622 |
2601 #undef __ | 2623 #undef __ |
2602 | 2624 |
2603 } // namespace compiler | 2625 } // namespace compiler |
2604 } // namespace internal | 2626 } // namespace internal |
2605 } // namespace v8 | 2627 } // namespace v8 |
OLD | NEW |