📄 convex.md
字号:
[(set_attr "type" "cvts")])(define_insn "floatdisf2" [(set (match_operand:SF 0 "register_operand" "=d") (float:SF (match_operand:DI 1 "register_operand" "d")))] "" "cvtl.s %1,%0" [(set_attr "type" "cvtd")])(define_insn "floatsidf2" [(set (match_operand:DF 0 "register_operand" "=d") (float:DF (match_operand:SI 1 "register_operand" "d")))] "! TARGET_C1" "cvtw.d %1,%0" [(set_attr "type" "cvts")])(define_insn "floatdidf2" [(set (match_operand:DF 0 "register_operand" "=d") (float:DF (match_operand:DI 1 "register_operand" "d")))] "" "cvtl.d %1,%0" [(set_attr "type" "cvtd")]);; These are a little slower than gcc's normal way of doing unsigned;; DI floats (if the DI number is "negative") but they avoid double;; rounding and they avoid explicit constants.(define_expand "floatunsdidf2" [(set (match_operand:DF 0 "register_operand" "=d") (float:DF (match_operand:DI 1 "register_operand" "d"))) (set (cc0) (compare:DI (match_dup 3) (match_dup 1))) (set (pc) (if_then_else (le (cc0) (const_int 0)) (label_ref (match_dup 4)) (pc))) (set (match_dup 2) (lshiftrt:DI (match_dup 1) (const_int 1))) (set (match_dup 0) (float:DF (match_dup 2))) (set (match_dup 0) (plus:DF (match_dup 0) (match_dup 0))) (match_dup 4) (set (match_dup 0) (match_dup 0))] "" "{ operands[2] = gen_reg_rtx (DImode); operands[3] = force_reg (DImode, const0_rtx); operands[4] = gen_label_rtx ();}")(define_expand "floatunsdisf2" [(set (match_operand:SF 0 "register_operand" "=d") (float:SF (match_operand:DI 1 "register_operand" "d"))) (set (cc0) (compare:DI (match_dup 3) (match_dup 1))) (set (pc) (if_then_else (le (cc0) (const_int 0)) (label_ref (match_dup 4)) (pc))) (set (match_dup 2) (lshiftrt:DI (match_dup 1) (const_int 1))) (set (match_dup 0) (float:SF (match_dup 2))) (set (match_dup 0) (plus:SF (match_dup 0) (match_dup 0))) (match_dup 4) (set (match_dup 0) (match_dup 0))] "" "{ operands[2] = gen_reg_rtx (DImode); operands[3] = force_reg (DImode, const0_rtx); operands[4] = gen_label_rtx ();}");; These patterns are identical to gcc's default action ;; if DI->DF and DI->SF are not present. There are here;; only to prevent SI->*F from promoting to DI->*F.(define_expand "floatunssidf2" [(set (match_dup 2) (zero_extend:DI (match_operand:SI 1 "register_operand" ""))) (set (match_operand:DF 0 "register_operand" "") (float:DF (match_dup 2)))] "" "operands[2] = gen_reg_rtx (DImode);")(define_expand "floatunssisf2" [(set (match_dup 2) (zero_extend:DI (match_operand:SI 1 "register_operand" ""))) (set (match_operand:SF 0 "register_operand" "") (float:SF (match_dup 2)))] "" "operands[2] = gen_reg_rtx (DImode);");; Float-to-fix conversion insns.(define_insn "fix_truncsfsi2" [(set (match_operand:SI 0 "register_operand" "=d") (fix:SI (fix:SF (match_operand:SF 1 "register_operand" "d"))))] "" "cvts.w %1,%0" [(set_attr "type" "cvts")])(define_insn "fix_truncsfdi2" [(set (match_operand:DI 0 "register_operand" "=d") (fix:DI (fix:SF (match_operand:SF 1 "register_operand" "d"))))] "" "cvts.l %1,%0" [(set_attr "type" "cvts")])(define_insn "fix_truncdfsi2" [(set (match_operand:SI 0 "register_operand" "=d") (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "d"))))] "" "cvtd.l %1,%0" [(set_attr "type" "cvtd")])(define_insn "fix_truncdfdi2" [(set (match_operand:DI 0 "register_operand" "=d") (fix:DI (fix:DF (match_operand:DF 1 "register_operand" "d"))))] "" "cvtd.l %1,%0" [(set_attr "type" "cvtd")]);;- All kinds of add instructions.(define_insn "adddf3" [(set (match_operand:DF 0 "register_operand" "=d") (plus:DF (match_operand:DF 1 "register_operand" "%0") (match_operand:DF 2 "register_operand" "d")))] "" "add.d %2,%0" [(set_attr "type" "addd")])(define_insn "addsf3" [(set (match_operand:SF 0 "register_operand" "=d") (plus:SF (match_operand:SF 1 "register_operand" "%0") (match_operand:SF 2 "nonmemory_operand" "dF")))] "" "add.s %2,%0" [(set_attr "type" "adds")])(define_insn "adddi3" [(set (match_operand:DI 0 "register_operand" "=d") (plus:DI (match_operand:DI 1 "register_operand" "%0") (match_operand:DI 2 "register_operand" "d")))] "" "add.l %2,%0")(define_expand "addsi3" [(set (match_operand:SI 0 "register_operand" "") (plus:SI (match_operand:SI 1 "register_operand" "") (match_operand:SI 2 "nonmemory_operand" "")))] "" "")(define_insn "" [(set (match_operand:SI 0 "register_operand" "=a") (plus:SI (match_operand:SI 1 "register_operand" "%A") (match_operand:SI 2 "immediate_operand" "i")))] "operands[1] == frame_pointer_rtx || operands[1] == arg_pointer_rtx" "ldea %a2(%1),%0")(define_insn "" [(set (match_operand:SI 0 "register_operand" "=a") (plus:SI (match_operand:SI 1 "register_operand" "%a") (match_operand:SI 2 "nonmemory_operand" "ri")))] "operands[1] == stack_pointer_rtx && operands[0] != stack_pointer_rtx" "mov %1,%0\;add.w %2,%0")(define_insn "" [(set (match_operand:SI 0 "push_operand" "=<") (plus:SI (match_operand:SI 1 "register_operand" "A") (match_operand:SI 2 "immediate_operand" "i")))] "operands[1] != stack_pointer_rtx" "pshea %a2(%1)" [(set_attr "type" "mst")])(define_insn "" [(set (match_operand:SI 0 "register_operand" "=d,a,a") (plus:SI (match_operand:SI 1 "register_operand" "%0,0,A") (match_operand:SI 2 "nonmemory_operand" "di,ri,i")))] "TARGET_C1" "@ add.w %2,%0 add.w %2,%0 ldea %a2(%1),%0")(define_insn "" [(set (match_operand:SI 0 "register_operand" "=d,a,r") (plus:SI (match_operand:SI 1 "register_operand" "%0,0,A") (match_operand:SI 2 "nonmemory_operand" "di,ri,i")))] "" "@ add.w %2,%0 add.w %2,%0 ldea %a2(%1),%0")(define_insn "addhi3" [(set (match_operand:HI 0 "register_operand" "=d,a") (plus:HI (match_operand:HI 1 "register_operand" "%0,0") (match_operand:HI 2 "nonmemory_operand" "di,ai")))] "" "add.h %2,%0")(define_insn "addqi3" [(set (match_operand:QI 0 "register_operand" "=d,d") (plus:QI (match_operand:QI 1 "register_operand" "%0,0") (match_operand:QI 2 "nonmemory_operand" "d,i")))] "" "@ add.b %2,%0 add.w %2,%0");;- All kinds of subtract instructions.(define_insn "subdf3" [(set (match_operand:DF 0 "register_operand" "=d") (minus:DF (match_operand:DF 1 "register_operand" "0") (match_operand:DF 2 "register_operand" "d")))] "" "sub.d %2,%0" [(set_attr "type" "addd")])(define_insn "subsf3" [(set (match_operand:SF 0 "register_operand" "=d") (minus:SF (match_operand:SF 1 "register_operand" "0") (match_operand:SF 2 "nonmemory_operand" "dF")))] "" "sub.s %2,%0" [(set_attr "type" "adds")])(define_insn "subdi3" [(set (match_operand:DI 0 "register_operand" "=d") (minus:DI (match_operand:DI 1 "register_operand" "0") (match_operand:DI 2 "register_operand" "d")))] "" "sub.l %2,%0")(define_insn "subsi3" [(set (match_operand:SI 0 "register_operand" "=d,a,?d,?a") (minus:SI (match_operand:SI 1 "nonmemory_operand" "0,0,di,ai") (match_operand:SI 2 "nonmemory_operand" "di,ai,0,0")))] "" "@ sub.w %2,%0 sub.w %2,%0 sub.w %1,%0\;neg.w %0,%0 sub.w %1,%0\;neg.w %0,%0")(define_insn "subhi3" [(set (match_operand:HI 0 "register_operand" "=d,a") (minus:HI (match_operand:HI 1 "register_operand" "0,0") (match_operand:HI 2 "nonmemory_operand" "di,ai")))] "" "sub.h %2,%0")(define_insn "subqi3" [(set (match_operand:QI 0 "register_operand" "=d,d") (minus:QI (match_operand:QI 1 "register_operand" "0,0") (match_operand:QI 2 "nonmemory_operand" "d,i")))] "" "@ sub.b %2,%0 sub.w %2,%0");;- Multiply instructions.(define_insn "muldf3" [(set (match_operand:DF 0 "register_operand" "=d") (mult:DF (match_operand:DF 1 "register_operand" "%0") (match_operand:DF 2 "register_operand" "d")))] "" "mul.d %2,%0" [(set_attr "type" "muld")])(define_insn "mulsf3" [(set (match_operand:SF 0 "register_operand" "=d") (mult:SF (match_operand:SF 1 "register_operand" "%0") (match_operand:SF 2 "nonmemory_operand" "dF")))] "" "mul.s %2,%0" [(set_attr "type" "muls")])(define_insn "muldi3" [(set (match_operand:DI 0 "register_operand" "=d") (mult:DI (match_operand:DI 1 "register_operand" "%0") (match_operand:DI 2 "register_operand" "d")))] "" "mul.l %2,%0" [(set_attr "type" "mull")])(define_insn "mulsi3" [(set (match_operand:SI 0 "register_operand" "=d,a") (mult:SI (match_operand:SI 1 "register_operand" "%0,0") (match_operand:SI 2 "nonmemory_operand" "di,ai")))] "" "mul.w %2,%0" [(set_attr "type" "mulw")])(define_insn "mulhi3" [(set (match_operand:HI 0 "register_operand" "=d,a") (mult:HI (match_operand:HI 1 "register_operand" "%0,0") (match_operand:HI 2 "nonmemory_operand" "di,ai")))] "" "mul.h %2,%0" [(set_attr "type" "mulw")])(define_insn "mulqi3" [(set (match_operand:QI 0 "register_operand" "=d,d") (mult:QI (match_operand:QI 1 "register_operand" "%0,0") (match_operand:QI 2 "nonmemory_operand" "d,i")))] "" "@ mul.b %2,%0 mul.w %2,%0" [(set_attr "type" "mulw,mulw")]);;- Divide instructions.(define_insn "divdf3" [(set (match_operand:DF 0 "register_operand" "=d") (div:DF (match_operand:DF 1 "register_operand" "0") (match_operand:DF 2 "register_operand" "d")))] "" "div.d %2,%0" [(set_attr "type" "divd")])(define_insn "divsf3" [(set (match_operand:SF 0 "register_operand" "=d") (div:SF (match_operand:SF 1 "register_operand" "0") (match_operand:SF 2 "nonmemory_operand" "dF")))] "" "div.s %2,%0" [(set_attr "type" "divs")])(define_insn "divdi3" [(set (match_operand:DI 0 "register_operand" "=d") (div:DI (match_operand:DI 1 "register_operand" "0") (match_operand:DI 2 "register_operand" "d")))] "" "div.l %2,%0" [(set_attr "type" "divl")])(define_expand "udivsi3" [(set (match_dup 3) (zero_extend:DI (match_operand:SI 1 "register_operand" ""))) (set (match_dup 4) (zero_extend:DI (match_operand:SI 2 "register_operand" ""))) (set (match_dup 3) (div:DI (match_dup 3) (match_dup 4))) (set (match_operand:SI 0 "register_operand" "") (subreg:SI (match_dup 3) 0))] "" "operands[3] = gen_reg_rtx (DImode); operands[4] = gen_reg_rtx (DImode); ")(define_insn "udivdi3" [(set (match_operand:DI 0 "register_operand" "=d") (udiv:DI (match_operand:DI 1 "register_operand" "d") (match_operand:DI 2 "register_operand" "d")))] "" "psh.l %2\;psh.l %1\;callq udiv64\;pop.l %0\;add.w #8,sp")(define_insn "divsi3" [(set (match_operand:SI 0 "register_operand" "=d,a") (div:SI (match_operand:SI 1 "register_operand" "0,0") (match_operand:SI 2 "nonmemory_operand" "di,ai")))] "" "div.w %2,%0" [(set_attr "type" "divw")])(define_insn "divhi3" [(set (match_operand:HI 0 "register_operand" "=d,a") (div:HI (match_operand:HI 1 "register_operand" "0,0") (match_operand:HI 2 "nonmemory_operand" "di,ai")))] "" "div.h %2,%0" [(set_attr "type" "divw")])(define_insn "divqi3" [(set (match_operand:QI 0 "register_operand" "=d") (div:QI (match_operand:QI 1 "register_operand" "0") (match_operand:QI 2 "register_operand" "d")))] "" "div.b %2,%0" [(set_attr "type" "divw")]);;- Bit clear instructions.(define_insn "" [(set (match_operand:DI 0 "register_operand" "=d") (and:DI (match_operand:DI 1 "register_operand" "%0") (match_operand:DI 2 "" "")))] "(GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0) || (GET_CODE (operands[2]) == CONST_DOUBLE && CONST_DOUBLE_HIGH (operands[2]) == -1)" "and %2,%0")(define_insn "anddi3" [(set (match_operand:DI 0 "register_operand" "=d") (and:DI (match_operand:DI 1 "register_operand" "%0") (match_operand:DI 2 "register_operand" "d")))] "" "and %2,%0")(define_insn "andsi3" [(set (match_operand:SI 0 "register_operand" "=d,a") (and:SI (match_operand:SI 1 "register_operand" "%0,0") (match_operand:SI 2 "nonmemory_operand" "di,ai")))] "" "and %2,%0")(define_insn "andhi3" [(set (match_operand:HI 0 "register_operand" "=d,a") (and:HI (match_operand:HI 1 "register_operand" "%0,0") (match_operand:HI 2 "nonmemory_operand" "di,ai")))] "" "and %2,%0")(define_insn "andqi3" [(set (match_operand:QI 0 "register_operand" "=d,a") (and:QI (match_operand:QI 1 "register_operand" "%0,0") (match_operand:QI 2 "nonmemory_operand" "di,ai")))] "" "and %2,%0");;- Bit set instructions.(define_insn "" [(set (match_operand:DI 0 "register_operand" "=d") (ior:DI (match_operand:DI 1 "register_operand" "%0") (match_operand:DI 2 "" "")))] "(GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 0) || (GET_CODE (operands[2]) == CONST_DOUBLE && CONST_DOUBLE_HIGH (operands[2]) == 0)" "or %2,%0")(define_insn "iordi3" [(set (match_operand:DI 0 "register_operand" "=d") (ior:DI (match_operand:DI 1 "register_operand" "%0") (match_operand:DI 2 "register_operand" "d")))] "" "or %2,%0")(define_insn "iorsi3" [(set (match_operand:SI 0 "register_operand" "=d,a") (ior:SI (match_operand:SI 1 "register_operand" "%0,0") (match_operand:SI 2 "nonmemory_operand" "di,ai")))] "" "or %2,%0")(define_insn "iorhi3" [(set (match_operand:HI 0 "register_operand" "=d,a") (ior:HI (match_operand:HI 1 "register_operand" "%0,0") (match_operand:HI 2 "nonmemory_operand" "di,ai")))] "" "or %2,%0")(define_insn "iorqi3" [(set (match_operand:QI 0 "register_operand" "=d,a") (ior:QI (match_operand:QI 1 "register_operand" "%0,0") (match_operand:QI 2 "nonmemory_operand" "di,ai")))] "" "or %2,%0");;- xor instructions.(define_insn "" [(set (match_operand:DI 0 "register_operand" "=d") (xor:DI (match_operand:DI 1 "register_operand" "%0") (match_operand:DI 2 "" "")))] "(GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 0) || (GET_CODE (operands[2]) == CONST_DOUBLE && CONST_DOUBLE_HIGH (operands[2]) == 0)" "xor %2,%0")
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -