📄 arm.md
字号:
(match_operand:DI 2 "s_register_operand" "r,0")))] "" "and%?\\t%0, %1, %2\;and%?\\t%R0, %R1, %R2"[(set_attr "length" "8")])(define_insn "" [(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%0, %1, %2\;mov%?\\t%R0, #0"[(set_attr "length" "8")])(define_insn "" [(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%0, %1, %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 "" [(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 "" [(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 "" [(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 "" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (zero_extract:SI (match_operand:SI 0 "s_register_operand" "r") (match_operand:SI 1 "immediate_operand" "n") (match_operand:SI 2 "immediate_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" "*{ unsigned int mask = 0; int cnt = INTVAL (operands[1]); while (cnt--) mask = (mask << 1) | 1; operands[1] = GEN_INT (mask << INTVAL (operands[2])); output_asm_insn (\"tst%?\\t%0, %1\", operands); return \"\";}"[(set_attr "conds" "set")])(define_insn "" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (zero_extract:SI (match_operand:QI 0 "memory_operand" "m") (match_operand 1 "immediate_operand" "n") (match_operand 2 "immediate_operand" "n")) (const_int 0))) (clobber (match_scratch:QI 3 "=r"))] "INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) < 8 && INTVAL (operands[1]) > 0 && INTVAL (operands[1]) <= 8" "*{ unsigned int mask = 0; int cnt = INTVAL (operands[1]); while (cnt--) mask = (mask << 1) | 1; operands[1] = GEN_INT (mask << INTVAL (operands[2])); output_asm_insn (\"ldr%?b\\t%3, %0\", operands); output_asm_insn (\"tst%?\\t%3, %1\", operands); return \"\";}"[(set_attr "conds" "set") (set_attr "length" "8")]);; constants for op 2 will never be given to these patterns.(define_insn "" [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") (and:DI (not:DI (match_operand:DI 2 "s_register_operand" "r,0")) (match_operand:DI 1 "s_register_operand" "0,r")))] "" "bic%?\\t%0, %1, %2\;bic%?\\t%R0, %R1, %R2"[(set_attr "length" "8")]) (define_insn "" [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") (and:DI (not:DI (zero_extend:DI (match_operand:SI 2 "s_register_operand" "r,r"))) (match_operand:DI 1 "s_register_operand" "0,?r")))] "" "@ bic%?\\t%0, %1, %2 bic%?\\t%0, %1, %2\;mov%?\\t%R0, %R1"[(set_attr "length" "4,8")]) (define_insn "" [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") (and:DI (not:DI (sign_extend:DI (match_operand:SI 2 "s_register_operand" "r,r"))) (match_operand:DI 1 "s_register_operand" "?r,0")))] "" "bic%?\\t%0, %1, %2\;bic%?\\t%R0, %R1, %2, asr #31"[(set_attr "length" "8")]) (define_insn "" [(set (match_operand:SI 0 "s_register_operand" "=r") (and:SI (not:SI (match_operand:SI 2 "s_register_operand" "r")) (match_operand:SI 1 "s_register_operand" "r")))] "" "bic%?\\t%0, %1, %2")(define_insn "" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (and:SI (not:SI (match_operand:SI 2 "s_register_operand" "r")) (match_operand:SI 1 "s_register_operand" "r")) (const_int 0))) (set (match_operand:SI 0 "s_register_operand" "=r") (and:SI (not:SI (match_dup 2)) (match_dup 1)))] "" "bic%?s\\t%0, %1, %2"[(set_attr "conds" "set")])(define_insn "" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (and:SI (not:SI (match_operand:SI 2 "s_register_operand" "r")) (match_operand:SI 1 "s_register_operand" "r")) (const_int 0))) (clobber (match_scratch:SI 0 "=r"))] "" "bic%?s\\t%0, %1, %2"[(set_attr "conds" "set")])(define_insn "iordi3" [(set (match_operand:DI 0 "s_register_operand" "=&r") (ior:DI (match_operand:DI 1 "s_register_operand" "%0") (match_operand:DI 2 "s_register_operand" "r")))] "" "orr%?\\t%0, %1, %2\;orr%?\\t%R0, %R1, %R2"[(set_attr "length" "8")])(define_insn "" [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") (ior:DI (zero_extend:DI (match_operand:SI 2 "s_register_operand" "r,r")) (match_operand:DI 1 "s_register_operand" "0,?r")))] "" "@ orr%?\\t%0, %1, %2 orr%?\\t%0, %1, %2\;mov%?\\t%R0, %R1"[(set_attr "length" "4,8")])(define_insn "" [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") (ior:DI (sign_extend:DI (match_operand:SI 2 "s_register_operand" "r,r")) (match_operand:DI 1 "s_register_operand" "?r,0")))] "" "orr%?\\t%0, %1, %2\;orr%?\\t%R0, %R1, %2, asr #31"[(set_attr "length" "8")])(define_expand "iorsi3" [(set (match_operand:SI 0 "s_register_operand" "") (ior: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 (IOR, SImode, INTVAL (operands[2]), operands[0], operands[1], (reload_in_progress || reload_completed ? 0 : preserve_subexpressions_p ())); DONE; }")(define_insn "" [(set (match_operand:SI 0 "s_register_operand" "=r,r") (ior:SI (match_operand:SI 1 "s_register_operand" "r,r") (match_operand:SI 2 "reg_or_int_operand" "rI,?n")))] "" "@ orr%?\\t%0, %1, %2 #"[(set_attr "length" "4,16")])(define_split [(set (match_operand:SI 0 "s_register_operand" "") (ior:SI (match_operand:SI 1 "s_register_operand" "") (match_operand:SI 2 "const_int_operand" "")))] "! const_ok_for_arm (INTVAL (operands[2]))" [(clobber (const_int 0))] " arm_split_constant (IOR, SImode, INTVAL (operands[2]), operands[0], operands[1], 0); DONE;") (define_insn "" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" "%r") (match_operand:SI 2 "arm_rhs_operand" "rI")) (const_int 0))) (set (match_operand:SI 0 "s_register_operand" "=r") (ior:SI (match_dup 1) (match_dup 2)))] "" "orr%?s\\t%0, %1, %2"[(set_attr "conds" "set")])(define_insn "" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (ior:SI (match_operand:SI 1 "s_register_operand" "%r") (match_operand:SI 2 "arm_rhs_operand" "rI")) (const_int 0))) (clobber (match_scratch:SI 0 "=r"))] "" "orr%?s\\t%0, %1, %2"[(set_attr "conds" "set")])(define_insn "xordi3" [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") (xor:DI (match_operand:DI 1 "s_register_operand" "%0,0") (match_operand:DI 2 "s_register_operand" "r,0")))] "" "eor%?\\t%0, %1, %2\;eor%?\\t%R0, %R1, %R2"[(set_attr "length" "8")])(define_insn "" [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") (xor:DI (zero_extend:DI (match_operand:SI 2 "s_register_operand" "r,r")) (match_operand:DI 1 "s_register_operand" "0,?r")))] "" "@ eor%?\\t%0, %1, %2 eor%?\\t%0, %1, %2\;mov%?\\t%R0, %R1"[(set_attr "length" "4,8")])(define_insn "" [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") (xor:DI (sign_extend:DI (match_operand:SI 2 "s_register_operand" "r,r")) (match_operand:DI 1 "s_register_operand" "?r,0")))] "" "eor%?\\t%0, %1, %2\;eor%?\\t%R0, %R1, %2, asr #31"[(set_attr "length" "8")])(define_insn "xorsi3" [(set (match_operand:SI 0 "s_register_operand" "=r") (xor:SI (match_operand:SI 1 "s_register_operand" "r") (match_operand:SI 2 "arm_rhs_operand" "rI")))] "" "eor%?\\t%0, %1, %2")(define_insn "" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (xor:SI (match_operand:SI 1 "s_register_operand" "r") (match_operand:SI 2 "arm_rhs_operand" "rI")) (const_int 0))) (set (match_operand:SI 0 "s_register_operand" "=r") (xor:SI (match_dup 1) (match_dup 2)))] "" "eor%?s\\t%0, %1, %2"[(set_attr "conds" "set")])(define_insn "" [(set (reg:CC_NOOV 24) (compare:CC_NOOV (xor:SI (match_operand:SI 0 "s_register_operand" "r") (match_operand:SI 1 "arm_rhs_operand" "rI")) (const_int 0)))] "" "teq%?\\t%0, %1"[(set_attr "conds" "set")]);; by splitting (IOR (AND (NOT A) (NOT B)) C) as D = AND (IOR A B) (NOT C), ;; (NOT D) we can sometimes merge the final NOT into one of the following;; insns(define_split [(set (match_operand:SI 0 "s_register_operand" "=r") (ior:SI (and:SI (not:SI (match_operand:SI 1 "s_register_operand" "r")) (not:SI (match_operand:SI 2 "arm_rhs_operand" "rI"))) (match_operand:SI 3 "arm_rhs_operand" "rI"))) (clobber (match_operand:SI 4 "s_register_operand" "=r"))] "" [(set (match_dup 4) (and:SI (ior:SI (match_dup 1) (match_dup 2)) (not:SI (match_dup 3)))) (set (match_dup 0) (not:SI (match_dup 4)))] "")(define_insn "" [(set (match_operand:SI 0 "s_register_operand" "=&r,&r,&r") (and:SI (ior:SI (match_operand:SI 1 "s_register_operand" "r,r,0") (match_operand:SI 2 "arm_rhs_operand" "rI,0,rI")) (not:SI (match_operand:SI 3 "arm_rhs_operand" "rI,rI,rI"))))] "" "orr%?\\t%0, %1, %2\;bic%?\\t%0, %0, %3"[(set_attr "length" "8")]);; 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")])
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -