Implement parsing of float constants
authorDavid Schleef <ds@schleef.org>
Fri, 27 Aug 2010 21:04:23 +0000 (14:04 -0700)
committerDavid Schleef <ds@schleef.org>
Fri, 27 Aug 2010 21:16:31 +0000 (14:16 -0700)
orc/orcparse.c
orc/orcprogram.c
orc/orcprogram.h
testsuite/test.orc

index 2a09c82..92bb59d 100644 (file)
@@ -186,8 +186,16 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log)
         orc_program_add_parameter (parser->program, size, token[2]);
       } else if (strcmp (token[0], ".const") == 0) {
         int size = strtol (token[1], NULL, 0);
-        int value = strtoul (token[3], NULL, 0);
-        orc_program_add_constant (parser->program, size, value, token[2]);
+        char *end, *endf;
+        int value;
+        double valuef;
+        value = strtol (token[3], &end, 0);
+        valuef = strtod (token[3], &endf);
+        if (endf > end) {
+          orc_program_add_constant_float (parser->program, size, valuef, token[2]);
+        } else {
+          orc_program_add_constant (parser->program, size, value, token[2]);
+        }
       } else if (strcmp (token[0], ".floatparam") == 0) {
         int size = strtol (token[1], NULL, 0);
         orc_program_add_parameter_float (parser->program, size, token[2]);
@@ -212,6 +220,8 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log)
 
       if (o) {
         int n_args = opcode_n_args (o);
+        char const_regs[10][10];
+        int i;
 
         if (n_tokens != 1 + offset + n_args) {
           orc_parse_log (parser, "error: line %d: too %s arguments for %s (expected %d)\n",
@@ -219,23 +229,33 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log)
               token[offset], n_args);
         }
 
+        for(i=offset+1;i<n_tokens;i++){
+          char *end;
+          char *endf;
+          int imm;
+          double immf;
+          imm = strtol (token[i], &end, 0);
+          immf = strtod (token[i], &endf);
+          if ((end != token[i]) || (endf != token[i])) {
+            sprintf(const_regs[i], "c%d", parser->creg_index);
+            parser->creg_index++;
+            if (end >= endf) {
+              orc_program_add_constant (parser->program, 2, imm,
+                  const_regs[i]);
+            } else {
+              orc_program_add_constant_float (parser->program, 2, immf,
+                  const_regs[i]);
+            }
+            token[i] = const_regs[i];
+          }
+        }
+
         if (n_tokens - offset == 5) {
           orc_program_append_str_2 (parser->program, token[offset], flags,
               token[offset+1], token[offset+2], token[offset+3], token[offset+4]);
         } else if (n_tokens - offset == 4) {
-          char *end;
-          int imm = strtol (token[offset + 3], &end, 0);
-          if (end != token[offset + 3]) {
-            char creg[10];
-            sprintf(creg, "c%d", parser->creg_index);
-            parser->creg_index++;
-            orc_program_add_constant (parser->program, 2, imm, creg);
-            orc_program_append_str_2 (parser->program, token[offset], flags,
-                token[offset+1], token[offset+2], creg, NULL);
-          } else {
-            orc_program_append_str_2 (parser->program, token[offset], flags,
-                token[offset+1], token[offset+2], token[offset+3], NULL);
-          }
+          orc_program_append_str_2 (parser->program, token[offset], flags,
+              token[offset+1], token[offset+2], token[offset+3], NULL);
         } else {
           orc_program_append_str_2 (parser->program, token[offset], flags,
               token[offset+1], token[offset+2], NULL, NULL);
index fe27db5..643e60e 100644 (file)
@@ -357,6 +357,31 @@ orc_program_add_constant (OrcProgram *program, int size, int value, const char *
   return i;
 }
 
+int
+orc_program_add_constant_int64 (OrcProgram *program, int size,
+    orc_int64 value, const char *name)
+{
+  ORC_ASSERT(0);
+}
+
+int
+orc_program_add_constant_float (OrcProgram *program, int size,
+    float value, const char *name)
+{
+  orc_union32 u;
+  u.f = value;
+  return orc_program_add_constant (program, size, u.i, name);
+}
+
+int
+orc_program_add_constant_double (OrcProgram *program, int size,
+    double value, const char *name)
+{
+  orc_union64 u;
+  u.f = value;
+  return orc_program_add_constant_int64 (program, size, u.i, name);
+}
+
 /**
  * orc_program_add_parameter:
  * @program: a pointer to an OrcProgram structure
index 11d5f84..05fd592 100644 (file)
@@ -633,6 +633,9 @@ int orc_program_dup_temporary (OrcProgram *program, int i, int j);
 int orc_program_add_source (OrcProgram *program, int size, const char *name);
 int orc_program_add_destination (OrcProgram *program, int size, const char *name);
 int orc_program_add_constant (OrcProgram *program, int size, int value, const char *name);
+int orc_program_add_constant_int64 (OrcProgram *program, int size, orc_int64 value, const char *name);
+int orc_program_add_constant_float (OrcProgram *program, int size, float value, const char *name);
+int orc_program_add_constant_double (OrcProgram *program, int size, double value, const char *name);
 int orc_program_add_parameter (OrcProgram *program, int size, const char *name);
 int orc_program_add_parameter_float (OrcProgram *program, int size, const char *name);
 int orc_program_add_parameter_double (OrcProgram *program, int size, const char *name);
index fcfe26d..c0a0a8a 100644 (file)
@@ -2228,3 +2228,16 @@ ldresnearb d1, s1, p1, p2
 
 ldreslinb d1, s1, p1, p2
 
+
+.function test_float_constant_1
+.dest 4 d1
+.const 4 c1 2.0
+
+copyl d1, c1
+
+
+.function test_float_constant_2
+.dest 4 d1
+
+copyl d1, 2.0
+