[patch] m68k: ISAC corrections (Part 1)
Kazu Hirata
kazu@codesourcery.com
Fri Jun 15 13:27:00 GMT 2007
Hi,
Attached is a patch to correct the ISAC support.
Zero-extend and sign-extend moves are available on both TARGET_ISAB
and TARGET_ISAC. The ff1 instruction (or clz in the gcc terms) is
available on both TARGET_ISAAPLUS and TARGET_ISAC. This patch
introduces ISA_HAS_MVS_MVZ and ISA_HAS_FF1 to indicate the
availability of these instructions.
Tested by building m68k-elf. OK to apply?
Kazu Hirata
2007-06-14 Nathan Sidwell <nathan@codesourcery.com>
* config/m68k/m68k.h (ISA_HAS_FF1, ISA_HAS_MVS_MVZ): New.
* config/m68k/m68k.md: Use ISA_HAS_FF1 and ISA_HAS_MVS_MVZ as
appropriate.
Index: gcc/config/m68k/m68k.h
===================================================================
--- gcc/config/m68k/m68k.h (revision 125739)
+++ gcc/config/m68k/m68k.h (working copy)
@@ -245,6 +245,10 @@ Boston, MA 02110-1301, USA. */
#define TARGET_ISAB ((m68k_cpu_flags & FL_ISA_B) != 0)
#define TARGET_ISAC ((m68k_cpu_flags & FL_ISA_C) != 0)
+/* Some instructions are common to more than one ISA. */
+#define ISA_HAS_MVS_MVZ (TARGET_ISAB || TARGET_ISAC)
+#define ISA_HAS_FF1 (TARGET_ISAAPLUS || TARGET_ISAC)
+
#define TUNE_68000 (m68k_tune == u68000)
#define TUNE_68010 (m68k_tune == u68010)
#define TUNE_68000_10 (TUNE_68000 || TUNE_68010)
Index: gcc/config/m68k/m68k.md
===================================================================
--- gcc/config/m68k/m68k.md (revision 125739)
+++ gcc/config/m68k/m68k.md (working copy)
@@ -1391,7 +1391,7 @@ (define_insn_and_split "*zero_extendsidi
(define_insn "*zero_extendhisi2_cf"
[(set (match_operand:SI 0 "register_operand" "=d")
(zero_extend:SI (match_operand:HI 1 "nonimmediate_src_operand" "rmS")))]
- "TARGET_ISAB"
+ "ISA_HAS_MVS_MVZ"
"mvz%.w %1,%0")
(define_insn "zero_extendhisi2"
@@ -1415,7 +1415,7 @@ (define_insn "*zero_extendqihi2"
(define_insn "*zero_extendqisi2_cfv4"
[(set (match_operand:SI 0 "register_operand" "=d")
(zero_extend:SI (match_operand:QI 1 "nonimmediate_src_operand" "dmS")))]
- "TARGET_ISAB"
+ "ISA_HAS_MVS_MVZ"
"mvz%.b %1,%0")
(define_insn "zero_extendqisi2"
@@ -1429,7 +1429,7 @@ (define_insn "zero_extendqisi2"
(define_split
[(set (match_operand 0 "register_operand" "")
(zero_extend (match_operand 1 "nonimmediate_src_operand" "")))]
- "!TARGET_ISAB
+ "!ISA_HAS_MVS_MVZ
&& reload_completed
&& reg_mentioned_p (operands[0], operands[1])"
[(set (strict_low_part (match_dup 2))
@@ -1445,7 +1445,7 @@ (define_split
(define_split
[(set (match_operand 0 "register_operand" "")
(zero_extend (match_operand 1 "nonimmediate_src_operand" "")))]
- "!TARGET_ISAB && reload_completed"
+ "!ISA_HAS_MVS_MVZ && reload_completed"
[(set (match_dup 0)
(const_int 0))
(set (strict_low_part (match_dup 2))
@@ -1463,7 +1463,7 @@ (define_insn "extendqidi2"
{
CC_STATUS_INIT;
operands[2] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
- if (TARGET_ISAB)
+ if (ISA_HAS_MVS_MVZ)
return "mvs%.b %1,%2\;smi %0\;extb%.l %0";
if (TARGET_68020 || TARGET_COLDFIRE)
{
@@ -1489,7 +1489,7 @@ (define_insn "extendhidi2"
{
CC_STATUS_INIT;
operands[2] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
- if (TARGET_ISAB)
+ if (ISA_HAS_MVS_MVZ)
return "mvs%.w %1,%2\;smi %0\;extb%.l %0";
if (TARGET_68020 || TARGET_COLDFIRE)
return "move%.w %1,%2\;ext%.l %2\;smi %0\;extb%.l %0";
@@ -1567,14 +1567,14 @@ (define_insn "*cfv4_extendhisi2"
[(set (match_operand:SI 0 "nonimmediate_operand" "=d")
(sign_extend:SI
(match_operand:HI 1 "nonimmediate_src_operand" "rmS")))]
- "TARGET_ISAB"
+ "ISA_HAS_MVS_MVZ"
"mvs%.w %1,%0")
(define_insn "*68k_extendhisi2"
[(set (match_operand:SI 0 "nonimmediate_operand" "=*d,a")
(sign_extend:SI
(match_operand:HI 1 "nonimmediate_src_operand" "0,rmS")))]
- "!TARGET_ISAB"
+ "!ISA_HAS_MVS_MVZ"
{
if (ADDRESS_REG_P (operands[0]))
return "move%.w %1,%0";
@@ -1596,13 +1596,13 @@ (define_expand "extendqisi2"
(define_insn "*cfv4_extendqisi2"
[(set (match_operand:SI 0 "nonimmediate_operand" "=d")
(sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "rms")))]
- "TARGET_ISAB"
+ "ISA_HAS_MVS_MVZ"
"mvs%.b %1,%0")
(define_insn "*68k_extendqisi2"
[(set (match_operand:SI 0 "nonimmediate_operand" "=d")
(sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "0")))]
- "TARGET_68020 || (TARGET_COLDFIRE && !TARGET_ISAB)"
+ "TARGET_68020 || (TARGET_COLDFIRE && !ISA_HAS_MVS_MVZ)"
"extb%.l %0")
;; Conversions between float and double.
@@ -3114,7 +3114,7 @@ (define_insn "udivmodhi4"
(umod:HI (match_dup 1) (match_dup 2)))]
"!TARGET_COLDFIRE || TARGET_CF_HWDIV"
{
- if (TARGET_ISAB)
+ if (ISA_HAS_MVS_MVZ)
output_asm_insn (MOTOROLA ?
"mvz%.w %0,%0\;divu%.w %2,%0" :
"mvz%.w %0,%0\;divu %2,%0",
@@ -3238,7 +3238,7 @@ (define_insn "andsi3_5200"
(match_operand:SI 2 "general_src_operand" "d,dmsK")))]
"TARGET_COLDFIRE"
{
- if (TARGET_ISAB
+ if (ISA_HAS_MVS_MVZ
&& DATA_REG_P (operands[0])
&& GET_CODE (operands[2]) == CONST_INT)
{
@@ -4005,7 +4005,7 @@ (define_insn "abs<mode>2_cf"
(define_insn "clzsi2"
[(set (match_operand:SI 0 "register_operand" "=d")
(clz:SI (match_operand:SI 1 "register_operand" "0")))]
- "TARGET_ISAAPLUS || TARGET_ISAC"
+ "ISA_HAS_FF1"
"ff1 %0")
;; one complement instructions
More information about the Gcc-patches
mailing list