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/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" |
(...skipping 1289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1300 case kS390_Tst64: | 1300 case kS390_Tst64: |
1301 if (HasRegisterInput(instr, 1)) { | 1301 if (HasRegisterInput(instr, 1)) { |
1302 __ AndP(r0, i.InputRegister(0), i.InputRegister(1)); | 1302 __ AndP(r0, i.InputRegister(0), i.InputRegister(1)); |
1303 } else { | 1303 } else { |
1304 __ AndP(r0, i.InputRegister(0), i.InputImmediate(1)); | 1304 __ AndP(r0, i.InputRegister(0), i.InputImmediate(1)); |
1305 } | 1305 } |
1306 break; | 1306 break; |
1307 #endif | 1307 #endif |
1308 case kS390_Push: | 1308 case kS390_Push: |
1309 if (instr->InputAt(0)->IsDoubleRegister()) { | 1309 if (instr->InputAt(0)->IsDoubleRegister()) { |
1310 __ StoreDouble(i.InputDoubleRegister(0), MemOperand(sp, -kDoubleSize)); | |
1311 __ lay(sp, MemOperand(sp, -kDoubleSize)); | 1310 __ lay(sp, MemOperand(sp, -kDoubleSize)); |
| 1311 __ StoreDouble(i.InputDoubleRegister(0), MemOperand(sp)); |
1312 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize); | 1312 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize); |
1313 } else { | 1313 } else { |
1314 __ Push(i.InputRegister(0)); | 1314 __ Push(i.InputRegister(0)); |
1315 frame_access_state()->IncreaseSPDelta(1); | 1315 frame_access_state()->IncreaseSPDelta(1); |
1316 } | 1316 } |
1317 break; | 1317 break; |
1318 case kS390_PushFrame: { | 1318 case kS390_PushFrame: { |
1319 int num_slots = i.InputInt32(1); | 1319 int num_slots = i.InputInt32(1); |
| 1320 __ lay(sp, MemOperand(sp, -num_slots * kPointerSize)); |
1320 if (instr->InputAt(0)->IsDoubleRegister()) { | 1321 if (instr->InputAt(0)->IsDoubleRegister()) { |
1321 __ StoreDouble(i.InputDoubleRegister(0), | 1322 __ StoreDouble(i.InputDoubleRegister(0), |
1322 MemOperand(sp, -num_slots * kPointerSize)); | 1323 MemOperand(sp)); |
1323 } else { | 1324 } else { |
1324 __ StoreP(i.InputRegister(0), | 1325 __ StoreP(i.InputRegister(0), |
1325 MemOperand(sp, -num_slots * kPointerSize)); | 1326 MemOperand(sp)); |
1326 } | 1327 } |
1327 __ lay(sp, MemOperand(sp, -num_slots * kPointerSize)); | |
1328 break; | 1328 break; |
1329 } | 1329 } |
1330 case kS390_StoreToStackSlot: { | 1330 case kS390_StoreToStackSlot: { |
1331 int slot = i.InputInt32(1); | 1331 int slot = i.InputInt32(1); |
1332 if (instr->InputAt(0)->IsDoubleRegister()) { | 1332 if (instr->InputAt(0)->IsDoubleRegister()) { |
1333 __ StoreDouble(i.InputDoubleRegister(0), | 1333 __ StoreDouble(i.InputDoubleRegister(0), |
1334 MemOperand(sp, slot * kPointerSize)); | 1334 MemOperand(sp, slot * kPointerSize)); |
1335 } else { | 1335 } else { |
1336 __ StoreP(i.InputRegister(0), MemOperand(sp, slot * kPointerSize)); | 1336 __ StoreP(i.InputRegister(0), MemOperand(sp, slot * kPointerSize)); |
1337 } | 1337 } |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1492 break; | 1492 break; |
1493 } | 1493 } |
1494 #endif | 1494 #endif |
1495 case kS390_DoubleToFloat32: | 1495 case kS390_DoubleToFloat32: |
1496 __ ledbr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 1496 __ ledbr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
1497 break; | 1497 break; |
1498 case kS390_Float32ToDouble: | 1498 case kS390_Float32ToDouble: |
1499 __ ldebr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 1499 __ ldebr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
1500 break; | 1500 break; |
1501 case kS390_DoubleExtractLowWord32: | 1501 case kS390_DoubleExtractLowWord32: |
1502 // TODO(john.yan): this can cause problem when interrupting, | 1502 __ lgdr(i.OutputRegister(), i.InputDoubleRegister(0)); |
1503 // use freg->greg instruction | 1503 __ llgfr(i.OutputRegister(), i.OutputRegister()); |
1504 __ stdy(i.InputDoubleRegister(0), MemOperand(sp, -kDoubleSize)); | |
1505 __ LoadlW(i.OutputRegister(), | |
1506 MemOperand(sp, -kDoubleSize + Register::kMantissaOffset)); | |
1507 break; | 1504 break; |
1508 case kS390_DoubleExtractHighWord32: | 1505 case kS390_DoubleExtractHighWord32: |
1509 // TODO(john.yan): this can cause problem when interrupting, | 1506 __ lgdr(i.OutputRegister(), i.InputDoubleRegister(0)); |
1510 // use freg->greg instruction | 1507 __ srlg(i.OutputRegister(), i.OutputRegister(), Operand(32)); |
1511 __ stdy(i.InputDoubleRegister(0), MemOperand(sp, -kDoubleSize)); | |
1512 __ LoadlW(i.OutputRegister(), | |
1513 MemOperand(sp, -kDoubleSize + Register::kExponentOffset)); | |
1514 break; | 1508 break; |
1515 case kS390_DoubleInsertLowWord32: | 1509 case kS390_DoubleInsertLowWord32: |
1516 __ InsertDoubleLow(i.OutputDoubleRegister(), i.InputRegister(1)); | 1510 __ lgdr(kScratchReg, i.OutputDoubleRegister()); |
| 1511 __ lr(kScratchReg, i.InputRegister(1)); |
| 1512 __ ldgr(i.OutputDoubleRegister(), kScratchReg); |
1517 break; | 1513 break; |
1518 case kS390_DoubleInsertHighWord32: | 1514 case kS390_DoubleInsertHighWord32: |
1519 __ InsertDoubleHigh(i.OutputDoubleRegister(), i.InputRegister(1)); | 1515 __ sllg(kScratchReg, i.InputRegister(1), Operand(32)); |
| 1516 __ lgdr(r0, i.OutputDoubleRegister()); |
| 1517 __ lr(kScratchReg, r0); |
| 1518 __ ldgr(i.OutputDoubleRegister(), kScratchReg); |
1520 break; | 1519 break; |
1521 case kS390_DoubleConstruct: | 1520 case kS390_DoubleConstruct: |
1522 // TODO(john.yan): this can cause problem when interrupting, | 1521 __ sllg(kScratchReg, i.InputRegister(0), Operand(32)); |
1523 // use greg->freg instruction | 1522 __ lr(kScratchReg, i.InputRegister(1)); |
1524 #if V8_TARGET_LITTLE_ENDIAN | 1523 |
1525 __ StoreW(i.InputRegister(0), MemOperand(sp, -kDoubleSize / 2)); | 1524 // Bitwise convert from GPR to FPR |
1526 __ StoreW(i.InputRegister(1), MemOperand(sp, -kDoubleSize)); | 1525 __ ldgr(i.OutputDoubleRegister(), kScratchReg); |
1527 #else | |
1528 __ StoreW(i.InputRegister(1), MemOperand(sp, -kDoubleSize / 2)); | |
1529 __ StoreW(i.InputRegister(0), MemOperand(sp, -kDoubleSize)); | |
1530 #endif | |
1531 __ ldy(i.OutputDoubleRegister(), MemOperand(sp, -kDoubleSize)); | |
1532 break; | 1526 break; |
1533 case kS390_LoadWordS8: | 1527 case kS390_LoadWordS8: |
1534 ASSEMBLE_LOAD_INTEGER(LoadlB); | 1528 ASSEMBLE_LOAD_INTEGER(LoadlB); |
1535 #if V8_TARGET_ARCH_S390X | 1529 #if V8_TARGET_ARCH_S390X |
1536 __ lgbr(i.OutputRegister(), i.OutputRegister()); | 1530 __ lgbr(i.OutputRegister(), i.OutputRegister()); |
1537 #else | 1531 #else |
1538 __ lbr(i.OutputRegister(), i.OutputRegister()); | 1532 __ lbr(i.OutputRegister(), i.OutputRegister()); |
1539 #endif | 1533 #endif |
1540 break; | 1534 break; |
1541 case kS390_BitcastFloat32ToInt32: | 1535 case kS390_BitcastFloat32ToInt32: |
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2076 padding_size -= 2; | 2070 padding_size -= 2; |
2077 } | 2071 } |
2078 } | 2072 } |
2079 } | 2073 } |
2080 | 2074 |
2081 #undef __ | 2075 #undef __ |
2082 | 2076 |
2083 } // namespace compiler | 2077 } // namespace compiler |
2084 } // namespace internal | 2078 } // namespace internal |
2085 } // namespace v8 | 2079 } // namespace v8 |
OLD | NEW |