⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmx.md

📁 Mac OS X 10.4.9 for x86 Source Code gcc 实现源代码
💻 MD
📖 第 1 页 / 共 4 页
字号:
;; GCC machine description for MMX and 3dNOW! instructions;; Copyright (C) 2005;; Free Software Foundation, Inc.;;;; This file is part of GCC.;;;; GCC is free software; you can redistribute it and/or modify;; it under the terms of the GNU General Public License as published by;; the Free Software Foundation; either version 2, or (at your option);; any later version.;;;; GCC is distributed in the hope that it will be useful,;; but WITHOUT ANY WARRANTY; without even the implied warranty of;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the;; GNU General Public License for more details.;;;; You should have received a copy of the GNU General Public License;; along with GCC; see the file COPYING.  If not, write to;; the Free Software Foundation, 59 Temple Place - Suite 330,;; Boston, MA 02111-1307, USA.;; The MMX and 3dNOW! patterns are in the same file because they use;; the same register file, and 3dNOW! adds a number of extensions to;; the base integer MMX isa.;; Note!  Except for the basic move instructions, *all* of these ;; patterns are outside the normal optabs namespace.  This is because;; use of these registers requires the insertion of emms or femms;; instructions to return to normal fpu mode.  The compiler doesn't;; know how to do that itself, which means it's up to the user.  Which;; means that we should never use any of these patterns except at the;; direction of the user via a builtin.;; 8 byte integral modes handled by MMX (and by extension, SSE)(define_mode_macro MMXMODEI [V8QI V4HI V2SI]);; All 8-byte vector modes handled by MMX(define_mode_macro MMXMODE [V8QI V4HI V2SI V2SF]);; Mix-n-match(define_mode_macro MMXMODE12 [V8QI V4HI])(define_mode_macro MMXMODE24 [V4HI V2SI]);; Mapping from integer vector mode to mnemonic suffix(define_mode_attr mmxvecsize [(V8QI "b") (V4HI "w") (V2SI "d") (DI "q")]);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Move patterns;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; All of these patterns are enabled for MMX as well as 3dNOW.;; This is essential for maintaining stable calling conventions.(define_expand "mov<mode>"  [(set (match_operand:MMXMODEI 0 "nonimmediate_operand" "")	(match_operand:MMXMODEI 1 "nonimmediate_operand" ""))]  "TARGET_MMX"{  ix86_expand_vector_move (<MODE>mode, operands);  DONE;})(define_insn "*mov<mode>_internal_rex64"  [(set (match_operand:MMXMODEI 0 "nonimmediate_operand"				"=rm,r,*y,*y ,m ,*y,Y ,x,x ,m,r,x")	(match_operand:MMXMODEI 1 "vector_move_operand"				"Cr ,m,C ,*ym,*y,Y ,*y,C,xm,x,x,r"))]  "TARGET_64BIT && TARGET_MMX   && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"  "@    movq\t{%1, %0|%0, %1}    movq\t{%1, %0|%0, %1}    pxor\t%0, %0    movq\t{%1, %0|%0, %1}    movq\t{%1, %0|%0, %1}    movdq2q\t{%1, %0|%0, %1}    movq2dq\t{%1, %0|%0, %1}    pxor\t%0, %0    movq\t{%1, %0|%0, %1}    movq\t{%1, %0|%0, %1}    movd\t{%1, %0|%0, %1}    movd\t{%1, %0|%0, %1}"  [(set_attr "type" "imov,imov,mmxmov,mmxmov,mmxmov,ssecvt,ssecvt,ssemov,ssemov,ssemov,ssemov,ssemov")   (set_attr "mode" "DI")])(define_insn "*mov<mode>_internal";; APPLE LOCAL begin radar 4043818  [(set (match_operand:MMXMODEI 0 "nonimmediate_operand"			"=*y,y ,m ,*y,*Y,*Y,*Y ,m ,*x,*x,*x,m ,?r ,?m")	(match_operand:MMXMODEI 1 "vector_move_operand"			"C  ,ym,*y,*Y,*y,C ,*Ym,*Y,C ,*x,m ,*x,irm,r"))];; APPLE LOCAL end radar 4043818  "TARGET_MMX   && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"  "@    pxor\t%0, %0    movq\t{%1, %0|%0, %1}    movq\t{%1, %0|%0, %1}    movdq2q\t{%1, %0|%0, %1}    movq2dq\t{%1, %0|%0, %1}    pxor\t%0, %0    movq\t{%1, %0|%0, %1}    movq\t{%1, %0|%0, %1}    xorps\t%0, %0    movaps\t{%1, %0|%0, %1}    movlps\t{%1, %0|%0, %1}    movlps\t{%1, %0|%0, %1}    #    #"  [(set_attr "type" "mmxmov,mmxmov,mmxmov,ssecvt,ssecvt,ssemov,ssemov,ssemov,ssemov,ssemov,ssemov,ssemov,*,*")   (set_attr "mode" "DI,DI,DI,DI,DI,TI,DI,DI,V4SF,V4SF,V2SF,V2SF,DI,DI")])(define_expand "movv2sf"  [(set (match_operand:V2SF 0 "nonimmediate_operand" "")	(match_operand:V2SF 1 "nonimmediate_operand" ""))]  "TARGET_MMX"{  ix86_expand_vector_move (V2SFmode, operands);  DONE;})(define_insn "*movv2sf_internal_rex64"  [(set (match_operand:V2SF 0 "nonimmediate_operand"				"=rm,r,*y ,*y ,m ,*y,Y ,x,x,x,m,r,x")        (match_operand:V2SF 1 "vector_move_operand"				"Cr ,m ,C ,*ym,*y,Y ,*y,C,x,m,x,x,r"))]  "TARGET_64BIT && TARGET_MMX   && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"  "@    movq\t{%1, %0|%0, %1}    movq\t{%1, %0|%0, %1}    pxor\t%0, %0    movq\t{%1, %0|%0, %1}    movq\t{%1, %0|%0, %1}    movdq2q\t{%1, %0|%0, %1}    movq2dq\t{%1, %0|%0, %1}    xorps\t%0, %0    movaps\t{%1, %0|%0, %1}    movlps\t{%1, %0|%0, %1}    movlps\t{%1, %0|%0, %1}    movd\t{%1, %0|%0, %1}    movd\t{%1, %0|%0, %1}"  [(set_attr "type" "imov,imov,mmxmov,mmxmov,mmxmov,ssecvt,ssecvt,ssemov,ssemov,ssemov,ssemov,ssemov,ssemov")   (set_attr "mode" "DI,DI,DI,DI,DI,DI,DI,V4SF,V4SF,V2SF,V2SF,DI,DI")])(define_insn "*movv2sf_internal"  [(set (match_operand:V2SF 0 "nonimmediate_operand"					"=*y,*y ,m,*y,*Y,*x,*x,*x,m ,?r ,?m")        (match_operand:V2SF 1 "vector_move_operand"					"C ,*ym,*y,*Y,*y,C ,*x,m ,*x,irm,r"))]  "TARGET_MMX   && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"  "@    pxor\t%0, %0    movq\t{%1, %0|%0, %1}    movq\t{%1, %0|%0, %1}    movdq2q\t{%1, %0|%0, %1}    movq2dq\t{%1, %0|%0, %1}    xorps\t%0, %0    movaps\t{%1, %0|%0, %1}    movlps\t{%1, %0|%0, %1}    movlps\t{%1, %0|%0, %1}    #    #"  [(set_attr "type" "mmxmov,mmxmov,mmxmov,ssecvt,ssecvt,ssemov,ssemov,ssemov,ssemov,*,*")   (set_attr "mode" "DI,DI,DI,DI,DI,V4SF,V4SF,V2SF,V2SF,DI,DI")]);; %%% This multiword shite has got to go.(define_split  [(set (match_operand:MMXMODE 0 "nonimmediate_operand" "")        (match_operand:MMXMODE 1 "general_operand" ""))];; APPLE LOCAL begin 4099020  "!TARGET_64BIT && reload_completed   && (!MMX_REG_P (operands[0]) && !SSE_REG_P (operands[0]) && GET_CODE (operands[0]) != SUBREG)   && (!MMX_REG_P (operands[1]) && !SSE_REG_P (operands[1]) && GET_CODE (operands[1]) != SUBREG)";; APPLE LOCAL end 4099020  [(const_int 0)]  "ix86_split_long_move (operands); DONE;")(define_expand "push<mode>1"  [(match_operand:MMXMODE 0 "register_operand" "")]  "TARGET_MMX"{  ix86_expand_push (<MODE>mode, operands[0]);  DONE;})(define_expand "movmisalign<mode>"  [(set (match_operand:MMXMODE 0 "nonimmediate_operand" "")	(match_operand:MMXMODE 1 "nonimmediate_operand" ""))]  "TARGET_MMX"{  ix86_expand_vector_move (<MODE>mode, operands);  DONE;})(define_insn "sse_movntdi"  [(set (match_operand:DI 0 "memory_operand" "=m")	(unspec:DI [(match_operand:DI 1 "register_operand" "y")]		   UNSPEC_MOVNT))]  "TARGET_SSE || TARGET_3DNOW_A"  "movntq\t{%1, %0|%0, %1}"  [(set_attr "type" "mmxmov")   (set_attr "mode" "DI")]);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Parallel single-precision floating point arithmetic;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;(define_insn "mmx_addv2sf3"  [(set (match_operand:V2SF 0 "register_operand" "=y")	(plus:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "%0")		   (match_operand:V2SF 2 "nonimmediate_operand" "ym")))]  "TARGET_3DNOW && ix86_binary_operator_ok (PLUS, V2SFmode, operands)"  "pfadd\\t{%2, %0|%0, %2}"  [(set_attr "type" "mmxadd")   (set_attr "mode" "V2SF")])(define_insn "mmx_subv2sf3"  [(set (match_operand:V2SF 0 "register_operand" "=y,y")        (minus:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "0,ym")		    (match_operand:V2SF 2 "nonimmediate_operand" "ym,0")))]  "TARGET_3DNOW && !(MEM_P (operands[0]) && MEM_P (operands[1]))"  "@   pfsub\\t{%2, %0|%0, %2}   pfsubr\\t{%2, %0|%0, %2}"  [(set_attr "type" "mmxadd")   (set_attr "mode" "V2SF")])(define_expand "mmx_subrv2sf3"  [(set (match_operand:V2SF 0 "register_operand" "")        (minus:V2SF (match_operand:V2SF 2 "nonimmediate_operand" "")		    (match_operand:V2SF 1 "nonimmediate_operand" "")))]  "TARGET_3DNOW && !(MEM_P (operands[0]) && MEM_P (operands[1]))"  "")(define_insn "mmx_mulv2sf3"  [(set (match_operand:V2SF 0 "register_operand" "=y")	(mult:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "%0")		   (match_operand:V2SF 2 "nonimmediate_operand" "ym")))]  "TARGET_3DNOW && ix86_binary_operator_ok (MULT, V2SFmode, operands)"  "pfmul\\t{%2, %0|%0, %2}"  [(set_attr "type" "mmxmul")   (set_attr "mode" "V2SF")])(define_insn "mmx_smaxv2sf3"  [(set (match_operand:V2SF 0 "register_operand" "=y")        (smax:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "%0")                   (match_operand:V2SF 2 "nonimmediate_operand" "ym")))]  "TARGET_3DNOW && ix86_binary_operator_ok (SMAX, V2SFmode, operands)"  "pfmax\\t{%2, %0|%0, %2}"  [(set_attr "type" "mmxadd")   (set_attr "mode" "V2SF")])(define_insn "mmx_sminv2sf3"  [(set (match_operand:V2SF 0 "register_operand" "=y")        (smin:V2SF (match_operand:V2SF 1 "nonimmediate_operand" "%0")                   (match_operand:V2SF 2 "nonimmediate_operand" "ym")))]  "TARGET_3DNOW && ix86_binary_operator_ok (SMIN, V2SFmode, operands)"  "pfmin\\t{%2, %0|%0, %2}"  [(set_attr "type" "mmxadd")   (set_attr "mode" "V2SF")])(define_insn "mmx_rcpv2sf2"  [(set (match_operand:V2SF 0 "register_operand" "=y")        (unspec:V2SF [(match_operand:V2SF 1 "nonimmediate_operand" "ym")]		     UNSPEC_PFRCP))]  "TARGET_3DNOW"  "pfrcp\\t{%1, %0|%0, %1}"  [(set_attr "type" "mmx")   (set_attr "mode" "V2SF")])(define_insn "mmx_rcpit1v2sf3"  [(set (match_operand:V2SF 0 "register_operand" "=y")	(unspec:V2SF [(match_operand:V2SF 1 "register_operand" "0")		      (match_operand:V2SF 2 "nonimmediate_operand" "ym")]		     UNSPEC_PFRCPIT1))]  "TARGET_3DNOW"  "pfrcpit1\\t{%2, %0|%0, %2}"  [(set_attr "type" "mmx")   (set_attr "mode" "V2SF")])(define_insn "mmx_rcpit2v2sf3"  [(set (match_operand:V2SF 0 "register_operand" "=y")	(unspec:V2SF [(match_operand:V2SF 1 "register_operand" "0")		      (match_operand:V2SF 2 "nonimmediate_operand" "ym")]		     UNSPEC_PFRCPIT2))]  "TARGET_3DNOW"  "pfrcpit2\\t{%2, %0|%0, %2}"  [(set_attr "type" "mmx")   (set_attr "mode" "V2SF")])(define_insn "mmx_rsqrtv2sf2"  [(set (match_operand:V2SF 0 "register_operand" "=y")	(unspec:V2SF [(match_operand:V2SF 1 "nonimmediate_operand" "ym")]		     UNSPEC_PFRSQRT))]  "TARGET_3DNOW"  "pfrsqrt\\t{%1, %0|%0, %1}"  [(set_attr "type" "mmx")   (set_attr "mode" "V2SF")])		(define_insn "mmx_rsqit1v2sf3"  [(set (match_operand:V2SF 0 "register_operand" "=y")	(unspec:V2SF [(match_operand:V2SF 1 "register_operand" "0")		      (match_operand:V2SF 2 "nonimmediate_operand" "ym")]		     UNSPEC_PFRSQIT1))]  "TARGET_3DNOW"  "pfrsqit1\\t{%2, %0|%0, %2}"  [(set_attr "type" "mmx")   (set_attr "mode" "V2SF")])(define_insn "mmx_haddv2sf3"  [(set (match_operand:V2SF 0 "register_operand" "=y")	(vec_concat:V2SF	  (plus:SF	    (vec_select:SF	      (match_operand:V2SF 1 "register_operand" "0")	      (parallel [(const_int  0)]))	    (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))	  (plus:SF            (vec_select:SF	      (match_operand:V2SF 2 "nonimmediate_operand" "ym")	      (parallel [(const_int  0)]))	    (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))))]  "TARGET_3DNOW"  "pfacc\\t{%2, %0|%0, %2}"  [(set_attr "type" "mmxadd")   (set_attr "mode" "V2SF")])(define_insn "mmx_hsubv2sf3"  [(set (match_operand:V2SF 0 "register_operand" "=y")	(vec_concat:V2SF	  (minus:SF	    (vec_select:SF	      (match_operand:V2SF 1 "register_operand" "0")	      (parallel [(const_int  0)]))	    (vec_select:SF (match_dup 1) (parallel [(const_int 1)])))	  (minus:SF            (vec_select:SF	      (match_operand:V2SF 2 "nonimmediate_operand" "ym")	      (parallel [(const_int  0)]))	    (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))))]  "TARGET_3DNOW_A"  "pfnacc\\t{%2, %0|%0, %2}"  [(set_attr "type" "mmxadd")   (set_attr "mode" "V2SF")])(define_insn "mmx_addsubv2sf3"  [(set (match_operand:V2SF 0 "register_operand" "=y")        (vec_merge:V2SF          (plus:V2SF            (match_operand:V2SF 1 "register_operand" "0")            (match_operand:V2SF 2 "nonimmediate_operand" "ym"))          (minus:V2SF (match_dup 1) (match_dup 2))          (const_int 1)))]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -