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

Side by Side Diff: src/IceTargetLoweringX8632Traits.h

Issue 1657833002: Subzero: Improve x86-32's implementation of getGprForType(). (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Created 4 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 | « no previous file | src/IceTargetLoweringX8664Traits.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- subzero/src/IceTargetLoweringX8632Traits.h - x86-32 traits -*- C++ -*-=// 1 //===- subzero/src/IceTargetLoweringX8632Traits.h - x86-32 traits -*- C++ -*-=//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 /// 9 ///
10 /// \file 10 /// \file
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 isTrunc8Rcvr, isAhRcvr, aliases) \ 356 isTrunc8Rcvr, isAhRcvr, aliases) \
357 RegisterSet::base, 357 RegisterSet::base,
358 REGX8632_TABLE 358 REGX8632_TABLE
359 #undef X 359 #undef X
360 }; 360 };
361 assert(RegNum >= 0); 361 assert(RegNum >= 0);
362 assert(RegNum < RegisterSet::Reg_NUM); 362 assert(RegNum < RegisterSet::Reg_NUM);
363 return BaseRegs[RegNum]; 363 return BaseRegs[RegNum];
364 } 364 }
365 365
366 private:
367 static int32_t getFirstGprForType(Type Ty) {
368 switch (Ty) {
369 default:
370 llvm_unreachable("Invalid type for GPR.");
371 case IceType_i1:
372 case IceType_i8:
373 return RegisterSet::Reg_al;
374 case IceType_i16:
375 return RegisterSet::Reg_ax;
376 case IceType_i32:
377 return RegisterSet::Reg_eax;
378 }
379 }
380
381 public:
366 // Return a register in RegNum's alias set that is suitable for Ty. 382 // Return a register in RegNum's alias set that is suitable for Ty.
367 static int32_t getGprForType(Type Ty, int32_t RegNum) { 383 static int32_t getGprForType(Type Ty, int32_t RegNum) {
368 assert(RegNum != Variable::NoRegister); 384 assert(RegNum != Variable::NoRegister);
369 // TODO(stichnot): Rewrite this as a table lookup from a table computed in a 385
370 // TargetLowering static initializer. 386 if (!isScalarIntegerType(Ty)) {
387 return RegNum;
388 }
389
371 // [abcd]h registers are not convertible to their ?l, ?x, and e?x versions. 390 // [abcd]h registers are not convertible to their ?l, ?x, and e?x versions.
372 switch (RegNum) { 391 switch (RegNum) {
373 default: 392 default:
374 break; 393 break;
375 case RegisterSet::Reg_ah: 394 case RegisterSet::Reg_ah:
376 case RegisterSet::Reg_bh: 395 case RegisterSet::Reg_bh:
377 case RegisterSet::Reg_ch: 396 case RegisterSet::Reg_ch:
378 case RegisterSet::Reg_dh: 397 case RegisterSet::Reg_dh:
379 assert(isByteSizedType(Ty)); 398 assert(isByteSizedType(Ty));
380 return RegNum; 399 return RegNum;
381 } 400 }
382 RegNum = getBaseReg(RegNum); 401
383 if (isByteSizedType(Ty)) { 402 const int32_t FirstGprForType = getFirstGprForType(Ty);
384 switch (RegNum) { 403
385 default: 404 switch (RegNum) {
386 assert(0); 405 default:
387 case RegisterSet::Reg_eax: 406 llvm::report_fatal_error("Unknown register.");
388 return RegisterSet::Reg_al; 407 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
389 case RegisterSet::Reg_ecx: 408 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
390 return RegisterSet::Reg_cl; 409 isTrunc8Rcvr, isAhRcvr, aliases) \
391 case RegisterSet::Reg_edx: 410 case RegisterSet::val: { \
392 return RegisterSet::Reg_dl; 411 if (!isGPR) \
393 case RegisterSet::Reg_ebx: 412 return RegisterSet::val; \
394 return RegisterSet::Reg_bl; 413 assert((is32) || (is16) || (is8) || \
395 } 414 getBaseReg(RegisterSet::val) == RegisterSet::Reg_esp); \
415 constexpr int32_t FirstGprWithRegNumSize = \
416 (((is32) || RegisterSet::val == RegisterSet::Reg_esp) \
417 ? RegisterSet::Reg_eax \
418 : (((is16) || RegisterSet::val == RegisterSet::Reg_sp) \
419 ? RegisterSet::Reg_ax \
420 : RegisterSet::Reg_al)); \
421 const int32_t NewRegNum = \
422 RegNum - FirstGprWithRegNumSize + FirstGprForType; \
423 assert(getBaseReg(RegNum) == getBaseReg(NewRegNum) && \
424 "Error involving " #val); \
425 return NewRegNum; \
426 }
427 REGX8632_TABLE
428 #undef X
396 } 429 }
397 if (Ty == IceType_i16) {
398 switch (RegNum) {
399 default:
400 assert(0);
401 case RegisterSet::Reg_eax:
402 return RegisterSet::Reg_ax;
403 case RegisterSet::Reg_ecx:
404 return RegisterSet::Reg_cx;
405 case RegisterSet::Reg_edx:
406 return RegisterSet::Reg_dx;
407 case RegisterSet::Reg_ebx:
408 return RegisterSet::Reg_bx;
409 case RegisterSet::Reg_ebp:
410 return RegisterSet::Reg_bp;
411 case RegisterSet::Reg_esi:
412 return RegisterSet::Reg_si;
413 case RegisterSet::Reg_edi:
414 return RegisterSet::Reg_di;
415 }
416 }
417 return RegNum;
418 } 430 }
419 431
420 private: 432 private:
421 /// SizeOf is used to obtain the size of an initializer list as a constexpr 433 /// SizeOf is used to obtain the size of an initializer list as a constexpr
422 /// expression. This is only needed until our C++ library is updated to 434 /// expression. This is only needed until our C++ library is updated to
423 /// C++ 14 -- which defines constexpr members to std::initializer_list. 435 /// C++ 14 -- which defines constexpr members to std::initializer_list.
424 class SizeOf { 436 class SizeOf {
425 SizeOf(const SizeOf &) = delete; 437 SizeOf(const SizeOf &) = delete;
426 SizeOf &operator=(const SizeOf &) = delete; 438 SizeOf &operator=(const SizeOf &) = delete;
427 439
(...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after
988 1000
989 static uint8_t InstSegmentPrefixes[]; 1001 static uint8_t InstSegmentPrefixes[];
990 }; 1002 };
991 1003
992 using Traits = ::Ice::X8632::TargetX8632Traits; 1004 using Traits = ::Ice::X8632::TargetX8632Traits;
993 } // end of namespace X8632 1005 } // end of namespace X8632
994 1006
995 } // end of namespace Ice 1007 } // end of namespace Ice
996 1008
997 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8632TRAITS_H 1009 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8632TRAITS_H
OLDNEW
« no previous file with comments | « no previous file | src/IceTargetLoweringX8664Traits.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698