summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2013-02-23 20:09:23 -0500
committerSøren Sandmann Pedersen <ssp@redhat.com>2013-02-23 20:09:23 -0500
commitaaa80dfd11d760a1ccdfc79210a89b4daefd23f1 (patch)
tree31797578390e371ab5869afbdacd3e2a20f4acd0
parentb8d26bf81c21c86b4c513152d35451afc4e52b7e (diff)
F_FXSR
-rw-r--r--simplex86.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/simplex86.c b/simplex86.c
index 3a5d49e..51a0d60 100644
--- a/simplex86.c
+++ b/simplex86.c
@@ -114,6 +114,7 @@ typedef enum
F_XOP = (1 << 25),
F_FMA = (1 << 26),
F_FMA4 = (1 << 27),
+ F_FXSR = (1 << 28),
F_LAST,
F_MASK = (F_LAST - 1) | (F_LAST - 2)
} feature_t;
@@ -492,8 +493,8 @@ static const variant_t variants[] =
{ I_vpmovmskb, { A_R, A_SSE }, F_AVX, E_RM, 0xd7, VEX(128,0x66,0x0f,WIG) },
/* SSE */
- { I_fxsave, { A_MEM }, F_SSE, E_M, 0x0fae, 0 },
- { I_fxrstor, { A_MEM }, F_SSE, E_M, 0x0fae, 1 },
+ { I_fxsave, { A_MEM }, F_FXSR, E_M, 0x0fae, 0 },
+ { I_fxrstor, { A_MEM }, F_FXSR, E_M, 0x0fae, 1 },
{ I_ldmxcsr, { A_MEM }, F_SSE, E_M, 0x0fae, 2 },
{ I_vldmxcsr, { A_MEM }, F_AVX, E_M, 0xae, 2 | VEX(LZ,0x00,0x0f,WIG) },
{ I_stmxcsr, { A_MEM }, F_SSE, E_M, 0x0fae, 3 },
@@ -1032,6 +1033,7 @@ detect_features (assembler_t *as)
TEST_FEATURE (ecx, 20, F_SSE42),
TEST_FEATURE (ecx, 22, F_MOVBE),
TEST_FEATURE (ecx, 23, F_POPCNT),
+ TEST_FEATURE (ecx, 24, F_FXSR),
TEST_FEATURE (ecx, 27, F_OSXSAVE),
TEST_FEATURE (ecx, 28, F_AVX),
TEST_FEATURE (ecx, 29, F_F16C),
@@ -1060,17 +1062,17 @@ detect_features (assembler_t *as)
TEST_FEATURE (ebx, 5, F_AVX2),
TEST_FEATURE (ebx, 3, F_BMI1),
TEST_FEATURE (ebx, 8, F_BMI2),
-
- /* Check OS support for saving YMM and XMM state,
- * and that AVX is present.
- */
+
+ /* AVX is required for AVX2 and F16C */
I_test, esi, IMM (F_AVX),
I_jz, LABEL ("no_ymm"),
+ /* Check OS support for saving YMM and XMM state
+ */
I_test, esi, IMM (F_OSXSAVE),
I_jz, LABEL ("no_ymm"),
- I_mov, ecx, IMM (0),
+ I_xor, ecx, ecx,
I_xgetbv,
I_and, eax, IMM (0x06),
I_cmp, eax, IMM (0x06),
@@ -1080,8 +1082,8 @@ detect_features (assembler_t *as)
I_and, esi, IMM (~(F_AVX | F_F16C | F_AVX2)),
DEFINE_LABEL ("done"),
- I_mov, eax, esi,
- I_pop, ebx,
+ I_mov, eax, esi,
+ I_pop, ebx,
I_ret,
DEFINE_VALUE64("printf", (uint64_t)printf),