]> git.tdb.fi Git - builder.git/blobdiff - source/architecture.cpp
Add FPU specification to Architecture and GnuCompiler
[builder.git] / source / architecture.cpp
index fe0033891feb903867bc7eb037b8ca9d480c0943..627ba66ccf6ab6defbcaa960c09fbca775845b14 100644 (file)
@@ -42,6 +42,15 @@ const char *cpus[] =
        0
 };
 
+const char *fpus[] =
+{
+       "387",   "x86",
+       "sse",   "x86",
+       "vfpv3", "arm",
+       "neon",  "arm",
+       0
+};
+
 const char *systems[] =
 {
        "linux",
@@ -116,6 +125,8 @@ Architecture::Architecture(Builder &b, const string &spec):
        name = type;
        if(!cpu.empty())
                name += format("-%s", cpu);
+       if(!fpu.empty())
+               name += format("-%s", fpu);
        name += format("-%d-%s", bits, system);
 
        if(system=="windows")
@@ -149,7 +160,7 @@ bool Architecture::match_name(const string &pattern) const
        {
                if((*i=="32" && bits==32) || (*i=="64" && bits==64))
                        ;
-               else if(*i!=type && *i!=cpu && *i!=system)
+               else if(*i!=type && *i!=cpu && *i!=fpu && *i!=system)
                        return negate;
        }
        return !negate;
@@ -236,6 +247,15 @@ void Architecture::parse_specification(const string &spec)
                                ok = true;
                        }
 
+               for(unsigned j=0; (!ok && fpus[j]); j+=2)
+                       if(*i==fpus[j])
+                       {
+                               if(fpus[j+1]!=type)
+                                       throw invalid_argument("Conflicting FPU specification");
+                               fpu = *i;
+                               ok = true;
+                       }
+
                for(unsigned j=0; (!ok && systems[j]); ++j)
                        if(*i==systems[j])
                        {