📄 i370.md
字号:
(define_insn "" [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d")) (match_operand:HI 1 "r_or_s_operand" "g"))] "" "*{ check_label_emit (); if (REG_P (operands[1])) { mvs_check_page (0, 8, 0); return \"STH %1,140(,13)\;ICM %0,3,140(13)\"; } else if (GET_CODE (operands[1]) == CONST_INT) { mvs_check_page (0, 4, 0); return \"ICM %0,3,%H1\"; } mvs_check_page (0, 4, 0); return \"ICM %0,3,%1\";}" [(set_attr "length" "8")])(define_insn "movstricthi" [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm")) (match_operand:HI 1 "general_operand" "d"))] "" "*{ check_label_emit (); if (REG_P (operands[0])) { mvs_check_page (0, 8, 0); return \"STH %1,140(,13)\;ICM %0,3,140(13)\"; } mvs_check_page (0, 4, 0); return \"STH %1,%0\";}" [(set_attr "length" "8")]);; movdf instruction pattern(s).;(define_insn "";; [(set (match_operand:DF 0 "r_or_s_operand" "=fm,fm,*dm");; (match_operand:DF 1 "r_or_s_operand" "fmF,*dm,fmF"))] [(set (match_operand:DF 0 "general_operand" "=f,m,fS,*dS,???d") (match_operand:DF 1 "general_operand" "fmF,fF,*dS,fSF,???d"))] "TARGET_CHAR_INSTRUCTIONS" "*{ check_label_emit (); if (FP_REG_P (operands[0])) { if (FP_REG_P (operands[1])) { mvs_check_page (0, 2, 0); return \"LDR %0,%1\"; } if (REG_P (operands[1])) { mvs_check_page (0, 8, 0); return \"STM %1,%N1,140(13)\;LD %0,140(,13)\"; } if (operands[1] == const0_rtx) { CC_STATUS_SET (operands[0], operands[1]); mvs_check_page (0, 2, 0); return \"SDR %0,%0\"; } mvs_check_page (0, 4, 0); return \"LD %0,%1\"; } if (REG_P (operands[0])) { if (FP_REG_P (operands[1])) { mvs_check_page (0, 12, 0); return \"STD %1,140(,13)\;LM %0,%N0,140(13)\"; } if (REG_P (operands[1])) { mvs_check_page (0, 4, 0); return \"LR %0,%1\;LR %N0,%N1\"; } mvs_check_page (0, 4, 0); return \"LM %0,%N0,%1\"; } else if (FP_REG_P (operands[1])) { mvs_check_page (0, 4, 0); return \"STD %1,%0\"; } else if (REG_P (operands[1])) { mvs_check_page (0, 4, 0); return \"STM %1,%N1,%0\"; } mvs_check_page (0, 6, 0); return \"MVC %O0(8,%R0),%1\";}" [(set_attr "length" "12")])(define_insn "movdf";; [(set (match_operand:DF 0 "general_operand" "=f,fm,m,*d");; (match_operand:DF 1 "general_operand" "fmF,*d,f,fmF"))] [(set (match_operand:DF 0 "general_operand" "=f,m,fS,*d,???d") (match_operand:DF 1 "general_operand" "fmF,f,*d,SfF,???d"))] "" "*{ check_label_emit (); if (FP_REG_P (operands[0])) { if (FP_REG_P (operands[1])) { mvs_check_page (0, 2, 0); return \"LDR %0,%1\"; } if (REG_P (operands[1])) { mvs_check_page (0, 8, 0); return \"STM %1,%N1,140(13)\;LD %0,140(,13)\"; } if (operands[1] == const0_rtx) { CC_STATUS_SET (operands[0], operands[1]); mvs_check_page (0, 2, 0); return \"SDR %0,%0\"; } mvs_check_page (0, 4, 0); return \"LD %0,%1\"; } else if (REG_P (operands[0])) { if (FP_REG_P (operands[1])) { mvs_check_page (0, 12, 0); return \"STD %1,140(,13)\;LM %0,%N0,140(13)\"; } if (REG_P (operands[1])) { mvs_check_page (0, 4, 0); return \"LR %0,%1\;LR %N0,%N1\"; } mvs_check_page (0, 4, 0); return \"LM %0,%N0,%1\"; } else if (FP_REG_P (operands[1])) { mvs_check_page (0, 4, 0); return \"STD %1,%0\"; } mvs_check_page (0, 4, 0); return \"STM %1,%N1,%0\";}" [(set_attr "length" "12")]);; movsf instruction pattern(s).;(define_insn "";; [(set (match_operand:SF 0 "r_or_s_operand" "=fm,fm,*dm");; (match_operand:SF 1 "r_or_s_operand" "fmF,*dm,fmF"))];; [(set (match_operand:SF 0 "general_operand" "=f,m,fm,*d,S");; (match_operand:SF 1 "general_operand" "fmF,fF,*d,fmF,S"))] [(set (match_operand:SF 0 "general_operand" "=f*d,fm,S,???d") (match_operand:SF 1 "general_operand" "fmF,fF*d,S,???d"))] "TARGET_CHAR_INSTRUCTIONS" "*{ check_label_emit (); if (FP_REG_P (operands[0])) { if (FP_REG_P (operands[1])) { mvs_check_page (0, 2, 0); return \"LER %0,%1\"; } if (REG_P (operands[1])) { mvs_check_page (0, 8, 0); return \"ST %1,140(,13)\;LE %0,140(,13)\"; } if (operands[1] == const0_rtx) { CC_STATUS_SET (operands[0], operands[1]); mvs_check_page (0, 2, 0); return \"SER %0,%0\"; } mvs_check_page (0, 4, 0); return \"LE %0,%1\"; } else if (REG_P (operands[0])) { if (FP_REG_P (operands[1])) { mvs_check_page (0, 8, 0); return \"STE %1,140(,13)\;L %0,140(,13)\"; } if (REG_P (operands[1])) { mvs_check_page (0, 2, 0); return \"LR %0,%1\"; } mvs_check_page (0, 4, 0); return \"L %0,%1\"; } else if (FP_REG_P (operands[1])) { mvs_check_page (0, 4, 0); return \"STE %1,%0\"; } else if (REG_P (operands[1])) { mvs_check_page (0, 4, 0); return \"ST %1,%0\"; } mvs_check_page (0, 6, 0); return \"MVC %O0(4,%R0),%1\";}" [(set_attr "length" "8")])(define_insn "movsf" [(set (match_operand:SF 0 "general_operand" "=f,fm,m,*d") (match_operand:SF 1 "general_operand" "fmF,*d,f,fmF"))] "" "*{ check_label_emit (); if (FP_REG_P (operands[0])) { if (FP_REG_P (operands[1])) { mvs_check_page (0, 2, 0); return \"LER %0,%1\"; } if (REG_P (operands[1])) { mvs_check_page (0, 8, 0); return \"ST %1,140(,13)\;LE %0,140(,13)\"; } if (operands[1] == const0_rtx) { CC_STATUS_SET (operands[0], operands[1]); mvs_check_page (0, 2, 0); return \"SER %0,%0\"; } mvs_check_page (0, 4, 0); return \"LE %0,%1\"; } else if (REG_P (operands[0])) { if (FP_REG_P (operands[1])) { mvs_check_page (0, 8, 0); return \"STE %1,140(,13)\;L %0,140(,13)\"; } mvs_check_page (0, 4, 0); return \"L %0,%1\"; } else if (FP_REG_P (operands[1])) { mvs_check_page (0, 4, 0); return \"STE %1,%0\"; } mvs_check_page (0, 4, 0); return \"ST %1,%0\";}" [(set_attr "length" "8")]);; clrstrsi instruction pattern(s).; memset a block of bytes to zero.; block must be less than 16M (24 bits) in length;(define_expand "clrstrsi" [(set (match_operand:BLK 0 "general_operand" "g") (const_int 0)) (use (match_operand:SI 1 "general_operand" "")) (match_operand 2 "" "")] "" "{ { /* implementation suggested by Richard Henderson <rth@cygnus.com> */ rtx reg1 = gen_reg_rtx (DImode); rtx reg2 = gen_reg_rtx (DImode); rtx mem1 = operands[0]; rtx zippo = gen_rtx_CONST_INT (SImode, 0); rtx len = operands[1]; if (!CONSTANT_P (len)) len = force_reg (SImode, len); /* Load up the address+length pairs. */ emit_insn (gen_rtx_CLOBBER (VOIDmode, reg1)); emit_move_insn (gen_rtx_SUBREG (SImode, reg1, 0), force_operand (XEXP (mem1, 0), NULL_RTX)); emit_move_insn (gen_rtx_SUBREG (SImode, reg1, GET_MODE_SIZE (SImode)), len); emit_insn (gen_rtx_CLOBBER (VOIDmode, reg2)); emit_move_insn (gen_rtx_SUBREG (SImode, reg2, 0), zippo); emit_move_insn (gen_rtx_SUBREG (SImode, reg2, GET_MODE_SIZE (SImode)), zippo); /* Copy! */ emit_insn (gen_movstrsi_1 (reg1, reg2)); } DONE;}");; movstrsi instruction pattern(s).; block must be less than 16M (24 bits) in length(define_expand "movstrsi" [(set (match_operand:BLK 0 "general_operand" "") (match_operand:BLK 1 "general_operand" "")) (use (match_operand:SI 2 "general_operand" "")) (match_operand 3 "" "")] "" "{ rtx op0, op1; op0 = XEXP (operands[0], 0); if (GET_CODE (op0) == REG || (GET_CODE (op0) == PLUS && GET_CODE (XEXP (op0, 0)) == REG && GET_CODE (XEXP (op0, 1)) == CONST_INT && (unsigned) INTVAL (XEXP (op0, 1)) < 4096)) op0 = operands[0]; else op0 = replace_equiv_address (operands[0], copy_to_mode_reg (SImode, op0)); op1 = XEXP (operands[1], 0); if (GET_CODE (op1) == REG || (GET_CODE (op1) == PLUS && GET_CODE (XEXP (op1, 0)) == REG && GET_CODE (XEXP (op1, 1)) == CONST_INT && (unsigned) INTVAL (XEXP (op1, 1)) < 4096)) op1 = operands[1]; else op1 = replace_equiv_address (operands[1], copy_to_mode_reg (SImode, op1)); if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 256) emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, gen_rtx_SET (VOIDmode, op0, op1), gen_rtx_USE (VOIDmode, operands[2])))); else { /* implementation provided by Richard Henderson <rth@cygnus.com> */ rtx reg1 = gen_reg_rtx (DImode); rtx reg2 = gen_reg_rtx (DImode); rtx mem1 = operands[0]; rtx mem2 = operands[1]; rtx len = operands[2]; if (!CONSTANT_P (len)) len = force_reg (SImode, len); /* Load up the address+length pairs. */ emit_insn (gen_rtx_CLOBBER (VOIDmode, reg1)); emit_move_insn (gen_rtx_SUBREG (SImode, reg1, 0), force_operand (XEXP (mem1, 0), NULL_RTX)); emit_move_insn (gen_rtx_SUBREG (SImode, reg1, GET_MODE_SIZE (SImode)), len); emit_insn (gen_rtx_CLOBBER (VOIDmode, reg2)); emit_move_insn (gen_rtx_SUBREG (SImode, reg2, 0), force_operand (XEXP (mem2, 0), NULL_RTX)); emit_move_insn (gen_rtx_SUBREG (SImode, reg2, GET_MODE_SIZE (SImode)), len); /* Copy! */ emit_insn (gen_movstrsi_1 (reg1, reg2)); } DONE;}"); Move a block that is less than 256 bytes in length.(define_insn "" [(set (match_operand:BLK 0 "s_operand" "=m") (match_operand:BLK 1 "s_operand" "m")) (use (match_operand 2 "immediate_operand" "I"))] "((unsigned) INTVAL (operands[2]) < 256)" "*{ check_label_emit (); mvs_check_page (0, 6, 0); return \"MVC %O0(%c2,%R0),%1\";}" [(set_attr "length" "6")]); Move a block that is larger than 255 bytes in length.(define_insn "movstrsi_1" [(set (mem:BLK (subreg:SI (match_operand:DI 0 "register_operand" "+d") 0)) (mem:BLK (subreg:SI (match_operand:DI 1 "register_operand" "+d") 0))) (use (match_dup 0)) (use (match_dup 1)) (clobber (match_dup 0)) (clobber (match_dup 1))] "" "*{ check_label_emit (); mvs_check_page (0, 2, 0); return \"MVCL %0,%1\";}" [(set_attr "length" "2")]);;;;- Conversion instructions.;;;; extendsidi2 instruction pattern(s).;(define_expand "extendsidi2" [(set (match_operand:DI 0 "register_operand" "=d") (sign_extend:DI (match_operand:SI 1 "general_operand" "")))] "" "{ if (GET_CODE (operands[1]) != CONST_INT) { emit_insn (gen_rtx_SET (VOIDmode, operand_subword (operands[0], 0, 1, DImode), operands[1])); emit_insn (gen_rtx_SET (VOIDmode, operands[0], gen_rtx_ASHIFTRT (DImode, operands[0], gen_rtx_CONST_INT (SImode, 32)))); } else { if (INTVAL (operands[1]) < 0) { emit_insn (gen_rtx_SET (VOIDmode, operand_subword (operands[0], 0, 1, DImode), gen_rtx_CONST_INT (SImode, -1))); } else { emit_insn (gen_rtx_SET (VOIDmode, operand_subword (operands[0], 0, 1, DImode), gen_rtx_CONST_INT (SImode, 0))); } emit_insn (gen_rtx_SET (VOIDmode, gen_lowpart (SImode, operands[0]), operands[1])); } DONE;}");; extendhisi2 instruction pattern(s).;(define_insn "extendhisi2" [(set (match_operand:SI 0 "general_operand" "=d,m") (sign_extend:SI (match_operand:HI 1 "general_operand" "g,d")))] "" "*{ check_label_emit (); if (REG_P (operands[0])) { if (REG_P (operands[1])) { if (REGNO (operands[0]) != REGNO (operands[1])) { mvs_check_page (0, 10, 0); return \"LR %0,%1\;SLL %0,16\;SRA %0,16\"; } else return \"\"; /* Should be empty. 16-bits regs are always 32-bits. */ } if (operands[1] == const0_rtx) { CC_STATUS_INIT; mvs_check_page (0, 2, 0); return \"SLR %0,%0\"; } if (GET_CODE (operands[1]) == CONST_INT && (unsigned) INTVAL (operands[1]) < 4096) { mvs_check_page (0, 4, 0); return \"LA %0,%c1(0,0)\"; } if (GET_CODE (operands[1]) == CONST_INT) { mvs_check_page (0, 4, 0); return \"LH %0,%H1\"; } mvs_check_page (0, 4, 0); return \"LH %0,%1\"; } mvs_check_page (0, 12, 0); return \"SLL %1,16\;SRA %1,16\;ST %1,%0\";}" [(set_attr "length" "12")]);; extendqisi2 instruction pattern(s).;(define_insn "extendqisi2" [(set (match_operand:SI 0 "general_operand" "=d") (sign_extend:SI (match_operand:QI 1 "general_operand" "0mi")))] "" "*{ check_label_emit (); CC_STATUS_SET (operands[0], operands[1]); if (REG_P (operands[1])) { mvs_check_page (0, 8, 0); return \"SLL %0,24\;SRA %0,24\"; } if (s_operand (operands[1], GET_MODE (operands[1]))) { mvs_check_page (0, 8, 0); return \"ICM %0,8,%1\;SRA %0,24\"; } mvs_check_page (0, 12, 0); return \"IC %0,%1\;SLL %0,24\;SRA %0,24\";}" [(set_attr "length" "12")]);; extendqihi2 instruction pattern(s).;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -