📄 i370.md
字号:
; This insn handles additions that are relative to the frame pointer.(define_insn "" [(set (match_operand:SI 0 "register_operand" "=d") (plus:SI (match_operand:SI 1 "register_operand" "%a") (match_operand:SI 2 "immediate_operand" "i")))] "REGNO (operands[1]) == FRAME_POINTER_REGNUM" "*{ check_label_emit (); if ((unsigned) INTVAL (operands[2]) < 4096) { mvs_check_page (0, 4, 0); return \"LA %0,%c2(,%1)\"; } if (REGNO (operands[1]) == REGNO (operands[0])) { mvs_check_page (0, 4, 0); return \"A %0,%2\"; } mvs_check_page (0, 6, 0); return \"L %0,%2\;AR %0,%1\";}")(define_insn "addsi3" [(set (match_operand:SI 0 "general_operand" "=d") (plus: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 \"AR %0,%2\"; } if (GET_CODE (operands[2]) == CONST_INT) { if (INTVAL (operands[2]) == -1) { CC_STATUS_INIT; mvs_check_page (0, 2, 0); return \"BCTR %0,0\"; } } mvs_check_page (0, 4, 0); return \"A %0,%2\";}");; addhi3 instruction pattern(s).;(define_insn "addhi3" [(set (match_operand:HI 0 "general_operand" "=d") (plus:HI (match_operand:HI 1 "general_operand" "%0") (match_operand:HI 2 "general_operand" "dmi")))] "" "*{ check_label_emit (); if (REG_P (operands[2])) { mvs_check_page (0, 8, 0); return \"STH %2,140(,13)\;AH %0,140(,13)\"; } if (GET_CODE (operands[2]) == CONST_INT) { if (INTVAL (operands[2]) == -1) { CC_STATUS_INIT; mvs_check_page (0, 2, 0); return \"BCTR %0,0\"; } mvs_check_page (0, 4, 0); return \"AH %0,%H2\"; } mvs_check_page (0, 4, 0); return \"AH %0,%2\";}");; addqi3 instruction pattern(s).;(define_insn "addqi3" [(set (match_operand:QI 0 "general_operand" "=d") (plus:QI (match_operand:QI 1 "general_operand" "%a") (match_operand:QI 2 "general_operand" "ai")))] "" "*{ check_label_emit (); CC_STATUS_INIT; mvs_check_page (0, 4, 0); if (REG_P (operands[2])) return \"LA %0,0(%1,%2)\"; return \"LA %0,%B2(,%1)\";}");; adddf3 instruction pattern(s).;(define_insn "adddf3" [(set (match_operand:DF 0 "general_operand" "=f") (plus: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 \"ADR %0,%2\"; } mvs_check_page (0, 4, 0); return \"AD %0,%2\";}");; addsf3 instruction pattern(s).;(define_insn "addsf3" [(set (match_operand:SF 0 "general_operand" "=f") (plus: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 \"AER %0,%2\"; } mvs_check_page (0, 4, 0); return \"AE %0,%2\";}");;;;- Subtract instructions.;;;; subdi3 instruction pattern(s).;(define_expand "subdi3" [(set (match_operand:DI 0 "general_operand" "") (minus: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 (MINUS, 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 (MINUS, 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 (MINUS, SImode, op0_high, GEN_INT (1)))); emit_label (label); DONE;}")(define_insn "" [(set (match_operand:SI 0 "general_operand" "=d") (minus: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 (); 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\";}");; 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; mvs_check_page (0, 2, 0); return \"BCTR %0,0\"; } mvs_check_page (0, 4, 0); return \"S %0,%2\";}");; 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; 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\";}");; 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 (); CC_STATUS_INIT; mvs_check_page (0, 2, 0); return \"SR %0,%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\";}");; 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\";}");;;;- 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); emit_insn (gen_rtx (SET, VOIDmode, gen_rtx (SUBREG, SImode, r, 1), operands[1])); emit_insn (gen_rtx (SET, VOIDmode, r, gen_rtx (MULT, SImode, r, operands[2]))); emit_insn (gen_rtx (SET, VOIDmode, operands[0], gen_rtx (SUBREG, SImode, r, 1))); } DONE;}")(define_insn "" [(set (match_operand:SI 0 "register_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\";}")(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" "g")))] "" "*{ 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\";}");; 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\";}");; 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\";}");;;;- 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, SImode, r, operands[2]))); emit_insn (gen_rtx (SET, VOIDmode, operands[0], gen_rtx (SUBREG, SImode, r, 1))); 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, 1); 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, SImode, 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_jump_insn (gen_beq (label1)); emit_insn (gen_rtx (SET, VOIDmode, dr, gen_rtx (LSHIFTRT, DImode, dr, GEN_INT (32)))); emit_insn (gen_rtx (SET, VOIDmode, dr, gen_rtx (DIV, SImode, 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")
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -