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/ast/scopes.h" | 7 #include "src/ast/scopes.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" |
11 #include "src/compiler/osr.h" | 11 #include "src/compiler/osr.h" |
12 #include "src/ppc/macro-assembler-ppc.h" | 12 #include "src/ppc/macro-assembler-ppc.h" |
13 | 13 |
14 namespace v8 { | 14 namespace v8 { |
15 namespace internal { | 15 namespace internal { |
16 namespace compiler { | 16 namespace compiler { |
17 | 17 |
18 #define __ masm()-> | 18 #define __ masm()-> |
19 | 19 |
20 | 20 |
21 #define kScratchReg r11 | 21 #define kScratchReg r11 |
22 | 22 |
23 | 23 |
24 // Adds PPC-specific methods to convert InstructionOperands. | 24 // Adds PPC-specific methods to convert InstructionOperands. |
25 class PPCOperandConverter final : public InstructionOperandConverter { | 25 class PPCOperandConverter final : public InstructionOperandConverter { |
26 public: | 26 public: |
27 PPCOperandConverter(CodeGenerator* gen, Instruction* instr) | 27 PPCOperandConverter(CodeGenerator* gen, Instruction* instr) |
28 : InstructionOperandConverter(gen, instr) {} | 28 : InstructionOperandConverter(gen, instr) {} |
29 | 29 |
| 30 size_t OutputCount() { return instr_->OutputCount(); } |
| 31 |
30 RCBit OutputRCBit() const { | 32 RCBit OutputRCBit() const { |
31 switch (instr_->flags_mode()) { | 33 switch (instr_->flags_mode()) { |
32 case kFlags_branch: | 34 case kFlags_branch: |
33 case kFlags_set: | 35 case kFlags_set: |
34 return SetRC; | 36 return SetRC; |
35 case kFlags_none: | 37 case kFlags_none: |
36 return LeaveRC; | 38 return LeaveRC; |
37 } | 39 } |
38 UNREACHABLE(); | 40 UNREACHABLE(); |
39 return LeaveRC; | 41 return LeaveRC; |
(...skipping 1110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1150 __ ConvertIntToDouble(i.InputRegister(0), i.OutputDoubleRegister()); | 1152 __ ConvertIntToDouble(i.InputRegister(0), i.OutputDoubleRegister()); |
1151 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 1153 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
1152 break; | 1154 break; |
1153 case kPPC_Uint32ToDouble: | 1155 case kPPC_Uint32ToDouble: |
1154 __ ConvertUnsignedIntToDouble(i.InputRegister(0), | 1156 __ ConvertUnsignedIntToDouble(i.InputRegister(0), |
1155 i.OutputDoubleRegister()); | 1157 i.OutputDoubleRegister()); |
1156 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 1158 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
1157 break; | 1159 break; |
1158 case kPPC_DoubleToInt32: | 1160 case kPPC_DoubleToInt32: |
1159 case kPPC_DoubleToUint32: | 1161 case kPPC_DoubleToUint32: |
1160 case kPPC_DoubleToInt64: | 1162 case kPPC_DoubleToInt64: { |
| 1163 #if V8_TARGET_ARCH_PPC64 |
| 1164 bool check_conversion = |
| 1165 (opcode == kPPC_DoubleToInt64 && i.OutputCount() > 1); |
| 1166 if (check_conversion) { |
| 1167 __ mtfsb0(VXCVI); // clear FPSCR:VXCVI bit |
| 1168 } |
| 1169 #endif |
1161 __ ConvertDoubleToInt64(i.InputDoubleRegister(0), | 1170 __ ConvertDoubleToInt64(i.InputDoubleRegister(0), |
1162 #if !V8_TARGET_ARCH_PPC64 | 1171 #if !V8_TARGET_ARCH_PPC64 |
1163 kScratchReg, | 1172 kScratchReg, |
1164 #endif | 1173 #endif |
1165 i.OutputRegister(), kScratchDoubleReg); | 1174 i.OutputRegister(0), kScratchDoubleReg); |
| 1175 #if V8_TARGET_ARCH_PPC64 |
| 1176 if (check_conversion) { |
| 1177 // Set 2nd output to zero if conversion fails. |
| 1178 CRBit crbit = static_cast<CRBit>(VXCVI % CRWIDTH); |
| 1179 __ mcrfs(cr7, VXCVI); // extract FPSCR field containing VXCVI into cr7 |
| 1180 __ li(i.OutputRegister(1), Operand(1)); |
| 1181 __ isel(i.OutputRegister(1), r0, i.OutputRegister(1), |
| 1182 v8::internal::Assembler::encode_crbit(cr7, crbit)); |
| 1183 } |
| 1184 #endif |
1166 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 1185 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
1167 break; | 1186 break; |
| 1187 } |
1168 #if V8_TARGET_ARCH_PPC64 | 1188 #if V8_TARGET_ARCH_PPC64 |
1169 case kPPC_DoubleToUint64: | 1189 case kPPC_DoubleToUint64: |
1170 __ ConvertDoubleToUnsignedInt64(i.InputDoubleRegister(0), | 1190 __ ConvertDoubleToUnsignedInt64(i.InputDoubleRegister(0), |
1171 i.OutputRegister(), kScratchDoubleReg); | 1191 i.OutputRegister(), kScratchDoubleReg); |
1172 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 1192 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
1173 break; | 1193 break; |
1174 #endif | 1194 #endif |
1175 case kPPC_DoubleToFloat32: | 1195 case kPPC_DoubleToFloat32: |
1176 ASSEMBLE_FLOAT_UNOP_RC(frsp); | 1196 ASSEMBLE_FLOAT_UNOP_RC(frsp); |
1177 break; | 1197 break; |
(...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1770 padding_size -= v8::internal::Assembler::kInstrSize; | 1790 padding_size -= v8::internal::Assembler::kInstrSize; |
1771 } | 1791 } |
1772 } | 1792 } |
1773 } | 1793 } |
1774 | 1794 |
1775 #undef __ | 1795 #undef __ |
1776 | 1796 |
1777 } // namespace compiler | 1797 } // namespace compiler |
1778 } // namespace internal | 1798 } // namespace internal |
1779 } // namespace v8 | 1799 } // namespace v8 |
OLD | NEW |