📄 arm.md
字号:
[(set_attr "type" "mult")])(define_insn "*mulsi3_compare0" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (mult:SI (match_operand:SI 2 "s_register_operand" "r,r") (match_operand:SI 1 "s_register_operand" "%?r,0")) (const_int 0))) (set (match_operand:SI 0 "s_register_operand" "=&r,&r") (mult:SI (match_dup 2) (match_dup 1)))] "" "mul%?s\\t%0, %2, %1"[(set_attr "conds" "set") (set_attr "type" "mult")])(define_insn "*mulsi_compare0_scratch" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (mult:SI (match_operand:SI 2 "s_register_operand" "r,r") (match_operand:SI 1 "s_register_operand" "%?r,0")) (const_int 0))) (clobber (match_scratch:SI 0 "=&r,&r"))] "" "mul%?s\\t%0, %2, %1"[(set_attr "conds" "set") (set_attr "type" "mult")]);; Unnamed templates to match MLA instruction.(define_insn "*mulsi3addsi" [(set (match_operand:SI 0 "s_register_operand" "=&r,&r,&r,&r") (plus:SI (mult:SI (match_operand:SI 2 "s_register_operand" "r,r,r,r") (match_operand:SI 1 "s_register_operand" "%r,0,r,0")) (match_operand:SI 3 "s_register_operand" "?r,r,0,0")))] "" "mla%?\\t%0, %2, %1, %3"[(set_attr "type" "mult")])(define_insn "*mulsi3addsi_compare0" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (plus:SI (mult:SI (match_operand:SI 2 "s_register_operand" "r,r,r,r") (match_operand:SI 1 "s_register_operand" "%r,0,r,0")) (match_operand:SI 3 "s_register_operand" "?r,r,0,0")) (const_int 0))) (set (match_operand:SI 0 "s_register_operand" "=&r,&r,&r,&r") (plus:SI (mult:SI (match_dup 2) (match_dup 1)) (match_dup 3)))] "" "mla%?s\\t%0, %2, %1, %3"[(set_attr "conds" "set") (set_attr "type" "mult")])(define_insn "*mulsi3addsi_compare0_scratch" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (plus:SI (mult:SI (match_operand:SI 2 "s_register_operand" "r,r,r,r") (match_operand:SI 1 "s_register_operand" "%r,0,r,0")) (match_operand:SI 3 "s_register_operand" "?r,r,0,0")) (const_int 0))) (clobber (match_scratch:SI 0 "=&r,&r,&r,&r"))] "" "mla%?s\\t%0, %2, %1, %3"[(set_attr "conds" "set") (set_attr "type" "mult")])(define_insn "mulsidi3" [(set (match_operand:DI 0 "s_register_operand" "=&r") (mult:DI (sign_extend:DI (match_operand:SI 1 "s_register_operand" "%r")) (sign_extend:DI (match_operand:SI 2 "s_register_operand" "r"))))] "arm_fast_multiply" "smull%?\\t%Q0, %R0, %1, %2"[(set_attr "type" "mult")])(define_insn "umulsidi3" [(set (match_operand:DI 0 "s_register_operand" "=&r") (mult:DI (zero_extend:DI (match_operand:SI 1 "s_register_operand" "%r")) (zero_extend:DI (match_operand:SI 2 "s_register_operand" "r"))))] "arm_fast_multiply" "umull%?\\t%Q0, %R0, %1, %2"[(set_attr "type" "mult")])(define_insn "smulsi3_highpart" [(set (match_operand:SI 0 "s_register_operand" "=&r,&r") (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (match_operand:SI 1 "s_register_operand" "%r,0")) (sign_extend:DI (match_operand:SI 2 "s_register_operand" "r,r"))) (const_int 32)))) (clobber (match_scratch:SI 3 "=&r,&r"))] "arm_fast_multiply" "smull%?\\t%3, %0, %2, %1"[(set_attr "type" "mult")])(define_insn "umulsi3_highpart" [(set (match_operand:SI 0 "s_register_operand" "=&r,&r") (truncate:SI (lshiftrt:DI (mult:DI (zero_extend:DI (match_operand:SI 1 "s_register_operand" "%r,0")) (zero_extend:DI (match_operand:SI 2 "s_register_operand" "r,r"))) (const_int 32)))) (clobber (match_scratch:SI 3 "=&r,&r"))] "arm_fast_multiply" "umull%?\\t%3, %0, %2, %1"[(set_attr "type" "mult")])(define_insn "mulsf3" [(set (match_operand:SF 0 "s_register_operand" "=f") (mult:SF (match_operand:SF 1 "s_register_operand" "f") (match_operand:SF 2 "fpu_rhs_operand" "fG")))] "TARGET_HARD_FLOAT" "fml%?s\\t%0, %1, %2"[(set_attr "type" "ffmul")])(define_insn "muldf3" [(set (match_operand:DF 0 "s_register_operand" "=f") (mult:DF (match_operand:DF 1 "s_register_operand" "f") (match_operand:DF 2 "fpu_rhs_operand" "fG")))] "TARGET_HARD_FLOAT" "muf%?d\\t%0, %1, %2"[(set_attr "type" "fmul")])(define_insn "*muldf_esfdf_df" [(set (match_operand:DF 0 "s_register_operand" "=f") (mult:DF (float_extend:DF (match_operand:SF 1 "s_register_operand" "f")) (match_operand:DF 2 "fpu_rhs_operand" "fG")))] "TARGET_HARD_FLOAT" "muf%?d\\t%0, %1, %2"[(set_attr "type" "fmul")])(define_insn "*muldf_df_esfdf" [(set (match_operand:DF 0 "s_register_operand" "=f") (mult:DF (match_operand:DF 1 "s_register_operand" "f") (float_extend:DF (match_operand:SF 2 "s_register_operand" "f"))))] "TARGET_HARD_FLOAT" "muf%?d\\t%0, %1, %2"[(set_attr "type" "fmul")])(define_insn "*muldf_esfdf_esfdf" [(set (match_operand:DF 0 "s_register_operand" "=f") (mult:DF (float_extend:DF (match_operand:SF 1 "s_register_operand" "f")) (float_extend:DF (match_operand:SF 2 "s_register_operand" "f"))))] "TARGET_HARD_FLOAT" "muf%?d\\t%0, %1, %2"[(set_attr "type" "fmul")])(define_insn "mulxf3" [(set (match_operand:XF 0 "s_register_operand" "=f") (mult:XF (match_operand:XF 1 "s_register_operand" "f") (match_operand:XF 2 "fpu_rhs_operand" "fG")))] "ENABLE_XF_PATTERNS && TARGET_HARD_FLOAT" "muf%?e\\t%0, %1, %2"[(set_attr "type" "fmul")]);; Division insns(define_insn "divsf3" [(set (match_operand:SF 0 "s_register_operand" "=f,f") (div:SF (match_operand:SF 1 "fpu_rhs_operand" "f,G") (match_operand:SF 2 "fpu_rhs_operand" "fG,f")))] "TARGET_HARD_FLOAT" "@ fdv%?s\\t%0, %1, %2 frd%?s\\t%0, %2, %1"[(set_attr "type" "fdivs")])(define_insn "divdf3" [(set (match_operand:DF 0 "s_register_operand" "=f,f") (div:DF (match_operand:DF 1 "fpu_rhs_operand" "f,G") (match_operand:DF 2 "fpu_rhs_operand" "fG,f")))] "TARGET_HARD_FLOAT" "@ dvf%?d\\t%0, %1, %2 rdf%?d\\t%0, %2, %1"[(set_attr "type" "fdivd")])(define_insn "*divdf_esfdf_df" [(set (match_operand:DF 0 "s_register_operand" "=f") (div:DF (float_extend:DF (match_operand:SF 1 "s_register_operand" "f")) (match_operand:DF 2 "fpu_rhs_operand" "fG")))] "TARGET_HARD_FLOAT" "dvf%?d\\t%0, %1, %2"[(set_attr "type" "fdivd")])(define_insn "*divdf_df_esfdf" [(set (match_operand:DF 0 "s_register_operand" "=f") (div:DF (match_operand:DF 1 "fpu_rhs_operand" "fG") (float_extend:DF (match_operand:SF 2 "s_register_operand" "f"))))] "TARGET_HARD_FLOAT" "rdf%?d\\t%0, %2, %1"[(set_attr "type" "fdivd")])(define_insn "*divdf_esfdf_esfdf" [(set (match_operand:DF 0 "s_register_operand" "=f") (div:DF (float_extend:DF (match_operand:SF 1 "s_register_operand" "f")) (float_extend:DF (match_operand:SF 2 "s_register_operand" "f"))))] "TARGET_HARD_FLOAT" "dvf%?d\\t%0, %1, %2"[(set_attr "type" "fdivd")])(define_insn "divxf3" [(set (match_operand:XF 0 "s_register_operand" "=f,f") (div:XF (match_operand:XF 1 "fpu_rhs_operand" "f,G") (match_operand:XF 2 "fpu_rhs_operand" "fG,f")))] "ENABLE_XF_PATTERNS && TARGET_HARD_FLOAT" "@ dvf%?e\\t%0, %1, %2 rdf%?e\\t%0, %2, %1"[(set_attr "type" "fdivx")]);; Modulo insns(define_insn "modsf3" [(set (match_operand:SF 0 "s_register_operand" "=f") (mod:SF (match_operand:SF 1 "s_register_operand" "f") (match_operand:SF 2 "fpu_rhs_operand" "fG")))] "TARGET_HARD_FLOAT" "rmf%?s\\t%0, %1, %2"[(set_attr "type" "fdivs")])(define_insn "moddf3" [(set (match_operand:DF 0 "s_register_operand" "=f") (mod:DF (match_operand:DF 1 "s_register_operand" "f") (match_operand:DF 2 "fpu_rhs_operand" "fG")))] "TARGET_HARD_FLOAT" "rmf%?d\\t%0, %1, %2"[(set_attr "type" "fdivd")])(define_insn "*moddf_esfdf_df" [(set (match_operand:DF 0 "s_register_operand" "=f") (mod:DF (float_extend:DF (match_operand:SF 1 "s_register_operand" "f")) (match_operand:DF 2 "fpu_rhs_operand" "fG")))] "TARGET_HARD_FLOAT" "rmf%?d\\t%0, %1, %2"[(set_attr "type" "fdivd")])(define_insn "*moddf_df_esfdf" [(set (match_operand:DF 0 "s_register_operand" "=f") (mod:DF (match_operand:DF 1 "s_register_operand" "f") (float_extend:DF (match_operand:SF 2 "s_register_operand" "f"))))] "TARGET_HARD_FLOAT" "rmf%?d\\t%0, %1, %2"[(set_attr "type" "fdivd")])(define_insn "*moddf_esfdf_esfdf" [(set (match_operand:DF 0 "s_register_operand" "=f") (mod:DF (float_extend:DF (match_operand:SF 1 "s_register_operand" "f")) (float_extend:DF (match_operand:SF 2 "s_register_operand" "f"))))] "TARGET_HARD_FLOAT" "rmf%?d\\t%0, %1, %2"[(set_attr "type" "fdivd")])(define_insn "modxf3" [(set (match_operand:XF 0 "s_register_operand" "=f") (mod:XF (match_operand:XF 1 "s_register_operand" "f") (match_operand:XF 2 "fpu_rhs_operand" "fG")))] "ENABLE_XF_PATTERNS && TARGET_HARD_FLOAT" "rmf%?e\\t%0, %1, %2"[(set_attr "type" "fdivx")]);; Boolean and,ior,xor insns(define_insn "anddi3" [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") (and:DI (match_operand:DI 1 "s_register_operand" "%0,0") (match_operand:DI 2 "s_register_operand" "r,0")))] "" "and%?\\t%Q0, %Q1, %Q2\;and%?\\t%R0, %R1, %R2"[(set_attr "length" "8")])(define_insn "*anddi_zesidi_di" [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") (and:DI (zero_extend:DI (match_operand:SI 2 "s_register_operand" "r,r")) (match_operand:DI 1 "s_register_operand" "?r,0")))] "" "and%?\\t%Q0, %Q1, %2\;mov%?\\t%R0, #0"[(set_attr "length" "8")])(define_insn "*anddi_sesdi_di" [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") (and:DI (sign_extend:DI (match_operand:SI 2 "s_register_operand" "r,r")) (match_operand:DI 1 "s_register_operand" "?r,0")))] "" "and%?\\t%Q0, %Q1, %2\;and%?\\t%R0, %R1, %2, asr #31"[(set_attr "length" "8")])(define_expand "andsi3" [(set (match_operand:SI 0 "s_register_operand" "") (and:SI (match_operand:SI 1 "s_register_operand" "") (match_operand:SI 2 "reg_or_int_operand" "")))] "" " if (GET_CODE (operands[2]) == CONST_INT) { arm_split_constant (AND, SImode, INTVAL (operands[2]), operands[0], operands[1], (reload_in_progress || reload_completed ? 0 : preserve_subexpressions_p ())); DONE; }")(define_insn "*andsi3_insn" [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") (and:SI (match_operand:SI 1 "s_register_operand" "r,r,r") (match_operand:SI 2 "reg_or_int_operand" "rI,K,?n")))] "" "@ and%?\\t%0, %1, %2 bic%?\\t%0, %1, #%B2 #"[(set_attr "length" "4,4,16")])(define_split [(set (match_operand:SI 0 "s_register_operand" "") (and:SI (match_operand:SI 1 "s_register_operand" "") (match_operand:SI 2 "const_int_operand" "")))] "! (const_ok_for_arm (INTVAL (operands[2])) || const_ok_for_arm (~ INTVAL (operands[2])))" [(clobber (const_int 0))] " arm_split_constant (AND, SImode, INTVAL (operands[2]), operands[0], operands[1], 0); DONE;")(define_insn "*andsi3_compare0" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (and:SI (match_operand:SI 1 "s_register_operand" "r,r") (match_operand:SI 2 "arm_not_operand" "rI,K")) (const_int 0))) (set (match_operand:SI 0 "s_register_operand" "=r,r") (and:SI (match_dup 1) (match_dup 2)))] "" "@ and%?s\\t%0, %1, %2 bic%?s\\t%0, %1, #%B2"[(set_attr "conds" "set")])(define_insn "*andsi3_compare0_scratch" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (and:SI (match_operand:SI 0 "s_register_operand" "r,r") (match_operand:SI 1 "arm_not_operand" "rI,K")) (const_int 0))) (clobber (match_scratch:SI 3 "=X,r"))] "" "@ tst%?\\t%0, %1 bic%?s\\t%3, %0, #%B1"[(set_attr "conds" "set")])(define_insn "*zeroextractsi_compare0_scratch" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (zero_extract:SI (match_operand:SI 0 "s_register_operand" "r") (match_operand 1 "const_int_operand" "n") (match_operand 2 "const_int_operand" "n")) (const_int 0)))] "INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) < 32 && INTVAL (operands[1]) > 0 && INTVAL (operands[1]) + (INTVAL (operands[2]) & 1) <= 8 && INTVAL (operands[1]) + INTVAL (operands[2]) <= 32" "* operands[1] = GEN_INT (((1 << INTVAL (operands[1])) - 1) << INTVAL (operands[2])); output_asm_insn (\"tst%?\\t%0, %1\", operands); return \"\";"[(set_attr "conds" "set")])(define_insn "*ne_zeroextractsi" [(set (match_operand:SI 0 "s_register_operand" "=r") (ne:SI (zero_extract:SI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -