On 01/10/2013 11:25 AM, Eli Friedman wrote:
On Thu, Jan 10, 2013 at 4:36 AM, Simon Atanasyan 
<[email protected]> wrote:
Author: atanasyan
Date: Thu Jan 10 06:36:19 2013
New Revision: 172062

URL: http://llvm.org/viewvc/llvm-project?rev=172062&view=rev
Log:
[Mips] Pass a combination of +soft-float and -mips16-hard-float flags to
the backend if hard float ABI is selected under -mips16 mode.

Modified:
     cfe/trunk/lib/Driver/Tools.cpp
     cfe/trunk/test/Driver/mips-float.c

Modified: cfe/trunk/lib/Driver/Tools.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=172062&r1=172061&r2=172062&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/Tools.cpp (original)
+++ cfe/trunk/lib/Driver/Tools.cpp Thu Jan 10 06:36:19 2013
@@ -958,7 +958,9 @@

    StringRef FloatABI = getMipsFloatABI(D, Args);

-  if (FloatABI == "soft") {
+  bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
+
+  if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
      // Floating point operations and argument passing are soft.
      CmdArgs.push_back("-msoft-float");
      CmdArgs.push_back("-mfloat-abi");
@@ -969,6 +971,11 @@
      // Now it is the only method.
      CmdArgs.push_back("-target-feature");
      CmdArgs.push_back("+soft-float");
+
+    if (FloatABI == "hard" && IsMips16) {
+      CmdArgs.push_back("-mllvm");
+      CmdArgs.push_back("-mips16-hard-float");
+    }
    }
    else if (FloatABI == "single") {
      // Restrict the use of hardware floating-point

I don't understand this change; -mips16-hard-float isn't soft-float at
all.  (Normally, I would consider "soft-float" to mean "doesn't use
floating-point registers".) Why are we passing the soft-float flag in
the first place?

Mips16 does not have floating point, but mips16 is really a processor mode and not an architecture.

Mips16 code is running on a mips32 processor (could theoretically be on a mips64 processor but no such configuration exists in reality that I am aware of).

We are using gcc nomenclature here, but hard float for mips 16 means essentially to compile as soft float but to use a runtime library for soft float float that is written with native mips32 floating point instructions (those runtime routines will run in mips32 mode). From the point of view of llvm then, it is soft float with different library names (essentially).

Mips16 and mips32 can more or less freely call each other. There are some issues when floating point arguments or return values are involved but they don't involve any part of llvm beyond the target dependent part of the mips compiler.

So we are compiling mips16 code with hard float using the soft float argument, but when I see the additional -mips16-hard-float, then I redefine the table of runtime library routines in llvm that are normally called for soft float to be the hard float analogs.

There is a more to the mips16 hard float but for these purpose of the driver, I have explained it fully.

Reed

-Eli


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to