📄 mmx.md
字号:
DONE;})(define_insn "mmx_pshufw_1" [(set (match_operand:V4HI 0 "register_operand" "=y") (vec_select:V4HI (match_operand:V4HI 1 "nonimmediate_operand" "ym") (parallel [(match_operand 2 "const_0_to_3_operand" "") (match_operand 3 "const_0_to_3_operand" "") (match_operand 4 "const_0_to_3_operand" "") (match_operand 5 "const_0_to_3_operand" "")])))] "TARGET_SSE || TARGET_3DNOW_A"{ int mask = 0; mask |= INTVAL (operands[2]) << 0; mask |= INTVAL (operands[3]) << 2; mask |= INTVAL (operands[4]) << 4; mask |= INTVAL (operands[5]) << 6; operands[2] = GEN_INT (mask); return "pshufw\t{%2, %1, %0|%0, %1, %2}";} [(set_attr "type" "mmxcvt") (set_attr "mode" "DI")])(define_insn "mmx_pswapdv2si2" [(set (match_operand:V2SI 0 "register_operand" "=y") (vec_select:V2SI (match_operand:V2SI 1 "nonimmediate_operand" "ym") (parallel [(const_int 1) (const_int 0)])))] "TARGET_3DNOW_A" "pswapd\\t{%1, %0|%0, %1}" [(set_attr "type" "mmxcvt") (set_attr "mode" "DI")])(define_insn "*vec_dupv4hi" [(set (match_operand:V4HI 0 "register_operand" "=y") (vec_duplicate:V4HI (truncate:HI (match_operand:SI 1 "register_operand" "0"))))] "TARGET_SSE || TARGET_3DNOW_A" "pshufw\t{$0, %0, %0|%0, %0, 0}" [(set_attr "type" "mmxcvt") (set_attr "mode" "DI")])(define_insn "*vec_dupv2si" [(set (match_operand:V2SI 0 "register_operand" "=y") (vec_duplicate:V2SI (match_operand:SI 1 "register_operand" "0")))] "TARGET_MMX" "punpckldq\t%0, %0" [(set_attr "type" "mmxcvt") (set_attr "mode" "DI")])(define_insn "*mmx_concatv2si" [(set (match_operand:V2SI 0 "register_operand" "=y,y") (vec_concat:V2SI (match_operand:SI 1 "nonimmediate_operand" " 0,rm") (match_operand:SI 2 "vector_move_operand" "ym,C")))] "TARGET_MMX && !TARGET_SSE" "@ punpckldq\t{%2, %0|%0, %2} movd\t{%1, %0|%0, %1}" [(set_attr "type" "mmxcvt,mmxmov") (set_attr "mode" "DI")])(define_expand "vec_setv2si" [(match_operand:V2SI 0 "register_operand" "") (match_operand:SI 1 "register_operand" "") (match_operand 2 "const_int_operand" "")] "TARGET_MMX"{ ix86_expand_vector_set (false, operands[0], operands[1], INTVAL (operands[2])); DONE;})(define_insn_and_split "*vec_extractv2si_0" [(set (match_operand:SI 0 "nonimmediate_operand" "=x,y,m,m,frxy") (vec_select:SI (match_operand:V2SI 1 "nonimmediate_operand" " x,y,x,y,m") (parallel [(const_int 0)])))] "TARGET_MMX && !(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 (SImode, REGNO (op1)); else op1 = gen_lowpart (SImode, op1); emit_move_insn (operands[0], op1); DONE;})(define_insn "*vec_extractv2si_1" [(set (match_operand:SI 0 "nonimmediate_operand" "=y,Y,Y,x,frxy") (vec_select:SI (match_operand:V2SI 1 "nonimmediate_operand" " 0,0,Y,0,o") (parallel [(const_int 1)])))] "TARGET_MMX && !(MEM_P (operands[0]) && MEM_P (operands[1]))" "@ punpckhdq\t%0, %0 punpckhdq\t%0, %0 pshufd\t{$85, %1, %0|%0, %1, 85} unpckhps\t%0, %0 #" [(set_attr "type" "mmxcvt,sselog1,sselog1,sselog1,*") (set_attr "mode" "DI,TI,TI,V4SF,SI")])(define_split [(set (match_operand:SI 0 "register_operand" "") (vec_select:SI (match_operand:V2SI 1 "memory_operand" "") (parallel [(const_int 1)])))] "TARGET_MMX && reload_completed" [(const_int 0)]{ operands[1] = adjust_address (operands[1], SImode, 4); emit_move_insn (operands[0], operands[1]); DONE;})(define_expand "vec_extractv2si" [(match_operand:SI 0 "register_operand" "") (match_operand:V2SI 1 "register_operand" "") (match_operand 2 "const_int_operand" "")] "TARGET_MMX"{ ix86_expand_vector_extract (false, operands[0], operands[1], INTVAL (operands[2])); DONE;})(define_expand "vec_initv2si" [(match_operand:V2SI 0 "register_operand" "") (match_operand 1 "" "")] "TARGET_SSE"{ ix86_expand_vector_init (false, operands[0], operands[1]); DONE;})(define_expand "vec_setv4hi" [(match_operand:V4HI 0 "register_operand" "") (match_operand:HI 1 "register_operand" "") (match_operand 2 "const_int_operand" "")] "TARGET_MMX"{ ix86_expand_vector_set (false, operands[0], operands[1], INTVAL (operands[2])); DONE;})(define_expand "vec_extractv4hi" [(match_operand:HI 0 "register_operand" "") (match_operand:V4HI 1 "register_operand" "") (match_operand 2 "const_int_operand" "")] "TARGET_MMX"{ ix86_expand_vector_extract (false, operands[0], operands[1], INTVAL (operands[2])); DONE;})(define_expand "vec_initv4hi" [(match_operand:V4HI 0 "register_operand" "") (match_operand 1 "" "")] "TARGET_SSE"{ ix86_expand_vector_init (false, operands[0], operands[1]); DONE;})(define_expand "vec_setv8qi" [(match_operand:V8QI 0 "register_operand" "") (match_operand:QI 1 "register_operand" "") (match_operand 2 "const_int_operand" "")] "TARGET_MMX"{ ix86_expand_vector_set (false, operands[0], operands[1], INTVAL (operands[2])); DONE;})(define_expand "vec_extractv8qi" [(match_operand:QI 0 "register_operand" "") (match_operand:V8QI 1 "register_operand" "") (match_operand 2 "const_int_operand" "")] "TARGET_MMX"{ ix86_expand_vector_extract (false, operands[0], operands[1], INTVAL (operands[2])); DONE;})(define_expand "vec_initv8qi" [(match_operand:V8QI 0 "register_operand" "") (match_operand 1 "" "")] "TARGET_SSE"{ ix86_expand_vector_init (false, operands[0], operands[1]); DONE;});;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;(define_insn "mmx_uavgv8qi3" [(set (match_operand:V8QI 0 "register_operand" "=y") (truncate:V8QI (lshiftrt:V8HI (plus:V8HI (plus:V8HI (zero_extend:V8HI (match_operand:V8QI 1 "nonimmediate_operand" "%0")) (zero_extend:V8HI (match_operand:V8QI 2 "nonimmediate_operand" "ym"))) (const_vector:V8HI [(const_int 1) (const_int 1) (const_int 1) (const_int 1) (const_int 1) (const_int 1) (const_int 1) (const_int 1)])) (const_int 1))))] "(TARGET_SSE || TARGET_3DNOW) && ix86_binary_operator_ok (PLUS, V8QImode, operands)"{ /* These two instructions have the same operation, but their encoding is different. Prefer the one that is de facto standard. */ if (TARGET_SSE || TARGET_3DNOW_A) return "pavgb\t{%2, %0|%0, %2}"; else return "pavgusb\\t{%2, %0|%0, %2}";} [(set_attr "type" "mmxshft") (set_attr "mode" "DI")])(define_insn "mmx_uavgv4hi3" [(set (match_operand:V4HI 0 "register_operand" "=y") (truncate:V4HI (lshiftrt:V4SI (plus:V4SI (plus:V4SI (zero_extend:V4SI (match_operand:V4HI 1 "nonimmediate_operand" "%0")) (zero_extend:V4SI (match_operand:V4HI 2 "nonimmediate_operand" "ym"))) (const_vector:V4SI [(const_int 1) (const_int 1) (const_int 1) (const_int 1)])) (const_int 1))))] "(TARGET_SSE || TARGET_3DNOW_A) && ix86_binary_operator_ok (PLUS, V4HImode, operands)" "pavgw\t{%2, %0|%0, %2}" [(set_attr "type" "mmxshft") (set_attr "mode" "DI")])(define_insn "mmx_psadbw" [(set (match_operand:DI 0 "register_operand" "=y") (unspec:DI [(match_operand:V8QI 1 "register_operand" "0") (match_operand:V8QI 2 "nonimmediate_operand" "ym")] UNSPEC_PSADBW))] "TARGET_SSE || TARGET_3DNOW_A" "psadbw\t{%2, %0|%0, %2}" [(set_attr "type" "mmxshft") (set_attr "mode" "DI")])(define_insn "mmx_pmovmskb" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [(match_operand:V8QI 1 "register_operand" "y")] UNSPEC_MOVMSK))] "TARGET_SSE || TARGET_3DNOW_A" "pmovmskb\t{%1, %0|%0, %1}" [(set_attr "type" "ssecvt") (set_attr "mode" "V4SF")])(define_expand "mmx_maskmovq" [(set (match_operand:V8QI 0 "memory_operand" "") (unspec:V8QI [(match_operand:V8QI 1 "register_operand" "y") (match_operand:V8QI 2 "register_operand" "y") (match_dup 0)] UNSPEC_MASKMOV))] "TARGET_SSE || TARGET_3DNOW_A" "")(define_insn "*mmx_maskmovq" [(set (mem:V8QI (match_operand:SI 0 "register_operand" "D")) (unspec:V8QI [(match_operand:V8QI 1 "register_operand" "y") (match_operand:V8QI 2 "register_operand" "y") (mem:V8QI (match_dup 0))] UNSPEC_MASKMOV))] "(TARGET_SSE || TARGET_3DNOW_A) && !TARGET_64BIT" ;; @@@ check ordering of operands in intel/nonintel syntax "maskmovq\t{%2, %1|%1, %2}" [(set_attr "type" "mmxcvt") (set_attr "mode" "DI")])(define_insn "*mmx_maskmovq_rex" [(set (mem:V8QI (match_operand:DI 0 "register_operand" "D")) (unspec:V8QI [(match_operand:V8QI 1 "register_operand" "y") (match_operand:V8QI 2 "register_operand" "y") (mem:V8QI (match_dup 0))] UNSPEC_MASKMOV))] "(TARGET_SSE || TARGET_3DNOW_A) && TARGET_64BIT" ;; @@@ check ordering of operands in intel/nonintel syntax "maskmovq\t{%2, %1|%1, %2}" [(set_attr "type" "mmxcvt") (set_attr "mode" "DI")])(define_insn "mmx_emms" [(unspec_volatile [(const_int 0)] UNSPECV_EMMS) (clobber (reg:XF 8)) (clobber (reg:XF 9)) (clobber (reg:XF 10)) (clobber (reg:XF 11)) (clobber (reg:XF 12)) (clobber (reg:XF 13)) (clobber (reg:XF 14)) (clobber (reg:XF 15)) (clobber (reg:DI 29)) (clobber (reg:DI 30)) (clobber (reg:DI 31)) (clobber (reg:DI 32)) (clobber (reg:DI 33)) (clobber (reg:DI 34)) (clobber (reg:DI 35)) (clobber (reg:DI 36))] "TARGET_MMX" "emms" [(set_attr "type" "mmx") (set_attr "memory" "unknown")])(define_insn "mmx_femms" [(unspec_volatile [(const_int 0)] UNSPECV_FEMMS) (clobber (reg:XF 8)) (clobber (reg:XF 9)) (clobber (reg:XF 10)) (clobber (reg:XF 11)) (clobber (reg:XF 12)) (clobber (reg:XF 13)) (clobber (reg:XF 14)) (clobber (reg:XF 15)) (clobber (reg:DI 29)) (clobber (reg:DI 30)) (clobber (reg:DI 31)) (clobber (reg:DI 32)) (clobber (reg:DI 33)) (clobber (reg:DI 34)) (clobber (reg:DI 35)) (clobber (reg:DI 36))] "TARGET_3DNOW" "femms" [(set_attr "type" "mmx") (set_attr "memory" "none")])
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -