diff options
| author | Elena Demikhovsky <elena.demikhovsky@intel.com> | 2012-02-08 08:37:26 +0000 | 
|---|---|---|
| committer | Elena Demikhovsky <elena.demikhovsky@intel.com> | 2012-02-08 08:37:26 +0000 | 
| commit | 1adc1d53dd38ef2db502dc7b8c8c59fde6406e05 (patch) | |
| tree | 6305824983077e8550ee11094d9a7bdeecd76118 /llvm/lib/Target/X86/InstPrinter | |
| parent | 172b9243cde4a05564aa68adfe50e395798d766c (diff) | |
| download | bcm5719-llvm-1adc1d53dd38ef2db502dc7b8c8c59fde6406e05.tar.gz bcm5719-llvm-1adc1d53dd38ef2db502dc7b8c8c59fde6406e05.zip  | |
Fixed a bug in printing "cmp" pseudo ops.
> This IR code
> %res = call <8 x float> @llvm.x86.avx.cmp.ps.256(<8 x float> %a0, <8 x float> %a1, i8 14)
> fails with assertion:
>
> llc: X86ATTInstPrinter.cpp:62: void llvm::X86ATTInstPrinter::printSSECC(const llvm::MCInst*, unsigned int, llvm::raw_ostream&): Assertion `0 && "Invalid ssecc argument!"' failed.
> 0  llc             0x0000000001355803
> 1  llc             0x0000000001355dc9
> 2  libpthread.so.0 0x00007f79a30575d0
> 3  libc.so.6       0x00007f79a23a1945 gsignal + 53
> 4  libc.so.6       0x00007f79a23a2f21 abort + 385
> 5  libc.so.6       0x00007f79a239a810 __assert_fail + 240
> 6  llc             0x00000000011858d5 llvm::X86ATTInstPrinter::printSSECC(llvm::MCInst const*, unsigned int, llvm::raw_ostream&) + 119
I added the full testing for all possible pseudo-ops of cmp.
I extended X86AsmPrinter.cpp and X86IntelInstPrinter.cpp.
You'l also see lines alignments (unrelated to this fix) in X86IselLowering.cpp from my previous check-in.
llvm-svn: 150068
Diffstat (limited to 'llvm/lib/Target/X86/InstPrinter')
| -rw-r--r-- | llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp | 40 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp | 41 | 
2 files changed, 65 insertions, 16 deletions
diff --git a/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp b/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp index 106f716aa5c..772fe1bf193 100644 --- a/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp +++ b/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp @@ -60,14 +60,38 @@ void X86ATTInstPrinter::printSSECC(const MCInst *MI, unsigned Op,                                     raw_ostream &O) {    switch (MI->getOperand(Op).getImm()) {    default: llvm_unreachable("Invalid ssecc argument!"); -  case 0: O << "eq"; break; -  case 1: O << "lt"; break; -  case 2: O << "le"; break; -  case 3: O << "unord"; break; -  case 4: O << "neq"; break; -  case 5: O << "nlt"; break; -  case 6: O << "nle"; break; -  case 7: O << "ord"; break; +  case    0: O << "eq"; break; +  case    1: O << "lt"; break; +  case    2: O << "le"; break; +  case    3: O << "unord"; break; +  case    4: O << "neq"; break; +  case    5: O << "nlt"; break; +  case    6: O << "nle"; break; +  case    7: O << "ord"; break; +  case    8: O << "eq_uq"; break; +  case    9: O << "nge"; break; +  case  0xa: O << "ngt"; break; +  case  0xb: O << "false"; break; +  case  0xc: O << "neq_oq"; break; +  case  0xd: O << "ge"; break; +  case  0xe: O << "gt"; break; +  case  0xf: O << "true"; break; +  case 0x10: O << "eq_os"; break; +  case 0x11: O << "lt_oq"; break; +  case 0x12: O << "le_oq"; break; +  case 0x13: O << "unord_s"; break; +  case 0x14: O << "neq_us"; break; +  case 0x15: O << "nlt_uq"; break; +  case 0x16: O << "nle_uq"; break; +  case 0x17: O << "ord_s"; break; +  case 0x18: O << "eq_us"; break; +  case 0x19: O << "nge_uq"; break; +  case 0x1a: O << "ngt_uq"; break; +  case 0x1b: O << "false_os"; break; +  case 0x1c: O << "neq_os"; break; +  case 0x1d: O << "ge_oq"; break; +  case 0x1e: O << "gt_oq"; break; +  case 0x1f: O << "true_us"; break;    }  } diff --git a/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp b/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp index 3bbe1273381..7f1f8a3c4cb 100644 --- a/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp +++ b/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp @@ -50,14 +50,39 @@ void X86IntelInstPrinter::printSSECC(const MCInst *MI, unsigned Op,                                       raw_ostream &O) {    switch (MI->getOperand(Op).getImm()) {    default: llvm_unreachable("Invalid ssecc argument!"); -  case 0: O << "eq"; break; -  case 1: O << "lt"; break; -  case 2: O << "le"; break; -  case 3: O << "unord"; break; -  case 4: O << "neq"; break; -  case 5: O << "nlt"; break; -  case 6: O << "nle"; break; -  case 7: O << "ord"; break; +  case    0: O << "eq"; break; +  case    1: O << "lt"; break; +  case    2: O << "le"; break; +  case    3: O << "unord"; break; +  case    4: O << "neq"; break; +  case    5: O << "nlt"; break; +  case    6: O << "nle"; break; +  case    7: O << "ord"; break; +  case    8: O << "eq_uq"; break; +  case    9: O << "nge"; break; +  case  0xa: O << "ngt"; break; +  case  0xb: O << "false"; break; +  case  0xc: O << "neq_oq"; break; +  case  0xd: O << "ge"; break; +  case  0xe: O << "gt"; break; +  case  0xf: O << "true"; break; +  case 0x10: O << "eq_os"; break; +  case 0x11: O << "lt_oq"; break; +  case 0x12: O << "le_oq"; break; +  case 0x13: O << "unord_s"; break; +  case 0x14: O << "neq_us"; break; +  case 0x15: O << "nlt_uq"; break; +  case 0x16: O << "nle_uq"; break; +  case 0x17: O << "ord_s"; break; +  case 0x18: O << "eq_us"; break; +  case 0x19: O << "nge_uq"; break; +  case 0x1a: O << "ngt_uq"; break; +  case 0x1b: O << "false_os"; break; +  case 0x1c: O << "neq_os"; break; +  case 0x1d: O << "ge_oq"; break; +  case 0x1e: O << "gt_oq"; break; +  case 0x1f: O << "true_us"; break; +    }  }  | 

