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

Side by Side Diff: src/compiler/s390/instruction-selector-s390.cc

Issue 2662963002: s390: TF Optimize 32-bit Mul/Div/Mod/Popcnt (Closed)
Patch Set: fix dcheck Created 3 years, 10 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 | « src/compiler/s390/instruction-scheduler-s390.cc ('k') | src/s390/disasm-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/base/adapters.h" 5 #include "src/base/adapters.h"
6 #include "src/compiler/instruction-selector-impl.h" 6 #include "src/compiler/instruction-selector-impl.h"
7 #include "src/compiler/node-matchers.h" 7 #include "src/compiler/node-matchers.h"
8 #include "src/compiler/node-properties.h" 8 #include "src/compiler/node-properties.h"
9 #include "src/s390/frames-s390.h" 9 #include "src/s390/frames-s390.h"
10 10
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 } 239 }
240 240
241 bool AutoZeroExtendsWord32ToWord64(Node* node) { 241 bool AutoZeroExtendsWord32ToWord64(Node* node) {
242 #if !V8_TARGET_ARCH_S390X 242 #if !V8_TARGET_ARCH_S390X
243 return true; 243 return true;
244 #else 244 #else
245 switch (node->opcode()) { 245 switch (node->opcode()) {
246 case IrOpcode::kInt32Div: 246 case IrOpcode::kInt32Div:
247 case IrOpcode::kUint32Div: 247 case IrOpcode::kUint32Div:
248 case IrOpcode::kInt32MulHigh: 248 case IrOpcode::kInt32MulHigh:
249 case IrOpcode::kUint32MulHigh:
249 case IrOpcode::kInt32Mod: 250 case IrOpcode::kInt32Mod:
250 case IrOpcode::kUint32Mod: 251 case IrOpcode::kUint32Mod:
252 case IrOpcode::kWord32Clz:
253 case IrOpcode::kWord32Popcnt:
251 return true; 254 return true;
252 default: 255 default:
253 return false; 256 return false;
254 } 257 }
255 return false; 258 return false;
256 #endif 259 #endif
257 } 260 }
258 261
259 bool ZeroExtendsWord32ToWord64(Node* node) { 262 bool ZeroExtendsWord32ToWord64(Node* node) {
260 #if !V8_TARGET_ARCH_S390X 263 #if !V8_TARGET_ARCH_S390X
261 return true; 264 return true;
262 #else 265 #else
263 switch (node->opcode()) { 266 switch (node->opcode()) {
264 case IrOpcode::kInt32Add: 267 case IrOpcode::kInt32Add:
265 case IrOpcode::kInt32Sub: 268 case IrOpcode::kInt32Sub:
266 case IrOpcode::kWord32And: 269 case IrOpcode::kWord32And:
267 case IrOpcode::kWord32Or: 270 case IrOpcode::kWord32Or:
268 case IrOpcode::kWord32Xor: 271 case IrOpcode::kWord32Xor:
269 case IrOpcode::kWord32Shl: 272 case IrOpcode::kWord32Shl:
270 case IrOpcode::kWord32Shr: 273 case IrOpcode::kWord32Shr:
271 case IrOpcode::kWord32Sar: 274 case IrOpcode::kWord32Sar:
272 case IrOpcode::kInt32Mul: 275 case IrOpcode::kInt32Mul:
273 case IrOpcode::kWord32Ror: 276 case IrOpcode::kWord32Ror:
274 case IrOpcode::kInt32Div: 277 case IrOpcode::kInt32Div:
275 case IrOpcode::kUint32Div: 278 case IrOpcode::kUint32Div:
276 case IrOpcode::kInt32MulHigh: 279 case IrOpcode::kInt32MulHigh:
277 case IrOpcode::kInt32Mod: 280 case IrOpcode::kInt32Mod:
278 case IrOpcode::kUint32Mod: 281 case IrOpcode::kUint32Mod:
282 case IrOpcode::kWord32Popcnt:
279 return true; 283 return true;
280 // TODO(john.yan): consider the following case to be valid 284 // TODO(john.yan): consider the following case to be valid
281 // case IrOpcode::kWord32Equal: 285 // case IrOpcode::kWord32Equal:
282 // case IrOpcode::kInt32LessThan: 286 // case IrOpcode::kInt32LessThan:
283 // case IrOpcode::kInt32LessThanOrEqual: 287 // case IrOpcode::kInt32LessThanOrEqual:
284 // case IrOpcode::kUint32LessThan: 288 // case IrOpcode::kUint32LessThan:
285 // case IrOpcode::kUint32LessThanOrEqual: 289 // case IrOpcode::kUint32LessThanOrEqual:
286 // case IrOpcode::kUint32MulHigh: 290 // case IrOpcode::kUint32MulHigh:
287 // // These 32-bit operations implicitly zero-extend to 64-bit on x64, so 291 // // These 32-bit operations implicitly zero-extend to 64-bit on x64, so
288 // the 292 // the
(...skipping 852 matching lines...) Expand 10 before | Expand all | Expand 10 after
1141 OperandMode::kAllowRRI | OperandMode::kShift32Imm); 1145 OperandMode::kAllowRRI | OperandMode::kShift32Imm);
1142 } 1146 }
1143 1147
1144 #if V8_TARGET_ARCH_S390X 1148 #if V8_TARGET_ARCH_S390X
1145 void InstructionSelector::VisitWord64Ror(Node* node) { 1149 void InstructionSelector::VisitWord64Ror(Node* node) {
1146 VisitRRO(this, kS390_RotRight64, node, OperandMode::kShift64Imm); 1150 VisitRRO(this, kS390_RotRight64, node, OperandMode::kShift64Imm);
1147 } 1151 }
1148 #endif 1152 #endif
1149 1153
1150 void InstructionSelector::VisitWord32Clz(Node* node) { 1154 void InstructionSelector::VisitWord32Clz(Node* node) {
1151 S390OperandGenerator g(this); 1155 VisitRR(this, kS390_Cntlz32, node);
1152 Emit(kS390_Cntlz32, g.DefineAsRegister(node),
1153 g.UseRegister(node->InputAt(0)));
1154 } 1156 }
1155 1157
1156 #if V8_TARGET_ARCH_S390X 1158 #if V8_TARGET_ARCH_S390X
1157 void InstructionSelector::VisitWord64Clz(Node* node) { 1159 void InstructionSelector::VisitWord64Clz(Node* node) {
1158 S390OperandGenerator g(this); 1160 S390OperandGenerator g(this);
1159 Emit(kS390_Cntlz64, g.DefineAsRegister(node), 1161 Emit(kS390_Cntlz64, g.DefineAsRegister(node),
1160 g.UseRegister(node->InputAt(0))); 1162 g.UseRegister(node->InputAt(0)));
1161 } 1163 }
1162 #endif 1164 #endif
1163 1165
1164 void InstructionSelector::VisitWord32Popcnt(Node* node) { 1166 void InstructionSelector::VisitWord32Popcnt(Node* node) {
1165 S390OperandGenerator g(this); 1167 S390OperandGenerator g(this);
1166 Emit(kS390_Popcnt32, g.DefineAsRegister(node), 1168 Node* value = node->InputAt(0);
1167 g.UseRegister(node->InputAt(0))); 1169 Emit(kS390_Popcnt32, g.DefineAsRegister(node), g.UseRegister(value));
1168 } 1170 }
1169 1171
1170 #if V8_TARGET_ARCH_S390X 1172 #if V8_TARGET_ARCH_S390X
1171 void InstructionSelector::VisitWord64Popcnt(Node* node) { 1173 void InstructionSelector::VisitWord64Popcnt(Node* node) {
1172 S390OperandGenerator g(this); 1174 S390OperandGenerator g(this);
1173 Emit(kS390_Popcnt64, g.DefineAsRegister(node), 1175 Emit(kS390_Popcnt64, g.DefineAsRegister(node),
1174 g.UseRegister(node->InputAt(0))); 1176 g.UseRegister(node->InputAt(0)));
1175 } 1177 }
1176 #endif 1178 #endif
1177 1179
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
1324 VisitMul(this, node, kS390_Mul64); 1326 VisitMul(this, node, kS390_Mul64);
1325 } 1327 }
1326 #endif 1328 #endif
1327 1329
1328 void InstructionSelector::VisitInt32MulHigh(Node* node) { 1330 void InstructionSelector::VisitInt32MulHigh(Node* node) {
1329 VisitBin32op(this, node, kS390_MulHigh32, 1331 VisitBin32op(this, node, kS390_MulHigh32,
1330 OperandMode::kInt32Imm | OperandMode::kAllowDistinctOps); 1332 OperandMode::kInt32Imm | OperandMode::kAllowDistinctOps);
1331 } 1333 }
1332 1334
1333 void InstructionSelector::VisitUint32MulHigh(Node* node) { 1335 void InstructionSelector::VisitUint32MulHigh(Node* node) {
1334 S390OperandGenerator g(this); 1336 VisitBin32op(this, node, kS390_MulHighU32,
1335 Int32BinopMatcher m(node); 1337 OperandMode::kAllowRRM | OperandMode::kAllowRRR);
1336 Node* left = m.left().node();
1337 Node* right = m.right().node();
1338 if (g.CanBeBetterLeftOperand(right)) {
1339 std::swap(left, right);
1340 }
1341 Emit(kS390_MulHighU32, g.DefineAsRegister(node), g.UseRegister(left),
1342 g.Use(right));
1343 } 1338 }
1344 1339
1345 void InstructionSelector::VisitInt32Div(Node* node) { 1340 void InstructionSelector::VisitInt32Div(Node* node) {
1346 VisitBin32op(this, node, kS390_Div32, 1341 VisitBin32op(this, node, kS390_Div32,
1347 OperandMode::kAllowRRM | OperandMode::kAllowRRR); 1342 OperandMode::kAllowRRM | OperandMode::kAllowRRR);
1348 } 1343 }
1349 1344
1350 #if V8_TARGET_ARCH_S390X 1345 #if V8_TARGET_ARCH_S390X
1351 void InstructionSelector::VisitInt64Div(Node* node) { 1346 void InstructionSelector::VisitInt64Div(Node* node) {
1352 VisitRRR(this, kS390_Div64, node); 1347 VisitRRR(this, kS390_Div64, node);
1353 } 1348 }
1354 #endif 1349 #endif
1355 1350
1356 void InstructionSelector::VisitUint32Div(Node* node) { 1351 void InstructionSelector::VisitUint32Div(Node* node) {
1357 VisitBin32op(this, node, kS390_DivU32, 1352 VisitBin32op(this, node, kS390_DivU32,
1358 OperandMode::kAllowRRM | OperandMode::kAllowRRR); 1353 OperandMode::kAllowRRM | OperandMode::kAllowRRR);
1359 } 1354 }
1360 1355
1361 #if V8_TARGET_ARCH_S390X 1356 #if V8_TARGET_ARCH_S390X
1362 void InstructionSelector::VisitUint64Div(Node* node) { 1357 void InstructionSelector::VisitUint64Div(Node* node) {
1363 VisitRRR(this, kS390_DivU64, node); 1358 VisitRRR(this, kS390_DivU64, node);
1364 } 1359 }
1365 #endif 1360 #endif
1366 1361
1367 void InstructionSelector::VisitInt32Mod(Node* node) { 1362 void InstructionSelector::VisitInt32Mod(Node* node) {
1368 VisitRRR(this, kS390_Mod32, node); 1363 VisitBin32op(this, node, kS390_Mod32,
1364 OperandMode::kAllowRRM | OperandMode::kAllowRRR);
1369 } 1365 }
1370 1366
1371 #if V8_TARGET_ARCH_S390X 1367 #if V8_TARGET_ARCH_S390X
1372 void InstructionSelector::VisitInt64Mod(Node* node) { 1368 void InstructionSelector::VisitInt64Mod(Node* node) {
1373 VisitRRR(this, kS390_Mod64, node); 1369 VisitRRR(this, kS390_Mod64, node);
1374 } 1370 }
1375 #endif 1371 #endif
1376 1372
1377 void InstructionSelector::VisitUint32Mod(Node* node) { 1373 void InstructionSelector::VisitUint32Mod(Node* node) {
1378 VisitRRR(this, kS390_ModU32, node); 1374 VisitBin32op(this, node, kS390_ModU32,
1375 OperandMode::kAllowRRM | OperandMode::kAllowRRR);
1379 } 1376 }
1380 1377
1381 #if V8_TARGET_ARCH_S390X 1378 #if V8_TARGET_ARCH_S390X
1382 void InstructionSelector::VisitUint64Mod(Node* node) { 1379 void InstructionSelector::VisitUint64Mod(Node* node) {
1383 VisitRRR(this, kS390_ModU64, node); 1380 VisitRRR(this, kS390_ModU64, node);
1384 } 1381 }
1385 #endif 1382 #endif
1386 1383
1387 void InstructionSelector::VisitChangeFloat32ToFloat64(Node* node) { 1384 void InstructionSelector::VisitChangeFloat32ToFloat64(Node* node) {
1388 VisitRR(this, kS390_Float32ToDouble, node); 1385 VisitRR(this, kS390_Float32ToDouble, node);
(...skipping 911 matching lines...) Expand 10 before | Expand all | Expand 10 after
2300 // static 2297 // static
2301 MachineOperatorBuilder::AlignmentRequirements 2298 MachineOperatorBuilder::AlignmentRequirements
2302 InstructionSelector::AlignmentRequirements() { 2299 InstructionSelector::AlignmentRequirements() {
2303 return MachineOperatorBuilder::AlignmentRequirements:: 2300 return MachineOperatorBuilder::AlignmentRequirements::
2304 FullUnalignedAccessSupport(); 2301 FullUnalignedAccessSupport();
2305 } 2302 }
2306 2303
2307 } // namespace compiler 2304 } // namespace compiler
2308 } // namespace internal 2305 } // namespace internal
2309 } // namespace v8 2306 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/s390/instruction-scheduler-s390.cc ('k') | src/s390/disasm-s390.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698