diff mbox series

[RFC,v3,15/46] target/i386: introduce function ck_cpuid

Message ID 20190815020928.9679-16-jan.bobek@gmail.com
State New
Headers show
Series rewrite MMX/SSE/SSE2/SSE3 instruction translation | expand

Commit Message

Jan Bobek Aug. 15, 2019, 2:08 a.m. UTC
Introduce a helper function to take care of instruction CPUID checks.

Signed-off-by: Jan Bobek <jan.bobek@gmail.com>
---
 target/i386/translate.c | 48 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

Comments

Aleksandar Markovic Aug. 15, 2019, 3:01 p.m. UTC | #1
15.08.2019. 04.23, "Jan Bobek" <jan.bobek@gmail.com> је написао/ла:
>
> Introduce a helper function to take care of instruction CPUID checks.
>
> Signed-off-by: Jan Bobek <jan.bobek@gmail.com>
> ---

Jan, what is the origin of "CK"? If it is a QEMU internal thing, perhaps
use "CHECK".

The function should be called check_cpuid(), imho. I know, Richard would
like c_ci(), or simpler cc(), better.

Aleksandar

>  target/i386/translate.c | 48 +++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 48 insertions(+)
>
> diff --git a/target/i386/translate.c b/target/i386/translate.c
> index 6296a02991..0cffa2226b 100644
> --- a/target/i386/translate.c
> +++ b/target/i386/translate.c
> @@ -4500,6 +4500,54 @@ static void gen_sse(CPUX86State *env, DisasContext
*s, int b)
>  #define tcg_gen_gvec_cmpgt(vece, dofs, aofs, bofs, oprsz, maxsz)        \
>      tcg_gen_gvec_cmp(TCG_COND_GT, vece, dofs, aofs, bofs, oprsz, maxsz)
>
> +typedef enum {
> +    CK_CPUID_MMX = 1,
> +    CK_CPUID_3DNOW,
> +    CK_CPUID_SSE,
> +    CK_CPUID_SSE2,
> +    CK_CPUID_CLFLUSH,
> +    CK_CPUID_SSE3,
> +    CK_CPUID_SSSE3,
> +    CK_CPUID_SSE4_1,
> +    CK_CPUID_SSE4_2,
> +    CK_CPUID_SSE4A,
> +    CK_CPUID_AVX,
> +    CK_CPUID_AVX2,
> +} CkCpuidFeat;
> +
> +static int ck_cpuid(CPUX86State *env, DisasContext *s, CkCpuidFeat feat)
> +{
> +    switch (feat) {
> +    case CK_CPUID_MMX:
> +        return !(s->cpuid_features & CPUID_MMX)
> +            || !(s->cpuid_ext2_features & CPUID_EXT2_MMX);
> +    case CK_CPUID_3DNOW:
> +        return !(s->cpuid_ext2_features & CPUID_EXT2_3DNOW);
> +    case CK_CPUID_SSE:
> +        return !(s->cpuid_features & CPUID_SSE);
> +    case CK_CPUID_SSE2:
> +        return !(s->cpuid_features & CPUID_SSE2);
> +    case CK_CPUID_CLFLUSH:
> +        return !(s->cpuid_features & CPUID_CLFLUSH);
> +    case CK_CPUID_SSE3:
> +        return !(s->cpuid_ext_features & CPUID_EXT_SSE3);
> +    case CK_CPUID_SSSE3:
> +        return !(s->cpuid_ext_features & CPUID_EXT_SSSE3);
> +    case CK_CPUID_SSE4_1:
> +        return !(s->cpuid_ext_features & CPUID_EXT_SSE41);
> +    case CK_CPUID_SSE4_2:
> +        return !(s->cpuid_ext_features & CPUID_EXT_SSE42);
> +    case CK_CPUID_SSE4A:
> +        return !(s->cpuid_ext3_features & CPUID_EXT3_SSE4A);
> +    case CK_CPUID_AVX:
> +        return !(s->cpuid_ext_features & CPUID_EXT_AVX);
> +    case CK_CPUID_AVX2:
> +        return !(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_AVX2);
> +    default:
> +        g_assert_not_reached();
> +    }
> +}
> +
>  static void gen_sse_ng(CPUX86State *env, DisasContext *s, int b)
>  {
>      enum {
> --
> 2.20.1
>
>
Richard Henderson Aug. 15, 2019, 3:16 p.m. UTC | #2
On August 15, 2019 4:01:33 PM GMT+01:00, Aleksandar Markovic
>
>The function should be called check_cpuid(), imho. I know, Richard
>would
>like c_ci(), or simpler cc(), better.

Now you're just playing the fool.  Cut it out.


r~
Jan Bobek Aug. 21, 2019, 5:07 a.m. UTC | #3
On 8/15/19 11:01 AM, Aleksandar Markovic wrote:
> 
> 15.08.2019. 04.23, "Jan Bobek" <jan.bobek@gmail.com <mailto:jan.bobek@gmail.com>> је написао/ла:
>>
>> Introduce a helper function to take care of instruction CPUID checks.
>>
>> Signed-off-by: Jan Bobek <jan.bobek@gmail.com <mailto:jan.bobek@gmail.com>>
>> ---
> 
> Jan, what is the origin of "CK"? If it is a QEMU internal thing, perhaps use "CHECK".
> 
> The function should be called check_cpuid(), imho. I know, Richard would like c_ci(), or simpler cc(), better.

It was completely my initiative to name it like that. I'll rename
it to check_cpuid().

-Jan
diff mbox series

Patch

diff --git a/target/i386/translate.c b/target/i386/translate.c
index 6296a02991..0cffa2226b 100644
--- a/target/i386/translate.c
+++ b/target/i386/translate.c
@@ -4500,6 +4500,54 @@  static void gen_sse(CPUX86State *env, DisasContext *s, int b)
 #define tcg_gen_gvec_cmpgt(vece, dofs, aofs, bofs, oprsz, maxsz)        \
     tcg_gen_gvec_cmp(TCG_COND_GT, vece, dofs, aofs, bofs, oprsz, maxsz)
 
+typedef enum {
+    CK_CPUID_MMX = 1,
+    CK_CPUID_3DNOW,
+    CK_CPUID_SSE,
+    CK_CPUID_SSE2,
+    CK_CPUID_CLFLUSH,
+    CK_CPUID_SSE3,
+    CK_CPUID_SSSE3,
+    CK_CPUID_SSE4_1,
+    CK_CPUID_SSE4_2,
+    CK_CPUID_SSE4A,
+    CK_CPUID_AVX,
+    CK_CPUID_AVX2,
+} CkCpuidFeat;
+
+static int ck_cpuid(CPUX86State *env, DisasContext *s, CkCpuidFeat feat)
+{
+    switch (feat) {
+    case CK_CPUID_MMX:
+        return !(s->cpuid_features & CPUID_MMX)
+            || !(s->cpuid_ext2_features & CPUID_EXT2_MMX);
+    case CK_CPUID_3DNOW:
+        return !(s->cpuid_ext2_features & CPUID_EXT2_3DNOW);
+    case CK_CPUID_SSE:
+        return !(s->cpuid_features & CPUID_SSE);
+    case CK_CPUID_SSE2:
+        return !(s->cpuid_features & CPUID_SSE2);
+    case CK_CPUID_CLFLUSH:
+        return !(s->cpuid_features & CPUID_CLFLUSH);
+    case CK_CPUID_SSE3:
+        return !(s->cpuid_ext_features & CPUID_EXT_SSE3);
+    case CK_CPUID_SSSE3:
+        return !(s->cpuid_ext_features & CPUID_EXT_SSSE3);
+    case CK_CPUID_SSE4_1:
+        return !(s->cpuid_ext_features & CPUID_EXT_SSE41);
+    case CK_CPUID_SSE4_2:
+        return !(s->cpuid_ext_features & CPUID_EXT_SSE42);
+    case CK_CPUID_SSE4A:
+        return !(s->cpuid_ext3_features & CPUID_EXT3_SSE4A);
+    case CK_CPUID_AVX:
+        return !(s->cpuid_ext_features & CPUID_EXT_AVX);
+    case CK_CPUID_AVX2:
+        return !(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_AVX2);
+    default:
+        g_assert_not_reached();
+    }
+}
+
 static void gen_sse_ng(CPUX86State *env, DisasContext *s, int b)
 {
     enum {