r233205 - Add Hardware Transactional Memory (HTM) Support

Kit Barton kbarton at ca.ibm.com
Thu Mar 26 07:41:47 PDT 2015


Thanks for the comments.
I will start working on these now and submit a new patch to Phabrictor once
I have the comments addressed.


Kit Barton, Ph.D.
LLVM Development on POWER
IBM Toronto Lab, D2/810/8200/MKM
8200 Warden Ave, Markham, L6G 1C7
(905) 413-3452
kbarton at ca.ibm.com





From:	Richard Smith <richard at metafoo.co.uk>
To:	Kit Barton/Toronto/IBM at IBMCA
Cc:	cfe commits <cfe-commits at cs.uiuc.edu>
Date:	2015/03/25 04:47 PM
Subject:	Re: r233205 - Add Hardware Transactional Memory (HTM) Support
Sent by:	metafoo at gmail.com



On Wed, Mar 25, 2015 at 12:41 PM, Kit Barton <kbarton at ca.ibm.com> wrote:
  Author: kbarton
  Date: Wed Mar 25 14:41:41 2015
  New Revision: 233205

  URL: http://llvm.org/viewvc/llvm-project?rev=233205&view=rev
  Log:
  Add Hardware Transactional Memory (HTM) Support

  This patch adds Hardware Transaction Memory (HTM) support supported by
  ISA 2.07
  (POWER8). The intrinsic support is based on GCC one [1], with both
  'PowerPC HTM
  Low Level Built-in Functions' and 'PowerPC HTM High Level Inline
  Functions'
  implemented.

  Along with builtins a new driver switch is added to enable/disable HTM
  instruction support (-mhtm) and a header with common definitions (mostly
  to
  parse the TFHAR register value). The HTM switch also sets a preprocessor
  builtin
  HTM.

  The HTM usage requires a recently newer kernel with PPC HTM enabled.
  Tested on
  powerpc64 and powerpc64le.

  This is send along a llvm patch to enabled the builtins and option
  switch.

  [1]
  https://gcc.gnu.org/onlinedocs/gcc/PowerPC-Hardware-Transactional-Memory-Built-in-Functions.html


  Phabricator Review: http://reviews.llvm.org/D8248

  Added:
      cfe/trunk/lib/Headers/htmintrin.h
      cfe/trunk/lib/Headers/htmxlintrin.h
      cfe/trunk/test/CodeGen/builtins-ppc-htm.c
  Modified:
      cfe/trunk/include/clang/Basic/BuiltinsPPC.def
      cfe/trunk/include/clang/Driver/Options.td
      cfe/trunk/lib/Basic/Targets.cpp
      cfe/trunk/lib/CodeGen/CGBuiltin.cpp

  Modified: cfe/trunk/include/clang/Basic/BuiltinsPPC.def
  URL:
  http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/BuiltinsPPC.def?rev=233205&r1=233204&r2=233205&view=diff

  ==============================================================================

  --- cfe/trunk/include/clang/Basic/BuiltinsPPC.def (original)
  +++ cfe/trunk/include/clang/Basic/BuiltinsPPC.def Wed Mar 25 14:41:41
  2015
  @@ -252,6 +252,37 @@ BUILTIN(__builtin_vsx_xsmindp, "ddd", ""
   BUILTIN(__builtin_vsx_xvdivdp, "V2dV2dV2d", "")
   BUILTIN(__builtin_vsx_xvdivsp, "V4fV4fV4f", "")

  +// HTM builtins
  +BUILTIN(__builtin_tbegin, "UiUIi", "")
  +BUILTIN(__builtin_tend, "UiUIi", "")
  +
  +BUILTIN(__builtin_tabort, "UiUi", "")
  +BUILTIN(__builtin_tabortdc, "UiUiUiUi", "")
  +BUILTIN(__builtin_tabortdci, "UiUiUii", "")
  +BUILTIN(__builtin_tabortwc, "UiUiUiUi", "")
  +BUILTIN(__builtin_tabortwci, "UiUiUii", "")
  +
  +BUILTIN(__builtin_tcheck, "Ui", "")
  +BUILTIN(__builtin_treclaim, "UiUi", "")
  +BUILTIN(__builtin_trechkpt, "Ui", "")
  +BUILTIN(__builtin_tsr, "UiUi", "")
  +
  +BUILTIN(__builtin_tendall, "Ui", "")
  +BUILTIN(__builtin_tresume, "Ui", "")
  +BUILTIN(__builtin_tsuspend, "Ui", "")
  +
  +BUILTIN(__builtin_get_texasr, "LUi", "c")
  +BUILTIN(__builtin_get_texasru, "LUi", "c")
  +BUILTIN(__builtin_get_tfhar, "LUi", "c")
  +BUILTIN(__builtin_get_tfiar, "LUi", "c")
  +
  +BUILTIN(__builtin_set_texasr, "vLUi", "c")
  +BUILTIN(__builtin_set_texasru, "vLUi", "c")
  +BUILTIN(__builtin_set_tfhar, "vLUi", "c")
  +BUILTIN(__builtin_set_tfiar, "vLUi", "c")
  +
  +BUILTIN(__builtin_ttest, "LUi", "")
  +
   // FIXME: Obviously incomplete.

   #undef BUILTIN

  Modified: cfe/trunk/include/clang/Driver/Options.td
  URL:
  http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=233205&r1=233204&r2=233205&view=diff

  ==============================================================================

  --- cfe/trunk/include/clang/Driver/Options.td (original)
  +++ cfe/trunk/include/clang/Driver/Options.td Wed Mar 25 14:41:41 2015
  @@ -1263,6 +1263,8 @@ def mpower8_crypto : Flag<["-"], "mcrypt
       Group<m_ppc_Features_Group>;
   def mnopower8_crypto : Flag<["-"], "mno-crypto">,
       Group<m_ppc_Features_Group>;
  +def mhtm : Flag<["-"], "mhtm">, Group<m_ppc_Features_Group>;
  +def mno_htm : Flag<["-"], "mno-htm">, Group<m_ppc_Features_Group>;
   def mfprnd : Flag<["-"], "mfprnd">, Group<m_ppc_Features_Group>;
   def mno_fprnd : Flag<["-"], "mno-fprnd">, Group<m_ppc_Features_Group>;
   def mcmpb : Flag<["-"], "mcmpb">, Group<m_ppc_Features_Group>;

  Modified: cfe/trunk/lib/Basic/Targets.cpp
  URL:
  http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=233205&r1=233204&r2=233205&view=diff

  ==============================================================================

  --- cfe/trunk/lib/Basic/Targets.cpp (original)
  +++ cfe/trunk/lib/Basic/Targets.cpp Wed Mar 25 14:41:41 2015
  @@ -744,6 +744,7 @@ class PPCTargetInfo : public TargetInfo
     bool HasP8Vector;
     bool HasP8Crypto;
     bool HasQPX;
  +  bool HasHTM;

   protected:
     std::string ABI;
  @@ -751,7 +752,7 @@ protected:
   public:
     PPCTargetInfo(const llvm::Triple &Triple)
       : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
  -      HasP8Crypto(false), HasQPX(false) {
  +      HasP8Crypto(false), HasQPX(false), HasHTM(false) {
       BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
       LongDoubleWidth = LongDoubleAlign = 128;
       LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
  @@ -1026,6 +1027,11 @@ bool PPCTargetInfo::handleTargetFeatures
         continue;
       }

  +    if (Feature == "htm") {
  +      HasHTM = true;
  +      continue;
  +    }
  +
       // TODO: Finish this list and add an assert that we've handled them
       // all.
     }
  @@ -1180,6 +1186,8 @@ void PPCTargetInfo::getTargetDefines(con
       Builder.defineMacro("__POWER8_VECTOR__");
     if (HasP8Crypto)
       Builder.defineMacro("__CRYPTO__");
  +  if (HasHTM)
  +    Builder.defineMacro("__HTM__");

     // FIXME: The following are not yet generated here by Clang, but are
     //        generated by GCC:
  @@ -1235,6 +1243,7 @@ bool PPCTargetInfo::hasFeature(StringRef
       .Case("power8-vector", HasP8Vector)
       .Case("crypto", HasP8Crypto)
       .Case("qpx", HasQPX)
  +    .Case("htm", HasHTM)
       .Default(false);
   }


  Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp
  URL:
  http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=233205&r1=233204&r2=233205&view=diff

  ==============================================================================

  --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original)
  +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Wed Mar 25 14:41:41 2015
  @@ -26,6 +26,7 @@
   #include "llvm/IR/DataLayout.h"
   #include "llvm/IR/InlineAsm.h"
   #include "llvm/IR/Intrinsics.h"
  +#include <sstream>

   using namespace clang;
   using namespace CodeGen;
  @@ -6370,6 +6371,7 @@ Value *CodeGenFunction::EmitPPCBuiltinEx
       llvm::Function *F = CGM.getIntrinsic(ID);
       return Builder.CreateCall(F, Ops, "");
     }
  +
     // P8 Crypto builtins
     case PPC::BI__builtin_altivec_crypto_vshasigmaw:
     case PPC::BI__builtin_altivec_crypto_vshasigmad:
  @@ -6399,6 +6401,89 @@ Value *CodeGenFunction::EmitPPCBuiltinEx
       llvm::Function *F = CGM.getIntrinsic(ID);
       return Builder.CreateCall(F, Ops, "");
     }
  +
  +  // HTM builtins
  +  case PPC::BI__builtin_tbegin:
  +  case PPC::BI__builtin_tend:
  +  case PPC::BI__builtin_tsr: {
  +    unsigned int MaxValue;
  +    // The HTM instructions only accept one argument and with limited
  range.
  +    ConstantInt *CI = dyn_cast<ConstantInt>(Ops[0]);
  +    assert(CI);
  +    switch (BuiltinID) {
  +    case PPC::BI__builtin_tbegin:
  +      ID = Intrinsic::ppc_tbegin;
  +      MaxValue = 1;
  +      break;
  +    case PPC::BI__builtin_tend:
  +      ID = Intrinsic::ppc_tend;
  +      MaxValue = 1;
  +      break;
  +    case PPC::BI__builtin_tsr:
  +      ID = Intrinsic::ppc_tsr;
  +      MaxValue = 7;
  +      break;
  +    }
  +    if (CI->getZExtValue() > MaxValue) {
  +      std::stringstream ss;
  +      ss << "argument out of range (should be 0 or " << MaxValue << ")";
  +      CGM.Error(E->getArg(0)->getExprLoc(), ss.str());
  +      return llvm::UndefValue::get(Ops[0]->getType());

This constraint should be checked and diagnosed in Sema, not here, and
should use a proper diagnostic.

  +    }
  +
  +    llvm::Function *F = CGM.getIntrinsic(ID);
  +    return Builder.CreateCall(F, Ops, "");
  +  }
  +  case PPC::BI__builtin_tabortdc:
  +  case PPC::BI__builtin_tabortwc: {
  +    // For wd and dc variant of tabort first argument must be a 5-bit
  constant
  +    // integer
  +    ConstantInt *CI = dyn_cast<ConstantInt>(Ops[0]);
  +    assert(CI);
  +    if (CI->getZExtValue() > 31) {
  +      CGM.ErrorUnsupported(E->getArg(0), "argument out of range (should
  be 0-31)");
  +      return llvm::UndefValue::get(Ops[0]->getType());

Likewise here and in the two cases below.

Please also add some test coverage for these diagnostics.

  +    }
  +    switch (BuiltinID) {
  +    case PPC::BI__builtin_tabortdc:
  +      ID = Intrinsic::ppc_tabortdc;
  +      break;
  +    case PPC::BI__builtin_tabortwc:
  +      ID = Intrinsic::ppc_tabortwc;
  +      break;
  +    }
  +    llvm::Function *F = CGM.getIntrinsic(ID);
  +    return Builder.CreateCall(F, Ops, "");
  +  }
  +  case PPC::BI__builtin_tabortdci:
  +  case PPC::BI__builtin_tabortwci: {
  +    // For wd and dc variant of tabort first and third argument must be
  a
  +    // 5-bit constant integer
  +    ConstantInt *CI = dyn_cast<ConstantInt>(Ops[0]);
  +    assert(CI);
  +    if (CI->getZExtValue() > 31) {
  +      CGM.ErrorUnsupported(E->getArg(0), "argument out of range (should
  be 0-31)");
  +      return llvm::UndefValue::get(Ops[0]->getType());
  +    }
  +    CI = dyn_cast<ConstantInt>(Ops[2]);
  +    assert(CI);
  +    if (CI->getZExtValue() > 31) {
  +      CGM.ErrorUnsupported(E->getArg(2), "argument out of range (should
  be 0-31)");
  +      return llvm::UndefValue::get(Ops[2]->getType());
  +    }
  +    switch (BuiltinID) {
  +    default: llvm_unreachable("Unsupported htm intrinsic!");
  +    case PPC::BI__builtin_tabortdci:
  +      ID = Intrinsic::ppc_tabortdci;
  +      break;
  +    case PPC::BI__builtin_tabortwci:
  +      ID = Intrinsic::ppc_tabortwci;
  +      break;
  +    }
  +    llvm::Function *F = CGM.getIntrinsic(ID);
  +    return Builder.CreateCall(F, Ops, "");
  +  }
  +
     }
   }


  Added: cfe/trunk/lib/Headers/htmintrin.h
  URL:
  http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/htmintrin.h?rev=233205&view=auto

  ==============================================================================

  --- cfe/trunk/lib/Headers/htmintrin.h (added)
  +++ cfe/trunk/lib/Headers/htmintrin.h Wed Mar 25 14:41:41 2015
  @@ -0,0 +1,131 @@
  +/*===---- htmintrin.h - Standard header for PowerPC HTM
  ---------------===*\
  + *
  + * Permission is hereby granted, free of charge, to any person obtaining
  a copy
  + * of this software and associated documentation files (the "Software"),
  to deal
  + * in the Software without restriction, including without limitation the
  rights
  + * to use, copy, modify, merge, publish, distribute, sublicense, and/or
  sell
  + * copies of the Software, and to permit persons to whom the Software is
  + * furnished to do so, subject to the following conditions:
  + *
  + * The above copyright notice and this permission notice shall be
  included in
  + * all copies or substantial portions of the Software.
  + *
  + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  EXPRESS OR
  + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  MERCHANTABILITY,
  + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
  SHALL THE
  + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  OTHER
  + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  ARISING FROM,
  + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  DEALINGS IN
  + * THE SOFTWARE.
  + *
  +
  \*===----------------------------------------------------------------------===*/

  +
  +#ifndef __HTMINTRIN_H
  +#define __HTMINTRIN_H
  +
  +#ifndef __HTM__
  +#error "HTM instruction set not enabled"
  +#endif
  +
  +#ifdef __powerpc__
  +
  +#include <stdint.h>
  +
  +typedef uint64_t texasr_t;
  +typedef uint32_t texasru_t;
  +typedef uint32_t texasrl_t;
  +typedef uintptr_t tfiar_t;
  +typedef uintptr_t tfhar_t;
  +
  +#define _HTM_STATE(CR0) ((CR0 >> 1) & 0x3)
  +#define _HTM_NONTRANSACTIONAL 0x0
  +#define _HTM_SUSPENDED        0x1
  +#define _HTM_TRANSACTIONAL    0x2
  +
  +#define _TEXASR_EXTRACT_BITS(TEXASR,BITNUM,SIZE) \
  +  (((TEXASR) >> (63-(BITNUM))) & ((1<<(SIZE))-1))
  +#define _TEXASRU_EXTRACT_BITS(TEXASR,BITNUM,SIZE) \
  +  (((TEXASR) >> (31-(BITNUM))) & ((1<<(SIZE))-1))
  +
  +#define _TEXASR_FAILURE_CODE(TEXASR) \
  +  _TEXASR_EXTRACT_BITS(TEXASR, 7, 8)
  +#define _TEXASRU_FAILURE_CODE(TEXASRU) \
  +  _TEXASRU_EXTRACT_BITS(TEXASRU, 7, 8)
  +
  +#define _TEXASR_FAILURE_PERSISTENT(TEXASR) \
  +  _TEXASR_EXTRACT_BITS(TEXASR, 7, 1)
  +#define _TEXASRU_FAILURE_PERSISTENT(TEXASRU) \
  +  _TEXASRU_EXTRACT_BITS(TEXASRU, 7, 1)
  +
  +#define _TEXASR_DISALLOWED(TEXASR) \
  +  _TEXASR_EXTRACT_BITS(TEXASR, 8, 1)
  +#define _TEXASRU_DISALLOWED(TEXASRU) \
  +  _TEXASRU_EXTRACT_BITS(TEXASRU, 8, 1)
  +
  +#define _TEXASR_NESTING_OVERFLOW(TEXASR) \
  +  _TEXASR_EXTRACT_BITS(TEXASR, 9, 1)
  +#define _TEXASRU_NESTING_OVERFLOW(TEXASRU) \
  +  _TEXASRU_EXTRACT_BITS(TEXASRU, 9, 1)
  +
  +#define _TEXASR_FOOTPRINT_OVERFLOW(TEXASR) \
  +  _TEXASR_EXTRACT_BITS(TEXASR, 10, 1)
  +#define _TEXASRU_FOOTPRINT_OVERFLOW(TEXASRU) \
  +  _TEXASRU_EXTRACT_BITS(TEXASRU, 10, 1)
  +
  +#define _TEXASR_SELF_INDUCED_CONFLICT(TEXASR) \
  +  _TEXASR_EXTRACT_BITS(TEXASR, 11, 1)
  +#define _TEXASRU_SELF_INDUCED_CONFLICT(TEXASRU) \
  +  _TEXASRU_EXTRACT_BITS(TEXASRU, 11, 1)
  +
  +#define _TEXASR_NON_TRANSACTIONAL_CONFLICT(TEXASR) \
  +  _TEXASR_EXTRACT_BITS(TEXASR, 12, 1)
  +#define _TEXASRU_NON_TRANSACTIONAL_CONFLICT(TEXASRU) \
  +  _TEXASRU_EXTRACT_BITS(TEXASRU, 12, 1)
  +
  +#define _TEXASR_TRANSACTION_CONFLICT(TEXASR) \
  +  _TEXASR_EXTRACT_BITS(TEXASR, 13, 1)
  +#define _TEXASRU_TRANSACTION_CONFLICT(TEXASRU) \
  +  _TEXASRU_EXTRACT_BITS(TEXASRU, 13, 1)
  +
  +#define _TEXASR_TRANSLATION_INVALIDATION_CONFLICT(TEXASR) \
  +  _TEXASR_EXTRACT_BITS(TEXASR, 14, 1)
  +#define _TEXASRU_TRANSLATION_INVALIDATION_CONFLICT(TEXASRU) \
  +  _TEXASRU_EXTRACT_BITS(TEXASRU, 14, 1)
  +
  +#define _TEXASR_IMPLEMENTAION_SPECIFIC(TEXASR) \
  +  _TEXASR_EXTRACT_BITS(TEXASR, 15, 1)
  +#define _TEXASRU_IMPLEMENTAION_SPECIFIC(TEXASRU) \
  +  _TEXASRU_EXTRACT_BITS(TEXASRU, 15, 1)
  +
  +#define _TEXASR_INSTRUCTION_FETCH_CONFLICT(TEXASR) \
  +  _TEXASR_EXTRACT_BITS(TEXASR, 16, 1)
  +#define _TEXASRU_INSTRUCTION_FETCH_CONFLICT(TEXASRU) \
  +  _TEXASRU_EXTRACT_BITS(TEXASRU, 16, 1)
  +
  +#define _TEXASR_ABORT(TEXASR) \
  +  _TEXASR_EXTRACT_BITS(TEXASR, 31, 1)
  +#define _TEXASRU_ABORT(TEXASRU) \
  +  _TEXASRU_EXTRACT_BITS(TEXASRU, 31, 1)
  +
  +
  +#define _TEXASR_SUSPENDED(TEXASR) \
  +  _TEXASR_EXTRACT_BITS(TEXASR, 32, 1)
  +
  +#define _TEXASR_PRIVILEGE(TEXASR) \
  +  _TEXASR_EXTRACT_BITS(TEXASR, 35, 2)
  +
  +#define _TEXASR_FAILURE_SUMMARY(TEXASR) \
  +  _TEXASR_EXTRACT_BITS(TEXASR, 36, 1)
  +
  +#define _TEXASR_TFIAR_EXACT(TEXASR) \
  +  _TEXASR_EXTRACT_BITS(TEXASR, 37, 1)
  +
  +#define _TEXASR_ROT(TEXASR) \
  +  _TEXASR_EXTRACT_BITS(TEXASR, 38, 1)
  +
  +#define _TEXASR_TRANSACTION_LEVEL(TEXASR) \
  +  _TEXASR_EXTRACT_BITS(TEXASR, 63, 12)
  +
  +#endif /* __powerpc */
  +
  +#endif /* __HTMINTRIN_H */

  Added: cfe/trunk/lib/Headers/htmxlintrin.h
  URL:
  http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/htmxlintrin.h?rev=233205&view=auto

  ==============================================================================

  --- cfe/trunk/lib/Headers/htmxlintrin.h (added)
  +++ cfe/trunk/lib/Headers/htmxlintrin.h Wed Mar 25 14:41:41 2015
  @@ -0,0 +1,215 @@
  +/*===---- htmxlintrin.h - XL compiler HTM execution
  intrinsics-------------===*\
  + *
  + * Permission is hereby granted, free of charge, to any person obtaining
  a copy
  + * of this software and associated documentation files (the "Software"),
  to deal
  + * in the Software without restriction, including without limitation the
  rights
  + * to use, copy, modify, merge, publish, distribute, sublicense, and/or
  sell
  + * copies of the Software, and to permit persons to whom the Software is
  + * furnished to do so, subject to the following conditions:
  + *
  + * The above copyright notice and this permission notice shall be
  included in
  + * all copies or substantial portions of the Software.
  + *
  + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  EXPRESS OR
  + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  MERCHANTABILITY,
  + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
  SHALL THE
  + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  OTHER
  + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  ARISING FROM,
  + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  DEALINGS IN
  + * THE SOFTWARE.
  + *
  +
  \*===----------------------------------------------------------------------===*/

  +
  +#ifndef __HTMXLINTRIN_H
  +#define __HTMXLINTRIN_H
  +
  +#ifndef __HTM__
  +#error "HTM instruction set not enabled"
  +#endif
  +
  +#include <htmintrin.h>
  +
  +#ifdef __powerpc__
  +
  +#ifdef __cplusplus
  +extern "C" {
  +#endif
  +
  +#define _TEXASR_PTR(TM_BUF) \
  +  ((texasr_t *)((TM_BUF)+0))
  +#define _TEXASRU_PTR(TM_BUF) \
  +  ((texasru_t *)((TM_BUF)+0))
  +#define _TEXASRL_PTR(TM_BUF) \
  +  ((texasrl_t *)((TM_BUF)+4))
  +#define _TFIAR_PTR(TM_BUF) \
  +  ((tfiar_t *)((TM_BUF)+8))
  +
  +typedef char TM_buff_type[16];
  +
  +/* This macro can be used to determine whether a transaction was
  successfully
  +   started from the __TM_begin() and __TM_simple_begin() intrinsic
  functions
  +   below.  */
  +#define _HTM_TBEGIN_STARTED     1
  +
  +extern __inline long
  +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
  +__TM_simple_begin (void)
  +{
  +  if (__builtin_expect (__builtin_tbegin (0), 1))
  +    return _HTM_TBEGIN_STARTED;
  +  return 0;
  +}
  +
  +extern __inline long
  +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
  +__TM_begin (void* const TM_buff)
  +{
  +  *_TEXASRL_PTR (TM_buff) = 0;
  +  if (__builtin_expect (__builtin_tbegin (0), 1))
  +    return _HTM_TBEGIN_STARTED;
  +#ifdef __powerpc64__
  +  *_TEXASR_PTR (TM_buff) = __builtin_get_texasr ();
  +#else
  +  *_TEXASRU_PTR (TM_buff) = __builtin_get_texasru ();
  +  *_TEXASRL_PTR (TM_buff) = __builtin_get_texasr ();
  +#endif
  +  *_TFIAR_PTR (TM_buff) = __builtin_get_tfiar ();
  +  return 0;
  +}
  +
  +extern __inline long
  +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
  +__TM_end (void)
  +{
  +  if (__builtin_expect (__builtin_tend (0), 1))
  +    return 1;
  +  return 0;
  +}
  +
  +extern __inline void
  +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
  +__TM_abort (void)
  +{
  +  __builtin_tabort (0);
  +}
  +
  +extern __inline void
  +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
  +__TM_named_abort (unsigned char const code)
  +{
  +  __builtin_tabort (code);
  +}
  +
  +extern __inline void
  +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
  +__TM_resume (void)
  +{
  +  __builtin_tresume ();
  +}
  +
  +extern __inline void
  +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
  +__TM_suspend (void)
  +{
  +  __builtin_tsuspend ();
  +}
  +
  +extern __inline long
  +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
  +__TM_is_user_abort (void* const TM_buff)
  +{
  +  texasru_t texasru = *_TEXASRU_PTR (TM_buff);
  +  return _TEXASRU_ABORT (texasru);
  +}
  +
  +extern __inline long
  +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
  +__TM_is_named_user_abort (void* const TM_buff, unsigned char *code)
  +{
  +  texasru_t texasru = *_TEXASRU_PTR (TM_buff);
  +
  +  *code = _TEXASRU_FAILURE_CODE (texasru);
  +  return _TEXASRU_ABORT (texasru);
  +}
  +
  +extern __inline long
  +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
  +__TM_is_illegal (void* const TM_buff)
  +{
  +  texasru_t texasru = *_TEXASRU_PTR (TM_buff);
  +  return _TEXASRU_DISALLOWED (texasru);
  +}
  +
  +extern __inline long
  +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
  +__TM_is_footprint_exceeded (void* const TM_buff)
  +{
  +  texasru_t texasru = *_TEXASRU_PTR (TM_buff);
  +  return _TEXASRU_FOOTPRINT_OVERFLOW (texasru);
  +}
  +
  +extern __inline long
  +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
  +__TM_nesting_depth (void* const TM_buff)
  +{
  +  texasrl_t texasrl;
  +
  +  if (_HTM_STATE (__builtin_ttest ()) == _HTM_NONTRANSACTIONAL)
  +    {
  +      texasrl = *_TEXASRL_PTR (TM_buff);
  +      if (!_TEXASR_FAILURE_SUMMARY (texasrl))
  +        texasrl = 0;
  +    }
  +  else
  +    texasrl = (texasrl_t) __builtin_get_texasr ();
  +
  +  return _TEXASR_TRANSACTION_LEVEL (texasrl);
  +}
  +
  +extern __inline long
  +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
  +__TM_is_nested_too_deep(void* const TM_buff)
  +{
  +  texasru_t texasru = *_TEXASRU_PTR (TM_buff);
  +  return _TEXASRU_NESTING_OVERFLOW (texasru);
  +}
  +
  +extern __inline long
  +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
  +__TM_is_conflict(void* const TM_buff)
  +{
  +  texasru_t texasru = *_TEXASRU_PTR (TM_buff);
  +  /* Return TEXASR bits 11 (Self-Induced Conflict) through
  +     14 (Translation Invalidation Conflict).  */
  +  return (_TEXASRU_EXTRACT_BITS (texasru, 14, 4)) ? 1 : 0;
  +}
  +
  +extern __inline long
  +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
  +__TM_is_failure_persistent(void* const TM_buff)
  +{
  +  texasru_t texasru = *_TEXASRU_PTR (TM_buff);
  +  return _TEXASRU_FAILURE_PERSISTENT (texasru);
  +}
  +
  +extern __inline long
  +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
  +__TM_failure_address(void* const TM_buff)
  +{
  +  return *_TFIAR_PTR (TM_buff);
  +}
  +
  +extern __inline long long
  +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
  +__TM_failure_code(void* const TM_buff)
  +{
  +  return *_TEXASR_PTR (TM_buff);
  +}
  +
  +#ifdef __cplusplus
  +}
  +#endif
  +
  +#endif /* __powerpc__ */
  +
  +#endif /* __HTMXLINTRIN_H  */

  Added: cfe/trunk/test/CodeGen/builtins-ppc-htm.c
  URL:
  http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/builtins-ppc-htm.c?rev=233205&view=auto

  ==============================================================================

  --- cfe/trunk/test/CodeGen/builtins-ppc-htm.c (added)
  +++ cfe/trunk/test/CodeGen/builtins-ppc-htm.c Wed Mar 25 14:41:41 2015
  @@ -0,0 +1,62 @@
  +// REQUIRES: powerpc-registered-target
  +// RUN: %clang_cc1 -faltivec -target-feature +htm -triple
  powerpc64-unknown-unknown -emit-llvm %s -o - | FileCheck %s
  +
  +void test1(long int *r, int code, long int *a, long int *b) {
  +// CHECK-LABEL: define void @test1
  +
  +  r[0] = __builtin_tbegin (0);
  +// CHECK: @llvm.ppc.tbegin
  +  r[1] = __builtin_tbegin (1);
  +// CHECK: @llvm.ppc.tbegin
  +  r[2] = __builtin_tend (0);
  +// CHECK: @llvm.ppc.tend
  +  r[3] = __builtin_tendall ();
  +// CHECK: @llvm.ppc.tendall
  +
  +  r[4] = __builtin_tabort (code);
  +// CHECK: @llvm.ppc.tabort
  +  r[5] = __builtin_tabort (0x1);
  +// CHECK: @llvm.ppc.tabort
  +  r[6] = __builtin_tabortdc (0xf, a[0], b[0]);
  +// CHECK: @llvm.ppc.tabortdc
  +  r[7] = __builtin_tabortdci (0xf, a[1], 0x1);
  +// CHECK: @llvm.ppc.tabortdc
  +  r[8] = __builtin_tabortwc (0xf, a[2], b[2]);
  +// CHECK: @llvm.ppc.tabortwc
  +  r[9] = __builtin_tabortwci (0xf, a[3], 0x1);
  +// CHECK: @llvm.ppc.tabortwc
  +
  +  r[10] = __builtin_tcheck ();
  +// CHECK: @llvm.ppc.tcheck
  +  r[11] = __builtin_trechkpt ();
  +// CHECK: @llvm.ppc.trechkpt
  +  r[12] = __builtin_treclaim (0);
  +// CHECK: @llvm.ppc.treclaim
  +  r[13] = __builtin_tresume ();
  +// CHECK: @llvm.ppc.tresume
  +  r[14] = __builtin_tsuspend ();
  +// CHECK: @llvm.ppc.tsuspend
  +  r[15] = __builtin_tsr (0);
  +// CHECK: @llvm.ppc.tsr
  +
  +  r[16] = __builtin_ttest ();
  +// CHECK: @llvm.ppc.ttest
  +
  +  r[17] = __builtin_get_texasr ();
  +// CHECK: @llvm.ppc.get.texasr
  +  r[18] = __builtin_get_texasru ();
  +// CHECK: @llvm.ppc.get.texasru
  +  r[19] = __builtin_get_tfhar ();
  +// CHECK: @llvm.ppc.get.tfhar
  +  r[20] = __builtin_get_tfiar ();
  +// CHECK: @llvm.ppc.get.tfiar
  +
  +  __builtin_set_texasr (a[21]);
  +// CHECK: @llvm.ppc.set.texasr
  +  __builtin_set_texasru (a[22]);
  +// CHECK: @llvm.ppc.set.texasru
  +  __builtin_set_tfhar (a[23]);
  +// CHECK: @llvm.ppc.set.tfhar
  +  __builtin_set_tfiar (a[24]);
  +// CHECK: @llvm.ppc.set.tfiar
  +}


  _______________________________________________
  cfe-commits mailing list
  cfe-commits at cs.uiuc.edu
  http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150326/60715fe8/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: graycol.gif
Type: image/gif
Size: 105 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150326/60715fe8/attachment.gif>


More information about the cfe-commits mailing list