📄 i370.md
字号:
mvs_check_page (0, 4, 0); return \"ST %1,%0\"; } mvs_check_page (0, 6, 0); return \"MVC %O0(4,%R0),%1\";}")(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\";}");; movstrsi instruction pattern(s).;(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 = change_address (operands[0], VOIDmode, 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 = change_address (operands[1], VOIDmode, 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 { rtx reg1 = gen_reg_rtx (DImode); rtx reg2 = gen_reg_rtx (DImode); rtx subreg = gen_rtx (SUBREG, SImode, reg1, 1); emit_insn (gen_rtx (SET, VOIDmode, subreg, operands[2])); emit_insn (gen_rtx (SET, VOIDmode, gen_rtx (SUBREG, SImode, reg2, 1), subreg)); emit_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (5, gen_rtx (SET, VOIDmode, op0, op1), gen_rtx (USE, VOIDmode, reg1), gen_rtx (USE, VOIDmode, reg2), gen_rtx (CLOBBER, VOIDmode, reg1), gen_rtx (CLOBBER, VOIDmode, 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\";}"); Move a block that is larger than 255 bytes in length.(define_insn "" [(set (match_operand:BLK 0 "general_operand" "=m") (match_operand:BLK 1 "general_operand" "m")) (use (match_operand:DI 2 "register_operand" "d")) (use (match_operand:DI 3 "register_operand" "d")) (clobber (match_dup 2)) (clobber (match_dup 3))] "" "*{ check_label_emit (); mvs_check_page (0, 10, 0); return \"LA %2,%0\;LA %3,%1\;MVCL %2,%3\";}");;;;- Conversion instructions.;;;; extendsidi2 instruction pattern(s).;(define_expand "extendsidi2" [(set (match_operand:DI 0 "general_operand" "") (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_INT (32)))); } else { if (INTVAL (operands[1]) < 0) { emit_insn (gen_rtx (SET, VOIDmode, operand_subword (operands[0], 0, 1, DImode), GEN_INT (-1))); } else { emit_insn (gen_rtx (SET, VOIDmode, operand_subword (operands[0], 0, 1, DImode), GEN_INT (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, 2, 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\"; } 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, 4, 0); return \"SLL %1,16\;SRA %1,16\;ST %1,%0\";}");; 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])) { 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\";}");; extendqihi2 instruction pattern(s).;(define_insn "extendqihi2" [(set (match_operand:HI 0 "general_operand" "=d") (sign_extend:HI (match_operand:QI 1 "general_operand" "0m")))] "" "*{ 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])) { 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\";}");; zero_extendsidi2 instruction pattern(s).;(define_expand "zero_extendsidi2" [(set (match_operand:DI 0 "general_operand" "") (zero_extend:DI (match_operand:SI 1 "general_operand" "")))] "" "{ 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 (LSHIFTRT, DImode, operands[0], GEN_INT (32)))); DONE;}");; zero_extendhisi2 instruction pattern(s).;(define_insn "zero_extendhisi2" [(set (match_operand:SI 0 "general_operand" "=d") (zero_extend:SI (match_operand:HI 1 "general_operand" "0")))] "" "*{ check_label_emit (); CC_STATUS_SET (operands[0], operands[1]); mvs_check_page (0, 4, 4); return \"N %1,=X'0000FFFF'\";}");; zero_extendqisi2 instruction pattern(s).;(define_insn "zero_extendqisi2" [(set (match_operand:SI 0 "general_operand" "=d,&d") (zero_extend:SI (match_operand:QI 1 "general_operand" "0i,m")))] "" "*{ check_label_emit (); if (REG_P (operands[1])) { CC_STATUS_SET (operands[0], operands[1]); mvs_check_page (0, 4, 4); return \"N %0,=X'000000FF'\"; } if (GET_CODE (operands[1]) == CONST_INT) { mvs_check_page (0, 4, 0); return \"LA %0,%c1\"; } CC_STATUS_INIT; mvs_check_page (0, 8, 0); return \"SLR %0,%0\;IC %0,%1\";}");; zero_extendqihi2 instruction pattern(s).;(define_insn "zero_extendqihi2" [(set (match_operand:HI 0 "general_operand" "=d,&d") (zero_extend:HI (match_operand:QI 1 "general_operand" "0i,m")))] "" "*{ check_label_emit (); if (REG_P (operands[1])) { CC_STATUS_SET (operands[0], operands[1]); mvs_check_page (0, 4, 4); return \"N %0,=X'000000FF'\"; } if (GET_CODE (operands[1]) == CONST_INT) { mvs_check_page (0, 4, 0); return \"LA %0,%c1\"; } CC_STATUS_INIT; mvs_check_page (0, 8, 0); return \"SLR %0,%0\;IC %0,%1\";}");; truncsihi2 instruction pattern(s).;(define_insn "truncsihi2" [(set (match_operand:HI 0 "general_operand" "=d,m") (truncate:HI (match_operand:SI 1 "general_operand" "0,d")))] "" "*{ check_label_emit (); if (REG_P (operands[0])) { CC_STATUS_SET (operands[0], operands[1]); mvs_check_page (0, 8, 0); return \"SLL %0,16\;SRA %0,16\"; } mvs_check_page (0, 4, 0); return \"STH %1,%0\";}");; fix_truncdfsi2 instruction pattern(s).;(define_insn "fix_truncdfsi2" [(set (match_operand:SI 0 "general_operand" "=d") (fix:SI (truncate:DF (match_operand:DF 1 "general_operand" "f")))) (clobber (reg:DF 16))] "" "*{ check_label_emit (); CC_STATUS_INIT; if (REGNO (operands[1]) == 16) { mvs_check_page (0, 12, 8); return \"AD 0,=XL8'4F08000000000000'\;STD 0,140(,13)\;L %0,144(,13)\"; } mvs_check_page (0, 14, 8); return \"LDR 0,%1\;AD 0,=XL8'4F08000000000000'\;STD 0,140(,13)\;L %0,144(,13)\";}");; floatsidf2 instruction pattern(s).;; Uses the float field of the TCA.;(define_insn "floatsidf2" [(set (match_operand:DF 0 "general_operand" "=f") (float:DF (match_operand:SI 1 "general_operand" "d")))] "" "*{ check_label_emit (); CC_STATUS_INIT; mvs_check_page (0, 16, 8); return \"ST %1,508(,12)\;XI 508(12),128\;LD %0,504(,12)\;SD %0,=XL8'4E00000080000000'\";}");; truncdfsf2 instruction pattern(s).;(define_insn "truncdfsf2" [(set (match_operand:SF 0 "general_operand" "=f") (float_truncate:SF (match_operand:DF 1 "general_operand" "f")))] "" "*{ check_label_emit (); mvs_check_page (0, 2, 0); return \"LRER %0,%1\";}");; extendsfdf2 instruction pattern(s).;(define_insn "extendsfdf2" [(set (match_operand:DF 0 "general_operand" "=f") (float_extend:DF (match_operand:SF 1 "general_operand" "fmF")))] "" "*{ check_label_emit (); CC_STATUS_SET (0, const0_rtx); if (FP_REG_P (operands[1])) { if (REGNO (operands[0]) == REGNO (operands[1])) { mvs_check_page (0, 10, 0); return \"STE %1,140(,13)\;SDR %0,%0\;LE %0,140(,13)\"; } mvs_check_page (0, 4, 0); return \"SDR %0,%0\;LER %0,%1\"; } mvs_check_page (0, 6, 0); return \"SDR %0,%0\;LE %0,%1\";}");;;;- Add instructions.;;;; adddi3 instruction pattern(s).;(define_expand "adddi3" [(set (match_operand:DI 0 "general_operand" "") (plus:DI (match_operand:DI 1 "general_operand" "") (match_operand:DI 2 "general_operand" "")))] "" "{ rtx label = gen_label_rtx (); rtx op0_high = operand_subword (operands[0], 0, 1, DImode); rtx op0_low = gen_lowpart (SImode, operands[0]); emit_insn (gen_rtx (SET, VOIDmode, op0_high, gen_rtx (PLUS, SImode, operand_subword (operands[1], 0, 1, DImode), operand_subword (operands[2], 0, 1, DImode)))); emit_jump_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (2, gen_rtx (SET, VOIDmode, op0_low, gen_rtx (PLUS, SImode, gen_lowpart (SImode, operands[1]), gen_lowpart (SImode, operands[2]))), gen_rtx (USE, VOIDmode, gen_rtx (LABEL_REF, VOIDmode, label))))); emit_insn (gen_rtx (SET, VOIDmode, op0_high, gen_rtx (PLUS, SImode, op0_high, GEN_INT (1)))); emit_label (label); DONE;}")(define_insn "" [(set (match_operand:SI 0 "general_operand" "=d") (plus:SI (match_operand:SI 1 "general_operand" "%0") (match_operand:SI 2 "general_operand" "g"))) (use (label_ref (match_operand 3 "" "")))] "" "*{ int onpage; check_label_emit (); onpage = mvs_check_label (CODE_LABEL_NUMBER (operands[3])); if (REG_P (operands[2])) { if (!onpage) { mvs_check_page (0, 8, 4); return \"ALR %0,%2\;L 14,=A(%l3)\;BCR 12,14\"; } if (mvs_check_page (0, 6, 0)) { mvs_check_page (0, 2, 4); return \"ALR %0,%2\;L 14,=A(%l3)\;BCR 12,14\"; } return \"ALR %0,%2\;BC 12,%l3\"; } if (!onpage) { mvs_check_page (0, 10, 4); return \"AL %0,%2\;L 14,=A(%l3)\;BCR 12,14\"; } if (mvs_check_page (0, 8 ,0)) { mvs_check_page (0, 2, 4); return \"AL %0,%2\;L 14,=A(%l3)\;BCR 12,14\"; } return \"AL %0,%2\;BC 12,%l3\";}");; addsi3 instruction pattern(s).;; The following insn is used when it is known that operand one is an address,; frame, stack or argument pointer, and operand two is a constant that is; small enough to fit in the displacement field.; Notice that we can't allow the frame pointer to used as a normal register; because of this insn.;(define_insn "" [(set (match_operand:SI 0 "register_operand" "=d") (plus:SI (match_operand:SI 1 "general_operand" "%a") (match_operand:SI 2 "immediate_operand" "J")))] "((REGNO (operands[1]) == FRAME_POINTER_REGNUM || REGNO (operands[1]) == ARG_POINTER_REGNUM || REGNO (operands[1]) == STACK_POINTER_REGNUM) && (unsigned) INTVAL (operands[2]) < 4096)" "*{ check_label_emit (); CC_STATUS_INIT; mvs_check_page (0, 4, 0); return \"LA %0,%c2(,%1)\";}")
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -