📄 vect.md
字号:
"%,movl %0 = %v1", "%,ld8%O1 %0 = %1%P1", "%,st8%Q0 %0 = %r1%P0", "%,setf.sig %0 = %1", "%,getf.sig %0 = %1" }; if (which_alternative == 1) { operands[2] = XVECEXP (operands[1], 0, 1); operands[1] = XVECEXP (operands[1], 0, 0); } return alt[which_alternative];} [(set_attr "itanium_class" "fmisc,fmisc,fld,stf,ialu,ialu,long_i,ld,st,tofr,frfr")])(define_insn "absv2sf2" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (abs:V2SF (match_operand:V2SF 1 "fr_register_operand" "f")))] "" "fpabs %0 = %1" [(set_attr "itanium_class" "fmisc")])(define_insn "negv2sf2" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (neg:V2SF (match_operand:V2SF 1 "fr_register_operand" "f")))] "" "fpneg %0 = %1" [(set_attr "itanium_class" "fmisc")])(define_insn "*negabsv2sf2" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (neg:V2SF (abs:V2SF (match_operand:V2SF 1 "fr_register_operand" "f"))))] "" "fpnegabs %0 = %1" [(set_attr "itanium_class" "fmisc")]);; In order to convince combine to merge plus and mult to a useful fpma,;; we need a couple of extra patterns.(define_expand "addv2sf3" [(parallel [(set (match_operand:V2SF 0 "fr_register_operand" "") (plus:V2SF (match_operand:V2SF 1 "fr_register_operand" "") (match_operand:V2SF 2 "fr_register_operand" ""))) (use (match_dup 3))])] ""{ rtvec v = gen_rtvec (2, CONST1_RTX (SFmode), CONST1_RTX (SFmode)); operands[3] = force_reg (V2SFmode, gen_rtx_CONST_VECTOR (V2SFmode, v));});; The split condition here could be combine_completed, if we had such.(define_insn_and_split "*addv2sf3_1" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (plus:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") (match_operand:V2SF 2 "fr_register_operand" "f"))) (use (match_operand:V2SF 3 "fr_register_operand" "f"))] "" "#" "reload_completed" [(set (match_dup 0) (plus:V2SF (mult:V2SF (match_dup 1) (match_dup 3)) (match_dup 2)))] "")(define_insn_and_split "*addv2sf3_2" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (plus:V2SF (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") (match_operand:V2SF 2 "fr_register_operand" "f")) (match_operand:V2SF 3 "fr_register_operand" "f"))) (use (match_operand:V2SF 4 "" "X"))] "" "#" "" [(set (match_dup 0) (plus:V2SF (mult:V2SF (match_dup 1) (match_dup 2)) (match_dup 3)))] "");; In order to convince combine to merge minus and mult to a useful fpms,;; we need a couple of extra patterns.(define_expand "subv2sf3" [(parallel [(set (match_operand:V2SF 0 "fr_register_operand" "") (minus:V2SF (match_operand:V2SF 1 "fr_register_operand" "") (match_operand:V2SF 2 "fr_register_operand" ""))) (use (match_dup 3))])] ""{ rtvec v = gen_rtvec (2, CONST1_RTX (SFmode), CONST1_RTX (SFmode)); operands[3] = force_reg (V2SFmode, gen_rtx_CONST_VECTOR (V2SFmode, v));});; The split condition here could be combine_completed, if we had such.(define_insn_and_split "*subv2sf3_1" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (minus:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") (match_operand:V2SF 2 "fr_register_operand" "f"))) (use (match_operand:V2SF 3 "fr_register_operand" "f"))] "" "#" "reload_completed" [(set (match_dup 0) (minus:V2SF (mult:V2SF (match_dup 1) (match_dup 3)) (match_dup 2)))] "")(define_insn_and_split "*subv2sf3_2" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (minus:V2SF (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") (match_operand:V2SF 2 "fr_register_operand" "f")) (match_operand:V2SF 3 "fr_register_operand" "f"))) (use (match_operand:V2SF 4 "" "X"))] "" "#" "" [(set (match_dup 0) (minus:V2SF (mult:V2SF (match_dup 1) (match_dup 2)) (match_dup 3)))] "")(define_insn "mulv2sf3" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") (match_operand:V2SF 2 "fr_register_operand" "f")))] "" "fpmpy %0 = %1, %2" [(set_attr "itanium_class" "fmac")])(define_insn "*fpma" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (plus:V2SF (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") (match_operand:V2SF 2 "fr_register_operand" "f")) (match_operand:V2SF 3 "fr_register_operand" "f")))] "" "fpma %0 = %1, %2, %3" [(set_attr "itanium_class" "fmac")])(define_insn "*fpms" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (minus:V2SF (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") (match_operand:V2SF 2 "fr_register_operand" "f")) (match_operand:V2SF 3 "fr_register_operand" "f")))] "" "fpms %0 = %1, %2, %3" [(set_attr "itanium_class" "fmac")])(define_insn "*fpnmpy" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (neg:V2SF (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") (match_operand:V2SF 2 "fr_register_operand" "f"))))] "" "fpnmpy %0 = %1, %2" [(set_attr "itanium_class" "fmac")])(define_insn "*fpnma" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (plus:V2SF (neg:V2SF (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") (match_operand:V2SF 2 "fr_register_operand" "f"))) (match_operand:V2SF 3 "fr_register_operand" "f")))] "" "fpnma %0 = %1, %2, %3" [(set_attr "itanium_class" "fmac")])(define_insn "smaxv2sf3" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (smax:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") (match_operand:V2SF 2 "fr_register_operand" "f")))] "" "fpmax %0 = %1, %2" [(set_attr "itanium_class" "fmisc")])(define_insn "sminv2sf3" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (smin:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") (match_operand:V2SF 2 "fr_register_operand" "f")))] "" "fpmin %0 = %1, %2" [(set_attr "itanium_class" "fmisc")])(define_expand "reduc_splus_v2sf" [(match_operand:V2SF 0 "fr_register_operand" "") (match_operand:V2SF 1 "fr_register_operand" "")] ""{ rtx tmp = gen_reg_rtx (V2SFmode); emit_insn (gen_fswap (tmp, operands[1], CONST0_RTX (V2SFmode))); emit_insn (gen_addv2sf3 (operands[0], operands[1], tmp)); DONE;})(define_expand "reduc_smax_v2sf" [(match_operand:V2SF 0 "fr_register_operand" "") (match_operand:V2SF 1 "fr_register_operand" "")] ""{ rtx tmp = gen_reg_rtx (V2SFmode); emit_insn (gen_fswap (tmp, operands[1], CONST0_RTX (V2SFmode))); emit_insn (gen_smaxv2sf3 (operands[0], operands[1], tmp)); DONE;})(define_expand "reduc_smin_v2sf" [(match_operand:V2SF 0 "fr_register_operand" "") (match_operand:V2SF 1 "fr_register_operand" "")] ""{ rtx tmp = gen_reg_rtx (V2SFmode); emit_insn (gen_fswap (tmp, operands[1], CONST0_RTX (V2SFmode))); emit_insn (gen_sminv2sf3 (operands[0], operands[1], tmp)); DONE;})(define_expand "vcondv2sf" [(set (match_operand:V2SF 0 "fr_register_operand" "") (if_then_else:V2SF (match_operator 3 "" [(match_operand:V2SF 4 "fr_reg_or_0_operand" "") (match_operand:V2SF 5 "fr_reg_or_0_operand" "")]) (match_operand:V2SF 1 "fr_reg_or_0_operand" "") (match_operand:V2SF 2 "fr_reg_or_0_operand" "")))] ""{ rtx x, cmp; cmp = gen_reg_rtx (V2SFmode); PUT_MODE (operands[3], V2SFmode); emit_insn (gen_rtx_SET (VOIDmode, cmp, operands[3])); x = gen_rtx_IF_THEN_ELSE (V2SFmode, cmp, operands[1], operands[2]); emit_insn (gen_rtx_SET (VOIDmode, operands[0], x)); DONE;})(define_insn "*fpcmp" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (match_operator:V2SF 3 "comparison_operator" [(match_operand:V2SF 1 "fr_reg_or_0_operand" "fU") (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU")]))] "" "fpcmp.%D3 %0 = %F1, %F2" [(set_attr "itanium_class" "fmisc")])(define_insn "*fselect" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (if_then_else:V2SF (match_operand:V2SF 1 "fr_register_operand" "f") (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU") (match_operand:V2SF 3 "fr_reg_or_0_operand" "fU")))] "" "fselect %0 = %F2, %F3, %1" [(set_attr "itanium_class" "fmisc")])(define_expand "vec_initv2sf" [(match_operand:V2SF 0 "fr_register_operand" "") (match_operand 1 "" "")] ""{ rtx op1 = XVECEXP (operands[1], 0, 0); rtx op2 = XVECEXP (operands[1], 0, 1); rtx x; if (GET_CODE (op1) == CONST_DOUBLE && GET_CODE (op2) == CONST_DOUBLE) { x = gen_rtx_CONST_VECTOR (V2SFmode, XVEC (operands[1], 0)); emit_move_insn (operands[0], x); DONE; } if (!fr_reg_or_fp01_operand (op1, SFmode)) op1 = force_reg (SFmode, op1); if (!fr_reg_or_fp01_operand (op2, SFmode)) op2 = force_reg (SFmode, op2); if (TARGET_BIG_ENDIAN) emit_insn (gen_fpack (operands[0], op2, op1)); else emit_insn (gen_fpack (operands[0], op1, op2)); DONE;})(define_insn "fpack" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (vec_concat:V2SF (match_operand:SF 1 "fr_reg_or_fp01_operand" "fG") (match_operand:SF 2 "fr_reg_or_fp01_operand" "fG")))] "" "fpack %0 = %F2, %F1" [(set_attr "itanium_class" "fmisc")])(define_insn "fswap" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (vec_select:V2SF (vec_concat:V4SF (match_operand:V2SF 1 "fr_reg_or_0_operand" "fU") (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU")) (parallel [(const_int 1) (const_int 2)])))] "" "fswap %0 = %F1, %F2" [(set_attr "itanium_class" "fmisc")])(define_insn "*fmix_l" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (vec_select:V2SF (vec_concat:V4SF (match_operand:V2SF 1 "fr_reg_or_0_operand" "fU") (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU")) (parallel [(const_int 1) (const_int 3)])))] "" "fmix.l %0 = %F2, %F1" [(set_attr "itanium_class" "fmisc")])(define_insn "fmix_r" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (vec_select:V2SF (vec_concat:V4SF (match_operand:V2SF 1 "fr_reg_or_0_operand" "fU") (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU")) (parallel [(const_int 0) (const_int 2)])))] "" "fmix.r %0 = %F2, %F1" [(set_attr "itanium_class" "fmisc")])(define_insn "fmix_lr" [(set (match_operand:V2SF 0 "fr_register_operand" "=f") (vec_select:V2SF (vec_concat:V4SF (match_operand:V2SF 1 "fr_reg_or_0_operand" "fU") (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU")) (parallel [(const_int 0) (const_int 3)])))] "" "fmix.lr %0 = %F2, %F1" [(set_attr "itanium_class" "fmisc")])(define_expand "vec_setv2sf" [(match_operand:V2SF 0 "fr_register_operand" "") (match_operand:SF 1 "fr_register_operand" "") (match_operand 2 "const_int_operand" "")] ""{ rtx tmp = gen_reg_rtx (V2SFmode); emit_insn (gen_fpack (tmp, operands[1], CONST0_RTX (SFmode))); switch (INTVAL (operands[2])) { case 0: emit_insn (gen_fmix_lr (operands[0], tmp, operands[0])); break; case 1: emit_insn (gen_fmix_r (operands[0], operands[0], tmp)); break; default: gcc_unreachable (); } DONE;})(define_insn_and_split "*vec_extractv2sf_0_le" [(set (match_operand:SF 0 "nonimmediate_operand" "=r,f,m") (unspec:SF [(match_operand:V2SF 1 "nonimmediate_operand" "rfm,rm,r") (const_int 0)] UNSPEC_VECT_EXTR))] "!TARGET_BIG_ENDIAN" "#" "reload_completed" [(set (match_dup 0) (match_dup 1))]{ if (REG_P (operands[1]) && FR_REGNO_P (REGNO (operands[1]))) operands[0] = gen_rtx_REG (V2SFmode, REGNO (operands[0])); else if (MEM_P (operands[1])) operands[1] = adjust_address (operands[1], SFmode, 0); else operands[1] = gen_rtx_REG (SFmode, REGNO (operands[1]));})(define_insn_and_split "*vec_extractv2sf_0_be" [(set (match_operand:SF 0 "register_operand" "=r,f") (unspec:SF [(match_operand:V2SF 1 "register_operand" "rf,r") (const_int 0)] UNSPEC_VECT_EXTR))] "TARGET_BIG_ENDIAN" "#" "reload_completed" [(set (match_dup 0) (match_dup 1))]{ if (REG_P (operands[1]) && FR_REGNO_P (REGNO (operands[1]))) operands[0] = gen_rtx_REG (V2SFmode, REGNO (operands[0])); else operands[1] = gen_rtx_REG (SFmode, REGNO (operands[1]));})(define_insn_and_split "*vec_extractv2sf_1" [(set (match_operand:SF 0 "register_operand" "=r") (unspec:SF [(match_operand:V2SF 1 "register_operand" "r") (const_int 1)] UNSPEC_VECT_EXTR))] "" "#" "reload_completed" [(const_int 0)]{ operands[0] = gen_rtx_REG (DImode, REGNO (operands[0])); operands[1] = gen_rtx_REG (DImode, REGNO (operands[1])); if (TARGET_BIG_ENDIAN) emit_move_insn (operands[0], operands[1]); else emit_insn (gen_lshrdi3 (operands[0], operands[1], GEN_INT (32))); DONE;})(define_expand "vec_extractv2sf" [(set (match_operand:SF 0 "register_operand" "") (unspec:SF [(match_operand:V2SF 1 "register_operand" "") (match_operand:DI 2 "const_int_operand" "")] UNSPEC_VECT_EXTR))] "" "");; Missing operations;; fprcpa;; fpsqrta
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -