📄 s390.md
字号:
stg\\t%1,%0 mvc\\t%O0(8,%R0),%1" [(set_attr "op_type" "RR,RX,RX,RRE,RXE,RXE,SS") (set_attr "atype" "reg,mem,mem,reg,mem,mem,mem")])(define_insn "*movdf_31" [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,m,d,Q,d,o,Q") (match_operand:DF 1 "general_operand" "f,m,f,Q,d,dKm,d,Q"))] "!TARGET_64BIT" "@ ldr\\t%0,%1 ld\\t%0,%1 std\\t%1,%0 lm\\t%0,%N0,%1 stm\\t%1,%N1,%0 # # mvc\\t%O0(8,%R0),%1" [(set_attr "op_type" "RR,RX,RX,RS,RS,NN,NN,SS") (set_attr "atype" "reg,mem,mem,mem,mem,*,*,mem")])(define_split [(set (match_operand:DF 0 "nonimmediate_operand" "") (match_operand:DF 1 "general_operand" ""))] "!TARGET_64BIT && reload_completed && s390_split_ok_p (operands[0], operands[1], DFmode, 0)" [(set (match_dup 2) (match_dup 4)) (set (match_dup 3) (match_dup 5))]{ operands[2] = operand_subword (operands[0], 0, 0, DFmode); operands[3] = operand_subword (operands[0], 1, 0, DFmode); operands[4] = operand_subword (operands[1], 0, 0, DFmode); operands[5] = operand_subword (operands[1], 1, 0, DFmode);})(define_split [(set (match_operand:DF 0 "nonimmediate_operand" "") (match_operand:DF 1 "general_operand" ""))] "!TARGET_64BIT && reload_completed && s390_split_ok_p (operands[0], operands[1], DFmode, 1)" [(set (match_dup 2) (match_dup 4)) (set (match_dup 3) (match_dup 5))]{ operands[2] = operand_subword (operands[0], 1, 0, DFmode); operands[3] = operand_subword (operands[0], 0, 0, DFmode); operands[4] = operand_subword (operands[1], 1, 0, DFmode); operands[5] = operand_subword (operands[1], 0, 0, DFmode);})(define_split [(set (match_operand:DF 0 "register_operand" "") (match_operand:DF 1 "memory_operand" ""))] "!TARGET_64BIT && reload_completed && !FP_REG_P (operands[0]) && !s_operand (operands[1], VOIDmode)" [(set (match_dup 0) (match_dup 1))]{ rtx addr = operand_subword (operands[0], 1, 0, DFmode); s390_load_address (addr, XEXP (operands[1], 0)); operands[1] = replace_equiv_address (operands[1], addr);})(define_expand "reload_outdf" [(parallel [(match_operand:DF 0 "" "") (match_operand:DF 1 "register_operand" "d") (match_operand:SI 2 "register_operand" "=&a")])] "!TARGET_64BIT"{ if (GET_CODE (operands[0]) != MEM) abort (); s390_load_address (operands[2], XEXP (operands[0], 0)); operands[0] = replace_equiv_address (operands[0], operands[2]); emit_move_insn (operands[0], operands[1]); DONE;});; movsf instruction pattern(s).;(define_expand "movsf" [(set (match_operand:SF 0 "nonimmediate_operand" "") (match_operand:SF 1 "general_operand" ""))] "" "{ /* During and after reload, we need to force constants to the literal pool ourselves, if necessary. */ if ((reload_in_progress || reload_completed) && CONSTANT_P (operands[1])) operands[1] = force_const_mem (SFmode, operands[1]);}")(define_insn "*movsf" [(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,m,d,d,m,?Q") (match_operand:SF 1 "general_operand" "f,m,f,d,m,d,?Q"))] "" "@ ler\\t%0,%1 le\\t%0,%1 ste\\t%1,%0 lr\\t%0,%1 l\\t%0,%1 st\\t%1,%0 mvc\\t%O0(4,%R0),%1" [(set_attr "op_type" "RR,RX,RX,RR,RX,RX,SS") (set_attr "atype" "reg,mem,mem,reg,mem,mem,mem")]);; load_multiple pattern(s).;; ??? Due to reload problems with replacing registers inside match_parallel; we currently support load_multiple/store_multiple only after reload.;(define_expand "load_multiple" [(match_par_dup 3 [(set (match_operand 0 "" "") (match_operand 1 "" "")) (use (match_operand 2 "" ""))])] "reload_completed" "{ int regno; int count; rtx from; int i, off; /* Support only loading a constant number of fixed-point registers from memory and only bother with this if more than two */ if (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) < 2 || INTVAL (operands[2]) > 16 || GET_CODE (operands[1]) != MEM || GET_CODE (operands[0]) != REG || REGNO (operands[0]) >= 16) FAIL; count = INTVAL (operands[2]); regno = REGNO (operands[0]); operands[3] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count)); if (no_new_pseudos) { if (GET_CODE (XEXP (operands[1], 0)) == REG) { from = XEXP (operands[1], 0); off = 0; } else if (GET_CODE (XEXP (operands[1], 0)) == PLUS && GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == REG && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == CONST_INT) { from = XEXP (XEXP (operands[1], 0), 0); off = INTVAL (XEXP (XEXP (operands[1], 0), 1)); } else FAIL; if (from == frame_pointer_rtx || from == arg_pointer_rtx) FAIL; } else { from = force_reg (Pmode, XEXP (operands[1], 0)); off = 0; } for (i = 0; i < count; i++) XVECEXP (operands[3], 0, i) = gen_rtx_SET (VOIDmode, gen_rtx_REG (Pmode, regno + i), change_address (operands[1], Pmode, plus_constant (from, off + i * UNITS_PER_WORD)));}")(define_insn "*load_multiple_di" [(match_parallel 0 "load_multiple_operation" [(set (match_operand:DI 1 "register_operand" "=r") (match_operand:DI 2 "s_operand" "Q"))])] "reload_completed" "*{ int words = XVECLEN (operands[0], 0); if (XVECLEN (operands[0], 0) == 1) return \"lg\\t%1,0(%2)\"; operands[0] = gen_rtx_REG (DImode, REGNO (operands[1]) + words - 1); return \"lmg\\t%1,%0,%2\";}" [(set_attr "op_type" "RXE") (set_attr "atype" "mem") (set_attr "type" "lm")])(define_insn "*load_multiple_si" [(match_parallel 0 "load_multiple_operation" [(set (match_operand:SI 1 "register_operand" "=r") (match_operand:SI 2 "s_operand" "Q"))])] "reload_completed" "*{ int words = XVECLEN (operands[0], 0); if (XVECLEN (operands[0], 0) == 1) return \"l\\t%1,0(%2)\"; operands[0] = gen_rtx_REG (SImode, REGNO (operands[1]) + words - 1); return \"lm\\t%1,%0,%2\";}" [(set_attr "op_type" "RXE") (set_attr "atype" "mem") (set_attr "type" "lm")]);; store multiple pattern(s). ;(define_expand "store_multiple" [(match_par_dup 3 [(set (match_operand 0 "" "") (match_operand 1 "" "")) (use (match_operand 2 "" ""))])] "reload_completed" "{ int regno; int count; rtx to; int i, off; /* Support only storing a constant number of fixed-point registers to memory and only bother with this if more than two. */ if (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) < 2 || INTVAL (operands[2]) > 16 || GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != REG || REGNO (operands[1]) >= 16) FAIL; count = INTVAL (operands[2]); regno = REGNO (operands[1]); operands[3] = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count)); if (no_new_pseudos) { if (GET_CODE (XEXP (operands[0], 0)) == REG) { to = XEXP (operands[0], 0); off = 0; } else if (GET_CODE (XEXP (operands[0], 0)) == PLUS && GET_CODE (XEXP (XEXP (operands[0], 0), 0)) == REG && GET_CODE (XEXP (XEXP (operands[0], 0), 1)) == CONST_INT) { to = XEXP (XEXP (operands[0], 0), 0); off = INTVAL (XEXP (XEXP (operands[0], 0), 1)); } else FAIL; if (to == frame_pointer_rtx || to == arg_pointer_rtx) FAIL; } else { to = force_reg (Pmode, XEXP (operands[0], 0)); off = 0; } for (i = 0; i < count; i++) XVECEXP (operands[3], 0, i) = gen_rtx_SET (VOIDmode, change_address (operands[0], Pmode, plus_constant (to, off + i * UNITS_PER_WORD)), gen_rtx_REG (Pmode, regno + i));}")(define_insn "*store_multiple_di" [(match_parallel 0 "store_multiple_operation" [(set (match_operand:DI 1 "s_operand" "=Q") (match_operand:DI 2 "register_operand" "r"))])] "reload_completed" "*{ int words = XVECLEN (operands[0], 0); if (XVECLEN (operands[0], 0) == 1) return \"stg\\t%1,0(%2)\"; operands[0] = gen_rtx_REG (DImode, REGNO (operands[2]) + words - 1); return \"stmg\\t%2,%0,%1\";}" [(set_attr "op_type" "RXE") (set_attr "atype" "mem") (set_attr "type" "stm")])(define_insn "*store_multiple_si" [(match_parallel 0 "store_multiple_operation" [(set (match_operand:SI 1 "s_operand" "=Q") (match_operand:SI 2 "register_operand" "r"))])] "reload_completed" "*{ int words = XVECLEN (operands[0], 0); if (XVECLEN (operands[0], 0) == 1) return \"st\\t%1,0(%2)\"; operands[0] = gen_rtx_REG (SImode, REGNO (operands[2]) + words - 1); return \"stm\\t%2,%0,%1\";}" [(set_attr "op_type" "RXE") (set_attr "atype" "mem") (set_attr "type" "stm")]);;;; String instructions.;;;; movstrM instruction pattern(s).;(define_expand "movstrdi" [(set (match_operand:BLK 0 "memory_operand" "") (match_operand:BLK 1 "memory_operand" "")) (use (match_operand:DI 2 "general_operand" "")) (match_operand 3 "" "")] "TARGET_64BIT" "s390_expand_movstr (operands[0], operands[1], operands[2]); DONE;")(define_expand "movstrsi" [(set (match_operand:BLK 0 "memory_operand" "") (match_operand:BLK 1 "memory_operand" "")) (use (match_operand:SI 2 "general_operand" "")) (match_operand 3 "" "")] "" "s390_expand_movstr (operands[0], operands[1], operands[2]); DONE;"); Move a block that is up to 256 bytes in length.; The block length is taken as (operands[2] % 256) + 1.(define_insn "movstr_short_64" [(set (match_operand:BLK 0 "memory_operand" "=Q,Q") (match_operand:BLK 1 "memory_operand" "Q,Q")) (use (match_operand:DI 2 "nonmemory_operand" "n,a")) (clobber (match_scratch:DI 3 "=X,&a"))] "TARGET_64BIT" "*{ switch (which_alternative) { case 0: return \"mvc\\t%O0(%b2+1,%R0),%1\"; case 1: output_asm_insn (\"bras\\t%3,.+10\", operands); output_asm_insn (\"mvc\\t%O0(1,%R0),%1\", operands); return \"ex\\t%2,0(%3)\"; default: abort (); }}" [(set_attr "op_type" "SS,NN") (set_attr "type" "cs,cs") (set_attr "atype" "mem,mem") (set_attr "length" "*,14")])(define_insn "movstr_short_31" [(set (match_operand:BLK 0 "memory_operand" "=Q,Q") (match_operand:BLK 1 "memory_operand" "Q,Q")) (use (match_operand:SI 2 "nonmemory_operand" "n,a")) (clobber (match_scratch:SI 3 "=X,&a"))] "!TARGET_64BIT" "*{ switch (which_alternative) { case 0: return \"mvc\\t%O0(%b2+1,%R0),%1\"; case 1: output_asm_insn (\"bras\\t%3,.+10\", operands); output_asm_insn (\"mvc\\t%O0(1,%R0),%1\", operands); return \"ex\\t%2,0(%3)\"; default: abort (); }}" [(set_attr "op_type" "SS,NN") (set_attr "type" "cs,cs") (set_attr "atype" "mem,mem") (set_attr "length" "*,14")]); Move a block of arbitrary length.(define_insn "movstr_long_64" [(set (match_operand:TI 0 "register_operand" "=d") (ashift:TI (plus:TI (match_operand:TI 2 "register_operand" "0") (lshiftrt:TI (match_dup 2) (const_int 64))) (const_int 64))) (set (match_operand:TI 1 "register_operand" "=d") (ashift:TI (plus:TI (match_operand:TI 3 "register_operand" "1") (lshiftrt:TI (match_dup 3) (const_int 64))) (const_int 64))) (set (mem:BLK (subreg:DI (match_dup 2) 0)) (mem:BLK (subreg:DI (match_dup 3) 0))) (clobber (reg:CC 33))] "TARGET_64BIT" "mvcle\\t%0,%1,0\;jo\\t.-4" [(set_attr "op_type" "NN") (set_attr "type" "vs") (set_attr "atype" "mem") (set_attr "length" "8")])(define_insn "movstr_long_31" [(set (match_operand:DI 0 "register_operand" "=d") (ashift:DI (plus:DI (match_operand:DI 2 "register_operand" "0") (lshiftrt:DI (match_dup 2) (const_int 32))) (const_int 32))) (set (match_operand:DI 1 "register_operand" "=d") (ashift:DI (plus:DI (match_operand:DI 3 "register_operand" "1") (lshiftrt:DI (match_dup 3) (const_int 32))) (const_int 32))) (set (mem:BLK (subreg:SI (match_dup 2) 0)) (mem:BLK (subreg:SI (match_dup 3) 0))) (clobber (reg:CC 33))] "!TARGET_64BIT" "mvcle\\t%0,%1,0\;jo\\t.-4" [(set_attr "op_type" "NN") (set_attr "type" "vs") (set_attr "atype" "mem") (set_attr "length" "8")])
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -