aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Gaeke <gaeke@uiuc.edu>2003-07-18 20:23:43 +0000
committerBrian Gaeke <gaeke@uiuc.edu>2003-07-18 20:23:43 +0000
commitd461505efd8f59b110c253548a74ca0a8ea6f8bf (patch)
treebc96166d9adfdded40d4eafe1b7e53fe2c3314a5
parent06dabfaed55d37cf40e811586ba06b5779e58ab9 (diff)
downloadexternal_llvm-d461505efd8f59b110c253548a74ca0a8ea6f8bf.zip
external_llvm-d461505efd8f59b110c253548a74ca0a8ea6f8bf.tar.gz
external_llvm-d461505efd8f59b110c253548a74ca0a8ea6f8bf.tar.bz2
Please, save your applause^H^H^H^H^H^H^H^Hflames for the end...
Avoid a fall-through in the (stubby) treatment of the longjmp intrinsic call which causes llc & lli to core-dump. Add a sort-of treatment of cast double to ulong. I am not really sure what a user should expect to see upon casting a negative FP value to unsigned long long. But with what is given here, I was able to write a program that could cast -123.456 to ulong and back and get -123.0, which seems like a step in the right direction. GCC seems to give you 0. I don't know if I'd consider that useful. These cases were coming up in GNU coreutils-5.0. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7205 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/X86/InstSelectSimple.cpp9
-rw-r--r--lib/Target/X86/X86ISelSimple.cpp9
2 files changed, 12 insertions, 6 deletions
diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp
index 9474942..ec8313e 100644
--- a/lib/Target/X86/InstSelectSimple.cpp
+++ b/lib/Target/X86/InstSelectSimple.cpp
@@ -980,6 +980,8 @@ void ISel::visitIntrinsicCall(LLVMIntrinsic::ID ID, CallInst &CI) {
case LLVMIntrinsic::longjmp:
BuildMI(X86::CALLpcrel32, 1).addExternalSymbol("abort", true);
+ return;
+
case LLVMIntrinsic::setjmp:
// Setjmp always returns zero...
BuildMI(BB, X86::MOVir32, 1, getReg(CI)).addZImm(0);
@@ -1814,9 +1816,10 @@ void ISel::emitCastOperation(MachineBasicBlock *BB,
case cByte: StoreTy = Type::ShortTy; StoreClass = cShort; break;
case cShort: StoreTy = Type::IntTy; StoreClass = cInt; break;
case cInt: StoreTy = Type::LongTy; StoreClass = cLong; break;
- case cLong:
- assert(0 &&"FIXME not implemented: cast FP to unsigned long long");
- abort();
+ // The following treatment of cLong may not be perfectly right,
+ // but it survives chains of casts of the form
+ // double->ulong->double.
+ case cLong: StoreTy = Type::LongTy; StoreClass = cLong; break;
default: assert(0 && "Unknown store class!");
}
diff --git a/lib/Target/X86/X86ISelSimple.cpp b/lib/Target/X86/X86ISelSimple.cpp
index 9474942..ec8313e 100644
--- a/lib/Target/X86/X86ISelSimple.cpp
+++ b/lib/Target/X86/X86ISelSimple.cpp
@@ -980,6 +980,8 @@ void ISel::visitIntrinsicCall(LLVMIntrinsic::ID ID, CallInst &CI) {
case LLVMIntrinsic::longjmp:
BuildMI(X86::CALLpcrel32, 1).addExternalSymbol("abort", true);
+ return;
+
case LLVMIntrinsic::setjmp:
// Setjmp always returns zero...
BuildMI(BB, X86::MOVir32, 1, getReg(CI)).addZImm(0);
@@ -1814,9 +1816,10 @@ void ISel::emitCastOperation(MachineBasicBlock *BB,
case cByte: StoreTy = Type::ShortTy; StoreClass = cShort; break;
case cShort: StoreTy = Type::IntTy; StoreClass = cInt; break;
case cInt: StoreTy = Type::LongTy; StoreClass = cLong; break;
- case cLong:
- assert(0 &&"FIXME not implemented: cast FP to unsigned long long");
- abort();
+ // The following treatment of cLong may not be perfectly right,
+ // but it survives chains of casts of the form
+ // double->ulong->double.
+ case cLong: StoreTy = Type::LongTy; StoreClass = cLong; break;
default: assert(0 && "Unknown store class!");
}