📄 sse.md
字号:
(set_attr "mode" "V2SF,V4SF,V2SF")])(define_insn "sse_loadlps" [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,m") (vec_concat:V4SF (match_operand:V2SF 2 "nonimmediate_operand" "0,m,x") (vec_select:V2SF (match_operand:V4SF 1 "nonimmediate_operand" "x,0,0") (parallel [(const_int 2) (const_int 3)]))))] "TARGET_SSE" "@ shufps\t{$0xe4, %1, %0|%0, %1, 0xe4} movlps\t{%2, %0|%0, %2} movlps\t{%2, %0|%0, %2}" [(set_attr "type" "sselog,ssemov,ssemov") (set_attr "mode" "V4SF,V2SF,V2SF")])(define_insn "sse_movss" [(set (match_operand:V4SF 0 "register_operand" "=x") (vec_merge:V4SF (match_operand:V4SF 2 "register_operand" "x") (match_operand:V4SF 1 "register_operand" "0") (const_int 1)))] "TARGET_SSE" "movss\t{%2, %0|%0, %2}" [(set_attr "type" "ssemov") (set_attr "mode" "SF")])(define_insn "*vec_dupv4sf" [(set (match_operand:V4SF 0 "register_operand" "=x") (vec_duplicate:V4SF (match_operand:SF 1 "register_operand" "0")))] "TARGET_SSE" "shufps\t{$0, %0, %0|%0, %0, 0}" [(set_attr "type" "sselog1") (set_attr "mode" "V4SF")]);; ??? In theory we can match memory for the MMX alternative, but allowing;; nonimmediate_operand for operand 2 and *not* allowing memory for the SSE;; alternatives pretty much forces the MMX alternative to be chosen.(define_insn "*sse_concatv2sf" [(set (match_operand:V2SF 0 "register_operand" "=x,x,*y,*y") (vec_concat:V2SF (match_operand:SF 1 "nonimmediate_operand" " 0,m, 0, m") /* APPLE LOCAL mainline candidate 4283414 */ (match_operand:SF 2 "nonimmediate_or_0_operand" " x,C,*y, C")))] "TARGET_SSE" "@ unpcklps\t{%2, %0|%0, %2} movss\t{%1, %0|%0, %1} punpckldq\t{%2, %0|%0, %2} movd\t{%1, %0|%0, %1}" [(set_attr "type" "sselog,ssemov,mmxcvt,mmxmov") (set_attr "mode" "V4SF,SF,DI,DI")])(define_insn "*sse_concatv4sf" [(set (match_operand:V4SF 0 "register_operand" "=x,x") (vec_concat:V4SF (match_operand:V2SF 1 "register_operand" " 0,0") (match_operand:V2SF 2 "nonimmediate_operand" " x,m")))] "TARGET_SSE" "@ movlhps\t{%2, %0|%0, %2} movhps\t{%2, %0|%0, %2}" [(set_attr "type" "ssemov") (set_attr "mode" "V4SF,V2SF")])(define_expand "vec_initv4sf" [(match_operand:V4SF 0 "register_operand" "") (match_operand 1 "" "")] "TARGET_SSE"{ ix86_expand_vector_init (false, operands[0], operands[1]); DONE;})(define_insn "*vec_setv4sf_0" [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,Y ,m") (vec_merge:V4SF (vec_duplicate:V4SF (match_operand:SF 2 "general_operand" " x,m,*r,x*rfF")) /* APPLE LOCAL mainline candidate 4283414 */ (match_operand:V4SF 1 "nonimmediate_or_0_operand" " 0,C,C ,0") (const_int 1)))] "TARGET_SSE" "@ movss\t{%2, %0|%0, %2} movss\t{%2, %0|%0, %2} movd\t{%2, %0|%0, %2} #" [(set_attr "type" "ssemov") (set_attr "mode" "SF")])(define_split [(set (match_operand:V4SF 0 "memory_operand" "") (vec_merge:V4SF (vec_duplicate:V4SF (match_operand:SF 1 "nonmemory_operand" "")) (match_dup 0) (const_int 1)))] "TARGET_SSE && reload_completed" [(const_int 0)]{ emit_move_insn (adjust_address (operands[0], SFmode, 0), operands[1]); DONE;})(define_expand "vec_setv4sf" [(match_operand:V4SF 0 "register_operand" "") (match_operand:SF 1 "register_operand" "") (match_operand 2 "const_int_operand" "")] "TARGET_SSE"{ ix86_expand_vector_set (false, operands[0], operands[1], INTVAL (operands[2])); DONE;})(define_insn_and_split "*vec_extractv4sf_0" [(set (match_operand:SF 0 "nonimmediate_operand" "=x,m,fr") (vec_select:SF (match_operand:V4SF 1 "nonimmediate_operand" "xm,x,m") (parallel [(const_int 0)])))] "TARGET_SSE && !(MEM_P (operands[0]) && MEM_P (operands[1]))" "#" "&& reload_completed" [(const_int 0)]{ rtx op1 = operands[1]; if (REG_P (op1)) op1 = gen_rtx_REG (SFmode, REGNO (op1)); else op1 = gen_lowpart (SFmode, op1); emit_move_insn (operands[0], op1); DONE;})(define_expand "vec_extractv4sf" [(match_operand:SF 0 "register_operand" "") (match_operand:V4SF 1 "register_operand" "") (match_operand 2 "const_int_operand" "")] "TARGET_SSE"{ ix86_expand_vector_extract (false, operands[0], operands[1], INTVAL (operands[2])); DONE;});;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Parallel double-precision floating point arithmetic;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;(define_expand "negv2df2" [(set (match_operand:V2DF 0 "register_operand" "") (neg:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "")))] "TARGET_SSE2" "ix86_expand_fp_absneg_operator (NEG, V2DFmode, operands); DONE;")(define_expand "absv2df2" [(set (match_operand:V2DF 0 "register_operand" "") (abs:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "")))] "TARGET_SSE2" "ix86_expand_fp_absneg_operator (ABS, V2DFmode, operands); DONE;")(define_expand "addv2df3" [(set (match_operand:V2DF 0 "register_operand" "") (plus:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "") (match_operand:V2DF 2 "nonimmediate_operand" "")))] "TARGET_SSE2" "ix86_fixup_binary_operands_no_copy (PLUS, V2DFmode, operands);")(define_insn "*addv2df3" [(set (match_operand:V2DF 0 "register_operand" "=x") (plus:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "%0") (match_operand:V2DF 2 "nonimmediate_operand" "xm")))] "TARGET_SSE2 && ix86_binary_operator_ok (PLUS, V2DFmode, operands)" "addpd\t{%2, %0|%0, %2}" [(set_attr "type" "sseadd") (set_attr "mode" "V2DF")])(define_insn "sse2_vmaddv2df3" [(set (match_operand:V2DF 0 "register_operand" "=x") (vec_merge:V2DF (plus:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "%0") (match_operand:V2DF 2 "nonimmediate_operand" "xm")) (match_dup 1) (const_int 1)))] "TARGET_SSE2 && ix86_binary_operator_ok (PLUS, V4SFmode, operands)" "addsd\t{%2, %0|%0, %2}" [(set_attr "type" "sseadd") (set_attr "mode" "DF")])(define_expand "subv2df3" [(set (match_operand:V2DF 0 "register_operand" "") (minus:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "") (match_operand:V2DF 2 "nonimmediate_operand" "")))] "TARGET_SSE2" "ix86_fixup_binary_operands_no_copy (MINUS, V2DFmode, operands);")(define_insn "*subv2df3" [(set (match_operand:V2DF 0 "register_operand" "=x") (minus:V2DF (match_operand:V2DF 1 "register_operand" "0") (match_operand:V2DF 2 "nonimmediate_operand" "xm")))] "TARGET_SSE2" "subpd\t{%2, %0|%0, %2}" [(set_attr "type" "sseadd") (set_attr "mode" "V2DF")])(define_insn "sse2_vmsubv2df3" [(set (match_operand:V2DF 0 "register_operand" "=x") (vec_merge:V2DF (minus:V2DF (match_operand:V2DF 1 "register_operand" "0") (match_operand:V2DF 2 "nonimmediate_operand" "xm")) (match_dup 1) (const_int 1)))] "TARGET_SSE2" "subsd\t{%2, %0|%0, %2}" [(set_attr "type" "sseadd") (set_attr "mode" "DF")])(define_expand "mulv2df3" [(set (match_operand:V2DF 0 "register_operand" "") (mult:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "") (match_operand:V2DF 2 "nonimmediate_operand" "")))] "TARGET_SSE2" "ix86_fixup_binary_operands_no_copy (MULT, V2DFmode, operands);")(define_insn "*mulv2df3" [(set (match_operand:V2DF 0 "register_operand" "=x") (mult:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "%0") (match_operand:V2DF 2 "nonimmediate_operand" "xm")))] "TARGET_SSE2 && ix86_binary_operator_ok (MULT, V2DFmode, operands)" "mulpd\t{%2, %0|%0, %2}" [(set_attr "type" "ssemul") (set_attr "mode" "V2DF")])(define_insn "sse2_vmmulv2df3" [(set (match_operand:V2DF 0 "register_operand" "=x") (vec_merge:V2DF (mult:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "%0") (match_operand:V2DF 2 "nonimmediate_operand" "xm")) (match_dup 1) (const_int 1)))] "TARGET_SSE2 && ix86_binary_operator_ok (MULT, V2DFmode, operands)" "mulsd\t{%2, %0|%0, %2}" [(set_attr "type" "ssemul") (set_attr "mode" "DF")])(define_expand "divv2df3" [(set (match_operand:V2DF 0 "register_operand" "") (div:V2DF (match_operand:V2DF 1 "register_operand" "") (match_operand:V2DF 2 "nonimmediate_operand" "")))] "TARGET_SSE2" "ix86_fixup_binary_operands_no_copy (DIV, V2DFmode, operands);")(define_insn "*divv2df3" [(set (match_operand:V2DF 0 "register_operand" "=x") (div:V2DF (match_operand:V2DF 1 "register_operand" "0") (match_operand:V2DF 2 "nonimmediate_operand" "xm")))] "TARGET_SSE2" "divpd\t{%2, %0|%0, %2}" [(set_attr "type" "ssediv") (set_attr "mode" "V2DF")])(define_insn "sse2_vmdivv2df3" [(set (match_operand:V2DF 0 "register_operand" "=x") (vec_merge:V2DF (div:V2DF (match_operand:V2DF 1 "register_operand" "0") (match_operand:V2DF 2 "nonimmediate_operand" "xm")) (match_dup 1) (const_int 1)))] "TARGET_SSE2" "divsd\t{%2, %0|%0, %2}" [(set_attr "type" "ssediv") (set_attr "mode" "DF")])(define_insn "sqrtv2df2" [(set (match_operand:V2DF 0 "register_operand" "=x") (sqrt:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "xm")))] "TARGET_SSE2" "sqrtpd\t{%1, %0|%0, %1}" [(set_attr "type" "sse") (set_attr "mode" "V2DF")])(define_insn "sse2_vmsqrtv2df2" [(set (match_operand:V2DF 0 "register_operand" "=x") (vec_merge:V2DF (sqrt:V2DF (match_operand:V2DF 1 "register_operand" "xm")) (match_operand:V2DF 2 "register_operand" "0") (const_int 1)))] "TARGET_SSE2" "sqrtsd\t{%1, %0|%0, %1}" [(set_attr "type" "sse") (set_attr "mode" "SF")]);; ??? For !flag_finite_math_only, the representation with SMIN/SMAX;; isn't really correct, as those rtl operators aren't defined when ;; applied to NaNs. Hopefully the optimizers won't get too smart on us.(define_expand "smaxv2df3" [(set (match_operand:V2DF 0 "register_operand" "") (smax:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "") (match_operand:V2DF 2 "nonimmediate_operand" "")))] "TARGET_SSE2"{ if (!flag_finite_math_only) operands[1] = force_reg (V2DFmode, operands[1]); ix86_fixup_binary_operands_no_copy (SMAX, V2DFmode, operands);})(define_insn "*smaxv2df3_finite" [(set (match_operand:V2DF 0 "register_operand" "=x") (smax:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "%0") (match_operand:V2DF 2 "nonimmediate_operand" "xm")))] "TARGET_SSE2 && flag_finite_math_only && ix86_binary_operator_ok (SMAX, V2DFmode, operands)" "maxpd\t{%2, %0|%0, %2}" [(set_attr "type" "sseadd") (set_attr "mode" "V2DF")])(define_insn "*smaxv2df3" [(set (match_operand:V2DF 0 "register_operand" "=x") (smax:V2DF (match_operand:V2DF 1 "register_operand" "0") (match_operand:V2DF 2 "nonimmediate_operand" "xm")))] "TARGET_SSE2" "maxpd\t{%2, %0|%0, %2}" [(set_attr "type" "sseadd") (set_attr "mode" "V2DF")])(define_insn "*sse2_vmsmaxv2df3_finite" [(set (match_operand:V2DF 0 "register_operand" "=x") (vec_merge:V2DF (smax:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "%0") (match_operand:V2DF 2 "nonimmediate_operand" "xm")) (match_dup 1) (const_int 1)))] "TARGET_SSE2 && flag_finite_math_only && ix86_binary_operator_ok (SMAX, V2DFmode, operands)" "maxsd\t{%2, %0|%0, %2}" [(set_attr "type" "sseadd") (set_attr "mode" "DF")])(define_insn "sse2_vmsmaxv2df3" [(set (match_operand:V2DF 0 "register_operand" "=x") (vec_merge:V2DF (smax:V2DF (match_operand:V2DF 1 "register_operand" "0") (match_operand:V2DF 2 "nonimmediate_operand" "xm")) (match_dup 1) (const_int 1)))] "TARGET_SSE2" "maxsd\t{%2, %0|%0, %2}" [(set_attr "type" "sseadd") (set_attr "mode" "DF")])(define_expand "sminv2df3" [(set (match_operand:V2DF 0 "register_operand" "") (smin:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "") (match_operand:V2DF 2 "nonimmediate_operand" "")))] "TARGET_SSE2"{ if (!flag_finite_math_only) operands[1] = force_reg (V2DFmode, operands[1]); ix86_fixup_binary_operands_no_copy (SMIN, V2DFmode, operands);})(define_insn "*sminv2df3_finite" [(set (match_operand:V2DF 0 "register_operand" "=x") (smin:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "%0") (match_operand:V2DF 2 "nonimmediate_operand" "xm")))] "TARGET_SSE2 && flag_finite_math_only && ix86_binary_operator_ok (SMIN, V2DFmode, operands)" "minpd\t{%2, %0|%0, %2}" [(set_attr "type" "sseadd") (set_attr "mode" "V2DF")])(define_insn "*sminv2df3" [(set (match_operand:V2DF 0 "register_operand" "=x") (smin:V2DF (match_operand:V2DF 1 "register_operand" "0") (match_operand:V2DF 2 "nonimmediate_operand" "xm")))] "TARGET_SSE2" "minpd\t{%2, %0|%0, %2}" [(set_attr "type" "sseadd") (set_attr "mode" "V2DF")])(define_insn "*sse2_vmsminv2df3_finite" [(set (match_operand:V2DF 0 "register_operand" "=x") (vec_merge:V2DF (smin:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "%0") (match_operand:V2DF 2 "nonimmediate_operand" "xm")) (match_dup 1) (const_int 1)))] "TARGET_SSE2 && flag_finite_math_only && ix86_binary_operator_ok (SMIN, V2DFmode, operands)" "minsd\t{%2, %0|%0, %2}" [(set_attr "type" "sseadd") (set_attr "mode" "DF")])
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -