diff mbox series

[for-8.0,17/29] tcg/aarch64: Add have_lse, have_lse2

Message ID 20221118094754.242910-18-richard.henderson@linaro.org
State Superseded
Headers show
Series tcg: Improve atomicity support | expand

Commit Message

Richard Henderson Nov. 18, 2022, 9:47 a.m. UTC
Notice when the host has additional atomic instructions.
The new variables will also be used in generated code.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 tcg/aarch64/tcg-target.h     |  3 +++
 tcg/aarch64/tcg-target.c.inc | 10 ++++++++++
 2 files changed, 13 insertions(+)

Comments

Philippe Mathieu-Daudé Nov. 21, 2022, 11:10 p.m. UTC | #1
On 18/11/22 10:47, Richard Henderson wrote:
> Notice when the host has additional atomic instructions.
> The new variables will also be used in generated code.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>   tcg/aarch64/tcg-target.h     |  3 +++
>   tcg/aarch64/tcg-target.c.inc | 10 ++++++++++
>   2 files changed, 13 insertions(+)


> diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
> index 001a71bbc0..cf5ee6f742 100644
> --- a/tcg/aarch64/tcg-target.c.inc
> +++ b/tcg/aarch64/tcg-target.c.inc
> @@ -13,6 +13,8 @@
>   #include "../tcg-ldst.c.inc"
>   #include "../tcg-pool.c.inc"
>   #include "qemu/bitops.h"
> +#include <asm/hwcap.h>

This doesn't build on Darwin:

In file included from ../../tcg/tcg.c:426:
tcg/aarch64/tcg-target.c.inc:16:10: fatal error: 'asm/hwcap.h' file not 
found
#include <asm/hwcap.h>
          ^~~~~~~~~~~~~

In file included from ../../accel/tcg/cputlb.c:1656:
../../accel/tcg/ldst_atomicity.c.inc:269:21: warning: value size does 
not match register size specified by the constraint and modifier 
[-Wasm-operand-widths]
             : "=&r"(r.u), "=&r"(fail) : "Q"(*p));
                     ^
../../accel/tcg/ldst_atomicity.c.inc:266:22: note: use constraint 
modifier "w"
         asm("0: ldxp %0, %R0, %2\n\t"
                      ^~
                      %w0

../../accel/tcg/ldst_atomicity.c.inc:902:9: error: invalid operand in 
inline asm: '0: ldxp $2, ${2:R}, $0	bic $2, $2, $4	bic ${2:R}, ${2:R}, 
${4:R}	orr $2, $2, $3	orr ${2:R}, ${2:R}, ${3:R}	stxp ${1:w}, $2, 
${2:R}, $0	cbnz ${1:w}, 0b'
     asm("0: ldxp %[t], %R[t], %[mem]\n\t"
         ^
../../accel/tcg/ldst_atomicity.c.inc:902:9: error: invalid operand in 
inline asm: '0: ldxp $2, ${2:R}, $0	bic $2, $2, $4	bic ${2:R}, ${2:R}, 
${4:R}	orr $2, $2, $3	orr ${2:R}, ${2:R}, ${3:R}	stxp ${1:w}, $2, 
${2:R}, $0	cbnz ${1:w}, 0b'
../../accel/tcg/ldst_atomicity.c.inc:902:9: error: invalid operand in 
inline asm: '0: ldxp $2, ${2:R}, $0	bic $2, $2, $4	bic ${2:R}, ${2:R}, 
${4:R}	orr $2, $2, $3	orr ${2:R}, ${2:R}, ${3:R}	stxp ${1:w}, $2, 
${2:R}, $0	cbnz ${1:w}, 0b'
../../accel/tcg/ldst_atomicity.c.inc:902:9: error: invalid operand in 
inline asm: '0: ldxp $2, ${2:R}, $0	bic $2, $2, $4	bic ${2:R}, ${2:R}, 
${4:R}	orr $2, $2, $3	orr ${2:R}, ${2:R}, ${3:R}	stxp ${1:w}, $2, 
${2:R}, $0	cbnz ${1:w}, 0b'
../../accel/tcg/ldst_atomicity.c.inc:902:9: error: invalid operand in 
inline asm: '0: ldxp $2, ${2:R}, $0	bic $2, $2, $4	bic ${2:R}, ${2:R}, 
${4:R}	orr $2, $2, $3	orr ${2:R}, ${2:R}, ${3:R}	stxp ${1:w}, $2, 
${2:R}, $0	cbnz ${1:w}, 0b'
../../accel/tcg/ldst_atomicity.c.inc:902:9: error: invalid operand in 
inline asm: '0: ldxp $2, ${2:R}, $0	bic $2, $2, $4	bic ${2:R}, ${2:R}, 
${4:R}	orr $2, $2, $3	orr ${2:R}, ${2:R}, ${3:R}	stxp ${1:w}, $2, 
${2:R}, $0	cbnz ${1:w}, 0b'
../../accel/tcg/ldst_atomicity.c.inc:902:9: error: invalid operand in 
inline asm: '0: ldxp $2, ${2:R}, $0	bic $2, $2, $4	bic ${2:R}, ${2:R}, 
${4:R}	orr $2, $2, $3	orr ${2:R}, ${2:R}, ${3:R}	stxp ${1:w}, $2, 
${2:R}, $0	cbnz ${1:w}, 0b'
../../accel/tcg/ldst_atomicity.c.inc:902:9: error: invalid operand in 
inline asm: '0: ldxp $2, ${2:R}, $0	bic $2, $2, $4	bic ${2:R}, ${2:R}, 
${4:R}	orr $2, $2, $3	orr ${2:R}, ${2:R}, ${3:R}	stxp ${1:w}, $2, 
${2:R}, $0	cbnz ${1:w}, 0b'
../../accel/tcg/ldst_atomicity.c.inc:902:9: error: unknown token in 
expression
<inline asm>:1:15: note: instantiated into assembly here
         0: ldxp x13, , [x9]
                      ^
In file included from ../../accel/tcg/cputlb.c:1656:
../../accel/tcg/ldst_atomicity.c.inc:902:9: error: invalid operand
     asm("0: ldxp %[t], %R[t], %[mem]\n\t"
         ^
<inline asm>:1:15: note: instantiated into assembly here
         0: ldxp x13, , [x9]
                      ^
In file included from ../../accel/tcg/cputlb.c:1656:
../../accel/tcg/ldst_atomicity.c.inc:903:32: error: unknown token in 
expression
         "bic %[t], %[t], %[m]\n\t"
                                ^
<inline asm>:3:6: note: instantiated into assembly here
         bic , ,
             ^
In file included from ../../accel/tcg/cputlb.c:1656:
../../accel/tcg/ldst_atomicity.c.inc:902:9: error: invalid operand in 
inline asm: '0: ldxp $2, ${2:R}, $0	bic $2, $2, $4	bic ${2:R}, ${2:R}, 
${4:R}	orr $2, $2, $3	orr ${2:R}, ${2:R}, ${3:R}	stxp ${1:w}, $2, 
${2:R}, $0	cbnz ${1:w}, 0b'
     asm("0: ldxp %[t], %R[t], %[mem]\n\t"
         ^
../../accel/tcg/ldst_atomicity.c.inc:902:9: error: invalid operand in 
inline asm: '0: ldxp $2, ${2:R}, $0	bic $2, $2, $4	bic ${2:R}, ${2:R}, 
${4:R}	orr $2, $2, $3	orr ${2:R}, ${2:R}, ${3:R}	stxp ${1:w}, $2, 
${2:R}, $0	cbnz ${1:w}, 0b'
../../accel/tcg/ldst_atomicity.c.inc:902:9: error: invalid operand in 
inline asm: '0: ldxp $2, ${2:R}, $0	bic $2, $2, $4	bic ${2:R}, ${2:R}, 
${4:R}	orr $2, $2, $3	orr ${2:R}, ${2:R}, ${3:R}	stxp ${1:w}, $2, 
${2:R}, $0	cbnz ${1:w}, 0b'
fatal error: too many errors emitted, stopping now [-ferror-limit=]
Philippe Mathieu-Daudé Nov. 21, 2022, 11:14 p.m. UTC | #2
On 22/11/22 00:10, Philippe Mathieu-Daudé wrote:
> On 18/11/22 10:47, Richard Henderson wrote:
>> Notice when the host has additional atomic instructions.
>> The new variables will also be used in generated code.
>>
>> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
>> ---
>>   tcg/aarch64/tcg-target.h     |  3 +++
>>   tcg/aarch64/tcg-target.c.inc | 10 ++++++++++
>>   2 files changed, 13 insertions(+)
> 
> 
>> diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
>> index 001a71bbc0..cf5ee6f742 100644
>> --- a/tcg/aarch64/tcg-target.c.inc
>> +++ b/tcg/aarch64/tcg-target.c.inc
>> @@ -13,6 +13,8 @@
>>   #include "../tcg-ldst.c.inc"
>>   #include "../tcg-pool.c.inc"
>>   #include "qemu/bitops.h"
>> +#include <asm/hwcap.h>
> 
> This doesn't build on Darwin:

Project version: 7.1.91
C compiler for the host machine: clang (clang 14.0.0 "Apple clang 
version 14.0.0 (clang-1400.0.29.102)")
C linker for the host machine: clang ld64 819.6
Host machine cpu family: aarch64
Host machine cpu: arm64

> In file included from ../../tcg/tcg.c:426:
> tcg/aarch64/tcg-target.c.inc:16:10: fatal error: 'asm/hwcap.h' file not 
> found
> #include <asm/hwcap.h>
>           ^~~~~~~~~~~~~
> 
> In file included from ../../accel/tcg/cputlb.c:1656:
> ../../accel/tcg/ldst_atomicity.c.inc:269:21: warning: value size does 
> not match register size specified by the constraint and modifier 
> [-Wasm-operand-widths]
>              : "=&r"(r.u), "=&r"(fail) : "Q"(*p));
>                      ^
diff mbox series

Patch

diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
index 0dff5807f6..b8f734f371 100644
--- a/tcg/aarch64/tcg-target.h
+++ b/tcg/aarch64/tcg-target.h
@@ -57,6 +57,9 @@  typedef enum {
 #define TCG_TARGET_CALL_ARG_I128        TCG_CALL_ARG_NORMAL
 #define TCG_TARGET_CALL_RET_I128        TCG_CALL_RET_NORMAL
 
+extern bool have_lse;
+extern bool have_lse2;
+
 /* optional instructions */
 #define TCG_TARGET_HAS_div_i32          1
 #define TCG_TARGET_HAS_rem_i32          1
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
index 001a71bbc0..cf5ee6f742 100644
--- a/tcg/aarch64/tcg-target.c.inc
+++ b/tcg/aarch64/tcg-target.c.inc
@@ -13,6 +13,8 @@ 
 #include "../tcg-ldst.c.inc"
 #include "../tcg-pool.c.inc"
 #include "qemu/bitops.h"
+#include <asm/hwcap.h>
+
 
 /* We're going to re-use TCGType in setting of the SF bit, which controls
    the size of the operation performed.  If we know the values match, it
@@ -71,6 +73,9 @@  static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
     return TCG_REG_X0 + slot;
 }
 
+bool have_lse;
+bool have_lse2;
+
 #define TCG_REG_TMP TCG_REG_X30
 #define TCG_VEC_TMP TCG_REG_V31
 
@@ -2918,6 +2923,11 @@  static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
 
 static void tcg_target_init(TCGContext *s)
 {
+    unsigned long hwcap = qemu_getauxval(AT_HWCAP);
+
+    have_lse = hwcap & HWCAP_ATOMICS;
+    have_lse2 = hwcap & HWCAP_USCAT;
+
     tcg_target_available_regs[TCG_TYPE_I32] = 0xffffffffu;
     tcg_target_available_regs[TCG_TYPE_I64] = 0xffffffffu;
     tcg_target_available_regs[TCG_TYPE_V64] = 0xffffffff00000000ull;