/* Copyright (C) 2011-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Chris Metcalf , 2011. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library. If not, see . */ #ifdef __tilegx__ #define TLS_GD_OFFSET(x) \ "moveli r0, hw1_last_tls_gd(" #x ")\n\t" \ "shl16insli r0, r0, hw0_tls_gd(" #x ")\n\t" \ "addi r0, %1, tls_add(" #x ")\n\t" #else #define TLS_GD_OFFSET(x) \ "auli r0, %1, tls_gd_ha16(" #x ")\n\t" \ "addli r0, r0, tls_gd_lo16(" #x ")\n\t" #endif #define TLS_GD(x) \ ({ \ int *__retval; \ extern char _GLOBAL_OFFSET_TABLE_[]; \ \ asm (TLS_GD_OFFSET(x) \ "jal tls_gd_call(" #x ")\n\t" \ "addi %0, r0, tls_gd_add(" #x ")" : \ "=&r" (__retval) : "r" (_GLOBAL_OFFSET_TABLE_) : \ "r0", "r25", "r26", "r27", "r28", "r29"); \ __retval; }) /* No special support for LD mode. */ #define TLS_LD TLS_GD #ifdef __tilegx__ #define TLS_IE_OFFSET(x) \ "moveli %0, hw1_last_tls_ie(" #x ")\n\t" \ "shl16insli %0, %0, hw0_tls_ie(" #x ")\n\t" \ "addi %0, %1, tls_add(" #x ")\n\t" #define LD_TLS "ld_tls" #else #define TLS_IE_OFFSET(x) \ "auli %0, %1, tls_ie_ha16(" #x ")\n\t" \ "addli %0, %0, tls_ie_lo16(" #x ")\n\t" #define LD_TLS "lw_tls" #endif #define TLS_IE(x) \ ({ \ int *__retval; \ extern char _GLOBAL_OFFSET_TABLE_[]; \ \ asm (TLS_IE_OFFSET(x) \ LD_TLS " %0, %0, tls_ie_load(" #x ")\n\t" \ "add %0, %0, tp" : \ "=&r" (__retval) : "r" (_GLOBAL_OFFSET_TABLE_)); \ __retval; }) #ifdef __tilegx__ #define _TLS_LE(x) \ "moveli %0, hw1_last_tls_le(" #x ")\n\t" \ "shl16insli %0, %0, hw0_tls_le(" #x ")\n\t" \ "add %0, %0, tp" #else #define _TLS_LE(x) \ "auli %0, tp, tls_le_ha16(" #x ")\n\t" \ "addli %0, %0, tls_le_lo16(" #x ")\n\t" #endif #define TLS_LE(x) \ ({ \ int *__retval; \ asm (_TLS_LE(x) : "=r" (__retval)); \ __retval; })