diff options
| author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-05-04 23:54:54 +0000 |
|---|---|---|
| committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-05-04 23:54:54 +0000 |
| commit | 808dca12f8aac4f14784673bfcf252d0d31cefb4 (patch) | |
| tree | 286168bd2cfad1060e36b8caa886f93e7da5ac01 /llvm | |
| parent | 369bddf5ad8cb1543d38d4afd12cce768292114a (diff) | |
| download | bcm5719-llvm-808dca12f8aac4f14784673bfcf252d0d31cefb4.tar.gz bcm5719-llvm-808dca12f8aac4f14784673bfcf252d0d31cefb4.zip | |
Fix X86RegisterInfo::getMatchingSuperRegClass for sub_8bit_hi.
It is OK for B to be any GR8_ABCD_H superclass, the returned register class
doesn't have to map surjectively onto B.
llvm-svn: 130892
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/X86/X86RegisterInfo.cpp | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/llvm/lib/Target/X86/X86RegisterInfo.cpp b/llvm/lib/Target/X86/X86RegisterInfo.cpp index 37fb0fe5694..6f3cdb503e6 100644 --- a/llvm/lib/Target/X86/X86RegisterInfo.cpp +++ b/llvm/lib/Target/X86/X86RegisterInfo.cpp @@ -229,19 +229,14 @@ X86RegisterInfo::getMatchingSuperRegClass(const TargetRegisterClass *A, } break; case X86::sub_8bit_hi: - if (B == &X86::GR8_ABCD_HRegClass) { - if (A == &X86::GR64RegClass || A == &X86::GR64_ABCDRegClass || - A == &X86::GR64_NOREXRegClass || - A == &X86::GR64_NOSPRegClass || - A == &X86::GR64_NOREX_NOSPRegClass) - return &X86::GR64_ABCDRegClass; - else if (A == &X86::GR32RegClass || A == &X86::GR32_ABCDRegClass || - A == &X86::GR32_NOREXRegClass || A == &X86::GR32_NOSPRegClass) - return &X86::GR32_ABCDRegClass; - else if (A == &X86::GR16RegClass || A == &X86::GR16_ABCDRegClass || - A == &X86::GR16_NOREXRegClass) - return &X86::GR16_ABCDRegClass; - } + if (B == &X86::GR8_ABCD_HRegClass || + B->hasSubClass(&X86::GR8_ABCD_HRegClass)) + switch (A->getSize()) { + case 2: return getCommonSubClass(A, &X86::GR16_ABCDRegClass); + case 4: return getCommonSubClass(A, &X86::GR32_ABCDRegClass); + case 8: return getCommonSubClass(A, &X86::GR64_ABCDRegClass); + default: return 0; + } break; case X86::sub_16bit: if (B == &X86::GR16RegClass) { |

