📄 alpha.md
字号:
(define_insn "*adddi_internal" [(set (match_operand:DI 0 "register_operand" "=r,r,r") (plus:DI (match_operand:DI 1 "register_operand" "%r,r,r") (match_operand:DI 2 "add_operand" "r,K,L")))] "" "@ addq %1,%2,%0 lda %0,%2(%1) ldah %0,%h2(%1)");; ??? Allow large constants when basing off the frame pointer or some;; virtual register that may eliminate to the frame pointer. This is;; done because register elimination offsets will change the hi/lo split,;; and if we split before reload, we will require additional instructions.(define_insn "*adddi_fp_hack" [(set (match_operand:DI 0 "register_operand" "=r") (plus:DI (match_operand:DI 1 "reg_no_subreg_operand" "r") (match_operand:DI 2 "const_int_operand" "n")))] "NONSTRICT_REG_OK_FP_BASE_P (operands[1]) && INTVAL (operands[2]) >= 0 /* This is the largest constant an lda+ldah pair can add, minus an upper bound on the displacement between SP and AP during register elimination. See INITIAL_ELIMINATION_OFFSET. */ && INTVAL (operands[2]) < (0x7fff8000 - FIRST_PSEUDO_REGISTER * UNITS_PER_WORD - ALPHA_ROUND(current_function_outgoing_args_size) - (ALPHA_ROUND (get_frame_size () + max_reg_num () * UNITS_PER_WORD + current_function_pretend_args_size) - current_function_pretend_args_size))" "#");; Don't do this if we are adjusting SP since we don't want to do it;; in two steps. Don't split FP sources for the reason listed above.(define_split [(set (match_operand:DI 0 "register_operand" "") (plus:DI (match_operand:DI 1 "register_operand" "") (match_operand:DI 2 "const_int_operand" "")))] "! add_operand (operands[2], DImode) && operands[0] != stack_pointer_rtx && operands[1] != frame_pointer_rtx && operands[1] != arg_pointer_rtx" [(set (match_dup 0) (plus:DI (match_dup 1) (match_dup 3))) (set (match_dup 0) (plus:DI (match_dup 0) (match_dup 4)))]{ HOST_WIDE_INT val = INTVAL (operands[2]); HOST_WIDE_INT low = (val & 0xffff) - 2 * (val & 0x8000); HOST_WIDE_INT rest = val - low; operands[4] = GEN_INT (low); if (CONST_OK_FOR_LETTER_P (rest, 'L')) operands[3] = GEN_INT (rest); else if (! no_new_pseudos) { operands[3] = gen_reg_rtx (DImode); emit_move_insn (operands[3], operands[2]); emit_insn (gen_adddi3 (operands[0], operands[1], operands[3])); DONE; } else FAIL;})(define_insn "*saddl" [(set (match_operand:SI 0 "register_operand" "=r,r") (plus:SI (mult:SI (match_operand:SI 1 "reg_not_elim_operand" "r,r") (match_operand:SI 2 "const48_operand" "I,I")) (match_operand:SI 3 "sext_add_operand" "rI,O")))] "" "@ s%2addl %1,%3,%0 s%2subl %1,%n3,%0")(define_insn "*saddl_se" [(set (match_operand:DI 0 "register_operand" "=r,r") (sign_extend:DI (plus:SI (mult:SI (match_operand:SI 1 "reg_not_elim_operand" "r,r") (match_operand:SI 2 "const48_operand" "I,I")) (match_operand:SI 3 "sext_add_operand" "rI,O"))))] "" "@ s%2addl %1,%3,%0 s%2subl %1,%n3,%0")(define_split [(set (match_operand:DI 0 "register_operand" "") (sign_extend:DI (plus:SI (mult:SI (match_operator:SI 1 "comparison_operator" [(match_operand 2 "" "") (match_operand 3 "" "")]) (match_operand:SI 4 "const48_operand" "")) (match_operand:SI 5 "sext_add_operand" "")))) (clobber (match_operand:DI 6 "reg_not_elim_operand" ""))] "" [(set (match_dup 6) (match_dup 7)) (set (match_dup 0) (sign_extend:DI (plus:SI (mult:SI (match_dup 8) (match_dup 4)) (match_dup 5))))]{ operands[7] = gen_rtx_fmt_ee (GET_CODE (operands[1]), DImode, operands[2], operands[3]); operands[8] = gen_lowpart (SImode, operands[6]);})(define_insn "*saddq" [(set (match_operand:DI 0 "register_operand" "=r,r") (plus:DI (mult:DI (match_operand:DI 1 "reg_not_elim_operand" "r,r") (match_operand:DI 2 "const48_operand" "I,I")) (match_operand:DI 3 "sext_add_operand" "rI,O")))] "" "@ s%2addq %1,%3,%0 s%2subq %1,%n3,%0")(define_insn "addvdi3" [(set (match_operand:DI 0 "register_operand" "=r,r") (plus:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ,rJ") (match_operand:DI 2 "sext_add_operand" "rI,O"))) (trap_if (ne (plus:TI (sign_extend:TI (match_dup 1)) (sign_extend:TI (match_dup 2))) (sign_extend:TI (plus:DI (match_dup 1) (match_dup 2)))) (const_int 0))] "" "@ addqv %r1,%2,%0 subqv %r1,%n2,%0")(define_insn "negsi2" [(set (match_operand:SI 0 "register_operand" "=r") (neg:SI (match_operand:SI 1 "reg_or_8bit_operand" "rI")))] "" "subl $31,%1,%0")(define_insn "*negsi_se" [(set (match_operand:DI 0 "register_operand" "=r") (sign_extend:DI (neg:SI (match_operand:SI 1 "reg_or_8bit_operand" "rI"))))] "" "subl $31,%1,%0")(define_insn "negvsi2" [(set (match_operand:SI 0 "register_operand" "=r") (neg:SI (match_operand:SI 1 "register_operand" "r"))) (trap_if (ne (neg:DI (sign_extend:DI (match_dup 1))) (sign_extend:DI (neg:SI (match_dup 1)))) (const_int 0))] "" "sublv $31,%1,%0")(define_insn "negdi2" [(set (match_operand:DI 0 "register_operand" "=r") (neg:DI (match_operand:DI 1 "reg_or_8bit_operand" "rI")))] "" "subq $31,%1,%0")(define_insn "negvdi2" [(set (match_operand:DI 0 "register_operand" "=r") (neg:DI (match_operand:DI 1 "register_operand" "r"))) (trap_if (ne (neg:TI (sign_extend:TI (match_dup 1))) (sign_extend:TI (neg:DI (match_dup 1)))) (const_int 0))] "" "subqv $31,%1,%0")(define_expand "subsi3" [(set (match_operand:SI 0 "register_operand" "") (minus:SI (match_operand:SI 1 "reg_or_0_operand" "") (match_operand:SI 2 "reg_or_8bit_operand" "")))] "! optimize" "")(define_insn "*subsi_internal" [(set (match_operand:SI 0 "register_operand" "=r") (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rJ") (match_operand:SI 2 "reg_or_8bit_operand" "rI")))] "" "subl %r1,%2,%0")(define_insn "*subsi_se" [(set (match_operand:DI 0 "register_operand" "=r") (sign_extend:DI (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rJ") (match_operand:SI 2 "reg_or_8bit_operand" "rI"))))] "" "subl %r1,%2,%0")(define_insn "*subsi_se2" [(set (match_operand:DI 0 "register_operand" "=r") (sign_extend:DI (subreg:SI (minus:DI (match_operand:DI 1 "reg_or_0_operand" "rJ") (match_operand:DI 2 "reg_or_8bit_operand" "rI")) 0)))] "" "subl %r1,%2,%0")(define_insn "subvsi3" [(set (match_operand:SI 0 "register_operand" "=r") (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rJ") (match_operand:SI 2 "reg_or_8bit_operand" "rI"))) (trap_if (ne (minus:DI (sign_extend:DI (match_dup 1)) (sign_extend:DI (match_dup 2))) (sign_extend:DI (minus:SI (match_dup 1) (match_dup 2)))) (const_int 0))] "" "sublv %r1,%2,%0")(define_insn "subdi3" [(set (match_operand:DI 0 "register_operand" "=r") (minus:DI (match_operand:DI 1 "reg_or_0_operand" "rJ") (match_operand:DI 2 "reg_or_8bit_operand" "rI")))] "" "subq %r1,%2,%0")(define_insn "*ssubl" [(set (match_operand:SI 0 "register_operand" "=r") (minus:SI (mult:SI (match_operand:SI 1 "reg_not_elim_operand" "r") (match_operand:SI 2 "const48_operand" "I")) (match_operand:SI 3 "reg_or_8bit_operand" "rI")))] "" "s%2subl %1,%3,%0")(define_insn "*ssubl_se" [(set (match_operand:DI 0 "register_operand" "=r") (sign_extend:DI (minus:SI (mult:SI (match_operand:SI 1 "reg_not_elim_operand" "r") (match_operand:SI 2 "const48_operand" "I")) (match_operand:SI 3 "reg_or_8bit_operand" "rI"))))] "" "s%2subl %1,%3,%0")(define_insn "*ssubq" [(set (match_operand:DI 0 "register_operand" "=r") (minus:DI (mult:DI (match_operand:DI 1 "reg_not_elim_operand" "r") (match_operand:DI 2 "const48_operand" "I")) (match_operand:DI 3 "reg_or_8bit_operand" "rI")))] "" "s%2subq %1,%3,%0")(define_insn "subvdi3" [(set (match_operand:DI 0 "register_operand" "=r") (minus:DI (match_operand:DI 1 "reg_or_0_operand" "rJ") (match_operand:DI 2 "reg_or_8bit_operand" "rI"))) (trap_if (ne (minus:TI (sign_extend:TI (match_dup 1)) (sign_extend:TI (match_dup 2))) (sign_extend:TI (minus:DI (match_dup 1) (match_dup 2)))) (const_int 0))] "" "subqv %r1,%2,%0");; The Unicos/Mk assembler doesn't support mull.(define_insn "mulsi3" [(set (match_operand:SI 0 "register_operand" "=r") (mult:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ") (match_operand:SI 2 "reg_or_8bit_operand" "rI")))] "!TARGET_ABI_UNICOSMK" "mull %r1,%2,%0" [(set_attr "type" "imul") (set_attr "opsize" "si")])(define_insn "*mulsi_se" [(set (match_operand:DI 0 "register_operand" "=r") (sign_extend:DI (mult:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ") (match_operand:SI 2 "reg_or_8bit_operand" "rI"))))] "!TARGET_ABI_UNICOSMK" "mull %r1,%2,%0" [(set_attr "type" "imul") (set_attr "opsize" "si")])(define_insn "mulvsi3" [(set (match_operand:SI 0 "register_operand" "=r") (mult:SI (match_operand:SI 1 "reg_or_0_operand" "%rJ") (match_operand:SI 2 "reg_or_8bit_operand" "rI"))) (trap_if (ne (mult:DI (sign_extend:DI (match_dup 1)) (sign_extend:DI (match_dup 2))) (sign_extend:DI (mult:SI (match_dup 1) (match_dup 2)))) (const_int 0))] "!TARGET_ABI_UNICOSMK" "mullv %r1,%2,%0" [(set_attr "type" "imul") (set_attr "opsize" "si")])(define_insn "muldi3" [(set (match_operand:DI 0 "register_operand" "=r") (mult:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ") (match_operand:DI 2 "reg_or_8bit_operand" "rI")))] "" "mulq %r1,%2,%0" [(set_attr "type" "imul")])(define_insn "mulvdi3" [(set (match_operand:DI 0 "register_operand" "=r") (mult:DI (match_operand:DI 1 "reg_or_0_operand" "%rJ") (match_operand:DI 2 "reg_or_8bit_operand" "rI"))) (trap_if (ne (mult:TI (sign_extend:TI (match_dup 1)) (sign_extend:TI (match_dup 2))) (sign_extend:TI (mult:DI (match_dup 1) (match_dup 2)))) (const_int 0))] "" "mulqv %r1,%2,%0" [(set_attr "type" "imul")])(define_expand "umuldi3_highpart" [(set (match_operand:DI 0 "register_operand" "") (truncate:DI (lshiftrt:TI (mult:TI (zero_extend:TI (match_operand:DI 1 "register_operand" "")) (match_operand:DI 2 "reg_or_8bit_operand" "")) (const_int 64))))] ""{ if (REG_P (operands[2])) operands[2] = gen_rtx_ZERO_EXTEND (TImode, operands[2]);})(define_insn "*umuldi3_highpart_reg" [(set (match_operand:DI 0 "register_operand" "=r") (truncate:DI (lshiftrt:TI (mult:TI (zero_extend:TI (match_operand:DI 1 "register_operand" "r")) (zero_extend:TI (match_operand:DI 2 "register_operand" "r"))) (const_int 64))))] "" "umulh %1,%2,%0" [(set_attr "type" "imul") (set_attr "opsize" "udi")])(define_insn "*umuldi3_highpart_const" [(set (match_operand:DI 0 "register_operand" "=r") (truncate:DI (lshiftrt:TI (mult:TI (zero_extend:TI (match_operand:DI 1 "register_operand" "r")) (match_operand:TI 2 "cint8_operand" "I")) (const_int 64))))] "" "umulh %1,%2,%0" [(set_attr "type" "imul") (set_attr "opsize" "udi")]);; The divide and remainder operations take their inputs from r24 and;; r25, put their output in r27, and clobber r23 and r28 on all;; systems except Unicos/Mk. On Unicos, the standard library provides;; subroutines which use the standard calling convention and work on;; DImode operands.;; ??? Force sign-extension here because some versions of OSF/1 and;; Interix/NT don't do the right thing if the inputs are not properly;; sign-extended. But Linux, for instance, does not have this;; problem. Is it worth the complication here to eliminate the sign;; extension?(define_expand "divsi3" [(set (match_dup 3) (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" ""))) (set (match_dup 4) (sign_extend:DI (match_operand:SI 2 "nonimmediate_operand" ""))) (parallel [(set (match_dup 5) (sign_extend:DI (div:SI (match_dup 3) (match_dup 4)))) (clobber (reg:DI 23)) (clobber (reg:DI 28))]) (set (match_operand:SI 0 "nonimmediate_operand" "") (subreg:SI (match_dup 5) 0))] "! TARGET_ABI_OPEN_VMS && ! TARGET_ABI_UNICOSMK"{ operands[3] = gen_reg_rtx (DImode); operands[4] = gen_reg_rtx (DImode); operands[5] = gen_reg_rtx (DImode);})(define_expand "udivsi3" [(set (match_dup 3) (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" ""))) (set (match_dup 4) (sign_extend:DI (match_operand:SI 2 "nonimmediate_operand" ""))) (parallel [(set (match_dup 5) (sign_extend:DI (udiv:SI (match_dup 3) (match_dup 4)))) (clobber (reg:DI 23)) (clobber (reg:DI 28))]) (set (match_operand:SI 0 "nonimmediate_operand" "") (subreg:SI (match_dup 5) 0))] "! TARGET_ABI_OPEN_VMS && ! TARGET_ABI_UNICOSMK"{ operands[3] = gen_reg_rtx (DImode); operands[4] = gen_reg_rtx (DImode); operands[5] = gen_reg_rtx (DImode);})(define_expand "modsi3" [(set (match_dup 3) (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" ""))) (set (match_dup 4) (sign_extend:DI (match_operand:SI 2 "nonimmediate_operand" ""))) (parallel [(set (match_dup 5) (sign_extend:DI (mod:SI (match_dup 3) (match_dup 4)))) (clobber (reg:DI 23)) (clobber (reg:DI 28))]) (set (match_operand:SI 0 "nonimmediate_operand" "") (subreg:SI (match_dup 5) 0))] "! TARGET_ABI_OPEN_VMS && ! TARGET_ABI_UNICOSMK"{ operands[3] = gen_reg_rtx (DImode); operands[4] = gen_reg_rtx (DImode); operands[5] = gen_reg_rtx (DImode);})(define_expand "umodsi3" [(set (match_dup 3) (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" ""))) (set (match_dup 4) (sign_extend:DI (match_operand:SI 2 "nonimmediate_operand" "")))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -