📄 m68k.md
字号:
"TARGET_COLDFIRE"{ return "move%.l %1,%0";})(define_expand "movdf" [(set (match_operand:DF 0 "nonimmediate_operand" "") (match_operand:DF 1 "general_operand" ""))] "" "")(define_insn "" [(set (match_operand:DF 0 "nonimmediate_operand" "=rm,rf,rf,&rof<>") (match_operand:DF 1 "general_operand" "*rf,m,0,*rofE<>"))]; [(set (match_operand:DF 0 "nonimmediate_operand" "=rm,&rf,&rof<>"); (match_operand:DF 1 "general_operand" "rf,m,rofF<>"))] "!TARGET_COLDFIRE"{ if (FP_REG_P (operands[0])) { if (FP_REG_P (operands[1])) return "f%&move%.x %1,%0"; if (REG_P (operands[1])) { rtx xoperands[2]; xoperands[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1); output_asm_insn ("move%.l %1,%-", xoperands); output_asm_insn ("move%.l %1,%-", operands); return "f%&move%.d %+,%0"; } if (GET_CODE (operands[1]) == CONST_DOUBLE) return output_move_const_double (operands); return "f%&move%.d %f1,%0"; } else if (FP_REG_P (operands[1])) { if (REG_P (operands[0])) { output_asm_insn ("fmove%.d %f1,%-\;move%.l %+,%0", operands); operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1); return "move%.l %+,%0"; } else return "fmove%.d %f1,%0"; } return output_move_double (operands);})(define_insn "" [(set (match_operand:DF 0 "nonimmediate_operand" "=r,g") (match_operand:DF 1 "general_operand" "g,r"))] "TARGET_COLDFIRE"{ return output_move_double (operands);});; ??? The XFmode patterns are schizophrenic about whether constants are;; allowed. Most but not all have predicates and constraint that disallow;; constants. Most but not all have output templates that handle constants.;; See also LEGITIMATE_CONSTANT_P.(define_expand "movxf" [(set (match_operand:XF 0 "nonimmediate_operand" "") (match_operand:XF 1 "general_operand" ""))] ""{ /* We can't rewrite operands during reload. */ if (! reload_in_progress) { if (CONSTANT_P (operands[1])) { operands[1] = force_const_mem (XFmode, operands[1]); if (! memory_address_p (XFmode, XEXP (operands[1], 0))) operands[1] = adjust_address (operands[1], XFmode, 0); } if (flag_pic && TARGET_PCREL) { /* Don't allow writes to memory except via a register; the m68k doesn't consider PC-relative addresses to be writable. */ if (GET_CODE (operands[0]) == MEM && symbolic_operand (XEXP (operands[0], 0), SImode)) operands[0] = gen_rtx_MEM (XFmode, force_reg (SImode, XEXP (operands[0], 0))); } }})(define_insn "" [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,f,!r,!f,!r") (match_operand:XF 1 "nonimmediate_operand" "m,f,f,f,r,!r"))] "TARGET_68881"{ if (FP_REG_P (operands[0])) { if (FP_REG_P (operands[1])) return "fmove%.x %1,%0"; if (REG_P (operands[1])) { rtx xoperands[2]; xoperands[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 2); output_asm_insn ("move%.l %1,%-", xoperands); xoperands[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1); output_asm_insn ("move%.l %1,%-", xoperands); output_asm_insn ("move%.l %1,%-", operands); return "fmove%.x %+,%0"; } if (GET_CODE (operands[1]) == CONST_DOUBLE) return "fmove%.x %1,%0"; return "fmove%.x %f1,%0"; } if (FP_REG_P (operands[1])) { if (REG_P (operands[0])) { output_asm_insn ("fmove%.x %f1,%-\;move%.l %+,%0", operands); operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1); output_asm_insn ("move%.l %+,%0", operands); operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1); return "move%.l %+,%0"; } /* Must be memory destination. */ return "fmove%.x %f1,%0"; } return output_move_double (operands);})(define_insn "" [(set (match_operand:XF 0 "nonimmediate_operand" "=rm,rf,&rof<>") (match_operand:XF 1 "nonimmediate_operand" "rf,m,rof<>"))] "! TARGET_68881 && ! TARGET_COLDFIRE"{ if (FP_REG_P (operands[0])) { if (FP_REG_P (operands[1])) return "fmove%.x %1,%0"; if (REG_P (operands[1])) { rtx xoperands[2]; xoperands[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 2); output_asm_insn ("move%.l %1,%-", xoperands); xoperands[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1); output_asm_insn ("move%.l %1,%-", xoperands); output_asm_insn ("move%.l %1,%-", operands); return "fmove%.x %+,%0"; } if (GET_CODE (operands[1]) == CONST_DOUBLE) return "fmove%.x %1,%0"; return "fmove%.x %f1,%0"; } if (FP_REG_P (operands[1])) { if (REG_P (operands[0])) { output_asm_insn ("fmove%.x %f1,%-\;move%.l %+,%0", operands); operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1); output_asm_insn ("move%.l %+,%0", operands); operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1); return "move%.l %+,%0"; } else return "fmove%.x %f1,%0"; } return output_move_double (operands);})(define_insn "" [(set (match_operand:XF 0 "nonimmediate_operand" "=r,g") (match_operand:XF 1 "nonimmediate_operand" "g,r"))] "! TARGET_68881 && TARGET_COLDFIRE" "* return output_move_double (operands);")(define_expand "movdi" ;; Let's see if it really still needs to handle fp regs, and, if so, why. [(set (match_operand:DI 0 "nonimmediate_operand" "") (match_operand:DI 1 "general_operand" ""))] "" "");; movdi can apply to fp regs in some cases(define_insn "" ;; Let's see if it really still needs to handle fp regs, and, if so, why. [(set (match_operand:DI 0 "nonimmediate_operand" "=rm,r,&ro<>") (match_operand:DI 1 "general_operand" "rF,m,roi<>F"))]; [(set (match_operand:DI 0 "nonimmediate_operand" "=rm,&r,&ro<>,!&rm,!&f"); (match_operand:DI 1 "general_operand" "r,m,roi<>,fF"))]; [(set (match_operand:DI 0 "nonimmediate_operand" "=rm,&rf,&ro<>,!&rm,!&f"); (match_operand:DI 1 "general_operand" "r,m,roi<>,fF,rfF"))] "!TARGET_COLDFIRE"{ if (FP_REG_P (operands[0])) { if (FP_REG_P (operands[1])) return "fmove%.x %1,%0"; if (REG_P (operands[1])) { rtx xoperands[2]; xoperands[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1); output_asm_insn ("move%.l %1,%-", xoperands); output_asm_insn ("move%.l %1,%-", operands); return "fmove%.d %+,%0"; } if (GET_CODE (operands[1]) == CONST_DOUBLE) return output_move_const_double (operands); return "fmove%.d %f1,%0"; } else if (FP_REG_P (operands[1])) { if (REG_P (operands[0])) { output_asm_insn ("fmove%.d %f1,%-\;move%.l %+,%0", operands); operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1); return "move%.l %+,%0"; } else return "fmove%.d %f1,%0"; } return output_move_double (operands);})(define_insn "" [(set (match_operand:DI 0 "nonimmediate_operand" "=r,g") (match_operand:DI 1 "general_operand" "g,r"))] "TARGET_COLDFIRE" "* return output_move_double (operands);");; Thus goes after the move instructions;; because the move instructions are better (require no spilling);; when they can apply. It goes before the add/sub insns;; so we will prefer it to them.(define_insn "pushasi" [(set (match_operand:SI 0 "push_operand" "=m") (match_operand:SI 1 "address_operand" "p"))] "" "pea %a1");; truncation instructions(define_insn "truncsiqi2" [(set (match_operand:QI 0 "nonimmediate_operand" "=dm,d") (truncate:QI (match_operand:SI 1 "general_src_operand" "doJS,i")))] ""{ if (GET_CODE (operands[0]) == REG) { /* Must clear condition codes, since the move.l bases them on the entire 32 bits, not just the desired 8 bits. */ CC_STATUS_INIT; return "move%.l %1,%0"; } if (GET_CODE (operands[1]) == MEM) operands[1] = adjust_address (operands[1], QImode, 3); return "move%.b %1,%0";})(define_insn "trunchiqi2" [(set (match_operand:QI 0 "nonimmediate_operand" "=dm,d") (truncate:QI (match_operand:HI 1 "general_src_operand" "doJS,i")))] ""{ if (GET_CODE (operands[0]) == REG && (GET_CODE (operands[1]) == MEM || GET_CODE (operands[1]) == CONST_INT)) { /* Must clear condition codes, since the move.w bases them on the entire 16 bits, not just the desired 8 bits. */ CC_STATUS_INIT; return "move%.w %1,%0"; } if (GET_CODE (operands[0]) == REG) { /* Must clear condition codes, since the move.l bases them on the entire 32 bits, not just the desired 8 bits. */ CC_STATUS_INIT; return "move%.l %1,%0"; } if (GET_CODE (operands[1]) == MEM) operands[1] = adjust_address (operands[1], QImode, 1); return "move%.b %1,%0";})(define_insn "truncsihi2" [(set (match_operand:HI 0 "nonimmediate_operand" "=dm,d") (truncate:HI (match_operand:SI 1 "general_src_operand" "roJS,i")))] ""{ if (GET_CODE (operands[0]) == REG) { /* Must clear condition codes, since the move.l bases them on the entire 32 bits, not just the desired 8 bits. */ CC_STATUS_INIT; return "move%.l %1,%0"; } if (GET_CODE (operands[1]) == MEM) operands[1] = adjust_address (operands[1], QImode, 2); return "move%.w %1,%0";});; zero extension instructions;; two special patterns to match various post_inc/pre_dec patterns(define_insn_and_split "*zero_extend_inc" [(set (match_operand 0 "post_inc_operand" "") (zero_extend (match_operand 1 "register_operand" "")))] "GET_MODE_CLASS (GET_MODE (operands[0])) == MODE_INT && GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT && GET_MODE_SIZE (GET_MODE (operands[0])) == GET_MODE_SIZE (GET_MODE (operands[1])) * 2" "#" "" [(set (match_dup 0) (const_int 0)) (set (match_dup 0) (match_dup 1))]{ operands[0] = adjust_address (operands[0], GET_MODE (operands[1]), 0);})(define_insn_and_split "*zero_extend_dec" [(set (match_operand 0 "pre_dec_operand" "") (zero_extend (match_operand 1 "register_operand" "")))] "(GET_MODE (operands[0]) != HImode || XEXP (XEXP (operands[0], 0), 0) != stack_pointer_rtx) && GET_MODE_CLASS (GET_MODE (operands[0])) == MODE_INT && GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT && GET_MODE_SIZE (GET_MODE (operands[0])) == GET_MODE_SIZE (GET_MODE (operands[1])) * 2" "#" "" [(set (match_dup 0) (match_dup 1)) (set (match_dup 0) (const_int 0))]{ operands[0] = adjust_address (operands[0], GET_MODE (operands[1]), 0);})(define_insn_and_split "zero_extendqidi2" [(set (match_operand:DI 0 "register_operand" "") (zero_extend:DI (match_operand:QI 1 "nonimmediate_src_operand" "")))] "" "#" "" [(set (match_dup 2) (zero_extend:SI (match_dup 1))) (set (match_dup 3) (const_int 0))]{ operands[2] = gen_lowpart (SImode, operands[0]); operands[3] = gen_highpart (SImode, operands[0]);})(define_insn_and_split "zero_extendhidi2" [(set (match_operand:DI 0 "register_operand" "") (zero_extend:DI (match_operand:HI 1 "nonimmediate_src_operand" "")))] "" "#" "" [(set (match_dup 2) (zero_extend:SI (match_dup 1))) (set (match_dup 3) (const_int 0))]{ operands[2] = gen_lowpart (SImode, operands[0]); operands[3] = gen_highpart (SImode, operands[0]);})(define_expand "zero_extendsidi2" [(set (match_operand:DI 0 "nonimmediate_operand" "") (zero_extend:DI (match_operand:SI 1 "nonimmediate_src_operand" "")))] "" "")(define_insn_and_split "*zero_extendsidi2" [(set (match_operand:DI 0 "nonimmediate_operand" "") (zero_extend:DI (match_operand:SI 1 "nonimmediate_src_operand" "")))] "GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM" "#" "" [(set (match_dup 2) (match_dup 1)) (set (match_dup 3) (const_int 0))]{ operands[2] = gen_lowpart (SImode, operands[0]); operands[3] = gen_highpart (SImode, operands[0]);})(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_CFV4" "mvz%.w %1,%0")(define_insn "zero_extendhisi2" [(set (match_operand:SI 0 "register_operand" "=d") (zero_extend:SI (match_operand:HI 1 "nonimmediate_src_operand" "rmS")))] "" "#")(define_expand "zero_extendqihi2" [(set (match_operand:HI 0 "register_operand" "") (zero_extend:HI (match_operand:QI 1 "nonimmediate_src_operand" "")))] "!TARGET_COLDFIRE" "")(define_insn "*zero_extendqihi2" [(set (match_operand:HI 0 "register_operand" "=d") (zero_extend:HI (match_operand:QI 1 "nonimmediate_src_operand" "dmS")))] "!TARGET_COLDFIRE" "#")(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_CFV4" "mvz%.b %1,%0")(define_insn "zero_extendqisi2"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -