diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h index ba3ee01b0814e802eedb56259f25f0679d02b68a..539fd2d2648b59e8aece2003b9eee6b4603ae8e6 100644 --- a/target-sparc/cpu.h +++ b/target-sparc/cpu.h @@ -284,17 +284,18 @@ typedef struct CPUSPARCState { #define CPU_FEATURE_FMUL (1 << 7) #define CPU_FEATURE_VIS1 (1 << 8) #define CPU_FEATURE_VIS2 (1 << 9) +#define CPU_FEATURE_FSMULD (1 << 10) #ifndef TARGET_SPARC64 #define CPU_DEFAULT_FEATURES (CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | \ CPU_FEATURE_MUL | CPU_FEATURE_DIV | \ CPU_FEATURE_FLUSH | CPU_FEATURE_FSQRT | \ - CPU_FEATURE_FMUL) + CPU_FEATURE_FMUL | CPU_FEATURE_FSMULD) #else #define CPU_DEFAULT_FEATURES (CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | \ CPU_FEATURE_MUL | CPU_FEATURE_DIV | \ CPU_FEATURE_FLUSH | CPU_FEATURE_FSQRT | \ CPU_FEATURE_FMUL | CPU_FEATURE_VIS1 | \ - CPU_FEATURE_VIS2) + CPU_FEATURE_VIS2 | CPU_FEATURE_FSMULD) #endif #if defined(TARGET_SPARC64) diff --git a/target-sparc/helper.c b/target-sparc/helper.c index 8bf40e4aeae86cfbc5fc2c4f381c1fa70c42aa01..4537314d697a53679b83bf715b05627628e561e4 100644 --- a/target-sparc/helper.c +++ b/target-sparc/helper.c @@ -1098,7 +1098,7 @@ static const sparc_def_t sparc_defs[] = { .mmu_cxr_mask = 0x0000003f, .mmu_sfsr_mask = 0xffffffff, .mmu_trcr_mask = 0xffffffff, - .features = CPU_FEATURE_FLOAT, + .features = CPU_FEATURE_FLOAT | CPU_FEATURE_FSMULD, }, { .name = "Fujitsu MB86904", @@ -1134,7 +1134,8 @@ static const sparc_def_t sparc_defs[] = { .mmu_cxr_mask = 0x0000003f, .mmu_sfsr_mask = 0xffffffff, .mmu_trcr_mask = 0xffffffff, - .features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_FSQRT, + .features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_FSQRT | + CPU_FEATURE_FSMULD, }, { .name = "Cypress CY7C601", @@ -1146,7 +1147,8 @@ static const sparc_def_t sparc_defs[] = { .mmu_cxr_mask = 0x0000003f, .mmu_sfsr_mask = 0xffffffff, .mmu_trcr_mask = 0xffffffff, - .features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_FSQRT, + .features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_FSQRT | + CPU_FEATURE_FSMULD, }, { .name = "Cypress CY7C611", @@ -1158,7 +1160,8 @@ static const sparc_def_t sparc_defs[] = { .mmu_cxr_mask = 0x0000003f, .mmu_sfsr_mask = 0xffffffff, .mmu_trcr_mask = 0xffffffff, - .features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_FSQRT, + .features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_FSQRT | + CPU_FEATURE_FSMULD, }, { .name = "TI SuperSparc II", @@ -1182,7 +1185,9 @@ static const sparc_def_t sparc_defs[] = { .mmu_cxr_mask = 0x0000003f, .mmu_sfsr_mask = 0x00016fff, .mmu_trcr_mask = 0x0000003f, - .features = CPU_DEFAULT_FEATURES, + .features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_MUL | + CPU_FEATURE_DIV | CPU_FEATURE_FLUSH | CPU_FEATURE_FSQRT | + CPU_FEATURE_FMUL, }, { .name = "TI MicroSparc II", @@ -1266,7 +1271,8 @@ static const sparc_def_t sparc_defs[] = { .mmu_cxr_mask = 0x0000003f, .mmu_sfsr_mask = 0xffffffff, .mmu_trcr_mask = 0xffffffff, - .features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_FSQRT, + .features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_FSQRT | + CPU_FEATURE_FSMULD, }, { .name = "Matsushita MN10501", @@ -1278,7 +1284,8 @@ static const sparc_def_t sparc_defs[] = { .mmu_cxr_mask = 0x0000003f, .mmu_sfsr_mask = 0xffffffff, .mmu_trcr_mask = 0xffffffff, - .features = CPU_FEATURE_FLOAT | CPU_FEATURE_MUL | CPU_FEATURE_FSQRT, + .features = CPU_FEATURE_FLOAT | CPU_FEATURE_MUL | CPU_FEATURE_FSQRT | + CPU_FEATURE_FSMULD, }, { .name = "Weitek W8601", @@ -1330,6 +1337,7 @@ static const char * const feature_name[] = { "fmul", "vis1", "vis2", + "fsmuld", }; static void print_features(FILE *f, diff --git a/target-sparc/translate.c b/target-sparc/translate.c index 9ff48b2179add8946f4d70041d4a6a09208f3b75..eb0ab3343fbeb20229a833a5c2e9611c10102332 100644 --- a/target-sparc/translate.c +++ b/target-sparc/translate.c @@ -2511,6 +2511,7 @@ static void disas_sparc_insn(DisasContext * dc) gen_op_store_QT0_fpr(QFPREG(rd)); break; case 0x69: + CHECK_FPU_FEATURE(dc, FSMULD); gen_op_load_fpr_FT0(rs1); gen_op_load_fpr_FT1(rs2); gen_clear_float_exceptions();