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

📄 sync.md

📁 linux下编程用 编译软件
💻 MD
字号:
;; GCC machine description for Alpha synchronization 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, 51 Franklin Street, Fifth Floor,;; Boston, MA 02110-1301, USA.(define_mode_macro I12MODE [QI HI])(define_mode_macro I48MODE [SI DI])(define_mode_attr modesuffix [(SI "l") (DI "q")])(define_code_macro FETCHOP [plus minus ior xor and])(define_code_attr fetchop_name  [(plus "add") (minus "sub") (ior "ior") (xor "xor") (and "and")])(define_code_attr fetchop_pred  [(plus "add_operand") (minus "reg_or_8bit_operand")   (ior "or_operand") (xor "or_operand") (and "and_operand")])(define_code_attr fetchop_constr  [(plus "rKL") (minus "rI") (ior "rIN") (xor "rIN") (and "riNHM")])(define_expand "memory_barrier"  [(set (mem:BLK (match_dup 0))	(unspec:BLK [(mem:BLK (match_dup 0))] UNSPEC_MB))]  ""{  operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (DImode));  MEM_VOLATILE_P (operands[0]) = 1;})(define_insn "*mb_internal"  [(set (match_operand:BLK 0 "" "")	(unspec:BLK [(match_operand:BLK 1 "" "")] UNSPEC_MB))]  ""  "mb"  [(set_attr "type" "mb")])(define_insn "load_locked_<mode>"  [(set (match_operand:I48MODE 0 "register_operand" "=r")	(unspec_volatile:I48MODE	  [(match_operand:I48MODE 1 "memory_operand" "m")]	  UNSPECV_LL))]  ""  "ld<modesuffix>_l %0,%1"  [(set_attr "type" "ld_l")])(define_insn "store_conditional_<mode>"  [(set (match_operand:DI 0 "register_operand" "=r")        (unspec_volatile:DI [(const_int 0)] UNSPECV_SC))   (set (match_operand:I48MODE 1 "memory_operand" "=m")	(match_operand:I48MODE 2 "reg_or_0_operand" "0"))]  ""  "st<modesuffix>_c %0,%1"  [(set_attr "type" "st_c")]);; The Alpha Architecture Handbook says that it is UNPREDICTABLE whether;; the lock is cleared by a TAKEN branch.  If we were to honor that, it;; would mean that we could not expand a ll/sc sequence until after the;; final basic-block reordering pass.  Fortunately, it appears that no;; Alpha implementation ever built actually clears the lock on branches,;; taken or not.(define_insn_and_split "sync_<fetchop_name><mode>"  [(set (match_operand:I48MODE 0 "memory_operand" "+m")	(unspec:I48MODE	  [(FETCHOP:I48MODE (match_dup 0)	     (match_operand:I48MODE 1 "<fetchop_pred>" "<fetchop_constr>"))]	  UNSPEC_ATOMIC))   (clobber (match_scratch:I48MODE 2 "=&r"))]  ""  "#"  "reload_completed"  [(const_int 0)]{  alpha_split_atomic_op (<CODE>, operands[0], operands[1],			 NULL, NULL, operands[2]);  DONE;}  [(set_attr "type" "multi")])(define_insn_and_split "sync_nand<mode>"  [(set (match_operand:I48MODE 0 "memory_operand" "+m")	(unspec:I48MODE	  [(and:I48MODE (not:I48MODE (match_dup 0))	     (match_operand:I48MODE 1 "register_operand" "r"))]	  UNSPEC_ATOMIC))   (clobber (match_scratch:I48MODE 2 "=&r"))]  ""  "#"  "reload_completed"  [(const_int 0)]{  alpha_split_atomic_op (NOT, operands[0], operands[1],			 NULL, NULL, operands[2]);  DONE;}  [(set_attr "type" "multi")])(define_insn_and_split "sync_old_<fetchop_name><mode>"  [(set (match_operand:I48MODE 0 "register_operand" "=&r")	(match_operand:I48MODE 1 "memory_operand" "+m"))   (set (match_dup 1)	(unspec:I48MODE	  [(FETCHOP:I48MODE (match_dup 1)	     (match_operand:I48MODE 2 "<fetchop_pred>" "<fetchop_constr>"))]	  UNSPEC_ATOMIC))   (clobber (match_scratch:I48MODE 3 "=&r"))]  ""  "#"  "reload_completed"  [(const_int 0)]{  alpha_split_atomic_op (<CODE>, operands[1], operands[2],			 operands[0], NULL, operands[3]);  DONE;}  [(set_attr "type" "multi")])(define_insn_and_split "sync_old_nand<mode>"  [(set (match_operand:I48MODE 0 "register_operand" "=&r")	(match_operand:I48MODE 1 "memory_operand" "+m"))   (set (match_dup 1)	(unspec:I48MODE	  [(and:I48MODE (not:I48MODE (match_dup 1))	     (match_operand:I48MODE 2 "register_operand" "r"))]	  UNSPEC_ATOMIC))   (clobber (match_scratch:I48MODE 3 "=&r"))]  ""  "#"  "reload_completed"  [(const_int 0)]{  alpha_split_atomic_op (NOT, operands[1], operands[2],			 operands[0], NULL, operands[3]);  DONE;}  [(set_attr "type" "multi")])(define_insn_and_split "sync_new_<fetchop_name><mode>"  [(set (match_operand:I48MODE 0 "register_operand" "=&r")	(FETCHOP:I48MODE 	  (match_operand:I48MODE 1 "memory_operand" "+m")	  (match_operand:I48MODE 2 "<fetchop_pred>" "<fetchop_constr>")))   (set (match_dup 1)	(unspec:I48MODE	  [(FETCHOP:I48MODE (match_dup 1) (match_dup 2))]	  UNSPEC_ATOMIC))   (clobber (match_scratch:I48MODE 3 "=&r"))]  ""  "#"  "reload_completed"  [(const_int 0)]{  alpha_split_atomic_op (<CODE>, operands[1], operands[2],			 NULL, operands[0], operands[3]);  DONE;}  [(set_attr "type" "multi")])(define_insn_and_split "sync_new_nand<mode>"  [(set (match_operand:I48MODE 0 "register_operand" "=&r")	(and:I48MODE 	  (not:I48MODE (match_operand:I48MODE 1 "memory_operand" "+m"))	  (match_operand:I48MODE 2 "register_operand" "r")))   (set (match_dup 1)	(unspec:I48MODE	  [(and:I48MODE (not:I48MODE (match_dup 1)) (match_dup 2))]	  UNSPEC_ATOMIC))   (clobber (match_scratch:I48MODE 3 "=&r"))]  ""  "#"  "reload_completed"  [(const_int 0)]{  alpha_split_atomic_op (NOT, operands[1], operands[2],			 NULL, operands[0], operands[3]);  DONE;}  [(set_attr "type" "multi")])(define_expand "sync_compare_and_swap<mode>"  [(match_operand:I12MODE 0 "register_operand" "")   (match_operand:I12MODE 1 "memory_operand" "")   (match_operand:I12MODE 2 "register_operand" "")   (match_operand:I12MODE 3 "add_operand" "")]  ""{  alpha_expand_compare_and_swap_12 (operands[0], operands[1],				    operands[2], operands[3]);  DONE;})(define_insn_and_split "sync_compare_and_swap<mode>_1"  [(set (match_operand:DI 0 "register_operand" "=&r,&r")	(zero_extend:DI	  (mem:I12MODE (match_operand:DI 1 "register_operand" "r,r"))))   (set (mem:I12MODE (match_dup 1))	(unspec:I12MODE	  [(match_operand:DI 2 "reg_or_8bit_operand" "J,rI")	   (match_operand:DI 3 "register_operand" "r,r")	   (match_operand:DI 4 "register_operand" "r,r")]	  UNSPEC_CMPXCHG))   (clobber (match_scratch:DI 5 "=&r,&r"))   (clobber (match_scratch:DI 6 "=X,&r"))]  ""  "#"  "reload_completed"  [(const_int 0)]{  alpha_split_compare_and_swap_12 (<MODE>mode, operands[0], operands[1],				   operands[2], operands[3], operands[4],				   operands[5], operands[6]);  DONE;}  [(set_attr "type" "multi")])(define_expand "sync_compare_and_swap<mode>"  [(parallel     [(set (match_operand:I48MODE 0 "register_operand" "")	   (match_operand:I48MODE 1 "memory_operand" ""))      (set (match_dup 1)	   (unspec:I48MODE	     [(match_operand:I48MODE 2 "reg_or_8bit_operand" "")	      (match_operand:I48MODE 3 "add_operand" "rKL")]	     UNSPEC_CMPXCHG))      (clobber (match_scratch:I48MODE 4 "=&r"))])]  ""{  if (<MODE>mode == SImode)    operands[2] = convert_modes (DImode, SImode, operands[2], 0);})(define_insn_and_split "*sync_compare_and_swap<mode>"  [(set (match_operand:I48MODE 0 "register_operand" "=&r")	(match_operand:I48MODE 1 "memory_operand" "+m"))   (set (match_dup 1)	(unspec:I48MODE	  [(match_operand:DI 2 "reg_or_8bit_operand" "rI")	   (match_operand:I48MODE 3 "add_operand" "rKL")]	  UNSPEC_CMPXCHG))   (clobber (match_scratch:I48MODE 4 "=&r"))]  ""  "#"  "reload_completed"  [(const_int 0)]{  alpha_split_compare_and_swap (operands[0], operands[1], operands[2],				operands[3], operands[4]);  DONE;}  [(set_attr "type" "multi")])(define_expand "sync_lock_test_and_set<mode>"  [(match_operand:I12MODE 0 "register_operand" "")   (match_operand:I12MODE 1 "memory_operand" "")   (match_operand:I12MODE 2 "register_operand" "")]  ""{  alpha_expand_lock_test_and_set_12 (operands[0], operands[1], operands[2]);  DONE;})(define_insn_and_split "sync_lock_test_and_set<mode>_1"  [(set (match_operand:DI 0 "register_operand" "=&r")	(zero_extend:DI	  (mem:I12MODE (match_operand:DI 1 "register_operand" "r"))))   (set (mem:I12MODE (match_dup 1))	(unspec:I12MODE	  [(match_operand:DI 2 "reg_or_8bit_operand" "rI")	   (match_operand:DI 3 "register_operand" "r")]	  UNSPEC_XCHG))   (clobber (match_scratch:DI 4 "=&r"))]  ""  "#"  "reload_completed"  [(const_int 0)]{  alpha_split_lock_test_and_set_12 (<MODE>mode, operands[0], operands[1],				    operands[2], operands[3], operands[4]);  DONE;}  [(set_attr "type" "multi")])(define_insn_and_split "sync_lock_test_and_set<mode>"  [(set (match_operand:I48MODE 0 "register_operand" "=&r")	(match_operand:I48MODE 1 "memory_operand" "+m"))   (set (match_dup 1)	(unspec:I48MODE	  [(match_operand:I48MODE 2 "add_operand" "rKL")]	  UNSPEC_XCHG))   (clobber (match_scratch:I48MODE 3 "=&r"))]  ""  "#"  "reload_completed"  [(const_int 0)]{  alpha_split_lock_test_and_set (operands[0], operands[1],				 operands[2], operands[3]);  DONE;}  [(set_attr "type" "multi")])

⌨️ 快捷键说明

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