Message ID | 20190815020928.9679-16-jan.bobek@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | rewrite MMX/SSE/SSE2/SSE3 instruction translation | expand |
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 > >
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~
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 --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 {
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(+)