📄 m68k.md
字号:
operands[1] = GEN_INT (7 - INTVAL (operands[1])); return output_btst (operands, operands[1], operands[0], insn, 7);}")(define_insn "" [(set (cc0) (zero_extract (match_operand:SI 0 "register_operand" "do") (const_int 1) (match_operand:SI 1 "const_int_operand" "n")))] "!TARGET_5200" "*{ if (GET_CODE (operands[0]) == MEM) { operands[0] = adjust_address (operands[0], QImode, INTVAL (operands[1]) / 8); operands[1] = GEN_INT (7 - INTVAL (operands[1]) % 8); return output_btst (operands, operands[1], operands[0], insn, 7); } operands[1] = GEN_INT (31 - INTVAL (operands[1])); return output_btst (operands, operands[1], operands[0], insn, 31);}");; This is the same as the above pattern except for the constraints.;; The 'o' has been replaced with 'Q'.(define_insn "" [(set (cc0) (zero_extract (match_operand:SI 0 "register_operand" "dQ") (const_int 1) (match_operand:SI 1 "const_int_operand" "n")))] "TARGET_5200" "*{ if (GET_CODE (operands[0]) == MEM) { operands[0] = adjust_address (operands[0], QImode, INTVAL (operands[1]) / 8); operands[1] = GEN_INT (7 - INTVAL (operands[1]) % 8); return output_btst (operands, operands[1], operands[0], insn, 7); } operands[1] = GEN_INT (31 - INTVAL (operands[1])); return output_btst (operands, operands[1], operands[0], insn, 31);}");; move instructions;; A special case in which it is not desirable;; to reload the constant into a data register.(define_insn "pushexthisi_const" [(set (match_operand:SI 0 "push_operand" "=m") (match_operand:SI 1 "const_int_operand" "J"))] "INTVAL (operands[1]) >= -0x8000 && INTVAL (operands[1]) < 0x8000" "*{ if (operands[1] == const0_rtx) return \"clr%.l %0\"; return \"pea %a1\";}");This is never used.;(define_insn "swapsi"; [(set (match_operand:SI 0 "nonimmediate_operand" "+r"); (match_operand:SI 1 "general_operand" "+r")); (set (match_dup 1) (match_dup 0))]; ""; "exg %1,%0");; Special case of fullword move when source is zero.;; The reason this is special is to avoid loading a zero;; into a data reg with moveq in order to store it elsewhere.(define_insn "movsi_const0" [(set (match_operand:SI 0 "nonimmediate_operand" "=g") (const_int 0))] ;; clr insns on 68000 read before writing. ;; This isn't so on the 68010, but we have no TARGET_68010. "((TARGET_68020 || TARGET_5200) || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0])))" "*{ if (ADDRESS_REG_P (operands[0])) { /* On the '040, 'subl an,an' takes 2 clocks while lea takes only 1 */ if (!TARGET_68040 && !TARGET_68060) return \"sub%.l %0,%0\"; else {#ifdef MOTOROLA#ifdef SGS /* Many SGS assemblers croak on size specifiers for constants. */ return \"lea 0,%0\";#else return \"lea 0.w,%0\";#endif#else return \"lea 0:w,%0\";#endif } } /* moveq is faster on the 68000. */ if (DATA_REG_P (operands[0]) && (!TARGET_68020 && !TARGET_5200))#if defined(MOTOROLA) && !defined(CRDS) return \"moveq%.l %#0,%0\";#else return \"moveq %#0,%0\";#endif return \"clr%.l %0\";}");; General case of fullword move.;;;; This is the main "hook" for PIC code. When generating;; PIC, movsi is responsible for determining when the source address;; needs PIC relocation and appropriately calling legitimize_pic_address;; to perform the actual relocation.;;;; In both the PIC and non-PIC cases the patterns generated will;; matched by the next define_insn.(define_expand "movsi" [(set (match_operand:SI 0 "nonimmediate_operand" "") (match_operand:SI 1 "general_operand" ""))] "" "{ if (flag_pic && !TARGET_PCREL && symbolic_operand (operands[1], SImode)) { /* The source is an address which requires PIC relocation. Call legitimize_pic_address with the source, mode, and a relocation register (a new pseudo, or the final destination if reload_in_progress is set). Then fall through normally */ rtx temp = reload_in_progress ? operands[0] : gen_reg_rtx (Pmode); operands[1] = legitimize_pic_address (operands[1], SImode, temp); } else if (flag_pic && TARGET_PCREL && ! reload_in_progress) { /* Don't allow writes to memory except via a register; the m68k doesn't consider PC-relative addresses to be writable. */ if (symbolic_operand (operands[0], SImode)) operands[0] = force_reg (SImode, XEXP (operands[0], 0)); else if (GET_CODE (operands[0]) == MEM && symbolic_operand (XEXP (operands[0], 0), SImode)) operands[0] = gen_rtx (MEM, SImode, force_reg (SImode, XEXP (operands[0], 0))); }}");; General case of fullword move. The register constraints;; force integer constants in range for a moveq to be reloaded;; if they are headed for memory.(define_insn "" ;; Notes: make sure no alternative allows g vs g. ;; We don't allow f-regs since fixed point cannot go in them. ;; We do allow y and x regs since fixed point is allowed in them. [(set (match_operand:SI 0 "nonimmediate_operand" "=g,d,a<,y,!*x*r*m") (match_operand:SI 1 "general_src_operand" "daymSKT,n,i,g,*x*r*m"))] "!TARGET_5200" "*{ if (which_alternative == 4) return \"fpmove%.l %x1,fpa0\;fpmove%.l fpa0,%x0\"; if (FPA_REG_P (operands[1]) || FPA_REG_P (operands[0])) return \"fpmove%.l %x1,%x0\"; return output_move_simode (operands);}")(define_insn "" [(set (match_operand:SI 0 "nonimmediate_operand" "=r<Q>,g") (match_operand:SI 1 "general_operand" "g,r<Q>"))] "TARGET_5200" "* return output_move_simode (operands);");; Special case of fullword move, where we need to get a non-GOT PIC;; reference into an address register.(define_insn "" [(set (match_operand:SI 0 "nonimmediate_operand" "=a<") (match_operand:SI 1 "pcrel_address" ""))] "TARGET_PCREL" "*{ if (push_operand (operands[0], SImode)) return \"pea %a1\"; return \"lea %a1,%0\";}")(define_expand "movhi" [(set (match_operand:HI 0 "nonimmediate_operand" "") (match_operand:HI 1 "general_operand" ""))] "" "")(define_insn "" [(set (match_operand:HI 0 "nonimmediate_operand" "=g") (match_operand:HI 1 "general_src_operand" "gS"))] "!TARGET_5200" "* return output_move_himode (operands);") (define_insn "" [(set (match_operand:HI 0 "nonimmediate_operand" "=r<Q>,g") (match_operand:HI 1 "general_operand" "g,r<Q>"))] "TARGET_5200" "* return output_move_himode (operands);")(define_expand "movstricthi" [(set (strict_low_part (match_operand:HI 0 "nonimmediate_operand" "")) (match_operand:HI 1 "general_src_operand" ""))] "" "")(define_insn "" [(set (strict_low_part (match_operand:HI 0 "nonimmediate_operand" "+dm")) (match_operand:HI 1 "general_src_operand" "rmSn"))] "!TARGET_5200" "* return output_move_stricthi (operands);")(define_insn "" [(set (strict_low_part (match_operand:HI 0 "nonimmediate_operand" "+d,m")) (match_operand:HI 1 "general_src_operand" "rmn,r"))] "TARGET_5200" "* return output_move_stricthi (operands);")(define_expand "movqi" [(set (match_operand:QI 0 "nonimmediate_operand" "") (match_operand:QI 1 "general_src_operand" ""))] "" "")(define_insn "" [(set (match_operand:QI 0 "nonimmediate_operand" "=d,*a,m") (match_operand:QI 1 "general_src_operand" "dmSi*a,di*a,dmSi"))] "!TARGET_5200" "* return output_move_qimode (operands);")(define_insn "" [(set (match_operand:QI 0 "nonimmediate_operand" "=d<Q>,dm,d*a") (match_operand:QI 1 "general_src_operand" "dmi,d<Q>,di*a"))] "TARGET_5200" "* return output_move_qimode (operands);")(define_expand "movstrictqi" [(set (strict_low_part (match_operand:QI 0 "nonimmediate_operand" "")) (match_operand:QI 1 "general_src_operand" ""))] "" "")(define_insn "" [(set (strict_low_part (match_operand:QI 0 "nonimmediate_operand" "+dm")) (match_operand:QI 1 "general_src_operand" "dmSn"))] "!TARGET_5200" "* return output_move_strictqi (operands);")(define_insn "" [(set (strict_low_part (match_operand:QI 0 "nonimmediate_operand" "+d,m")) (match_operand:QI 1 "general_src_operand" "dmn,d"))] "TARGET_5200" "* return output_move_strictqi (operands);")(define_expand "pushqi1" [(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int -2))) (set (mem:QI (plus:SI (reg:SI 15) (const_int 1))) (match_operand:QI 0 "general_operand" ""))] "!TARGET_5200" "")(define_expand "movsf" [(set (match_operand:SF 0 "nonimmediate_operand" "") (match_operand:SF 1 "general_operand" ""))] "" "")(define_insn "" [(set (match_operand:SF 0 "nonimmediate_operand" "=rmf,x,y,rm,!x,!rm") (match_operand:SF 1 "general_operand" "rmfF,xH,rmF,y,rm,x"))]; [(set (match_operand:SF 0 "nonimmediate_operand" "=rmf"); (match_operand:SF 1 "general_operand" "rmfF"))] "!TARGET_5200" "*{ if (which_alternative >= 4) return \"fpmove%.s %1,fpa0\;fpmove%.s fpa0,%0\"; if (FPA_REG_P (operands[0])) { if (FPA_REG_P (operands[1])) return \"fpmove%.s %x1,%x0\"; else if (GET_CODE (operands[1]) == CONST_DOUBLE) return output_move_const_single (operands); else if (FP_REG_P (operands[1])) return \"fmove%.s %1,sp@-\;fpmove%.d sp@+, %0\"; return \"fpmove%.s %x1,%x0\"; } if (FPA_REG_P (operands[1])) { if (FP_REG_P (operands[0])) return \"fpmove%.s %x1,sp@-\;fmove%.s sp@+,%0\"; else return \"fpmove%.s %x1,%x0\"; } if (FP_REG_P (operands[0])) { if (FP_REG_P (operands[1])) return \"f%$move%.x %1,%0\"; else if (ADDRESS_REG_P (operands[1])) return \"move%.l %1,%-\;f%$move%.s %+,%0\"; else if (GET_CODE (operands[1]) == CONST_DOUBLE) return output_move_const_single (operands); return \"f%$move%.s %f1,%0\"; } if (FP_REG_P (operands[1])) { if (ADDRESS_REG_P (operands[0])) return \"fmove%.s %1,%-\;move%.l %+,%0\"; return \"fmove%.s %f1,%0\"; } if (operands[1] == CONST0_RTX (SFmode) /* clr insns on 68000 read before writing. This isn't so on the 68010, but we have no TARGET_68010. */ && ((TARGET_68020 || TARGET_5200) || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0])))) { if (ADDRESS_REG_P (operands[0])) { /* On the '040, 'subl an,an' takes 2 clocks while lea takes only 1 */ if (!TARGET_68040 && !TARGET_68060) return \"sub%.l %0,%0\"; else {#ifdef MOTOROLA#ifdef SGS /* Many SGS assemblers croak on size specifiers for constants. */ return \"lea 0,%0\";#else return \"lea 0.w,%0\";#endif#else return \"lea 0:w,%0\";#endif } } /* moveq is faster on the 68000. */ if (DATA_REG_P (operands[0]) && !(TARGET_68020 || TARGET_5200)) {#if defined(MOTOROLA) && !defined(CRDS) return \"moveq%.l %#0,%0\";#else return \"moveq %#0,%0\";#endif } return \"clr%.l %0\"; } return \"move%.l %1,%0\";}")(define_insn "" [(set (match_operand:SF 0 "nonimmediate_operand" "=r,g") (match_operand:SF 1 "general_operand" "g,r"))] "TARGET_5200" "* 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<>,y,*rm,x,!x,!*rm") (match_operand:DF 1 "general_operand" "*rf,m,0,*rofE<>,*rmE,y,xH,*rm,x"))]; [(set (match_operand:DF 0 "nonimmediate_operand" "=rm,&rf,&rof<>"); (match_operand:DF 1 "general_operand" "rf,m,rofF<>"))] "!TARGET_5200" "*{ if (which_alternative == 7) return \"fpmove%.d %x1,fpa0\;fpmove%.d fpa0,%x0\"; if (FPA_REG_P (operands[0])) { if (GET_CODE (operands[1]) == CONST_DOUBLE) return output_move_const_double (operands); if (FP_REG_P (operands[1])) return \"fmove%.d %1,sp@-\;fpmove%.d sp@+,%x0\"; return \"fpmove%.d %x1,%x0\"; } else if (FPA_REG_P (operands[1])) { if (FP_REG_P(operands[0])) return \"fpmove%.d %x1,sp@-\;fmoved sp@+,%0\"; else return \"fpmove%.d %x1,%x0\"; } 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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -