switch ConstantFP emission to use MCStreamer, significantly
authorChris Lattner <sabre@nondot.org>
Wed, 20 Jan 2010 06:53:37 +0000 (06:53 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 20 Jan 2010 06:53:37 +0000 (06:53 +0000)
simplifying the code.

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

lib/CodeGen/AsmPrinter/AsmPrinter.cpp

index d008b8f99d6f6ef252f796a19093be05b9f90464..0c898669b7763a32f75c962f1a134e51b9f2ded7 100644 (file)
@@ -1124,8 +1124,7 @@ static void EmitGlobalConstantStruct(const ConstantStruct *CS,
 void AsmPrinter::EmitGlobalConstantFP(const ConstantFP *CFP,
                                       unsigned AddrSpace) {
   // FP Constants are printed as integer constants to avoid losing
-  // precision...
-  const TargetData &TD = *TM.getTargetData();
+  // precision.
   if (CFP->getType()->isDoubleTy()) {
     if (VerboseAsm) {
       double Val = CFP->getValueAPF().convertToDouble();  // for comment only
@@ -1134,15 +1133,7 @@ void AsmPrinter::EmitGlobalConstantFP(const ConstantFP *CFP,
     }
 
     uint64_t i = CFP->getValueAPF().bitcastToAPInt().getZExtValue();
-    if (MAI->getData64bitsDirective(AddrSpace)) {
-      O << MAI->getData64bitsDirective(AddrSpace) << i << '\n';
-    } else if (TD.isBigEndian()) {
-      O << MAI->getData32bitsDirective(AddrSpace) << unsigned(i >> 32)  << '\n';
-      O << MAI->getData32bitsDirective(AddrSpace) << unsigned(i) << '\n';
-    } else {
-      O << MAI->getData32bitsDirective(AddrSpace) << unsigned(i) << '\n';
-      O << MAI->getData32bitsDirective(AddrSpace) << unsigned(i >> 32) << '\n';
-    }
+    OutStreamer.EmitIntValue(i, 8, AddrSpace);
     return;
   }
   
@@ -1152,8 +1143,8 @@ void AsmPrinter::EmitGlobalConstantFP(const ConstantFP *CFP,
       O.PadToColumn(MAI->getCommentColumn());
       O << MAI->getCommentString() << " float " << Val << '\n';
     }
-    O << MAI->getData32bitsDirective(AddrSpace)
-      << CFP->getValueAPF().bitcastToAPInt().getZExtValue() << '\n';
+    OutStreamer.EmitIntValue(CFP->getValueAPF().bitcastToAPInt().getZExtValue(),
+                             4, AddrSpace);
     return;
   }
   
@@ -1173,19 +1164,16 @@ void AsmPrinter::EmitGlobalConstantFP(const ConstantFP *CFP,
         << DoubleVal.convertToDouble() << '\n';
     }
     
-    if (TD.isBigEndian()) {
-      O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[1]) << '\n';
-      O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 48)<<'\n';
-      O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 32)<<'\n';
-      O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 16)<<'\n';
-      O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0])      <<'\n';
+    if (TM.getTargetData()->isBigEndian()) {
+      OutStreamer.EmitIntValue(p[1], 2, AddrSpace);
+      OutStreamer.EmitIntValue(p[0], 8, AddrSpace);
     } else {
-      O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0]) << '\n';
-      O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 16)<<'\n';
-      O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 32)<<'\n';
-      O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 48)<<'\n';
-      O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[1]) << '\n';
+      OutStreamer.EmitIntValue(p[0], 8, AddrSpace);
+      OutStreamer.EmitIntValue(p[1], 2, AddrSpace);
     }
+    
+    // Emit the tail padding for the long double.
+    const TargetData &TD = *TM.getTargetData();
     OutStreamer.EmitZeros(TD.getTypeAllocSize(CFP->getType()) -
                             TD.getTypeStoreSize(CFP->getType()), AddrSpace);
     return;
@@ -1197,16 +1185,12 @@ void AsmPrinter::EmitGlobalConstantFP(const ConstantFP *CFP,
   // premature destruction.
   APInt API = CFP->getValueAPF().bitcastToAPInt();
   const uint64_t *p = API.getRawData();
-  if (TD.isBigEndian()) {
-    O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0] >> 32)<<'\n';
-    O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0])<<'\n';
-    O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1] >> 32)<<'\n';
-    O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1])<<'\n';
-   } else {
-    O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1])<<'\n';
-    O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1] >> 32)<<'\n';
-    O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0])<<'\n';
-    O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0] >> 32)<<'\n';
+  if (TM.getTargetData()->isBigEndian()) {
+    OutStreamer.EmitIntValue(p[0], 8, AddrSpace);
+    OutStreamer.EmitIntValue(p[1], 8, AddrSpace);
+  } else {
+    OutStreamer.EmitIntValue(p[1], 8, AddrSpace);
+    OutStreamer.EmitIntValue(p[0], 8, AddrSpace);
   }
 }