This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR c/5972 (Sun as using different cmov syntax on IA-32)


Hi!

This is an attempt to handle the special Sun as cmov syntax.
For some reason, Sun as uses cmov{w,l}.<condition code> instead
of cmov<condition code> and fcmov.<condition code> instead
of fcmov<condition code>.
IMHO introducing yet another assembly dialect for this would be far larger
patch and would mean way more problems than this.
Not having access to Solaris/ia32, I couldn't test this though (appart
from checking out assembly output on a simple testcase). Could anyone
please bootstrap this with -march=i686 on i686-sun-solaris2.[789]?

2002-03-18  Jakub Jelinek  <jakub@redhat.com>

	PR c/5972
	* config/i386/i386.md (movdicc_c_rex64, movsicc_noc, movhicc_noc,
	movsfcc_1, movdfcc_1): Add %O2.
	* config/i386/i386.c (print_operand): Handle %ON.
	Print . before float condition codes in Sun as cmov syntax.
	* config/i386/sol2.h (CMOV_SUN_AS_SYNTAX): Define for Sun as.
	* config.gcc (i[34567]86-*-solaris2*): Remove comment which is
	no longer true.

--- gcc/config/i386/i386.md.jj	Wed Mar  6 19:05:03 2002
+++ gcc/config/i386/i386.md	Mon Mar 18 13:01:56 2002
@@ -15896,8 +15896,8 @@
   "TARGET_64BIT && TARGET_CMOVE
    && (GET_CODE (operands[2]) != MEM || GET_CODE (operands[3]) != MEM)"
   "@
-   cmov%C1\t{%2, %0|%0, %2}
-   cmov%c1\t{%3, %0|%0, %3}"
+   cmov%O2%C1\t{%2, %0|%0, %2}
+   cmov%O2%c1\t{%3, %0|%0, %3}"
   [(set_attr "type" "icmov")
    (set_attr "mode" "DI")])
 
@@ -15938,8 +15938,8 @@
   "TARGET_CMOVE
    && (GET_CODE (operands[2]) != MEM || GET_CODE (operands[3]) != MEM)"
   "@
-   cmov%C1\t{%2, %0|%0, %2}
-   cmov%c1\t{%3, %0|%0, %3}"
+   cmov%O2%C1\t{%2, %0|%0, %2}
+   cmov%O2%c1\t{%3, %0|%0, %3}"
   [(set_attr "type" "icmov")
    (set_attr "mode" "SI")])
 
@@ -15960,8 +15960,8 @@
   "TARGET_CMOVE
    && (GET_CODE (operands[2]) != MEM || GET_CODE (operands[3]) != MEM)"
   "@
-   cmov%C1\t{%2, %0|%0, %2}
-   cmov%c1\t{%3, %0|%0, %3}"
+   cmov%O2%C1\t{%2, %0|%0, %2}
+   cmov%O2%c1\t{%3, %0|%0, %3}"
   [(set_attr "type" "icmov")
    (set_attr "mode" "HI")])
 
@@ -15984,8 +15984,8 @@
   "@
    fcmov%F1\t{%2, %0|%0, %2}
    fcmov%f1\t{%3, %0|%0, %3}
-   cmov%C1\t{%2, %0|%0, %2}
-   cmov%c1\t{%3, %0|%0, %3}"
+   cmov%O2%C1\t{%2, %0|%0, %2}
+   cmov%O2%c1\t{%3, %0|%0, %3}"
   [(set_attr "type" "fcmov,fcmov,icmov,icmov")
    (set_attr "mode" "SF,SF,SI,SI")])
 
@@ -16024,8 +16024,8 @@
   "@
    fcmov%F1\t{%2, %0|%0, %2}
    fcmov%f1\t{%3, %0|%0, %3}
-   cmov%C1\t{%2, %0|%0, %2}
-   cmov%c1\t{%3, %0|%0, %3}"
+   cmov%O2%C1\t{%2, %0|%0, %2}
+   cmov%O2%c1\t{%3, %0|%0, %3}"
   [(set_attr "type" "fcmov,fcmov,icmov,icmov")
    (set_attr "mode" "DF")])
 
--- gcc/config/i386/i386.c.jj	Thu Mar 14 16:26:11 2002
+++ gcc/config/i386/i386.c	Mon Mar 18 13:09:37 2002
@@ -5640,6 +5640,8 @@ print_reg (x, code, file)
    C -- print opcode suffix for set/cmov insn.
    c -- like C, but print reversed condition
    F,f -- likewise, but for floating-point.
+   O -- if CMOV_SUN_AS_SYNTAX, expand to "w.", "l." or "q.", otherwise
+        nothing
    R -- print the prefix for register names.
    z -- print the opcode suffix for the size of the current operand.
    * -- print a star (in certain assembler syntax)
@@ -5837,10 +5839,31 @@ print_operand (file, x, code)
 	      break;
 	    }
 	  return;
+	case 'O':
+#ifdef CMOV_SUN_AS_SYNTAX
+	  if (ASSEMBLER_DIALECT == ASM_ATT)
+	    {
+	      switch (GET_MODE (x))
+		{
+		case HImode: putc ('w', file); break;
+		case SImode:
+		case SFmode: putc ('l', file); break;
+		case DImode:
+		case DFmode: putc ('q', file); break;
+		default: abort ();
+		}
+	      putc ('.', file);
+	    }
+#endif
+	  return;
 	case 'C':
 	  put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 0, file);
 	  return;
 	case 'F':
+#ifdef CMOV_SUN_AS_SYNTAX
+	  if (ASSEMBLER_DIALECT == ASM_ATT)
+	    putc ('.', file);
+#endif
 	  put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 0, 1, file);
 	  return;
 
@@ -5856,6 +5879,10 @@ print_operand (file, x, code)
 	  put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 0, file);
 	  return;
 	case 'f':
+#ifdef CMOV_SUN_AS_SYNTAX
+	  if (ASSEMBLER_DIALECT == ASM_ATT)
+	    putc ('.', file);
+#endif
 	  put_condition_code (GET_CODE (x), GET_MODE (XEXP (x, 0)), 1, 1, file);
 	  return;
 	case '+':
--- gcc/config/i386/sol2.h.jj	Tue Jan 29 14:15:02 2002
+++ gcc/config/i386/sol2.h	Mon Mar 18 13:11:28 2002
@@ -39,6 +39,8 @@ Boston, MA 02111-1307, USA.  */
 #define ASM_SPEC \
   "%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Wa,*:%*} -s"
 
+#define CMOV_SUN_AS_SYNTAX 1
+
 #else /* GAS_REJECTS_MINUS_S */
 
 /* Same as above, except for -s, unsupported by GNU as.  */
--- gcc/config.gcc.jj	Wed Mar  6 19:04:20 2002
+++ gcc/config.gcc	Mon Mar 18 13:10:58 2002
@@ -1333,7 +1333,6 @@ i[34567]86-*-solaris2*)
 	xm_defines="POSIX SMALL_ARG_MAX"
 	tm_file="${tm_file} i386/att.h dbxelf.h elfos.h svr4.h i386/sysv4.h i386/sol2.h"
 	if test x$gas = xyes; then
-		# Only needed if gas does not support -s
 		tm_file="i386/sol2gas.h ${tm_file}"
 	fi
 	tmake_file="i386/t-sol2 t-svr4"

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]