📄 alpha.md
字号:
(define_expand "extendhidi2" [(set (match_dup 2) (ashift:DI (match_operand:HI 1 "register_operand" "") (const_int 48))) (set (match_operand:DI 0 "register_operand" "") (ashiftrt:DI (match_dup 2) (const_int 48)))] "" "{ operands[1] = gen_lowpart (DImode, operands[1]); operands[2] = gen_reg_rtx (DImode);}")(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ") (match_operand:DI 2 "mode_width_operand" "n") (match_operand:DI 3 "mul8_operand" "I")))] "" "ext%M2l %r1,%s3,%0")(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ") (match_operand:DI 2 "mode_width_operand" "n") (ashift:DI (match_operand:DI 3 "reg_or_8bit_operand" "rI") (const_int 3))))] "" "ext%M2l %r1,%3,%0")(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (ashift:DI (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ") (const_int 8) (ashift:DI (plus:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI") (const_int -1)) (const_int 3))) (const_int 56)))] "" "extqh %r1,%2,%0")(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (ashift:DI (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ") (const_int 16) (ashift:DI (plus:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI") (const_int -2)) (const_int 3))) (const_int 48)))] "" "extwh %r1,%2,%0")(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (ashift:DI (zero_extract:DI (match_operand:DI 1 "reg_or_0_operand" "rJ") (const_int 32) (ashift:DI (plus:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI") (const_int -4)) (const_int 3))) (const_int 32)))] "" "extlh %r1,%2,%0");; This converts an extXl into an extXh with an appropriate adjustment;; to the address calculation.(define_split [(set (match_operand:DI 0 "register_operand" "") (ashift:DI (zero_extract:DI (match_operand:DI 1 "register_operand" "") (match_operand:DI 2 "mode_width_operand" "") (ashift:DI (match_operand:DI 3 "" "") (const_int 3))) (match_operand:DI 4 "const_int_operand" ""))) (clobber (match_operand:DI 5 "register_operand" ""))] "INTVAL (operands[4]) == 64 - INTVAL (operands[2])" [(set (match_dup 5) (match_dup 6)) (set (match_dup 0) (ashift:DI (zero_extract:DI (match_dup 1) (match_dup 2) (ashift:DI (plus:DI (match_dup 5) (match_dup 7)) (const_int 3))) (match_dup 4)))] "{ operands[6] = plus_constant (operands[3], INTVAL (operands[2]) / BITS_PER_UNIT); operands[7] = GEN_INT (- INTVAL (operands[2]) / BITS_PER_UNIT);}") (define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (ashift:DI (zero_extend:DI (match_operand:QI 1 "register_operand" "r")) (match_operand:DI 2 "mul8_operand" "I")))] "" "insbl %1,%s2,%0")(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (ashift:DI (zero_extend:DI (match_operand:HI 1 "register_operand" "r")) (match_operand:DI 2 "mul8_operand" "I")))] "" "inswl %1,%s2,%0")(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (ashift:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "r")) (match_operand:DI 2 "mul8_operand" "I")))] "" "insll %1,%s2,%0")(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (ashift:DI (zero_extend:DI (match_operand:QI 1 "register_operand" "r")) (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI") (const_int 3))))] "" "insbl %1,%2,%0")(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (ashift:DI (zero_extend:DI (match_operand:HI 1 "register_operand" "r")) (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI") (const_int 3))))] "" "inswl %1,%2,%0")(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (ashift:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "r")) (ashift:DI (match_operand:DI 2 "reg_or_8bit_operand" "rI") (const_int 3))))] "" "insll %1,%2,%0");; We do not include the insXh insns because they are complex to express;; and it does not appear that we would ever want to generate them.(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (and:DI (not:DI (ashift:DI (match_operand:DI 2 "mode_mask_operand" "n") (ashift:DI (match_operand:DI 3 "reg_or_8bit_operand" "rI") (const_int 3)))) (match_operand:DI 1 "reg_or_0_operand" "rJ")))] "" "msk%U2l %r1,%3,%0");; We do not include the mskXh insns because it does not appear we would ever;; generate one.;; Floating-point operations. All the double-precision insns can extend;; from single, so indicate that. The exception are the ones that simply;; play with the sign bits; it's not clear what to do there.(define_insn "abssf2" [(set (match_operand:SF 0 "register_operand" "=f") (abs:SF (match_operand:SF 1 "reg_or_fp0_operand" "fG")))] "TARGET_FP" "cpys $f31,%R1,%0" [(set_attr "type" "fpop")])(define_insn "absdf2" [(set (match_operand:DF 0 "register_operand" "=f") (abs:DF (match_operand:DF 1 "reg_or_fp0_operand" "fG")))] "TARGET_FP" "cpys $f31,%R1,%0" [(set_attr "type" "fpop")])(define_insn "negsf2" [(set (match_operand:SF 0 "register_operand" "=f") (neg:SF (match_operand:SF 1 "reg_or_fp0_operand" "fG")))] "TARGET_FP" "cpysn %R1,%R1,%0" [(set_attr "type" "fpop")])(define_insn "negdf2" [(set (match_operand:DF 0 "register_operand" "=f") (neg:DF (match_operand:DF 1 "reg_or_fp0_operand" "fG")))] "TARGET_FP" "cpysn %R1,%R1,%0" [(set_attr "type" "fpop")])(define_insn "addsf3" [(set (match_operand:SF 0 "register_operand" "=f") (plus:SF (match_operand:SF 1 "reg_or_fp0_operand" "%fG") (match_operand:SF 2 "reg_or_fp0_operand" "fG")))] "TARGET_FP" "adds %R1,%R2,%0" [(set_attr "type" "fpop")])(define_insn "adddf3" [(set (match_operand:DF 0 "register_operand" "=f") (plus:DF (match_operand:DF 1 "reg_or_fp0_operand" "%fG") (match_operand:DF 2 "reg_or_fp0_operand" "fG")))] "TARGET_FP" "addt %R1,%R2,%0" [(set_attr "type" "fpop")])(define_insn "" [(set (match_operand:DF 0 "register_operand" "=f") (plus:DF (float_extend:DF (match_operand:SF 1 "reg_or_fp0_operand" "fG")) (match_operand:DF 2 "reg_or_fp0_operand" "fG")))] "TARGET_FP" "addt %R1,%R2,%0" [(set_attr "type" "fpop")])(define_insn "" [(set (match_operand:DF 0 "register_operand" "=f") (plus:DF (float_extend:DF (match_operand:SF 1 "reg_or_fp0_operand" "%fG")) (float_extend:DF (match_operand:SF 2 "reg_or_fp0_operand" "fG"))))] "TARGET_FP" "addt %R1,%R2,%0" [(set_attr "type" "fpop")])(define_insn "fix_truncdfdi2" [(set (match_operand:DI 0 "register_operand" "=f") (fix:DI (match_operand:DF 1 "reg_or_fp0_operand" "fG")))] "TARGET_FP" "cvttqc %R1,%0" [(set_attr "type" "fpop")])(define_insn "fix_truncsfdi2" [(set (match_operand:DI 0 "register_operand" "=f") (fix:DI (float_extend:DF (match_operand:SF 1 "reg_or_fp0_operand" "fG"))))] "TARGET_FP" "cvttqc %R1,%0" [(set_attr "type" "fpop")])(define_insn "floatdisf2" [(set (match_operand:SF 0 "register_operand" "=f") (float:SF (match_operand:DI 1 "register_operand" "f")))] "TARGET_FP" "cvtqs %1,%0" [(set_attr "type" "fpop")])(define_insn "floatdidf2" [(set (match_operand:DF 0 "register_operand" "=f") (float:DF (match_operand:DI 1 "register_operand" "f")))] "TARGET_FP" "cvtqt %1,%0" [(set_attr "type" "fpop")])(define_insn "extendsfdf2" [(set (match_operand:DF 0 "register_operand" "=f,f") (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "f,m")))] "TARGET_FP" "@ addt $f31,%1,%0 lds %0,%1" [(set_attr "type" "fpop,ld")])(define_insn "truncdfsf2" [(set (match_operand:SF 0 "register_operand" "=f") (float_truncate:SF (match_operand:DF 1 "reg_or_fp0_operand" "fG")))] "TARGET_FP" "cvtts %R1,%0" [(set_attr "type" "fpop")])(define_insn "divsf3" [(set (match_operand:SF 0 "register_operand" "=f") (div:SF (match_operand:SF 1 "reg_or_fp0_operand" "fG") (match_operand:SF 2 "reg_or_fp0_operand" "fG")))] "TARGET_FP" "divs %R1,%R2,%0" [(set_attr "type" "fdivs")])(define_insn "divdf3" [(set (match_operand:DF 0 "register_operand" "=f") (div:DF (match_operand:DF 1 "reg_or_fp0_operand" "fG") (match_operand:DF 2 "reg_or_fp0_operand" "fG")))] "TARGET_FP" "divt %R1,%R2,%0" [(set_attr "type" "fdivt")])(define_insn "" [(set (match_operand:DF 0 "register_operand" "=f") (div:DF (float_extend:DF (match_operand:SF 1 "reg_or_fp0_operand" "fG")) (match_operand:DF 2 "reg_or_fp0_operand" "fG")))] "TARGET_FP" "divt %R1,%R2,%0" [(set_attr "type" "fdivt")])(define_insn "" [(set (match_operand:DF 0 "register_operand" "=f") (div:DF (match_operand:DF 1 "reg_or_fp0_operand" "fG") (float_extend:DF (match_operand:SF 2 "reg_or_fp0_operand" "fG"))))] "TARGET_FP" "divt %R1,%R2,%0" [(set_attr "type" "fdivt")])(define_insn "" [(set (match_operand:DF 0 "register_operand" "=f") (div:DF (float_extend:DF (match_operand:SF 1 "reg_or_fp0_operand" "fG")) (float_extend:DF (match_operand:SF 2 "reg_or_fp0_operand" "fG"))))] "TARGET_FP" "divt %R1,%R2,%0" [(set_attr "type" "fdivt")])(define_insn "mulsf3" [(set (match_operand:SF 0 "register_operand" "=f") (mult:SF (match_operand:SF 1 "reg_or_fp0_operand" "%fG") (match_operand:SF 2 "reg_or_fp0_operand" "fG")))] "TARGET_FP" "muls %R1,%R2,%0" [(set_attr "type" "fpop")])(define_insn "muldf3" [(set (match_operand:DF 0 "register_operand" "=f") (mult:DF (match_operand:DF 1 "reg_or_fp0_operand" "%fG") (match_operand:DF 2 "reg_or_fp0_operand" "fG")))] "TARGET_FP" "mult %R1,%R2,%0" [(set_attr "type" "fpop")])(define_insn "" [(set (match_operand:DF 0 "register_operand" "=f") (mult:DF (float_extend:DF (match_operand:SF 1 "reg_or_fp0_operand" "fG")) (match_operand:DF 2 "reg_or_fp0_operand" "fG")))] "TARGET_FP" "mult %R1,%R2,%0" [(set_attr "type" "fpop")])(define_insn "" [(set (match_operand:DF 0 "register_operand" "=f") (mult:DF (float_extend:DF (match_operand:SF 1 "reg_or_fp0_operand" "%fG")) (float_extend:DF (match_operand:SF 2 "reg_or_fp0_operand" "fG"))))] "TARGET_FP" "mult %R1,%R2,%0" [(set_attr "type" "fpop")])(define_insn "subsf3" [(set (match_operand:SF 0 "register_operand" "=f") (minus:SF (match_operand:SF 1 "reg_or_fp0_operand" "fG") (match_operand:SF 2 "reg_or_fp0_operand" "fG")))] "TARGET_FP" "subs %R1,%R2,%0" [(set_attr "type" "fpop")])(define_insn "subdf3" [(set (match_operand:DF 0 "register_operand" "=f") (minus:DF (match_operand:DF 1 "reg_or_fp0_operand" "fG") (match_operand:DF 2 "reg_or_fp0_operand" "fG")))] "TARGET_FP" "subt %R1,%R2,%0" [(set_attr "type" "fpop")])(define_insn "" [(set (match_operand:DF 0 "register_operand" "=f") (minus:DF (float_extend:DF (match_operand:SF 1 "reg_or_fp0_operand" "fG")) (match_operand:DF 2 "reg_or_fp0_operand" "fG")))] "TARGET_FP" "subt %R1,%R2,%0" [(set_attr "type" "fpop")])(define_insn "" [(set (match_operand:DF 0 "register_operand" "=f") (minus:DF (match_operand:DF 1 "reg_or_fp0_operand" "fG") (float_extend:DF (match_operand:SF 2 "reg_or_fp0_operand" "fG"))))] "TARGET_FP" "subt %R1,%R2,%0" [(set_attr "type" "fpop")])(define_insn "" [(set (match_operand:DF 0 "register_operand" "=f") (minus:DF (float_extend:DF (match_operand:SF 1 "reg_or_fp0_operand" "fG")) (float_extend:DF (match_operand:SF 2 "reg_or_fp0_operand" "fG"))))] "TARGET_FP" "subt %R1,%R2,%0" [(set_attr "type" "fpop")]);; Next are all the integer comparisons, and conditional moves and branches;; and some of the related define_expand's and define_split's.(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (match_operator:DI 1 "alpha_comparison_operator" [(match_operand:DI 2 "reg_or_0_operand" "rJ") (match_operand:DI 3 "reg_or_8bit_operand" "rI")]))] "" "cmp%C1 %r2,%3,%0" [(set_attr "type" "icmp")]);; There are three important special-case that don't fit the above pattern;; but which we want to handle here.(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (ne:DI (match_operand:DI 1 "register_operand" "r") (const_int 0)))] "" "cmpult $31,%1,%0" [(set_attr "type" "icmp")])(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (gt:DI (match_operand:DI 1 "register_operand" "r") (const_int 0)))] "" "cmplt $31,%1,%0" [(set_attr "type" "icmp")])(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (ge:DI (match_operand:DI 1 "register_operand" "r") (const_int 0)))] "" "cmple $31,%1,%0" [(set_attr "type" "icmp")]);; This pattern exists so conditional moves of SImode values are handled.;; Comparisons are still done in DImode though.(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r,r,r,r") (if_then_else:DI (match_operator 2 "signed_comparison_operator"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -