Blame sysdeps/unix/sysv/linux/x86/hle.h

Packit 6c4009
/* Shared RTM header.  Emulate TSX intrinsics for compilers and assemblers
Packit 6c4009
   that do not support the intrinsics and instructions yet.  */
Packit 6c4009
#ifndef _HLE_H
Packit 6c4009
#define _HLE_H 1
Packit 6c4009
Packit 6c4009
#ifdef __ASSEMBLER__
Packit 6c4009
Packit 6c4009
.macro XBEGIN target
Packit 6c4009
	.byte 0xc7,0xf8
Packit 6c4009
	.long \target-1f
Packit 6c4009
1:
Packit 6c4009
.endm
Packit 6c4009
Packit 6c4009
.macro XEND
Packit 6c4009
	.byte 0x0f,0x01,0xd5
Packit 6c4009
.endm
Packit 6c4009
Packit 6c4009
.macro XABORT code
Packit 6c4009
	.byte 0xc6,0xf8,\code
Packit 6c4009
.endm
Packit 6c4009
Packit 6c4009
.macro XTEST
Packit 6c4009
	 .byte 0x0f,0x01,0xd6
Packit 6c4009
.endm
Packit 6c4009
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* Official RTM intrinsics interface matching gcc/icc, but works
Packit 6c4009
   on older gcc compatible compilers and binutils.
Packit 6c4009
   We should somehow detect if the compiler supports it, because
Packit 6c4009
   it may be able to generate slightly better code.  */
Packit 6c4009
Packit 6c4009
#define _XBEGIN_STARTED		(~0u)
Packit 6c4009
#define _XABORT_EXPLICIT	(1 << 0)
Packit 6c4009
#define _XABORT_RETRY		(1 << 1)
Packit 6c4009
#define _XABORT_CONFLICT	(1 << 2)
Packit 6c4009
#define _XABORT_CAPACITY	(1 << 3)
Packit 6c4009
#define _XABORT_DEBUG		(1 << 4)
Packit 6c4009
#define _XABORT_NESTED		(1 << 5)
Packit 6c4009
#define _XABORT_CODE(x)		(((x) >> 24) & 0xff)
Packit 6c4009
Packit 6c4009
#define _ABORT_LOCK_BUSY 	0xff
Packit 6c4009
#define _ABORT_LOCK_IS_LOCKED	0xfe
Packit 6c4009
#define _ABORT_NESTED_TRYLOCK	0xfd
Packit 6c4009
Packit 6c4009
#ifndef __ASSEMBLER__
Packit 6c4009
Packit 6c4009
#define __force_inline __attribute__((__always_inline__)) inline
Packit 6c4009
Packit 6c4009
static __force_inline int _xbegin(void)
Packit 6c4009
{
Packit 6c4009
  int ret = _XBEGIN_STARTED;
Packit 6c4009
  asm volatile (".byte 0xc7,0xf8 ; .long 0" : "+a" (ret) :: "memory");
Packit 6c4009
  return ret;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static __force_inline void _xend(void)
Packit 6c4009
{
Packit 6c4009
  asm volatile (".byte 0x0f,0x01,0xd5" ::: "memory");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static __force_inline void _xabort(const unsigned int status)
Packit 6c4009
{
Packit 6c4009
  asm volatile (".byte 0xc6,0xf8,%P0" :: "i" (status) : "memory");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static __force_inline int _xtest(void)
Packit 6c4009
{
Packit 6c4009
  unsigned char out;
Packit 6c4009
  asm volatile (".byte 0x0f,0x01,0xd6 ; setnz %0" : "=r" (out) :: "memory");
Packit 6c4009
  return out;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
#endif
Packit 6c4009
#endif