[flang] Added missing runtime I/O definitions
authorZachary Selk <zrselk@gmail.com>
Tue, 7 Jul 2020 19:33:31 +0000 (12:33 -0700)
committerTim Keith <tkeith@nvidia.com>
Tue, 7 Jul 2020 19:33:51 +0000 (12:33 -0700)
Added runtime function definitions for 32-bit real I/O and 32-bit complex output

Differential Revision: https://reviews.llvm.org/D83112

flang/runtime/io-api.cpp

index 77b32ca..4710a59 100644 (file)
@@ -843,6 +843,35 @@ bool IONAME(InputInteger)(Cookie cookie, std::int64_t &n, int kind) {
   return false;
 }
 
+bool IONAME(OutputReal32)(Cookie cookie, float x) {
+  IoStatementState &io{*cookie};
+  if (!io.get_if<OutputStatementState>()) {
+    io.GetIoErrorHandler().Crash(
+        "OutputReal32() called for a non-output I/O statement");
+    return false;
+  }
+  if (auto edit{io.GetNextDataEdit()}) {
+    return RealOutputEditing<24>{io, x}.Edit(*edit);
+  }
+  return false;
+}
+
+bool IONAME(InputReal32)(Cookie cookie, float &x) {
+  IoStatementState &io{*cookie};
+  if (!io.get_if<InputStatementState>()) {
+    io.GetIoErrorHandler().Crash(
+        "InputReal32() called for a non-input I/O statement");
+    return false;
+  }
+  if (auto edit{io.GetNextDataEdit()}) {
+    if (edit->descriptor == DataEdit::ListDirectedNullValue) {
+      return true;
+    }
+    return EditRealInput<24>(io, *edit, reinterpret_cast<void *>(&x));
+  }
+  return false;
+}
+
 bool IONAME(OutputReal64)(Cookie cookie, double x) {
   IoStatementState &io{*cookie};
   if (!io.get_if<OutputStatementState>()) {
@@ -872,6 +901,18 @@ bool IONAME(InputReal64)(Cookie cookie, double &x) {
   return false;
 }
 
+bool IONAME(OutputComplex32)(Cookie cookie, float r, float z) {
+  IoStatementState &io{*cookie};
+  if (io.get_if<ListDirectedStatementState<Direction::Output>>()) {
+    DataEdit real, imaginary;
+    real.descriptor = DataEdit::ListDirectedRealPart;
+    imaginary.descriptor = DataEdit::ListDirectedImaginaryPart;
+    return RealOutputEditing<24>{io, r}.Edit(real) &&
+        RealOutputEditing<24>{io, z}.Edit(imaginary);
+  }
+  return IONAME(OutputReal32)(cookie, r) && IONAME(OutputReal32)(cookie, z);
+}
+
 bool IONAME(OutputComplex64)(Cookie cookie, double r, double z) {
   IoStatementState &io{*cookie};
   if (io.get_if<ListDirectedStatementState<Direction::Output>>()) {