Commit 3d30741b by Richard Sandiford Committed by Richard Sandiford

mips.c (mips_split_64bit_move): Use gen_rtx_REG_offset rather than gen_lowpart…

mips.c (mips_split_64bit_move): Use gen_rtx_REG_offset rather than gen_lowpart to change a register from DImode...

gcc/
	* config/mips/mips.c (mips_split_64bit_move): Use gen_rtx_REG_offset
	rather than gen_lowpart to change a register from DImode to DFmode.
	(mips_cannot_change_mode_class): Only allow FPRs to change mode if
	both FROM and TO are integer modes that are no bigger than 4 bytes.
	(mips_mode_ok_for_mov_fmt_p): New function.
	(mips_preferred_reload_class): Use it instead of FLOAT_MODE_P.
	(mips_secondary_reload_class): Tweak formatting and comments.
	Use reg_class_subset_p instead of direct comparisons with
	classes.  Only allow direct FPR<->FPR moves for modes that
	satisfy mips_mode_ok_for_mov_fmt_p.  Only allow loads and stores
	for 4- and 8-byte types.  Handle reloads in which X is an FPR.
	* config/mips/mips.md (*movdi_gp32_fp64): Remove f<-f alternative.
	(*movdi_64bit): Likewise.
	(*movsi_internal): Likewise.
	(*movhi_internal): Likewise.
	(*movqi_internal): Likewise.

From-SVN: r128894
parent a45db20b
2007-09-30 Richard Sandiford <rsandifo@nildram.co.uk>
* config/mips/mips.c (mips_split_64bit_move): Use gen_rtx_REG_offset
rather than gen_lowpart to change a register from DImode to DFmode.
(mips_cannot_change_mode_class): Only allow FPRs to change mode if
both FROM and TO are integer modes that are no bigger than 4 bytes.
(mips_mode_ok_for_mov_fmt_p): New function.
(mips_preferred_reload_class): Use it instead of FLOAT_MODE_P.
(mips_secondary_reload_class): Tweak formatting and comments.
Use reg_class_subset_p instead of direct comparisons with
classes. Only allow direct FPR<->FPR moves for modes that
satisfy mips_mode_ok_for_mov_fmt_p. Only allow loads and stores
for 4- and 8-byte types. Handle reloads in which X is an FPR.
* config/mips/mips.md (*movdi_gp32_fp64): Remove f<-f alternative.
(*movdi_64bit): Likewise.
(*movsi_internal): Likewise.
(*movhi_internal): Likewise.
(*movqi_internal): Likewise.
2007-09-30 Diego Novillo <dnovillo@google.com> 2007-09-30 Diego Novillo <dnovillo@google.com>
PR 33593 PR 33593
...@@ -3547,7 +3547,8 @@ mips_split_64bit_move (rtx dest, rtx src) ...@@ -3547,7 +3547,8 @@ mips_split_64bit_move (rtx dest, rtx src)
/* Loading an FPR from memory or from GPRs. */ /* Loading an FPR from memory or from GPRs. */
if (ISA_HAS_MXHC1) if (ISA_HAS_MXHC1)
{ {
dest = gen_lowpart (DFmode, dest); if (GET_MODE (dest) != DFmode)
dest = gen_rtx_REG_offset (dest, DFmode, REGNO (dest), 0);
emit_insn (gen_load_df_low (dest, mips_subword (src, 0))); emit_insn (gen_load_df_low (dest, mips_subword (src, 0)));
emit_insn (gen_mthc1 (dest, mips_subword (src, 1), emit_insn (gen_mthc1 (dest, mips_subword (src, 1),
copy_rtx (dest))); copy_rtx (dest)));
...@@ -3565,7 +3566,8 @@ mips_split_64bit_move (rtx dest, rtx src) ...@@ -3565,7 +3566,8 @@ mips_split_64bit_move (rtx dest, rtx src)
/* Storing an FPR into memory or GPRs. */ /* Storing an FPR into memory or GPRs. */
if (ISA_HAS_MXHC1) if (ISA_HAS_MXHC1)
{ {
src = gen_lowpart (DFmode, src); if (GET_MODE (src) != DFmode)
src = gen_rtx_REG_offset (src, DFmode, REGNO (src), 0);
mips_emit_move (mips_subword (dest, 0), mips_subword (src, 0)); mips_emit_move (mips_subword (dest, 0), mips_subword (src, 0));
emit_insn (gen_mfhc1 (mips_subword (dest, 1), src)); emit_insn (gen_mfhc1 (mips_subword (dest, 1), src));
} }
...@@ -9314,44 +9316,38 @@ mips_callee_copies (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED, ...@@ -9314,44 +9316,38 @@ mips_callee_copies (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
to mode TO. */ to mode TO. */
bool bool
mips_cannot_change_mode_class (enum machine_mode from, mips_cannot_change_mode_class (enum machine_mode from ATTRIBUTE_UNUSED,
enum machine_mode to, enum reg_class class) enum machine_mode to ATTRIBUTE_UNUSED,
enum reg_class class)
{ {
if (MIN (GET_MODE_SIZE (from), GET_MODE_SIZE (to)) <= UNITS_PER_WORD /* There are several problems with changing the modes of values
&& MAX (GET_MODE_SIZE (from), GET_MODE_SIZE (to)) > UNITS_PER_WORD) in floating-point registers:
{
if (TARGET_BIG_ENDIAN)
{
/* When a multi-word value is stored in paired floating-point
registers, the first register always holds the low word.
We therefore can't allow FPRs to change between single-word
and multi-word modes. */
if (MAX_FPRS_PER_FMT > 1 && reg_classes_intersect_p (FP_REGS, class))
return true;
}
}
/* gcc assumes that each word of a multiword register can be accessed - When a multi-word value is stored in paired floating-point
individually using SUBREGs. This is not true for floating-point registers, the first register always holds the low word.
registers if they are bigger than a word. */ We therefore can't allow FPRs to change between single-word
if (UNITS_PER_FPREG > UNITS_PER_WORD and multi-word modes on big-endian targets.
&& GET_MODE_SIZE (from) > UNITS_PER_WORD
&& GET_MODE_SIZE (to) < UNITS_PER_FPREG
&& reg_classes_intersect_p (FP_REGS, class))
return true;
/* Loading a 32-bit value into a 64-bit floating-point register - GCC assumes that each word of a multiword register can be accessed
will not sign-extend the value, despite what LOAD_EXTEND_OP says. individually using SUBREGs. This is not true for floating-point
We can't allow 64-bit float registers to change from SImode to registers if they are bigger than a word.
to a wider mode. */
if (TARGET_64BIT
&& TARGET_FLOAT64
&& from == SImode
&& GET_MODE_SIZE (to) >= UNITS_PER_WORD
&& reg_classes_intersect_p (FP_REGS, class))
return true;
return false; - Loading a 32-bit value into a 64-bit floating-point register
will not sign-extend the value, despite what LOAD_EXTEND_OP says.
We can't allow FPRs to change from SImode to to a wider mode on
64-bit targets.
- If the FPU has already interpreted a value in one format, we must
not ask it to treat the value as having a different format.
We therefore only allow changes between 4-byte and smaller integer
values, all of which have the "W" format as far as the FPU is
concerned. */
return (reg_classes_intersect_p (FP_REGS, class)
&& (GET_MODE_CLASS (from) != MODE_INT
|| GET_MODE_CLASS (to) != MODE_INT
|| GET_MODE_SIZE (from) > 4
|| GET_MODE_SIZE (to) > 4));
} }
/* Return true if X should not be moved directly into register $25. /* Return true if X should not be moved directly into register $25.
...@@ -9367,6 +9363,27 @@ mips_dangerous_for_la25_p (rtx x) ...@@ -9367,6 +9363,27 @@ mips_dangerous_for_la25_p (rtx x)
&& mips_global_symbol_p (x)); && mips_global_symbol_p (x));
} }
/* Return true if moves in mode MODE can use the FPU's mov.fmt instruction. */
static bool
mips_mode_ok_for_mov_fmt_p (enum machine_mode mode)
{
switch (mode)
{
case SFmode:
return TARGET_HARD_FLOAT;
case DFmode:
return TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT;
case V2SFmode:
return TARGET_HARD_FLOAT && TARGET_PAIRED_SINGLE_FLOAT;
default:
return false;
}
}
/* Implement PREFERRED_RELOAD_CLASS. */ /* Implement PREFERRED_RELOAD_CLASS. */
enum reg_class enum reg_class
...@@ -9375,9 +9392,8 @@ mips_preferred_reload_class (rtx x, enum reg_class class) ...@@ -9375,9 +9392,8 @@ mips_preferred_reload_class (rtx x, enum reg_class class)
if (mips_dangerous_for_la25_p (x) && reg_class_subset_p (LEA_REGS, class)) if (mips_dangerous_for_la25_p (x) && reg_class_subset_p (LEA_REGS, class))
return LEA_REGS; return LEA_REGS;
if (TARGET_HARD_FLOAT if (reg_class_subset_p (FP_REGS, class)
&& FLOAT_MODE_P (GET_MODE (x)) && mips_mode_ok_for_mov_fmt_p (GET_MODE (x)))
&& reg_class_subset_p (FP_REGS, class))
return FP_REGS; return FP_REGS;
if (reg_class_subset_p (GR_REGS, class)) if (reg_class_subset_p (GR_REGS, class))
...@@ -9399,110 +9415,81 @@ enum reg_class ...@@ -9399,110 +9415,81 @@ enum reg_class
mips_secondary_reload_class (enum reg_class class, mips_secondary_reload_class (enum reg_class class,
enum machine_mode mode, rtx x, int in_p) enum machine_mode mode, rtx x, int in_p)
{ {
enum reg_class gr_regs = TARGET_MIPS16 ? M16_REGS : GR_REGS; int regno;
int regno = -1;
int gp_reg_p;
if (REG_P (x)|| GET_CODE (x) == SUBREG)
regno = true_regnum (x);
gp_reg_p = TARGET_MIPS16 ? M16_REG_P (regno) : GP_REG_P (regno);
/* If X is a constant that cannot be loaded into $25, it must be loaded
into some other GPR. No other register class allows a direct move. */
if (mips_dangerous_for_la25_p (x)) if (mips_dangerous_for_la25_p (x))
return reg_class_subset_p (class, LEA_REGS) ? NO_REGS : LEA_REGS;
regno = true_regnum (x);
if (TARGET_MIPS16)
{ {
gr_regs = LEA_REGS; /* In MIPS16 mode, every move must involve a member of M16_REGS. */
if (TEST_HARD_REG_BIT (reg_class_contents[(int) class], 25)) if (!reg_class_subset_p (class, M16_REGS) && !M16_REG_P (regno))
return gr_regs; return M16_REGS;
/* We can't really copy to HI or LO at all in MIPS16 mode. */
if (in_p ? reg_classes_intersect_p (class, ACC_REGS) : ACC_REG_P (regno))
return M16_REGS;
return NO_REGS;
} }
/* Copying from HI or LO to anywhere other than a general register /* Copying from accumulator registers to anywhere other than a general
requires a general register. register requires a temporary general register. */
This rule applies to both the original HI/LO pair and the new
DSP accumulators. */
if (reg_class_subset_p (class, ACC_REGS)) if (reg_class_subset_p (class, ACC_REGS))
{ return GP_REG_P (regno) ? NO_REGS : GR_REGS;
if (TARGET_MIPS16 && in_p)
{
/* We can't really copy to HI or LO at all in mips16 mode. */
return M16_REGS;
}
return gp_reg_p ? NO_REGS : gr_regs;
}
if (ACC_REG_P (regno)) if (ACC_REG_P (regno))
{ return reg_class_subset_p (class, GR_REGS) ? NO_REGS : GR_REGS;
if (TARGET_MIPS16 && ! in_p)
{
/* We can't really copy to HI or LO at all in mips16 mode. */
return M16_REGS;
}
return class == gr_regs ? NO_REGS : gr_regs;
}
/* We can only copy a value to a condition code register from a /* We can only copy a value to a condition code register from a
floating point register, and even then we require a scratch floating point register, and even then we require a scratch
floating point register. We can only copy a value out of a floating point register. We can only copy a value out of a
condition code register into a general register. */ condition code register into a general register. */
if (class == ST_REGS) if (reg_class_subset_p (class, ST_REGS))
{ {
if (in_p) if (in_p)
return FP_REGS; return FP_REGS;
return gp_reg_p ? NO_REGS : gr_regs; return GP_REG_P (regno) ? NO_REGS : GR_REGS;
} }
if (ST_REG_P (regno)) if (ST_REG_P (regno))
{ {
if (! in_p) if (!in_p)
return FP_REGS; return FP_REGS;
return class == gr_regs ? NO_REGS : gr_regs; return reg_class_subset_p (class, GR_REGS) ? NO_REGS : GR_REGS;
} }
if (class == FP_REGS) if (reg_class_subset_p (class, FP_REGS))
{ {
if (MEM_P (x)) if (MEM_P (x)
{ && (GET_MODE_SIZE (mode) == 4 || GET_MODE_SIZE (mode) == 8))
/* In this case we can use lwc1, swc1, ldc1 or sdc1. */ /* In this case we can use lwc1, swc1, ldc1 or sdc1. We'll use
return NO_REGS; pairs of lwc1s and swc1s if ldc1 and sdc1 are not supported. */
} return NO_REGS;
else if (CONSTANT_P (x) && GET_MODE_CLASS (mode) == MODE_FLOAT)
{
/* We can use the l.s and l.d macros to load floating-point
constants. ??? For l.s, we could probably get better
code by returning GR_REGS here. */
return NO_REGS;
}
else if (gp_reg_p || x == CONST0_RTX (mode))
{
/* In this case we can use mtc1, mfc1, dmtc1 or dmfc1. */
return NO_REGS;
}
else if (FP_REG_P (regno))
{
/* In this case we can use mov.s or mov.d. */
return NO_REGS;
}
else
{
/* Otherwise, we need to reload through an integer register. */
return gr_regs;
}
}
/* In mips16 mode, going between memory and anything but M16_REGS if (GP_REG_P (regno) || x == CONST0_RTX (mode))
requires an M16_REG. */ /* In this case we can use mtc1, mfc1, dmtc1 or dmfc1. */
if (TARGET_MIPS16) return NO_REGS;
{
if (class != M16_REGS && class != M16_NA_REGS) if (mips_mode_ok_for_mov_fmt_p (mode))
{ {
if (gp_reg_p) if (CONSTANT_P (x))
/* We can force the constants to memory and use lwc1
and ldc1. As above, we will use pairs of lwc1s if
ldc1 is not supported. */
return NO_REGS; return NO_REGS;
return M16_REGS;
} if (FP_REG_P (regno))
if (! gp_reg_p) /* In this case we can use mov.fmt. */
{
if (class == M16_REGS || class == M16_NA_REGS)
return NO_REGS; return NO_REGS;
return M16_REGS;
} }
/* Otherwise, we need to reload through an integer register. */
return GR_REGS;
} }
if (FP_REG_P (regno))
return reg_class_subset_p (class, GR_REGS) ? NO_REGS : GR_REGS;
return NO_REGS; return NO_REGS;
} }
......
...@@ -3399,15 +3399,15 @@ ...@@ -3399,15 +3399,15 @@
(set_attr "length" "8,16,*,*,8,8,8,*,8,*")]) (set_attr "length" "8,16,*,*,8,8,8,*,8,*")])
(define_insn "*movdi_gp32_fp64" (define_insn "*movdi_gp32_fp64"
[(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,m,*a,*d,*f,*f,*f,*d,*m") [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,m,*a,*d,*f,*f,*d,*m")
(match_operand:DI 1 "move_operand" "d,i,m,d,*J*d,*a,*f,*J*d,*m,*f,*f"))] (match_operand:DI 1 "move_operand" "d,i,m,d,*J*d,*a,*J*d,*m,*f,*f"))]
"!TARGET_64BIT && TARGET_FLOAT64 && !TARGET_MIPS16 "!TARGET_64BIT && TARGET_FLOAT64 && !TARGET_MIPS16
&& (register_operand (operands[0], DImode) && (register_operand (operands[0], DImode)
|| reg_or_0_operand (operands[1], DImode))" || reg_or_0_operand (operands[1], DImode))"
{ return mips_output_move (operands[0], operands[1]); } { return mips_output_move (operands[0], operands[1]); }
[(set_attr "type" "multi,multi,load,store,mthilo,mfhilo,fmove,mtc,fpload,mfc,fpstore") [(set_attr "type" "multi,multi,load,store,mthilo,mfhilo,mtc,fpload,mfc,fpstore")
(set_attr "mode" "DI") (set_attr "mode" "DI")
(set_attr "length" "8,16,*,*,8,8,4,8,*,8,*")]) (set_attr "length" "8,16,*,*,8,8,8,*,8,*")])
(define_insn "*movdi_32bit_mips16" (define_insn "*movdi_32bit_mips16"
[(set (match_operand:DI 0 "nonimmediate_operand" "=d,y,d,d,d,d,m,*d") [(set (match_operand:DI 0 "nonimmediate_operand" "=d,y,d,d,d,d,m,*d")
...@@ -3421,15 +3421,15 @@ ...@@ -3421,15 +3421,15 @@
(set_attr "length" "8,8,8,8,12,*,*,8")]) (set_attr "length" "8,8,8,8,12,*,*,8")])
(define_insn "*movdi_64bit" (define_insn "*movdi_64bit"
[(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,e,d,m,*f,*f,*f,*d,*m,*x,*B*C*D,*B*C*D,*d,*m") [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,e,d,m,*f,*f,*d,*m,*x,*B*C*D,*B*C*D,*d,*m")
(match_operand:DI 1 "move_operand" "d,U,T,m,dJ,*f,*d*J,*m,*f,*f,*J*d,*d,*m,*B*C*D,*B*C*D"))] (match_operand:DI 1 "move_operand" "d,U,T,m,dJ,*d*J,*m,*f,*f,*J*d,*d,*m,*B*C*D,*B*C*D"))]
"TARGET_64BIT && !TARGET_MIPS16 "TARGET_64BIT && !TARGET_MIPS16
&& (register_operand (operands[0], DImode) && (register_operand (operands[0], DImode)
|| reg_or_0_operand (operands[1], DImode))" || reg_or_0_operand (operands[1], DImode))"
{ return mips_output_move (operands[0], operands[1]); } { return mips_output_move (operands[0], operands[1]); }
[(set_attr "type" "move,const,const,load,store,fmove,mtc,fpload,mfc,fpstore,mthilo,mtc,load,mfc,store") [(set_attr "type" "move,const,const,load,store,mtc,fpload,mfc,fpstore,mthilo,mtc,load,mfc,store")
(set_attr "mode" "DI") (set_attr "mode" "DI")
(set_attr "length" "4,*,*,*,*,4,4,*,4,*,4,8,*,8,*")]) (set_attr "length" "4,*,*,*,*,4,*,4,*,4,8,*,8,*")])
(define_insn "*movdi_64bit_mips16" (define_insn "*movdi_64bit_mips16"
[(set (match_operand:DI 0 "nonimmediate_operand" "=d,y,d,d,d,d,d,d,m") [(set (match_operand:DI 0 "nonimmediate_operand" "=d,y,d,d,d,d,d,d,m")
...@@ -3518,15 +3518,15 @@ ...@@ -3518,15 +3518,15 @@
;; in FP registers (off by default, use -mdebugh to enable). ;; in FP registers (off by default, use -mdebugh to enable).
(define_insn "*movsi_internal" (define_insn "*movsi_internal"
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,e,d,m,*f,*f,*f,*d,*m,*d,*z,*a,*d,*B*C*D,*B*C*D,*d,*m") [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,e,d,m,*f,*f,*d,*m,*d,*z,*a,*d,*B*C*D,*B*C*D,*d,*m")
(match_operand:SI 1 "move_operand" "d,U,T,m,dJ,*f,*d*J,*m,*f,*f,*z,*d,*J*d,*A,*d,*m,*B*C*D,*B*C*D"))] (match_operand:SI 1 "move_operand" "d,U,T,m,dJ,*d*J,*m,*f,*f,*z,*d,*J*d,*A,*d,*m,*B*C*D,*B*C*D"))]
"!TARGET_MIPS16 "!TARGET_MIPS16
&& (register_operand (operands[0], SImode) && (register_operand (operands[0], SImode)
|| reg_or_0_operand (operands[1], SImode))" || reg_or_0_operand (operands[1], SImode))"
{ return mips_output_move (operands[0], operands[1]); } { return mips_output_move (operands[0], operands[1]); }
[(set_attr "type" "move,const,const,load,store,fmove,mtc,fpload,mfc,fpstore,mfc,mtc,mthilo,mfhilo,mtc,load,mfc,store") [(set_attr "type" "move,const,const,load,store,mtc,fpload,mfc,fpstore,mfc,mtc,mthilo,mfhilo,mtc,load,mfc,store")
(set_attr "mode" "SI") (set_attr "mode" "SI")
(set_attr "length" "4,*,*,*,*,4,4,*,4,*,4,4,4,4,4,*,4,*")]) (set_attr "length" "4,*,*,*,*,4,*,4,*,4,4,4,4,4,*,4,*")])
(define_insn "*movsi_mips16" (define_insn "*movsi_mips16"
[(set (match_operand:SI 0 "nonimmediate_operand" "=d,y,d,d,d,d,d,d,m") [(set (match_operand:SI 0 "nonimmediate_operand" "=d,y,d,d,d,d,d,d,m")
...@@ -3727,8 +3727,8 @@ ...@@ -3727,8 +3727,8 @@
}) })
(define_insn "*movhi_internal" (define_insn "*movhi_internal"
[(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d,m,*d,*f,*f,*x") [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d,m,*d,*f,*x")
(match_operand:HI 1 "move_operand" "d,I,m,dJ,*f,*d,*f,*d"))] (match_operand:HI 1 "move_operand" "d,I,m,dJ,*f,*d,*d"))]
"!TARGET_MIPS16 "!TARGET_MIPS16
&& (register_operand (operands[0], HImode) && (register_operand (operands[0], HImode)
|| reg_or_0_operand (operands[1], HImode))" || reg_or_0_operand (operands[1], HImode))"
...@@ -3739,11 +3739,10 @@ ...@@ -3739,11 +3739,10 @@
sh\t%z1,%0 sh\t%z1,%0
mfc1\t%0,%1 mfc1\t%0,%1
mtc1\t%1,%0 mtc1\t%1,%0
mov.s\t%0,%1
mt%0\t%1" mt%0\t%1"
[(set_attr "type" "move,arith,load,store,mfc,mtc,fmove,mthilo") [(set_attr "type" "move,arith,load,store,mfc,mtc,mthilo")
(set_attr "mode" "HI") (set_attr "mode" "HI")
(set_attr "length" "4,4,*,*,4,4,4,4")]) (set_attr "length" "4,4,*,*,4,4,4")])
(define_insn "*movhi_mips16" (define_insn "*movhi_mips16"
[(set (match_operand:HI 0 "nonimmediate_operand" "=d,y,d,d,d,d,m") [(set (match_operand:HI 0 "nonimmediate_operand" "=d,y,d,d,d,d,m")
...@@ -3834,8 +3833,8 @@ ...@@ -3834,8 +3833,8 @@
}) })
(define_insn "*movqi_internal" (define_insn "*movqi_internal"
[(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,m,*d,*f,*f,*x") [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,m,*d,*f,*x")
(match_operand:QI 1 "move_operand" "d,I,m,dJ,*f,*d,*f,*d"))] (match_operand:QI 1 "move_operand" "d,I,m,dJ,*f,*d,*d"))]
"!TARGET_MIPS16 "!TARGET_MIPS16
&& (register_operand (operands[0], QImode) && (register_operand (operands[0], QImode)
|| reg_or_0_operand (operands[1], QImode))" || reg_or_0_operand (operands[1], QImode))"
...@@ -3846,11 +3845,10 @@ ...@@ -3846,11 +3845,10 @@
sb\t%z1,%0 sb\t%z1,%0
mfc1\t%0,%1 mfc1\t%0,%1
mtc1\t%1,%0 mtc1\t%1,%0
mov.s\t%0,%1
mt%0\t%1" mt%0\t%1"
[(set_attr "type" "move,arith,load,store,mfc,mtc,fmove,mthilo") [(set_attr "type" "move,arith,load,store,mfc,mtc,mthilo")
(set_attr "mode" "QI") (set_attr "mode" "QI")
(set_attr "length" "4,4,*,*,4,4,4,4")]) (set_attr "length" "4,4,*,*,4,4,4")])
(define_insn "*movqi_mips16" (define_insn "*movqi_mips16"
[(set (match_operand:QI 0 "nonimmediate_operand" "=d,y,d,d,d,d,m") [(set (match_operand:QI 0 "nonimmediate_operand" "=d,y,d,d,d,d,m")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment