📄 i370.md
字号:
(minus:SI (match_operand:SI 1 "general_operand" "0") (match_operand:SI 2 "general_operand" "g"))) (use (label_ref (match_operand 3 "" ""))); (clobber (reg:SI 14)) ] "" "*{ int onpage; check_label_emit (); CC_STATUS_INIT; onpage = mvs_check_label (CODE_LABEL_NUMBER (operands[3])); if (REG_P (operands[2])) { if (!onpage) { mvs_check_page (0, 8, 4); return \"SLR %0,%2\;L 14,=A(%l3)\;BCR 12,14\"; } if (mvs_check_page (0, 6, 0)) { mvs_check_page (0, 2, 4); return \"SLR %0,%2\;L 14,=A(%l3)\;BCR 12,14\"; } return \"SLR %0,%2\;BC 12,%l3\"; } if (!onpage) { mvs_check_page (0, 10, 4); return \"SL %0,%2\;L 14,=A(%l3)\;BCR 12,14\"; } if (mvs_check_page (0, 8, 0)) { mvs_check_page (0, 2, 4); return \"SL %0,%2\;L 14,=A(%l3)\;BCR 12,14\"; } return \"SL %0,%2\;BC 12,%l3\";}" [(set_attr "length" "10")]);; subsi3 instruction pattern(s).;(define_insn "subsi3" [(set (match_operand:SI 0 "general_operand" "=d") (minus:SI (match_operand:SI 1 "general_operand" "0") (match_operand:SI 2 "general_operand" "g")))] "" "*{ check_label_emit (); if (REG_P (operands[2])) { mvs_check_page (0, 2, 0); return \"SR %0,%2\"; } if (operands[2] == const1_rtx) { CC_STATUS_INIT; /* subtract assumes CC but BCTR doesn't set CC */ mvs_check_page (0, 2, 0); return \"BCTR %0,0\"; } mvs_check_page (0, 4, 0); return \"S %0,%2\";}" [(set_attr "length" "4")]);; subhi3 instruction pattern(s).;(define_insn "subhi3" [(set (match_operand:HI 0 "general_operand" "=d") (minus:HI (match_operand:HI 1 "general_operand" "0") (match_operand:HI 2 "general_operand" "g")))] "" "*{ check_label_emit (); if (REG_P (operands[2])) { mvs_check_page (0, 8, 0); return \"STH %2,140(,13)\;SH %0,140(,13)\"; } if (operands[2] == const1_rtx) { CC_STATUS_INIT; /* subtract assumes CC but BCTR doesn't set CC */ mvs_check_page (0, 2, 0); return \"BCTR %0,0\"; } if (GET_CODE (operands[2]) == CONST_INT) { mvs_check_page (0, 4, 0); return \"SH %0,%H2\"; } mvs_check_page (0, 4, 0); return \"SH %0,%2\";}" [(set_attr "length" "8")]);; subqi3 instruction pattern(s).;(define_expand "subqi3" [(set (match_operand:QI 0 "general_operand" "=d") (minus:QI (match_operand:QI 1 "general_operand" "0") (match_operand:QI 2 "general_operand" "di")))] "" "{ if (REG_P (operands[2])) { emit_insn (gen_rtx_SET (VOIDmode, operands[0], gen_rtx_MINUS (QImode, operands[1], operands[2]))); } else { emit_insn (gen_rtx_SET (VOIDmode, operands[0], gen_rtx_PLUS (QImode, operands[1], negate_rtx (QImode, operands[2])))); } DONE;}")(define_insn "" [(set (match_operand:QI 0 "register_operand" "=d") (minus:QI (match_operand:QI 1 "register_operand" "0") (match_operand:QI 2 "register_operand" "d")))] "" "*{ check_label_emit (); mvs_check_page (0, 2, 0); return \"SR %0,%2\";}" [(set_attr "length" "2")]);; subdf3 instruction pattern(s).;(define_insn "subdf3" [(set (match_operand:DF 0 "general_operand" "=f") (minus:DF (match_operand:DF 1 "general_operand" "0") (match_operand:DF 2 "general_operand" "fmF")))] "" "*{ check_label_emit (); if (FP_REG_P (operands[2])) { mvs_check_page (0, 2, 0); return \"SDR %0,%2\"; } mvs_check_page (0, 4, 0); return \"SD %0,%2\";}" [(set_attr "length" "4")]);; subsf3 instruction pattern(s).;(define_insn "subsf3" [(set (match_operand:SF 0 "general_operand" "=f") (minus:SF (match_operand:SF 1 "general_operand" "0") (match_operand:SF 2 "general_operand" "fmF")))] "" "*{ check_label_emit (); if (FP_REG_P (operands[2])) { mvs_check_page (0, 2, 0); return \"SER %0,%2\"; } mvs_check_page (0, 4, 0); return \"SE %0,%2\";}" [(set_attr "length" "4")]);;;;- Multiply instructions.;;;; mulsi3 instruction pattern(s).;(define_expand "mulsi3" [(set (match_operand:SI 0 "general_operand" "") (mult:SI (match_operand:SI 1 "general_operand" "") (match_operand:SI 2 "general_operand" "")))] "" "{ if (GET_CODE (operands[1]) == CONST_INT && CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'K')) { emit_insn (gen_rtx_SET (VOIDmode, operands[0], gen_rtx_MULT (SImode, operands[2], operands[1]))); } else if (GET_CODE (operands[2]) == CONST_INT && CONST_OK_FOR_LETTER_P (INTVAL (operands[2]), 'K')) { emit_insn (gen_rtx_SET (VOIDmode, operands[0], gen_rtx_MULT (SImode, operands[1], operands[2]))); } else { rtx r = gen_reg_rtx (DImode); /* XXX trouble. Below we generate some rtx's that model what * is really supposed to happen with multiply on the 370/390 * hardware, and that is all well & good. However, during optimization * it can happen that the two operands are exchanged (after all, * multiplication is commutitive), in which case the doubleword * ends up in memory and everything is hosed. The gen_reg_rtx * should have kept it in a reg ... We hack around this * below, in the M/MR isntruction pattern, and constrain it to * \"di\" instead of \"g\". But this still ends up with lots & lots of * movement between registers & memory and is an awful waste. * Dunno how to untwist it elegantly; but it seems to work for now. */ emit_insn (gen_rtx_SET (VOIDmode, gen_rtx_SUBREG (SImode, r, GET_MODE_SIZE (SImode)), operands[1])); emit_insn (gen_rtx_SET (VOIDmode, r, gen_rtx_MULT (DImode, r, operands[2]))); emit_insn (gen_rtx_SET (VOIDmode, operands[0], gen_rtx_SUBREG (SImode, r, GET_MODE_SIZE (SImode)))); } DONE;}")(define_insn "" [(set (match_operand:SI 0 "general_operand" "=d") (mult:SI (match_operand:SI 1 "general_operand" "%0") (match_operand:SI 2 "immediate_operand" "K")))] "" "*{ check_label_emit (); mvs_check_page (0, 4, 0); return \"MH %0,%H2\";}" [(set_attr "length" "4")])(define_insn "" [(set (match_operand:DI 0 "register_operand" "=d") (mult:DI (match_operand:DI 1 "general_operand" "%0") (match_operand:SI 2 "general_operand" "di")))] "" "*{ check_label_emit (); if (REG_P (operands[2])) { mvs_check_page (0, 2, 0); return \"MR %0,%2\"; } mvs_check_page (0, 4, 0); return \"M %0,%2\";}" [(set_attr "length" "4")]);; muldf3 instruction pattern(s).;(define_insn "muldf3" [(set (match_operand:DF 0 "general_operand" "=f") (mult:DF (match_operand:DF 1 "general_operand" "%0") (match_operand:DF 2 "general_operand" "fmF")))] "" "*{ check_label_emit (); if (FP_REG_P (operands[2])) { mvs_check_page (0, 2, 0); return \"MDR %0,%2\"; } mvs_check_page (0, 4, 0); return \"MD %0,%2\";}" [(set_attr "length" "4")]);; mulsf3 instruction pattern(s).;(define_insn "mulsf3" [(set (match_operand:SF 0 "general_operand" "=f") (mult:SF (match_operand:SF 1 "general_operand" "%0") (match_operand:SF 2 "general_operand" "fmF")))] "" "*{ check_label_emit (); if (FP_REG_P (operands[2])) { mvs_check_page (0, 2, 0); return \"MER %0,%2\"; } mvs_check_page (0, 4, 0); return \"ME %0,%2\";}" [(set_attr "length" "4")]);;;;- Divide instructions.;;;; divsi3 instruction pattern(s).;(define_expand "divsi3" [(set (match_operand:SI 0 "general_operand" "") (div:SI (match_operand:SI 1 "general_operand" "") (match_operand:SI 2 "general_operand" "")))] "" "{ rtx r = gen_reg_rtx (DImode); emit_insn (gen_extendsidi2 (r, operands[1])); emit_insn (gen_rtx_SET (VOIDmode, r, gen_rtx_DIV (DImode, r, operands[2]))); emit_insn (gen_rtx_SET (VOIDmode, operands[0], gen_rtx_SUBREG (SImode, r, GET_MODE_SIZE (SImode)))); DONE;}");; udivsi3 instruction pattern(s).;(define_expand "udivsi3" [(set (match_operand:SI 0 "general_operand" "") (udiv:SI (match_operand:SI 1 "general_operand" "") (match_operand:SI 2 "general_operand" "")))] "" "{ rtx dr = gen_reg_rtx (DImode); rtx dr_0 = gen_rtx_SUBREG (SImode, dr, 0); rtx dr_1 = gen_rtx_SUBREG (SImode, dr, GET_MODE_SIZE (SImode)); if (GET_CODE (operands[2]) == CONST_INT) { if (INTVAL (operands[2]) > 0) { emit_insn (gen_zero_extendsidi2 (dr, operands[1])); emit_insn (gen_rtx_SET (VOIDmode, dr, gen_rtx_DIV (DImode, dr, operands[2]))); } else { rtx label1 = gen_label_rtx (); emit_insn (gen_rtx_SET (VOIDmode, dr_0, operands[1])); emit_insn (gen_rtx_SET (VOIDmode, dr_1, const0_rtx)); emit_insn (gen_cmpsi (dr_0, operands[2])); emit_jump_insn (gen_bltu (label1)); emit_insn (gen_rtx_SET (VOIDmode, dr_1, const1_rtx)); emit_label (label1); } } else { rtx label1 = gen_label_rtx (); rtx label2 = gen_label_rtx (); rtx label3 = gen_label_rtx (); rtx sr = gen_reg_rtx (SImode); emit_insn (gen_rtx_SET (VOIDmode, dr_0, operands[1])); emit_insn (gen_rtx_SET (VOIDmode, sr, operands[2])); emit_insn (gen_rtx_SET (VOIDmode, dr_1, const0_rtx)); emit_insn (gen_cmpsi (sr, dr_0)); emit_jump_insn (gen_bgtu (label3)); emit_insn (gen_cmpsi (sr, const1_rtx)); emit_jump_insn (gen_blt (label2)); emit_insn (gen_cmpsi (sr, const1_rtx)); emit_jump_insn (gen_beq (label1)); emit_insn (gen_rtx_SET (VOIDmode, dr, gen_rtx_LSHIFTRT (DImode, dr, gen_rtx_CONST_INT (SImode, 32)))); emit_insn (gen_rtx_SET (VOIDmode, dr, gen_rtx_DIV (DImode, dr, sr))); emit_jump_insn (gen_jump (label3)); emit_label (label1); emit_insn (gen_rtx_SET (VOIDmode, dr_1, dr_0)); emit_jump_insn (gen_jump (label3)); emit_label (label2); emit_insn (gen_rtx_SET (VOIDmode, dr_1, const1_rtx)); emit_label (label3); } emit_insn (gen_rtx_SET (VOIDmode, operands[0], dr_1)); DONE;}"); This is used by divsi3 & udivsi3.(define_insn "" [(set (match_operand:DI 0 "register_operand" "=d") (div:DI (match_operand:DI 1 "register_operand" "0") (match_operand:SI 2 "general_operand" "dm")))] "" "*{ check_label_emit (); if (REG_P (operands[2])) { mvs_check_page (0, 2, 0); return \"DR %0,%2\"; } mvs_check_page (0, 4, 0); return \"D %0,%2\";}" [(set_attr "length" "4")]);; divdf3 instruction pattern(s).;(define_insn "divdf3" [(set (match_operand:DF 0 "general_operand" "=f") (div:DF (match_operand:DF 1 "general_operand" "0") (match_operand:DF 2 "general_operand" "fmF")))] "" "*{ check_label_emit (); if (FP_REG_P (operands[2])) { mvs_check_page (0, 2, 0); return \"DDR %0,%2\"; } mvs_check_page (0, 4, 0); return \"DD %0,%2\";}" [(set_attr "length" "4")]);; divsf3 instruction pattern(s).;(define_insn "divsf3" [(set (match_operand:SF 0 "general_operand" "=f") (div:SF (match_operand:SF 1 "general_operand" "0") (match_operand:SF 2 "general_operand" "fmF")))] "" "*{ check_label_emit (); if (FP_REG_P (operands[2])) { mvs_check_page (0, 2, 0); return \"DER %0,%2\"; } mvs_check_page (0, 4, 0); return \"DE %0,%2\";}" [(set_attr "length" "4")]);;;;- Modulo instructions.;;;; modsi3 instruction pattern(s).;(define_expand "modsi3" [(set (match_operand:SI 0 "general_operand" "") (mod:SI (match_operand:SI 1 "general_operand" "") (match_operand:SI 2 "general_operand" "")))] "" "{ rtx r = gen_reg_rtx (DImode); emit_insn (gen_extendsidi2 (r, operands[1])); emit_insn (gen_rtx_SET (VOIDmode, r, gen_rtx_MOD (DImode, r, operands[2]))); emit_insn (gen_rtx_SET (VOIDmode, operands[0], gen_rtx_SUBREG (SImode, r, 0))); DONE;}");; umodsi3 instruction pattern(s).;(define_expand "umodsi3" [(set (match_operand:SI 0 "general_operand" "") (umod:SI (match_operand:SI 1 "general_operand" "") (match_operand:SI 2 "general_operand" "")))] "" "{ rtx dr = gen_reg_rtx (DImode); rtx dr_0 = gen_rtx_SUBREG (SImode, dr, 0); emit_insn (gen_rtx_SET (VOIDmode, dr_0, operands[1])); if (GET_CODE (operands[2]) == CONST_INT) { if (INTVAL (operands[2]) > 0) { emit_insn (gen_rtx_SET (VOIDmode, dr, gen_rtx_LSHIFTRT (DImode, dr, gen_rtx_CONST_INT (SImode, 32)))); emit_insn (gen_rtx_SET (VOIDmode, dr, gen_rtx_MOD (DImode, dr, operands[2]))); } else { rtx label1 = gen_label_rtx (); rtx sr = gen_reg_rt
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -