Home | History | Annotate | Line # | Download | only in rs6000
htm.md revision 1.1.1.1
      1 ;; Hardware Transactional Memory (HTM) patterns.
      2 ;; Copyright (C) 2013-2015 Free Software Foundation, Inc.
      3 ;; Contributed by Peter Bergner <bergner (a] vnet.ibm.com>.
      4 
      5 ;; This file is part of GCC.
      6 
      7 ;; GCC is free software; you can redistribute it and/or modify it
      8 ;; under the terms of the GNU General Public License as published
      9 ;; by the Free Software Foundation; either version 3, or (at your
     10 ;; option) any later version.
     11 
     12 ;; GCC is distributed in the hope that it will be useful, but WITHOUT
     13 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     14 ;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     15 ;; License for more details.
     16 
     17 ;; You should have received a copy of the GNU General Public License
     18 ;; along with GCC; see the file COPYING3.  If not see
     19 ;; <http://www.gnu.org/licenses/>.
     20 
     21 (define_constants
     22   [(TFHAR_SPR		128)
     23    (TFIAR_SPR		129)
     24    (TEXASR_SPR		130)
     25    (TEXASRU_SPR		131)
     26    (MAX_HTM_OPERANDS	4)
     27   ])
     28 
     29 ;;
     30 ;; UNSPEC_VOLATILE usage
     31 ;;
     32 
     33 (define_c_enum "unspecv"
     34   [UNSPECV_HTM_TABORT
     35    UNSPECV_HTM_TABORTXC
     36    UNSPECV_HTM_TABORTXCI
     37    UNSPECV_HTM_TBEGIN
     38    UNSPECV_HTM_TCHECK
     39    UNSPECV_HTM_TEND
     40    UNSPECV_HTM_TRECHKPT
     41    UNSPECV_HTM_TRECLAIM
     42    UNSPECV_HTM_TSR
     43    UNSPECV_HTM_TTEST
     44    UNSPECV_HTM_MFSPR
     45    UNSPECV_HTM_MTSPR
     46   ])
     47 
     48 
     49 (define_insn "tabort"
     50   [(set (match_operand:CC 1 "cc_reg_operand" "=x")
     51 	(unspec_volatile:CC [(match_operand:SI 0 "gpc_reg_operand" "r")]
     52 			    UNSPECV_HTM_TABORT))]
     53   "TARGET_HTM"
     54   "tabort. %0"
     55   [(set_attr "type" "htm")
     56    (set_attr "length" "4")])
     57 
     58 (define_insn "tabort<wd>c"
     59   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
     60 	(unspec_volatile:CC [(match_operand 0 "u5bit_cint_operand" "n")
     61 			     (match_operand:GPR 1 "gpc_reg_operand" "r")
     62 			     (match_operand:GPR 2 "gpc_reg_operand" "r")]
     63 			    UNSPECV_HTM_TABORTXC))]
     64   "TARGET_HTM"
     65   "tabort<wd>c. %0,%1,%2"
     66   [(set_attr "type" "htm")
     67    (set_attr "length" "4")])
     68 
     69 (define_insn "tabort<wd>ci"
     70   [(set (match_operand:CC 3 "cc_reg_operand" "=x")
     71 	(unspec_volatile:CC [(match_operand 0 "u5bit_cint_operand" "n")
     72 			     (match_operand:GPR 1 "gpc_reg_operand" "r")
     73 			     (match_operand 2 "s5bit_cint_operand" "n")]
     74 			    UNSPECV_HTM_TABORTXCI))]
     75   "TARGET_HTM"
     76   "tabort<wd>ci. %0,%1,%2"
     77   [(set_attr "type" "htm")
     78    (set_attr "length" "4")])
     79 
     80 (define_insn "tbegin"
     81   [(set (match_operand:CC 1 "cc_reg_operand" "=x")
     82 	(unspec_volatile:CC [(match_operand 0 "const_0_to_1_operand" "n")]
     83 			    UNSPECV_HTM_TBEGIN))]
     84   "TARGET_HTM"
     85   "tbegin. %0"
     86   [(set_attr "type" "htm")
     87    (set_attr "length" "4")])
     88 
     89 (define_insn "tcheck"
     90   [(set (match_operand:CC 0 "cc_reg_operand" "=y")
     91 	(unspec_volatile:CC [(const_int 0)]
     92 			    UNSPECV_HTM_TCHECK))]
     93   "TARGET_HTM"
     94   "tcheck %0"
     95   [(set_attr "type" "htm")
     96    (set_attr "length" "4")])
     97 
     98 (define_insn "tend"
     99   [(set (match_operand:CC 1 "cc_reg_operand" "=x")
    100 	(unspec_volatile:CC [(match_operand 0 "const_0_to_1_operand" "n")]
    101 			    UNSPECV_HTM_TEND))]
    102   "TARGET_HTM"
    103   "tend. %0"
    104   [(set_attr "type" "htm")
    105    (set_attr "length" "4")])
    106 
    107 (define_insn "trechkpt"
    108   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
    109 	(unspec_volatile:CC [(const_int 0)]
    110 			    UNSPECV_HTM_TRECHKPT))]
    111   "TARGET_HTM"
    112   "trechkpt."
    113   [(set_attr "type" "htm")
    114    (set_attr "length" "4")])
    115 
    116 (define_insn "treclaim"
    117   [(set (match_operand:CC 1 "cc_reg_operand" "=x")
    118 	(unspec_volatile:CC [(match_operand:SI 0 "gpc_reg_operand" "r")]
    119 			    UNSPECV_HTM_TRECLAIM))]
    120   "TARGET_HTM"
    121   "treclaim. %0"
    122   [(set_attr "type" "htm")
    123    (set_attr "length" "4")])
    124 
    125 (define_insn "tsr"
    126   [(set (match_operand:CC 1 "cc_reg_operand" "=x")
    127 	(unspec_volatile:CC [(match_operand 0 "const_0_to_1_operand" "n")]
    128 			    UNSPECV_HTM_TSR))]
    129   "TARGET_HTM"
    130   "tsr. %0"
    131   [(set_attr "type" "htm")
    132    (set_attr "length" "4")])
    133 
    134 (define_insn "ttest"
    135   [(set (match_operand:CC 0 "cc_reg_operand" "=x")
    136 	(unspec_volatile:CC [(const_int 0)]
    137 			    UNSPECV_HTM_TTEST))]
    138   "TARGET_HTM"
    139   "tabortwci. 0,1,0"
    140   [(set_attr "type" "htm")
    141    (set_attr "length" "4")])
    142 
    143 (define_insn "htm_mfspr_<mode>"
    144   [(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
    145         (unspec_volatile:GPR [(match_operand 1 "u10bit_cint_operand" "n")
    146 			      (match_operand:GPR 2 "htm_spr_reg_operand" "")]
    147 			     UNSPECV_HTM_MFSPR))]
    148   "TARGET_HTM"
    149   "mfspr %0,%1";
    150   [(set_attr "type" "htm")
    151    (set_attr "length" "4")])
    152 
    153 (define_insn "htm_mtspr_<mode>"
    154   [(set (match_operand:GPR 2 "htm_spr_reg_operand" "")
    155         (unspec_volatile:GPR [(match_operand:GPR 0 "gpc_reg_operand" "r")
    156 			      (match_operand 1 "u10bit_cint_operand" "n")]
    157 			     UNSPECV_HTM_MTSPR))]
    158   "TARGET_HTM"
    159   "mtspr %1,%0";
    160   [(set_attr "type" "htm")
    161    (set_attr "length" "4")])
    162