| 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 |