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

Side by Side Diff: src/compiler/s390/code-generator-s390.cc

Issue 1936953004: S390: Fix storing to below stack to avoid sampler handler corrupting stored value (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: remove insertdoublehigh/low Created 4 years, 7 months 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 | « no previous file | src/crankshaft/s390/lithium-codegen-s390.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 1286 matching lines...) Expand 10 before | Expand all | Expand 10 after
1297 case kS390_Tst64: 1297 case kS390_Tst64:
1298 if (HasRegisterInput(instr, 1)) { 1298 if (HasRegisterInput(instr, 1)) {
1299 __ AndP(r0, i.InputRegister(0), i.InputRegister(1)); 1299 __ AndP(r0, i.InputRegister(0), i.InputRegister(1));
1300 } else { 1300 } else {
1301 __ AndP(r0, i.InputRegister(0), i.InputImmediate(1)); 1301 __ AndP(r0, i.InputRegister(0), i.InputImmediate(1));
1302 } 1302 }
1303 break; 1303 break;
1304 #endif 1304 #endif
1305 case kS390_Push: 1305 case kS390_Push:
1306 if (instr->InputAt(0)->IsDoubleRegister()) { 1306 if (instr->InputAt(0)->IsDoubleRegister()) {
1307 __ StoreDouble(i.InputDoubleRegister(0), MemOperand(sp, -kDoubleSize));
1308 __ lay(sp, MemOperand(sp, -kDoubleSize)); 1307 __ lay(sp, MemOperand(sp, -kDoubleSize));
1308 __ StoreDouble(i.InputDoubleRegister(0), MemOperand(sp));
1309 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize); 1309 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize);
1310 } else { 1310 } else {
1311 __ Push(i.InputRegister(0)); 1311 __ Push(i.InputRegister(0));
1312 frame_access_state()->IncreaseSPDelta(1); 1312 frame_access_state()->IncreaseSPDelta(1);
1313 } 1313 }
1314 break; 1314 break;
1315 case kS390_PushFrame: { 1315 case kS390_PushFrame: {
1316 int num_slots = i.InputInt32(1); 1316 int num_slots = i.InputInt32(1);
1317 __ lay(sp, MemOperand(sp, -num_slots * kPointerSize));
1317 if (instr->InputAt(0)->IsDoubleRegister()) { 1318 if (instr->InputAt(0)->IsDoubleRegister()) {
1318 __ StoreDouble(i.InputDoubleRegister(0), 1319 __ StoreDouble(i.InputDoubleRegister(0),
1319 MemOperand(sp, -num_slots * kPointerSize)); 1320 MemOperand(sp));
1320 } else { 1321 } else {
1321 __ StoreP(i.InputRegister(0), 1322 __ StoreP(i.InputRegister(0),
1322 MemOperand(sp, -num_slots * kPointerSize)); 1323 MemOperand(sp));
1323 } 1324 }
1324 __ lay(sp, MemOperand(sp, -num_slots * kPointerSize));
1325 break; 1325 break;
1326 } 1326 }
1327 case kS390_StoreToStackSlot: { 1327 case kS390_StoreToStackSlot: {
1328 int slot = i.InputInt32(1); 1328 int slot = i.InputInt32(1);
1329 if (instr->InputAt(0)->IsDoubleRegister()) { 1329 if (instr->InputAt(0)->IsDoubleRegister()) {
1330 __ StoreDouble(i.InputDoubleRegister(0), 1330 __ StoreDouble(i.InputDoubleRegister(0),
1331 MemOperand(sp, slot * kPointerSize)); 1331 MemOperand(sp, slot * kPointerSize));
1332 } else { 1332 } else {
1333 __ StoreP(i.InputRegister(0), MemOperand(sp, slot * kPointerSize)); 1333 __ StoreP(i.InputRegister(0), MemOperand(sp, slot * kPointerSize));
1334 } 1334 }
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1489 break; 1489 break;
1490 } 1490 }
1491 #endif 1491 #endif
1492 case kS390_DoubleToFloat32: 1492 case kS390_DoubleToFloat32:
1493 __ ledbr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); 1493 __ ledbr(i.OutputDoubleRegister(), i.InputDoubleRegister(0));
1494 break; 1494 break;
1495 case kS390_Float32ToDouble: 1495 case kS390_Float32ToDouble:
1496 __ ldebr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); 1496 __ ldebr(i.OutputDoubleRegister(), i.InputDoubleRegister(0));
1497 break; 1497 break;
1498 case kS390_DoubleExtractLowWord32: 1498 case kS390_DoubleExtractLowWord32:
1499 // TODO(john.yan): this can cause problem when interrupting, 1499 __ lgdr(i.OutputRegister(), i.InputDoubleRegister(0));
1500 // use freg->greg instruction 1500 __ llgfr(i.OutputRegister(), i.OutputRegister());
1501 __ stdy(i.InputDoubleRegister(0), MemOperand(sp, -kDoubleSize));
1502 __ LoadlW(i.OutputRegister(),
1503 MemOperand(sp, -kDoubleSize + Register::kMantissaOffset));
1504 break; 1501 break;
1505 case kS390_DoubleExtractHighWord32: 1502 case kS390_DoubleExtractHighWord32:
1506 // TODO(john.yan): this can cause problem when interrupting, 1503 __ lgdr(i.OutputRegister(), i.InputDoubleRegister(0));
1507 // use freg->greg instruction 1504 __ srlg(i.OutputRegister(), i.OutputRegister(), Operand(32));
1508 __ stdy(i.InputDoubleRegister(0), MemOperand(sp, -kDoubleSize));
1509 __ LoadlW(i.OutputRegister(),
1510 MemOperand(sp, -kDoubleSize + Register::kExponentOffset));
1511 break; 1505 break;
1512 case kS390_DoubleInsertLowWord32: 1506 case kS390_DoubleInsertLowWord32:
1513 __ InsertDoubleLow(i.OutputDoubleRegister(), i.InputRegister(1)); 1507 __ lgdr(kScratchReg, i.OutputDoubleRegister());
1508 __ lr(kScratchReg, i.InputRegister(1));
1509 __ ldgr(i.OutputDoubleRegister(), kScratchReg);
1514 break; 1510 break;
1515 case kS390_DoubleInsertHighWord32: 1511 case kS390_DoubleInsertHighWord32:
1516 __ InsertDoubleHigh(i.OutputDoubleRegister(), i.InputRegister(1)); 1512 __ sllg(kScratchReg, i.InputRegister(1), Operand(32));
1513 __ lgdr(r0, i.OutputDoubleRegister());
1514 __ lr(kScratchReg, r0);
1515 __ ldgr(i.OutputDoubleRegister(), kScratchReg);
1517 break; 1516 break;
1518 case kS390_DoubleConstruct: 1517 case kS390_DoubleConstruct:
1519 // TODO(john.yan): this can cause problem when interrupting, 1518 __ sllg(kScratchReg, i.InputRegister(0), Operand(32));
1520 // use greg->freg instruction 1519 __ lr(kScratchReg, i.InputRegister(1));
1521 #if V8_TARGET_LITTLE_ENDIAN 1520
1522 __ StoreW(i.InputRegister(0), MemOperand(sp, -kDoubleSize / 2)); 1521 // Bitwise convert from GPR to FPR
1523 __ StoreW(i.InputRegister(1), MemOperand(sp, -kDoubleSize)); 1522 __ ldgr(i.OutputDoubleRegister(), kScratchReg);
1524 #else
1525 __ StoreW(i.InputRegister(1), MemOperand(sp, -kDoubleSize / 2));
1526 __ StoreW(i.InputRegister(0), MemOperand(sp, -kDoubleSize));
1527 #endif
1528 __ ldy(i.OutputDoubleRegister(), MemOperand(sp, -kDoubleSize));
1529 break; 1523 break;
1530 case kS390_LoadWordS8: 1524 case kS390_LoadWordS8:
1531 ASSEMBLE_LOAD_INTEGER(LoadlB); 1525 ASSEMBLE_LOAD_INTEGER(LoadlB);
1532 #if V8_TARGET_ARCH_S390X 1526 #if V8_TARGET_ARCH_S390X
1533 __ lgbr(i.OutputRegister(), i.OutputRegister()); 1527 __ lgbr(i.OutputRegister(), i.OutputRegister());
1534 #else 1528 #else
1535 __ lbr(i.OutputRegister(), i.OutputRegister()); 1529 __ lbr(i.OutputRegister(), i.OutputRegister());
1536 #endif 1530 #endif
1537 break; 1531 break;
1538 case kS390_BitcastFloat32ToInt32: 1532 case kS390_BitcastFloat32ToInt32:
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after
2123 padding_size -= 2; 2117 padding_size -= 2;
2124 } 2118 }
2125 } 2119 }
2126 } 2120 }
2127 2121
2128 #undef __ 2122 #undef __
2129 2123
2130 } // namespace compiler 2124 } // namespace compiler
2131 } // namespace internal 2125 } // namespace internal
2132 } // namespace v8 2126 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/crankshaft/s390/lithium-codegen-s390.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698