(split_di): New; from i386.c.
authorRichard Kenner <kenner@gcc.gnu.org>
Fri, 28 Jun 1996 00:23:08 +0000 (20:23 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Fri, 28 Jun 1996 00:23:08 +0000 (20:23 -0400)
From-SVN: r12340

gcc/config/ns32k/ns32k.c

index 045800b..0e07662 100644 (file)
@@ -1,5 +1,5 @@
 /* Subroutines for assembler code output on the NS32000.
-   Copyright (C) 1988, 1994, 1995 Free Software Foundation, Inc.
+   Copyright (C) 1988, 1994, 1995, 1996 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -227,6 +227,39 @@ reg_or_mem_operand (op, mode)
              || GET_CODE (op) == MEM));
 }
 \f
+/* Split one or more DImode RTL references into pairs of SImode
+   references.  The RTL can be REG, offsettable MEM, integer constant, or
+   CONST_DOUBLE.  "operands" is a pointer to an array of DImode RTL to
+   split and "num" is its length.  lo_half and hi_half are output arrays
+   that parallel "operands". */
+
+void
+split_di (operands, num, lo_half, hi_half)
+     rtx operands[];
+     int num;
+     rtx lo_half[], hi_half[];
+{
+  while (num--)
+    {
+      if (GET_CODE (operands[num]) == REG)
+       {
+         lo_half[num] = gen_rtx (REG, SImode, REGNO (operands[num]));
+         hi_half[num] = gen_rtx (REG, SImode, REGNO (operands[num]) + 1);
+       }
+      else if (CONSTANT_P (operands[num]))
+       {
+         split_double (operands[num], &lo_half[num], &hi_half[num]);
+       }
+      else if (offsettable_memref_p (operands[num]))
+       {
+         lo_half[num] = operands[num];
+         hi_half[num] = adj_offsettable_operand (operands[num], 4);
+       }
+      else
+       abort();
+    }
+}
+\f
 /* Return the best assembler insn template
    for moving operands[1] into operands[0] as a fullword.  */