target/i386: implement additional AVX comparison operators
The new implementation of SSE will cover AVX from the get go, so include the 24 extra comparison operators that are only available with the VEX prefix. Based on a patch by Paul Brook <paul@nowt.org>. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
620f75566a
commit
6e0cac782a
@ -1075,10 +1075,21 @@ void glue(helper_addsubpd, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s)
|
||||
} \
|
||||
}
|
||||
|
||||
static inline bool FPU_EQU(FloatRelation x)
|
||||
{
|
||||
return (x == float_relation_equal || x == float_relation_unordered);
|
||||
}
|
||||
static inline bool FPU_GE(FloatRelation x)
|
||||
{
|
||||
return (x == float_relation_equal || x == float_relation_greater);
|
||||
}
|
||||
#define FPU_EQ(x) (x == float_relation_equal)
|
||||
#define FPU_LT(x) (x == float_relation_less)
|
||||
#define FPU_LE(x) (x <= float_relation_equal)
|
||||
#define FPU_GT(x) (x == float_relation_greater)
|
||||
#define FPU_UNORD(x) (x == float_relation_unordered)
|
||||
/* We must make sure we evaluate the argument in case it is a signalling NAN */
|
||||
#define FPU_FALSE(x) (x == float_relation_equal && 0)
|
||||
|
||||
#define FPU_CMPQ(size, a, b) \
|
||||
float ## size ## _compare_quiet(a, b, &env->sse_status)
|
||||
@ -1098,6 +1109,33 @@ SSE_HELPER_CMP(cmpnlt, FPU_CMPS, !FPU_LT)
|
||||
SSE_HELPER_CMP(cmpnle, FPU_CMPS, !FPU_LE)
|
||||
SSE_HELPER_CMP(cmpord, FPU_CMPQ, !FPU_UNORD)
|
||||
|
||||
SSE_HELPER_CMP(cmpequ, FPU_CMPQ, FPU_EQU)
|
||||
SSE_HELPER_CMP(cmpnge, FPU_CMPS, !FPU_GE)
|
||||
SSE_HELPER_CMP(cmpngt, FPU_CMPS, !FPU_GT)
|
||||
SSE_HELPER_CMP(cmpfalse, FPU_CMPQ, FPU_FALSE)
|
||||
SSE_HELPER_CMP(cmpnequ, FPU_CMPQ, !FPU_EQU)
|
||||
SSE_HELPER_CMP(cmpge, FPU_CMPS, FPU_GE)
|
||||
SSE_HELPER_CMP(cmpgt, FPU_CMPS, FPU_GT)
|
||||
SSE_HELPER_CMP(cmptrue, FPU_CMPQ, !FPU_FALSE)
|
||||
|
||||
SSE_HELPER_CMP(cmpeqs, FPU_CMPS, FPU_EQ)
|
||||
SSE_HELPER_CMP(cmpltq, FPU_CMPQ, FPU_LT)
|
||||
SSE_HELPER_CMP(cmpleq, FPU_CMPQ, FPU_LE)
|
||||
SSE_HELPER_CMP(cmpunords, FPU_CMPS, FPU_UNORD)
|
||||
SSE_HELPER_CMP(cmpneqq, FPU_CMPS, !FPU_EQ)
|
||||
SSE_HELPER_CMP(cmpnltq, FPU_CMPQ, !FPU_LT)
|
||||
SSE_HELPER_CMP(cmpnleq, FPU_CMPQ, !FPU_LE)
|
||||
SSE_HELPER_CMP(cmpords, FPU_CMPS, !FPU_UNORD)
|
||||
|
||||
SSE_HELPER_CMP(cmpequs, FPU_CMPS, FPU_EQU)
|
||||
SSE_HELPER_CMP(cmpngeq, FPU_CMPQ, !FPU_GE)
|
||||
SSE_HELPER_CMP(cmpngtq, FPU_CMPQ, !FPU_GT)
|
||||
SSE_HELPER_CMP(cmpfalses, FPU_CMPS, FPU_FALSE)
|
||||
SSE_HELPER_CMP(cmpnequs, FPU_CMPS, !FPU_EQU)
|
||||
SSE_HELPER_CMP(cmpgeq, FPU_CMPQ, FPU_GE)
|
||||
SSE_HELPER_CMP(cmpgtq, FPU_CMPQ, FPU_GT)
|
||||
SSE_HELPER_CMP(cmptrues, FPU_CMPS, !FPU_FALSE)
|
||||
|
||||
#undef SSE_HELPER_CMP
|
||||
|
||||
#if SHIFT == 1
|
||||
|
@ -237,6 +237,33 @@ SSE_HELPER_CMP(cmpnlt, FPU_CMPS, !FPU_LT)
|
||||
SSE_HELPER_CMP(cmpnle, FPU_CMPS, !FPU_LE)
|
||||
SSE_HELPER_CMP(cmpord, FPU_CMPQ, !FPU_UNORD)
|
||||
|
||||
SSE_HELPER_CMP(cmpequ, FPU_CMPQ, FPU_EQU)
|
||||
SSE_HELPER_CMP(cmpnge, FPU_CMPS, !FPU_GE)
|
||||
SSE_HELPER_CMP(cmpngt, FPU_CMPS, !FPU_GT)
|
||||
SSE_HELPER_CMP(cmpfalse, FPU_CMPQ, FPU_FALSE)
|
||||
SSE_HELPER_CMP(cmpnequ, FPU_CMPQ, !FPU_EQU)
|
||||
SSE_HELPER_CMP(cmpge, FPU_CMPS, FPU_GE)
|
||||
SSE_HELPER_CMP(cmpgt, FPU_CMPS, FPU_GT)
|
||||
SSE_HELPER_CMP(cmptrue, FPU_CMPQ, !FPU_FALSE)
|
||||
|
||||
SSE_HELPER_CMP(cmpeqs, FPU_CMPS, FPU_EQ)
|
||||
SSE_HELPER_CMP(cmpltq, FPU_CMPQ, FPU_LT)
|
||||
SSE_HELPER_CMP(cmpleq, FPU_CMPQ, FPU_LE)
|
||||
SSE_HELPER_CMP(cmpunords, FPU_CMPS, FPU_UNORD)
|
||||
SSE_HELPER_CMP(cmpneqq, FPU_CMPS, !FPU_EQ)
|
||||
SSE_HELPER_CMP(cmpnltq, FPU_CMPQ, !FPU_LT)
|
||||
SSE_HELPER_CMP(cmpnleq, FPU_CMPQ, !FPU_LE)
|
||||
SSE_HELPER_CMP(cmpords, FPU_CMPS, !FPU_UNORD)
|
||||
|
||||
SSE_HELPER_CMP(cmpequs, FPU_CMPS, FPU_EQU)
|
||||
SSE_HELPER_CMP(cmpngeq, FPU_CMPQ, !FPU_GE)
|
||||
SSE_HELPER_CMP(cmpngtq, FPU_CMPQ, !FPU_GT)
|
||||
SSE_HELPER_CMP(cmpfalses, FPU_CMPS, FPU_FALSE)
|
||||
SSE_HELPER_CMP(cmpnequs, FPU_CMPS, !FPU_EQU)
|
||||
SSE_HELPER_CMP(cmpgeq, FPU_CMPQ, FPU_GE)
|
||||
SSE_HELPER_CMP(cmpgtq, FPU_CMPQ, FPU_GT)
|
||||
SSE_HELPER_CMP(cmptrues, FPU_CMPS, !FPU_FALSE)
|
||||
|
||||
#if SHIFT == 1
|
||||
DEF_HELPER_3(ucomiss, void, env, Reg, Reg)
|
||||
DEF_HELPER_3(comiss, void, env, Reg, Reg)
|
||||
|
Loading…
Reference in New Issue
Block a user