📄 arm.md
字号:
;; Minimum and maximum insns(define_insn "smaxsi3" [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") (smax:SI (match_operand:SI 1 "s_register_operand" "0,r,?r") (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI"))) (clobber (reg:CC 24))] "" "@ cmp\\t%1, %2\;movlt\\t%0, %2 cmp\\t%1, %2\;movge\\t%0, %1 cmp\\t%1, %2\;movge\\t%0, %1\;movlt\\t%0, %2"[(set_attr "conds" "clob") (set_attr "length" "8,8,12")])(define_insn "sminsi3" [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") (smin:SI (match_operand:SI 1 "s_register_operand" "0,r,?r") (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI"))) (clobber (reg:CC 24))] "" "@ cmp\\t%1, %2\;movge\\t%0, %2 cmp\\t%1, %2\;movlt\\t%0, %1 cmp\\t%1, %2\;movlt\\t%0, %1\;movge\\t%0, %2"[(set_attr "conds" "clob") (set_attr "length" "8,8,12")])(define_insn "umaxsi3" [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") (umax:SI (match_operand:SI 1 "s_register_operand" "0,r,?r") (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI"))) (clobber (reg:CC 24))] "" "@ cmp\\t%1, %2\;movcc\\t%0, %2 cmp\\t%1, %2\;movcs\\t%0, %1 cmp\\t%1, %2\;movcs\\t%0, %1\;movcc\\t%0, %2"[(set_attr "conds" "clob") (set_attr "length" "8,8,12")])(define_insn "uminsi3" [(set (match_operand:SI 0 "s_register_operand" "=r,r,r") (umin:SI (match_operand:SI 1 "s_register_operand" "0,r,?r") (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI"))) (clobber (reg:CC 24))] "" "@ cmp\\t%1, %2\;movcs\\t%0, %2 cmp\\t%1, %2\;movcc\\t%0, %1 cmp\\t%1, %2\;movcc\\t%0, %1\;movcs\\t%0, %2"[(set_attr "conds" "clob") (set_attr "length" "8,8,12")])(define_insn "*store_minmaxsi" [(set (match_operand:SI 0 "memory_operand" "=m") (match_operator:SI 3 "minmax_operator" [(match_operand:SI 1 "s_register_operand" "r") (match_operand:SI 2 "s_register_operand" "r")])) (clobber (reg:CC 24))] "" "* operands[3] = gen_rtx (minmax_code (operands[3]), SImode, operands[1], operands[2]); output_asm_insn (\"cmp\\t%1, %2\", operands); output_asm_insn (\"str%d3\\t%1, %0\", operands); output_asm_insn (\"str%D3\\t%2, %0\", operands); return \"\";"[(set_attr "conds" "clob") (set_attr "length" "12") (set_attr "type" "store1")]); Reject the frame pointer in operand[1], since reloading this after; it has been eliminated can cause carnage.(define_insn "*minmax_arithsi" [(set (match_operand:SI 0 "s_register_operand" "=r,r") (match_operator:SI 4 "shiftable_operator" [(match_operator:SI 5 "minmax_operator" [(match_operand:SI 2 "s_register_operand" "r,r") (match_operand:SI 3 "arm_rhs_operand" "rI,rI")]) (match_operand:SI 1 "s_register_operand" "0,?r")])) (clobber (reg:CC 24))] "GET_CODE (operands[1]) != REG || (REGNO(operands[1]) != FRAME_POINTER_REGNUM && REGNO(operands[1]) != ARG_POINTER_REGNUM)" "*{ enum rtx_code code = GET_CODE (operands[4]); operands[5] = gen_rtx (minmax_code (operands[5]), SImode, operands[2], operands[3]); output_asm_insn (\"cmp\\t%2, %3\", operands); output_asm_insn (\"%i4%d5\\t%0, %1, %2\", operands); if (which_alternative != 0 || operands[3] != const0_rtx || (code != PLUS && code != MINUS && code != IOR && code != XOR)) output_asm_insn (\"%i4%D5\\t%0, %1, %3\", operands); return \"\";}"[(set_attr "conds" "clob") (set_attr "length" "12")]);; Shift and rotation insns(define_expand "ashlsi3" [(set (match_operand:SI 0 "s_register_operand" "") (ashift:SI (match_operand:SI 1 "s_register_operand" "") (match_operand:SI 2 "arm_rhs_operand" "")))] "" " if (GET_CODE (operands[2]) == CONST_INT && ((unsigned HOST_WIDE_INT) INTVAL (operands[2])) > 31) { emit_insn (gen_movsi (operands[0], const0_rtx)); DONE; }")(define_expand "ashrsi3" [(set (match_operand:SI 0 "s_register_operand" "") (ashiftrt:SI (match_operand:SI 1 "s_register_operand" "") (match_operand:SI 2 "arm_rhs_operand" "")))] "" " if (GET_CODE (operands[2]) == CONST_INT && ((unsigned HOST_WIDE_INT) INTVAL (operands[2])) > 31) operands[2] = GEN_INT (31);")(define_expand "lshrsi3" [(set (match_operand:SI 0 "s_register_operand" "") (lshiftrt:SI (match_operand:SI 1 "s_register_operand" "") (match_operand:SI 2 "arm_rhs_operand" "")))] "" " if (GET_CODE (operands[2]) == CONST_INT && ((unsigned HOST_WIDE_INT) INTVAL (operands[2])) > 31) { emit_insn (gen_movsi (operands[0], const0_rtx)); DONE; }")(define_expand "rotlsi3" [(set (match_operand:SI 0 "s_register_operand" "") (rotatert:SI (match_operand:SI 1 "s_register_operand" "") (match_operand:SI 2 "reg_or_int_operand" "")))] "" " if (GET_CODE (operands[2]) == CONST_INT) operands[2] = GEN_INT ((32 - INTVAL (operands[2])) % 32); else { rtx reg = gen_reg_rtx (SImode); emit_insn (gen_subsi3 (reg, GEN_INT (32), operands[2])); operands[2] = reg; }")(define_expand "rotrsi3" [(set (match_operand:SI 0 "s_register_operand" "") (rotatert:SI (match_operand:SI 1 "s_register_operand" "") (match_operand:SI 2 "arm_rhs_operand" "")))] "" " if (GET_CODE (operands[2]) == CONST_INT && ((unsigned HOST_WIDE_INT) INTVAL (operands[2])) > 31) operands[2] = GEN_INT (INTVAL (operands[2]) % 32);")(define_insn "*shiftsi3" [(set (match_operand:SI 0 "s_register_operand" "=r") (match_operator:SI 3 "shift_operator" [(match_operand:SI 1 "s_register_operand" "r") (match_operand:SI 2 "reg_or_int_operand" "rM")]))] "" "mov%?\\t%0, %1%S3")(define_insn "*shiftsi3_compare0" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (match_operator:SI 3 "shift_operator" [(match_operand:SI 1 "s_register_operand" "r") (match_operand:SI 2 "arm_rhs_operand" "rM")]) (const_int 0))) (set (match_operand:SI 0 "s_register_operand" "=r") (match_op_dup 3 [(match_dup 1) (match_dup 2)]))] "" "mov%?s\\t%0, %1%S3"[(set_attr "conds" "set")])(define_insn "*shiftsi3_compare0_scratch" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (match_operator:SI 3 "shift_operator" [(match_operand:SI 1 "s_register_operand" "r") (match_operand:SI 2 "arm_rhs_operand" "rM")]) (const_int 0))) (clobber (match_scratch:SI 0 "=r"))] "" "mov%?s\\t%0, %1%S3"[(set_attr "conds" "set")])(define_insn "*notsi_shiftsi" [(set (match_operand:SI 0 "s_register_operand" "=r") (not:SI (match_operator:SI 3 "shift_operator" [(match_operand:SI 1 "s_register_operand" "r") (match_operand:SI 2 "arm_rhs_operand" "rM")])))] "" "mvn%?\\t%0, %1%S3")(define_insn "*notsi_shiftsi_compare0" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (not:SI (match_operator:SI 3 "shift_operator" [(match_operand:SI 1 "s_register_operand" "r") (match_operand:SI 2 "arm_rhs_operand" "rM")])) (const_int 0))) (set (match_operand:SI 0 "s_register_operand" "=r") (not:SI (match_op_dup 3 [(match_dup 1) (match_dup 2)])))] "" "mvn%?s\\t%0, %1%S3"[(set_attr "conds" "set")])(define_insn "*not_shiftsi_compare0_scratch" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (not:SI (match_operator:SI 3 "shift_operator" [(match_operand:SI 1 "s_register_operand" "r") (match_operand:SI 2 "arm_rhs_operand" "rM")])) (const_int 0))) (clobber (match_scratch:SI 0 "=r"))] "" "mvn%?s\\t%0, %1%S3"[(set_attr "conds" "set")]);; Unary arithmetic insns(define_insn "negdi2" [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") (neg:DI (match_operand:DI 1 "s_register_operand" "?r,0"))) (clobber (reg:CC 24))] "" "rsbs\\t%Q0, %Q1, #0\;rsc\\t%R0, %R1, #0"[(set_attr "conds" "clob") (set_attr "length" "8")])(define_insn "negsi2" [(set (match_operand:SI 0 "s_register_operand" "=r") (neg:SI (match_operand:SI 1 "s_register_operand" "r")))] "" "rsb%?\\t%0, %1, #0")(define_insn "negsf2" [(set (match_operand:SF 0 "s_register_operand" "=f") (neg:SF (match_operand:SF 1 "s_register_operand" "f")))] "TARGET_HARD_FLOAT" "mnf%?s\\t%0, %1"[(set_attr "type" "ffarith")])(define_insn "negdf2" [(set (match_operand:DF 0 "s_register_operand" "=f") (neg:DF (match_operand:DF 1 "s_register_operand" "f")))] "TARGET_HARD_FLOAT" "mnf%?d\\t%0, %1"[(set_attr "type" "ffarith")])(define_insn "*negdf_esfdf" [(set (match_operand:DF 0 "s_register_operand" "=f") (neg:DF (float_extend:DF (match_operand:SF 1 "s_register_operand" "f"))))] "TARGET_HARD_FLOAT" "mnf%?d\\t%0, %1"[(set_attr "type" "ffarith")])(define_insn "negxf2" [(set (match_operand:XF 0 "s_register_operand" "=f") (neg:XF (match_operand:XF 1 "s_register_operand" "f")))] "ENABLE_XF_PATTERNS && TARGET_HARD_FLOAT" "mnf%?e\\t%0, %1"[(set_attr "type" "ffarith")]);; abssi2 doesn't really clobber the condition codes if a different register;; is being set. To keep things simple, assume during rtl manipulations that;; it does, but tell the final scan operator the truth. Similarly for;; (neg (abs...))(define_insn "abssi2" [(set (match_operand:SI 0 "s_register_operand" "=r,&r") (abs:SI (match_operand:SI 1 "s_register_operand" "0,r"))) (clobber (reg:CC 24))] "" "@ cmp\\t%0, #0\;rsblt\\t%0, %0, #0 eor%?\\t%0, %1, %1, asr #31\;sub%?\\t%0, %0, %1, asr #31"[(set_attr "conds" "clob,*") (set_attr "length" "8")])(define_insn "*neg_abssi2" [(set (match_operand:SI 0 "s_register_operand" "=r,&r") (neg:SI (abs:SI (match_operand:SI 1 "s_register_operand" "0,r")))) (clobber (reg:CC 24))] "" "@ cmp\\t%0, #0\;rsbgt\\t%0, %0, #0 eor%?\\t%0, %1, %1, asr #31\;rsb%?\\t%0, %0, %1, asr #31"[(set_attr "conds" "clob,*") (set_attr "length" "8")])(define_insn "abssf2" [(set (match_operand:SF 0 "s_register_operand" "=f") (abs:SF (match_operand:SF 1 "s_register_operand" "f")))] "TARGET_HARD_FLOAT" "abs%?s\\t%0, %1"[(set_attr "type" "ffarith")])(define_insn "absdf2" [(set (match_operand:DF 0 "s_register_operand" "=f") (abs:DF (match_operand:DF 1 "s_register_operand" "f")))] "TARGET_HARD_FLOAT" "abs%?d\\t%0, %1"[(set_attr "type" "ffarith")])(define_insn "*absdf_esfdf" [(set (match_operand:DF 0 "s_register_operand" "=f") (abs:DF (float_extend:DF (match_operand:SF 1 "s_register_operand" "f"))))] "TARGET_HARD_FLOAT" "abs%?d\\t%0, %1"[(set_attr "type" "ffarith")])(define_insn "absxf2" [(set (match_operand:XF 0 "s_register_operand" "=f") (abs:XF (match_operand:XF 1 "s_register_operand" "f")))] "ENABLE_XF_PATTERNS && TARGET_HARD_FLOAT" "abs%?e\\t%0, %1"[(set_attr "type" "ffarith")])(define_insn "sqrtsf2" [(set (match_operand:SF 0 "s_register_operand" "=f") (sqrt:SF (match_operand:SF 1 "s_register_operand" "f")))] "TARGET_HARD_FLOAT" "sqt%?s\\t%0, %1"[(set_attr "type" "float_em")])(define_insn "sqrtdf2" [(set (match_operand:DF 0 "s_register_operand" "=f") (sqrt:DF (match_operand:DF 1 "s_register_operand" "f")))] "TARGET_HARD_FLOAT" "sqt%?d\\t%0, %1"[(set_attr "type" "float_em")])(define_insn "*sqrtdf_esfdf" [(set (match_operand:DF 0 "s_register_operand" "=f") (sqrt:DF (float_extend:DF (match_operand:SF 1 "s_register_operand" "f"))))] "TARGET_HARD_FLOAT" "sqt%?d\\t%0, %1"[(set_attr "type" "float_em")])(define_insn "sqrtxf2" [(set (match_operand:XF 0 "s_register_operand" "=f") (sqrt:XF (match_operand:XF 1 "s_register_operand" "f")))] "ENABLE_XF_PATTERNS && TARGET_HARD_FLOAT" "sqt%?e\\t%0, %1"[(set_attr "type" "float_em")]);; SIN COS TAN and family are always emulated, so it's probably better;; to always call a library function.;(define_insn "sinsf2"; [(set (match_operand:SF 0 "s_register_operand" "=f"); (unspec:SF [(match_operand:SF 1 "s_register_operand" "f")] 0))]; "TARGET_HARD_FLOAT"; "sin%?s\\t%0, %1";[(set_attr "type" "float_em")]);;(define_insn "sindf2"; [(set (match_operand:DF 0 "s_register_operand" "=f"); (unspec:DF [(match_operand:DF 1 "s_register_operand" "f")] 0))]; "TARGET_HARD_FLOAT"; "sin%?d\\t%0, %1";[(set_attr "type" "float_em")]);;(define_insn "*sindf_esfdf"; [(set (match_operand:DF 0 "s_register_operand" "=f"); (unspec:DF [(float_extend:DF; (match_operand:SF 1 "s_register_operand" "f"))] 0))]; "TARGET_HARD_FLOAT"; "sin%?d\\t%0, %1";[(set_attr "type" "float_em")]);;(define_insn "sinxf2"; [(set (match_operand:XF 0 "s_register_operand" "=f"); (unspec:XF [(match_operand:XF 1 "s_register_operand" "f")] 0))]; "ENABLE_XF_PATTERNS && TARGET_HARD_FLOAT"; "sin%?e\\t%0, %1";[(set_attr "type" "float_em")]);;(define_insn "cossf2"; [(set (match_operand:SF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -