📄 s390.md
字号:
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], mode, plus_constant (to, off + i * GET_MODE_SIZE (mode))), gen_rtx_REG (mode, regno + i));})(define_insn "*store_multiple_di" [(match_parallel 0 "store_multiple_operation" [(set (match_operand:DI 1 "s_operand" "=QS") (match_operand:DI 2 "register_operand" "r"))])] "reload_completed && word_mode == DImode"{ int words = XVECLEN (operands[0], 0); operands[0] = gen_rtx_REG (DImode, REGNO (operands[2]) + words - 1); return "stmg\t%2,%0,%S1";} [(set_attr "op_type" "RSY") (set_attr "type" "stm")])(define_insn "*store_multiple_si" [(match_parallel 0 "store_multiple_operation" [(set (match_operand:SI 1 "s_operand" "=Q,S") (match_operand:SI 2 "register_operand" "r,r"))])] "reload_completed"{ int words = XVECLEN (operands[0], 0); operands[0] = gen_rtx_REG (SImode, REGNO (operands[2]) + words - 1); return which_alternative == 0 ? "stm\t%2,%0,%S1" : "stmy\t%2,%0,%S1";} [(set_attr "op_type" "RS,RSY") (set_attr "type" "stm")]);;;; String instructions.;;(define_insn "*execute" [(match_parallel 0 "" [(unspec [(match_operand 1 "register_operand" "a") (match_operand:BLK 2 "memory_operand" "R") (match_operand 3 "" "")] UNSPEC_EXECUTE)])] "GET_MODE_CLASS (GET_MODE (operands[1])) == MODE_INT && GET_MODE_SIZE (GET_MODE (operands[1])) <= UNITS_PER_WORD" "ex\t%1,%2" [(set_attr "op_type" "RX") (set_attr "type" "cs")]);; strlenM instruction pattern(s).;(define_expand "strlendi" [(set (reg:QI 0) (match_operand:QI 2 "immediate_operand" "")) (parallel [(set (match_dup 4) (unspec:DI [(const_int 0) (match_operand:BLK 1 "memory_operand" "") (reg:QI 0) (match_operand 3 "immediate_operand" "")] UNSPEC_SRST)) (clobber (scratch:DI)) (clobber (reg:CC 33))]) (parallel [(set (match_operand:DI 0 "register_operand" "") (minus:DI (match_dup 4) (match_dup 5))) (clobber (reg:CC 33))])] "TARGET_64BIT"{ operands[4] = gen_reg_rtx (DImode); operands[5] = gen_reg_rtx (DImode); emit_move_insn (operands[5], force_operand (XEXP (operands[1], 0), NULL_RTX)); operands[1] = replace_equiv_address (operands[1], operands[5]);})(define_insn "*strlendi" [(set (match_operand:DI 0 "register_operand" "=a") (unspec:DI [(match_operand:DI 2 "general_operand" "0") (mem:BLK (match_operand:DI 3 "register_operand" "1")) (reg:QI 0) (match_operand 4 "immediate_operand" "")] UNSPEC_SRST)) (clobber (match_scratch:DI 1 "=a")) (clobber (reg:CC 33))] "TARGET_64BIT" "srst\t%0,%1\;jo\t.-4" [(set_attr "length" "8") (set_attr "type" "vs")])(define_expand "strlensi" [(set (reg:QI 0) (match_operand:QI 2 "immediate_operand" "")) (parallel [(set (match_dup 4) (unspec:SI [(const_int 0) (match_operand:BLK 1 "memory_operand" "") (reg:QI 0) (match_operand 3 "immediate_operand" "")] UNSPEC_SRST)) (clobber (scratch:SI)) (clobber (reg:CC 33))]) (parallel [(set (match_operand:SI 0 "register_operand" "") (minus:SI (match_dup 4) (match_dup 5))) (clobber (reg:CC 33))])] "!TARGET_64BIT"{ operands[4] = gen_reg_rtx (SImode); operands[5] = gen_reg_rtx (SImode); emit_move_insn (operands[5], force_operand (XEXP (operands[1], 0), NULL_RTX)); operands[1] = replace_equiv_address (operands[1], operands[5]);})(define_insn "*strlensi" [(set (match_operand:SI 0 "register_operand" "=a") (unspec:SI [(match_operand:SI 2 "general_operand" "0") (mem:BLK (match_operand:SI 3 "register_operand" "1")) (reg:QI 0) (match_operand 4 "immediate_operand" "")] UNSPEC_SRST)) (clobber (match_scratch:SI 1 "=a")) (clobber (reg:CC 33))] "!TARGET_64BIT" "srst\t%0,%1\;jo\t.-4" [(set_attr "length" "8") (set_attr "type" "vs")]);; movmemM instruction pattern(s).;(define_expand "movmemdi" [(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_movmem (operands[0], operands[1], operands[2]); DONE;")(define_expand "movmemsi" [(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_movmem (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_expand "movmem_short" [(parallel [(set (match_operand:BLK 0 "memory_operand" "") (match_operand:BLK 1 "memory_operand" "")) (use (match_operand 2 "nonmemory_operand" "")) (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN))) (clobber (match_dup 3))])] "" "operands[3] = gen_rtx_SCRATCH (Pmode);")(define_insn "*movmem_short" [(set (match_operand:BLK 0 "memory_operand" "=Q,Q,Q") (match_operand:BLK 1 "memory_operand" "Q,Q,Q")) (use (match_operand 2 "nonmemory_operand" "n,a,a")) (use (match_operand 3 "immediate_operand" "X,R,X")) (clobber (match_scratch 4 "=X,X,&a"))] "(GET_MODE (operands[2]) == Pmode || GET_MODE (operands[2]) == VOIDmode) && GET_MODE (operands[4]) == Pmode" "#" [(set_attr "type" "cs")])(define_split [(set (match_operand:BLK 0 "memory_operand" "") (match_operand:BLK 1 "memory_operand" "")) (use (match_operand 2 "const_int_operand" "")) (use (match_operand 3 "immediate_operand" "")) (clobber (scratch))] "reload_completed" [(parallel [(set (match_dup 0) (match_dup 1)) (use (match_dup 2))])] "operands[2] = GEN_INT ((INTVAL (operands[2]) & 0xff) + 1);")(define_split [(set (match_operand:BLK 0 "memory_operand" "") (match_operand:BLK 1 "memory_operand" "")) (use (match_operand 2 "register_operand" "")) (use (match_operand 3 "memory_operand" "")) (clobber (scratch))] "reload_completed" [(parallel [(unspec [(match_dup 2) (match_dup 3) (const_int 0)] UNSPEC_EXECUTE) (set (match_dup 0) (match_dup 1)) (use (const_int 1))])] "")(define_split [(set (match_operand:BLK 0 "memory_operand" "") (match_operand:BLK 1 "memory_operand" "")) (use (match_operand 2 "register_operand" "")) (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN))) (clobber (match_operand 3 "register_operand" ""))] "reload_completed && TARGET_CPU_ZARCH" [(set (match_dup 3) (label_ref (match_dup 4))) (parallel [(unspec [(match_dup 2) (mem:BLK (match_dup 3)) (label_ref (match_dup 4))] UNSPEC_EXECUTE) (set (match_dup 0) (match_dup 1)) (use (const_int 1))])] "operands[4] = gen_label_rtx ();"); Move a block of arbitrary length.(define_expand "movmem_long" [(parallel [(clobber (match_dup 2)) (clobber (match_dup 3)) (set (match_operand:BLK 0 "memory_operand" "") (match_operand:BLK 1 "memory_operand" "")) (use (match_operand 2 "general_operand" "")) (use (match_dup 3)) (clobber (reg:CC 33))])] ""{ enum machine_mode dword_mode = word_mode == DImode ? TImode : DImode; rtx reg0 = gen_reg_rtx (dword_mode); rtx reg1 = gen_reg_rtx (dword_mode); rtx addr0 = gen_lowpart (Pmode, gen_highpart (word_mode, reg0)); rtx addr1 = gen_lowpart (Pmode, gen_highpart (word_mode, reg1)); rtx len0 = gen_lowpart (Pmode, reg0); rtx len1 = gen_lowpart (Pmode, reg1); emit_insn (gen_rtx_CLOBBER (VOIDmode, reg0)); emit_move_insn (addr0, force_operand (XEXP (operands[0], 0), NULL_RTX)); emit_move_insn (len0, operands[2]); emit_insn (gen_rtx_CLOBBER (VOIDmode, reg1)); emit_move_insn (addr1, force_operand (XEXP (operands[1], 0), NULL_RTX)); emit_move_insn (len1, operands[2]); operands[0] = replace_equiv_address_nv (operands[0], addr0); operands[1] = replace_equiv_address_nv (operands[1], addr1); operands[2] = reg0; operands[3] = reg1;})(define_insn "*movmem_long_64" [(clobber (match_operand:TI 0 "register_operand" "=d")) (clobber (match_operand:TI 1 "register_operand" "=d")) (set (mem:BLK (subreg:DI (match_operand:TI 2 "register_operand" "0") 0)) (mem:BLK (subreg:DI (match_operand:TI 3 "register_operand" "1") 0))) (use (match_dup 2)) (use (match_dup 3)) (clobber (reg:CC 33))] "TARGET_64BIT" "mvcle\t%0,%1,0\;jo\t.-4" [(set_attr "length" "8") (set_attr "type" "vs")])(define_insn "*movmem_long_31" [(clobber (match_operand:DI 0 "register_operand" "=d")) (clobber (match_operand:DI 1 "register_operand" "=d")) (set (mem:BLK (subreg:SI (match_operand:DI 2 "register_operand" "0") 0)) (mem:BLK (subreg:SI (match_operand:DI 3 "register_operand" "1") 0))) (use (match_dup 2)) (use (match_dup 3)) (clobber (reg:CC 33))] "!TARGET_64BIT" "mvcle\t%0,%1,0\;jo\t.-4" [(set_attr "length" "8") (set_attr "type" "vs")]);; clrmemM instruction pattern(s).;(define_expand "clrmemdi" [(set (match_operand:BLK 0 "memory_operand" "") (const_int 0)) (use (match_operand:DI 1 "general_operand" "")) (match_operand 2 "" "")] "TARGET_64BIT" "s390_expand_clrmem (operands[0], operands[1]); DONE;")(define_expand "clrmemsi" [(set (match_operand:BLK 0 "memory_operand" "") (const_int 0)) (use (match_operand:SI 1 "general_operand" "")) (match_operand 2 "" "")] "" "s390_expand_clrmem (operands[0], operands[1]); DONE;"); Clear a block that is up to 256 bytes in length.; The block length is taken as (operands[1] % 256) + 1.(define_expand "clrmem_short" [(parallel [(set (match_operand:BLK 0 "memory_operand" "") (const_int 0)) (use (match_operand 1 "nonmemory_operand" "")) (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN))) (clobber (match_dup 2)) (clobber (reg:CC 33))])] "" "operands[2] = gen_rtx_SCRATCH (Pmode);")(define_insn "*clrmem_short" [(set (match_operand:BLK 0 "memory_operand" "=Q,Q,Q") (const_int 0)) (use (match_operand 1 "nonmemory_operand" "n,a,a")) (use (match_operand 2 "immediate_operand" "X,R,X")) (clobber (match_scratch 3 "=X,X,&a")) (clobber (reg:CC 33))] "(GET_MODE (operands[1]) == Pmode || GET_MODE (operands[1]) == VOIDmode) && GET_MODE (operands[3]) == Pmode" "#" [(set_attr "type" "cs")])(define_split [(set (match_operand:BLK 0 "memory_operand" "") (const_int 0)) (use (match_operand 1 "const_int_operand" "")) (use (match_operand 2 "immediate_operand" "")) (clobber (scratch)) (clobber (reg:CC 33))] "reload_completed" [(parallel [(set (match_dup 0) (const_int 0)) (use (match_dup 1)) (clobber (reg:CC 33))])] "operands[1] = GEN_INT ((INTVAL (operands[1]) & 0xff) + 1);")(define_split [(set (match_operand:BLK 0 "memory_operand" "") (const_int 0)) (use (match_operand 1 "register_operand" "")) (use (match_operand 2 "memory_operand" "")) (clobber (scratch)) (clobber (reg:CC 33))] "reload_completed" [(parallel [(unspec [(match_dup 1) (match_dup 2) (const_int 0)] UNSPEC_EXECUTE) (set (match_dup 0) (const_int 0)) (use (const_int 1)) (clobber (reg:CC 33))])] "")(define_split [(set (match_operand:BLK 0 "memory_operand" "") (const_int 0)) (use (match_operand 1 "register_operand" "")) (use (const:BLK (unspec:BLK [(const_int 0)] UNSPEC_INSN))) (clobber (match_operand 2 "register_operand" "")) (clobber (reg:CC 33))] "reload_completed && TARGET_CPU_ZARCH" [(set (match_dup 2) (label_ref (match_dup 3))) (parallel [(unspec [(match_dup 1) (mem:BLK (match_dup 2)) (label_ref (match_dup 3))] UNSPEC_EXECUTE) (set (match_dup 0) (const_int 0)) (use (const_int 1)) (clobber (reg:CC 33))])] "operands[3] = gen_label_rtx ();"); Clear a block of arbitrary length.(define_expand "clrmem_long" [(parallel [(clobber (match_dup 1)) (set (match_operand:BLK 0 "memory_operand" "") (const_int 0)) (use (match_operand 1 "general_operand" "")) (use (match_dup 2)) (clobber (reg:CC 33))])] ""{ enum machine_mode dword_mode = word_mode == DImode ? TImode : DImode; rtx reg0 = gen_reg_rtx (dword_mode); rtx reg1 = gen_reg_rtx (dword_mode); rtx addr0 = gen_lowpart (Pmode, gen_highpart (word_mode, reg0)); rtx len0 = gen_lowpart (Pmode, reg0); emit_insn (gen_rtx_CLOBBER (VOIDmode, reg0)); emit_move_insn (addr0, force_operand (XEXP (operands[0], 0), NULL_RTX)); emit_move_insn (len0, operands[1]); emit_move_insn (reg1, const0_rtx); operands[0] = replace_equiv_address_nv (operands[0], addr0); operands[1] = reg0; operands[2] = reg1;})(define_insn "*clrmem_long_64" [(clobber (match_operand:TI 0 "register_operand" "=d")) (set (mem:BLK (subreg:DI (match_operand:TI 2 "register_operand" "0") 0)) (const_int 0)) (use (match_dup 2)) (use (match_operand:TI 1 "register_operand" "d")) (clobber (reg:CC 33))] "TARGET_64BIT" "mvcle\t%0,%1,0\;jo\t.-4" [(set_attr "length" "8") (set_attr "type" "vs")])(define_insn "*clrmem_long_31" [(clobber (match_operand:DI 0 "register_operand" "=d")) (set (mem:BLK (subreg:SI (match_operand:DI 2 "register_operand" "0") 0)) (const_int 0)) (use (match_dup 2)) (use (match_operand:DI 1 "register_operand" "d")) (clobber (reg:CC 33))] "!TARGET_64BIT" "mvcle
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -