Added support for the llvm.readio and llvm.writeio intrinsics.
authorJohn Criswell <criswell@uiuc.edu>
Tue, 13 Apr 2004 22:13:14 +0000 (22:13 +0000)
committerJohn Criswell <criswell@uiuc.edu>
Tue, 13 Apr 2004 22:13:14 +0000 (22:13 +0000)
On x86, memory operations occur in-order, so these are just lowered into
volatile loads and stores.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12936 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/InstSelectSimple.cpp
lib/Target/X86/X86ISelSimple.cpp

index 775833c3d021364115bf4241e4efb66ca4256b7a..18b595fad85ef22572662a8e8af102313230f979 100644 (file)
@@ -1541,6 +1541,35 @@ void ISel::LowerUnknownIntrinsicFunctionCalls(Function &F) {
           case Intrinsic::writeport:
             // We directly implement these intrinsics
             break;
+          case Intrinsic::readio: {
+            // On X86, memory operations are in-order.  Lower this intrinsic
+            // into a volatile load.
+            Instruction *Before = CI->getPrev();
+            LoadInst * LI = new LoadInst (CI->getOperand(1), "", true, CI);
+            CI->replaceAllUsesWith (LI);
+            BB->getInstList().erase (CI);
+            if (Before) {        // Move iterator to instruction after call
+              I = Before;  ++I;
+            } else {
+              I = BB->begin();
+            }
+            break;
+          }
+          case Intrinsic::writeio: {
+            // On X86, memory operations are in-order.  Lower this intrinsic
+            // into a volatile store.
+            Instruction *Before = CI->getPrev();
+            StoreInst * LI = new StoreInst (CI->getOperand(1),
+                                            CI->getOperand(2), true, CI);
+            CI->replaceAllUsesWith (LI);
+            BB->getInstList().erase (CI);
+            if (Before) {        // Move iterator to instruction after call
+              I = Before;  ++I;
+            } else {
+              I = BB->begin();
+            }
+            break;
+          }
           default:
             // All other intrinsic calls we must lower.
             Instruction *Before = CI->getPrev();
index 775833c3d021364115bf4241e4efb66ca4256b7a..18b595fad85ef22572662a8e8af102313230f979 100644 (file)
@@ -1541,6 +1541,35 @@ void ISel::LowerUnknownIntrinsicFunctionCalls(Function &F) {
           case Intrinsic::writeport:
             // We directly implement these intrinsics
             break;
+          case Intrinsic::readio: {
+            // On X86, memory operations are in-order.  Lower this intrinsic
+            // into a volatile load.
+            Instruction *Before = CI->getPrev();
+            LoadInst * LI = new LoadInst (CI->getOperand(1), "", true, CI);
+            CI->replaceAllUsesWith (LI);
+            BB->getInstList().erase (CI);
+            if (Before) {        // Move iterator to instruction after call
+              I = Before;  ++I;
+            } else {
+              I = BB->begin();
+            }
+            break;
+          }
+          case Intrinsic::writeio: {
+            // On X86, memory operations are in-order.  Lower this intrinsic
+            // into a volatile store.
+            Instruction *Before = CI->getPrev();
+            StoreInst * LI = new StoreInst (CI->getOperand(1),
+                                            CI->getOperand(2), true, CI);
+            CI->replaceAllUsesWith (LI);
+            BB->getInstList().erase (CI);
+            if (Before) {        // Move iterator to instruction after call
+              I = Before;  ++I;
+            } else {
+              I = BB->begin();
+            }
+            break;
+          }
           default:
             // All other intrinsic calls we must lower.
             Instruction *Before = CI->getPrev();