Don't use the extsd/extd instructions on the ns32532.
authorRichard Kenner <kenner@gcc.gnu.org>
Tue, 17 May 1994 22:06:24 +0000 (18:06 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Tue, 17 May 1994 22:06:24 +0000 (18:06 -0400)
From-SVN: r7321

gcc/config/ns32k/ns32k.md

index 3a32e2fa8ee978b6f8ecdbe3f37bcfbaf30ed73d..2adef963310812d29c5d58a0ffaed5fbfa7d5bc5 100644 (file)
@@ -1,6 +1,6 @@
 ;;- Machine description for GNU compiler, ns32000 Version
 ;;  Copyright (C) 1988, 1994 Free Software Foundation, Inc.
-;;  Contributed by Michael Tiemann (tiemann@mcc.com)
+;;  Contributed by Michael Tiemann (tiemann@cygnus.com)
 
 ;; This file is part of GNU CC.
 
     return \"adjspb %$-4\";
 }")
 
+;; The extsd/extd isntructions have the problem that they always access
+;; 32 bits even if the bitfield is smaller. For example the instruction
+;;     extsd 7(r1),r0,2,5
+;; would read not only at address 7(r1) but also at 8(r1) to 10(r1).
+;; If these addresses are in a different (unmapped) page a memory fault
+;; is the result.
+;;
+;; Timing considerations:
+;;     movd    0(r1),r0        3 bytes
+;;     lshd    -26,r0          4
+;;     andd    0x1f,r0         5
+;; takes about 13 cycles on the 532 while
+;;     extsd   7(r1),r0,2,5    5 bytes
+;; takes about 21 cycles.
+;;
+;; So lets forget about extsd/extd on the 532.
+
 (define_insn ""
   [(set (match_operand:SI 0 "general_operand" "=g<")
        (zero_extract:SI (match_operand:SI 1 "register_operand" "g")
                         (match_operand:SI 2 "const_int_operand" "i")
                         (match_operand:SI 3 "general_operand" "rK")))]
-  ""
+  "! TARGET_32532"
   "*
 { if (GET_CODE (operands[3]) == CONST_INT)
     return \"extsd %1,%0,%3,%2\";
        (zero_extract:SI (match_operand:QI 1 "general_operand" "g")
                         (match_operand:SI 2 "const_int_operand" "i")
                         (match_operand:SI 3 "general_operand" "rK")))]
-  ""
+  "! TARGET_32532"
   "*
 { if (GET_CODE (operands[3]) == CONST_INT)
     return \"extsd %1,%0,%3,%2\";