ia64.md
来自「Mac OS X 10.4.9 for x86 Source Code gcc」· Markdown 代码 · 共 2,025 行 · 第 1/5 页
MD
2,025 行
(plus:DI (reg:DI 1) (match_operand 1 "sdata_symbolic_operand" "s")))] "reload_completed" "addl %0 = @gprel(%1), gp" [(set_attr "itanium_class" "ialu")])(define_insn "*gprel64_offset" [(set (match_operand:DI 0 "register_operand" "=r") (minus:DI (match_operand:DI 1 "symbolic_operand" "") (reg:DI 1)))] "reload_completed" "movl %0 = @gprel(%1)" [(set_attr "itanium_class" "long_i")])(define_expand "load_gprel64" [(set (match_operand:DI 0 "register_operand" "") (minus:DI (match_operand:DI 1 "symbolic_operand" "") (match_dup 2))) (set (match_dup 0) (plus:DI (match_dup 2) (match_dup 0)))] "reload_completed"{ operands[2] = pic_offset_table_rtx;});; This is used as a placeholder for the return address during early;; compilation. We won't know where we've placed this until during;; reload, at which point it can wind up in b0, a general register,;; or memory. The only safe destination under these conditions is a;; general register.(define_insn_and_split "*movdi_ret_addr" [(set (match_operand:DI 0 "register_operand" "=r") (unspec:DI [(const_int 0)] UNSPEC_RET_ADDR))] "" "#" "reload_completed" [(const_int 0)]{ ia64_split_return_addr_rtx (operands[0]); DONE;} [(set_attr "itanium_class" "ialu")])(define_insn "*load_symptr_high" [(set (match_operand:DI 0 "register_operand" "=r") (plus:DI (high:DI (match_operand 1 "got_symbolic_operand" "s")) (match_operand:DI 2 "register_operand" "a")))] "reload_completed"{ if (HAVE_AS_LTOFFX_LDXMOV_RELOCS) return "%,addl %0 = @ltoffx(%1), %2"; else return "%,addl %0 = @ltoff(%1), %2";} [(set_attr "itanium_class" "ialu")])(define_insn "*load_symptr_low" [(set (match_operand:DI 0 "register_operand" "=r") (lo_sum:DI (match_operand:DI 1 "register_operand" "r") (match_operand 2 "got_symbolic_operand" "s")))] "reload_completed"{ if (HAVE_AS_LTOFFX_LDXMOV_RELOCS) return "%,ld8.mov %0 = [%1], %2"; else return "%,ld8 %0 = [%1]";} [(set_attr "itanium_class" "ld")])(define_insn_and_split "load_dtpmod" [(set (match_operand:DI 0 "register_operand" "=r") (unspec:DI [(match_operand 1 "tls_symbolic_operand" "")] UNSPEC_DTPMOD))] "" "#" "reload_completed" [(set (match_dup 0) (plus:DI (unspec:DI [(match_dup 1)] UNSPEC_LTOFF_DTPMOD) (match_dup 2))) (set (match_dup 0) (match_dup 3))]{ operands[2] = pic_offset_table_rtx; operands[3] = gen_const_mem (DImode, operands[0]);})(define_insn "*load_ltoff_dtpmod" [(set (match_operand:DI 0 "register_operand" "=r") (plus:DI (unspec:DI [(match_operand 1 "tls_symbolic_operand" "")] UNSPEC_LTOFF_DTPMOD) (match_operand:DI 2 "register_operand" "a")))] "reload_completed" "addl %0 = @ltoff(@dtpmod(%1)), %2" [(set_attr "itanium_class" "ialu")])(define_expand "load_dtprel" [(set (match_operand:DI 0 "register_operand" "") (unspec:DI [(match_operand 1 "tls_symbolic_operand" "")] UNSPEC_DTPREL))] "" "")(define_insn "*load_dtprel64" [(set (match_operand:DI 0 "register_operand" "=r") (unspec:DI [(match_operand 1 "ld_tls_symbolic_operand" "")] UNSPEC_DTPREL))] "TARGET_TLS64" "movl %0 = @dtprel(%1)" [(set_attr "itanium_class" "long_i")])(define_insn "*load_dtprel22" [(set (match_operand:DI 0 "register_operand" "=r") (unspec:DI [(match_operand 1 "ld_tls_symbolic_operand" "")] UNSPEC_DTPREL))] "" "addl %0 = @dtprel(%1), r0" [(set_attr "itanium_class" "ialu")])(define_insn_and_split "*load_dtprel_gd" [(set (match_operand:DI 0 "register_operand" "=r") (unspec:DI [(match_operand 1 "tls_symbolic_operand" "")] UNSPEC_DTPREL))] "" "#" "reload_completed" [(set (match_dup 0) (plus:DI (unspec:DI [(match_dup 1)] UNSPEC_LTOFF_DTPREL) (match_dup 2))) (set (match_dup 0) (match_dup 3))]{ operands[2] = pic_offset_table_rtx; operands[3] = gen_const_mem (DImode, operands[0]);})(define_insn "*load_ltoff_dtprel" [(set (match_operand:DI 0 "register_operand" "=r") (plus:DI (unspec:DI [(match_operand 1 "tls_symbolic_operand" "")] UNSPEC_LTOFF_DTPREL) (match_operand:DI 2 "register_operand" "a")))] "" "addl %0 = @ltoff(@dtprel(%1)), %2" [(set_attr "itanium_class" "ialu")])(define_expand "add_dtprel" [(set (match_operand:DI 0 "register_operand" "") (plus:DI (unspec:DI [(match_operand 1 "ld_tls_symbolic_operand" "")] UNSPEC_DTPREL) (match_operand:DI 2 "register_operand" "")))] "!TARGET_TLS64" "")(define_insn "*add_dtprel14" [(set (match_operand:DI 0 "register_operand" "=r") (plus:DI (unspec:DI [(match_operand 1 "ld_tls_symbolic_operand" "")] UNSPEC_DTPREL) (match_operand:DI 2 "register_operand" "r")))] "TARGET_TLS14" "adds %0 = @dtprel(%1), %2" [(set_attr "itanium_class" "ialu")])(define_insn "*add_dtprel22" [(set (match_operand:DI 0 "register_operand" "=r") (plus:DI (unspec:DI [(match_operand 1 "ld_tls_symbolic_operand" "")] UNSPEC_DTPREL) (match_operand:DI 2 "register_operand" "a")))] "TARGET_TLS22" "addl %0 = @dtprel(%1), %2" [(set_attr "itanium_class" "ialu")])(define_expand "load_tprel" [(set (match_operand:DI 0 "register_operand" "") (unspec:DI [(match_operand 1 "tls_symbolic_operand" "")] UNSPEC_TPREL))] "" "")(define_insn "*load_tprel64" [(set (match_operand:DI 0 "register_operand" "=r") (unspec:DI [(match_operand 1 "le_tls_symbolic_operand" "")] UNSPEC_TPREL))] "TARGET_TLS64" "movl %0 = @tprel(%1)" [(set_attr "itanium_class" "long_i")])(define_insn "*load_tprel22" [(set (match_operand:DI 0 "register_operand" "=r") (unspec:DI [(match_operand 1 "le_tls_symbolic_operand" "")] UNSPEC_TPREL))] "" "addl %0 = @tprel(%1), r0" [(set_attr "itanium_class" "ialu")])(define_insn_and_split "*load_tprel_ie" [(set (match_operand:DI 0 "register_operand" "=r") (unspec:DI [(match_operand 1 "ie_tls_symbolic_operand" "")] UNSPEC_TPREL))] "" "#" "reload_completed" [(set (match_dup 0) (plus:DI (unspec:DI [(match_dup 1)] UNSPEC_LTOFF_TPREL) (match_dup 2))) (set (match_dup 0) (match_dup 3))]{ operands[2] = pic_offset_table_rtx; operands[3] = gen_const_mem (DImode, operands[0]);})(define_insn "*load_ltoff_tprel" [(set (match_operand:DI 0 "register_operand" "=r") (plus:DI (unspec:DI [(match_operand 1 "ie_tls_symbolic_operand" "")] UNSPEC_LTOFF_TPREL) (match_operand:DI 2 "register_operand" "a")))] "" "addl %0 = @ltoff(@tprel(%1)), %2" [(set_attr "itanium_class" "ialu")])(define_expand "add_tprel" [(set (match_operand:DI 0 "register_operand" "") (plus:DI (unspec:DI [(match_operand 1 "le_tls_symbolic_operand" "")] UNSPEC_TPREL) (match_operand:DI 2 "register_operand" "")))] "!TARGET_TLS64" "")(define_insn "*add_tprel14" [(set (match_operand:DI 0 "register_operand" "=r") (plus:DI (unspec:DI [(match_operand 1 "le_tls_symbolic_operand" "")] UNSPEC_TPREL) (match_operand:DI 2 "register_operand" "r")))] "TARGET_TLS14" "adds %0 = @tprel(%1), %2" [(set_attr "itanium_class" "ialu")])(define_insn "*add_tprel22" [(set (match_operand:DI 0 "register_operand" "=r") (plus:DI (unspec:DI [(match_operand 1 "le_tls_symbolic_operand" "")] UNSPEC_TPREL) (match_operand:DI 2 "register_operand" "a")))] "TARGET_TLS22" "addl %0 = @tprel(%1), %2" [(set_attr "itanium_class" "ialu")]);; With no offsettable memory references, we've got to have a scratch;; around to play with the second word. However, in order to avoid a;; reload nightmare we lie, claim we don't need one, and fix it up;; in ia64_split_tmode_move.(define_expand "movti" [(set (match_operand:TI 0 "general_operand" "") (match_operand:TI 1 "general_operand" ""))] ""{ rtx op1 = ia64_expand_move (operands[0], operands[1]); if (!op1) DONE; operands[1] = op1;})(define_insn_and_split "*movti_internal" [(set (match_operand:TI 0 "nonimmediate_operand" "=r,r,m") (match_operand:TI 1 "general_operand" "ri,m,r"))] "ia64_move_ok (operands[0], operands[1])" "#" "reload_completed" [(const_int 0)]{ ia64_split_tmode_move (operands); DONE;} [(set_attr "itanium_class" "unknown") (set_attr "predicable" "no")]);; Floating Point Moves;;;; Note - Patterns for SF mode moves are compulsory, but;; patterns for DF are optional, as GCC can synthesize them.(define_expand "movsf" [(set (match_operand:SF 0 "general_operand" "") (match_operand:SF 1 "general_operand" ""))] ""{ rtx op1 = ia64_expand_move (operands[0], operands[1]); if (!op1) DONE; operands[1] = op1;})(define_insn "*movsf_internal" [(set (match_operand:SF 0 "destination_operand" "=f,f, Q,*r, f,*r,*r, m") (match_operand:SF 1 "general_operand" "fG,Q,fG,fG,*r,*r, m,*r"))] "ia64_move_ok (operands[0], operands[1])" "@ mov %0 = %F1 ldfs %0 = %1%P1 stfs %0 = %F1%P0 getf.s %0 = %F1 setf.s %0 = %1 mov %0 = %1 ld4%O1 %0 = %1%P1 st4%Q0 %0 = %1%P0" [(set_attr "itanium_class" "fmisc,fld,stf,frfr,tofr,ialu,ld,st")])(define_expand "movdf" [(set (match_operand:DF 0 "general_operand" "") (match_operand:DF 1 "general_operand" ""))] ""{ rtx op1 = ia64_expand_move (operands[0], operands[1]); if (!op1) DONE; operands[1] = op1;})(define_insn "*movdf_internal" [(set (match_operand:DF 0 "destination_operand" "=f,f, Q,*r, f,*r,*r, m") (match_operand:DF 1 "general_operand" "fG,Q,fG,fG,*r,*r, m,*r"))] "ia64_move_ok (operands[0], operands[1])" "@ mov %0 = %F1 ldfd %0 = %1%P1 stfd %0 = %F1%P0 getf.d %0 = %F1 setf.d %0 = %1 mov %0 = %1 ld8%O1 %0 = %1%P1 st8%Q0 %0 = %1%P0" [(set_attr "itanium_class" "fmisc,fld,stf,frfr,tofr,ialu,ld,st")]);; With no offsettable memory references, we've got to have a scratch;; around to play with the second word if the variable winds up in GRs.(define_expand "movxf" [(set (match_operand:XF 0 "general_operand" "") (match_operand:XF 1 "general_operand" ""))] ""{ rtx op0 = operands[0]; if (GET_CODE (op0) == SUBREG) op0 = SUBREG_REG (op0); /* We must support XFmode loads into general registers for stdarg/vararg, unprototyped calls, and a rare case where a long double is passed as an argument after a float HFA fills the FP registers. We split them into DImode loads for convenience. We also need to support XFmode stores for the last case. This case does not happen for stdarg/vararg routines, because we do a block store to memory of unnamed arguments. */ if (GET_CODE (op0) == REG && GR_REGNO_P (REGNO (op0))) { /* We're hoping to transform everything that deals with XFmode quantities and GR registers early in the compiler. */ if (no_new_pseudos) abort (); /* Struct to register can just use TImode instead. */ if ((GET_CODE (operands[1]) == SUBREG && GET_MODE (SUBREG_REG (operands[1])) == TImode) || (GET_CODE (operands[1]) == REG && GR_REGNO_P (REGNO (operands[1])))) { rtx op1 = operands[1]; if (GET_CODE (op1) == SUBREG) op1 = SUBREG_REG (op1); else op1 = gen_rtx_REG (TImode, REGNO (op1)); emit_move_insn (gen_rtx_REG (TImode, REGNO (op0)), op1); DONE; } if (GET_CODE (operands[1]) == CONST_DOUBLE) { emit_move_insn (gen_rtx_REG (DImode, REGNO (op0)), operand_subword (operands[1], 0, 0, XFmode)); emit_move_insn (gen_rtx_REG (DImode, REGNO (op0) + 1), operand_subword (operands[1], 1, 0, XFmode)); DONE; } /* If the quantity is in a register not known to be GR, spill it. */ if (register_operand (operands[1], XFmode)) operands[1] = spill_xfmode_operand (operands[1], 1); if (GET_CODE (operands[1]) == MEM) { rtx out[2]; out[WORDS_BIG_ENDIAN] = gen_rtx_REG (DImode, REGNO (op0)); out[!WORDS_BIG_ENDIAN] = gen_rtx_REG (DImode, REGNO (op0) + 1); emit_move_insn (out[0], adjust_address (operands[1], DImode, 0)); emit_move_insn (out[1], adjust_address (operands[1], DImode, 8)); DONE; } abort (); } if (GET_CODE (operands[1]) == REG && GR_REGNO_P (REGNO (operands[1]))) { /* We're hoping to transform everything that deals with XFmode quantities and GR registers early in the compiler. */ if (no_new_pseudos) abort (); /* Op0 can't be a GR_REG here, as that case is handled above.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?