From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Kd8UG-0006US-Mi for qemu-devel@nongnu.org; Tue, 09 Sep 2008 15:02:52 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Kd8UF-0006U6-63 for qemu-devel@nongnu.org; Tue, 09 Sep 2008 15:02:51 -0400 Received: from [199.232.76.173] (port=37039 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Kd8UE-0006U3-Vj for qemu-devel@nongnu.org; Tue, 09 Sep 2008 15:02:51 -0400 Received: from savannah.gnu.org ([199.232.41.3]:50705 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Kd8UF-0003Xx-4s for qemu-devel@nongnu.org; Tue, 09 Sep 2008 15:02:51 -0400 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1Kd8UE-0005Ch-3B for qemu-devel@nongnu.org; Tue, 09 Sep 2008 19:02:50 +0000 Received: from blueswir1 by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1Kd8UD-0005Cd-Ox for qemu-devel@nongnu.org; Tue, 09 Sep 2008 19:02:50 +0000 MIME-Version: 1.0 Errors-To: blueswir1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Blue Swirl Message-Id: Date: Tue, 09 Sep 2008 19:02:49 +0000 Subject: [Qemu-devel] [5185] Implement ldxfsr/stxfsr, fix ld(x)fsr masks, convert to TCG Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 5185 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=5185 Author: blueswir1 Date: 2008-09-09 19:02:49 +0000 (Tue, 09 Sep 2008) Log Message: ----------- Implement ldxfsr/stxfsr, fix ld(x)fsr masks, convert to TCG Modified Paths: -------------- trunk/target-sparc/cpu.h trunk/target-sparc/helper.c trunk/target-sparc/helper.h trunk/target-sparc/op_helper.c trunk/target-sparc/translate.c Modified: trunk/target-sparc/cpu.h =================================================================== --- trunk/target-sparc/cpu.h 2008-09-09 18:56:59 UTC (rev 5184) +++ trunk/target-sparc/cpu.h 2008-09-09 19:02:49 UTC (rev 5185) @@ -147,10 +147,15 @@ #ifdef TARGET_SPARC64 #define FSR_FTT_NMASK 0xfffffffffffe3fffULL #define FSR_FTT_CEXC_NMASK 0xfffffffffffe3fe0ULL +#define FSR_LDFSR_OLDMASK 0x0000003f000fc000ULL +#define FSR_LDXFSR_MASK 0x0000003fcfc00fffULL +#define FSR_LDXFSR_OLDMASK 0x00000000000fc000ULL #else #define FSR_FTT_NMASK 0xfffe3fffULL #define FSR_FTT_CEXC_NMASK 0xfffe3fe0ULL +#define FSR_LDFSR_OLDMASK 0x000fc000ULL #endif +#define FSR_LDFSR_MASK 0xcfc00fffULL #define FSR_FTT_IEEE_EXCP (1ULL << 14) #define FSR_FTT_UNIMPFPOP (3ULL << 14) #define FSR_FTT_SEQ_ERROR (4ULL << 14) @@ -329,22 +334,6 @@ sparc_def_t *def; } CPUSPARCState; -#if defined(TARGET_SPARC64) -#define GET_FSR32(env) (env->fsr & 0xcfc1ffff) -#define PUT_FSR32(env, val) do { uint32_t _tmp = val; \ - env->fsr = (_tmp & 0xcfc1c3ff) | (env->fsr & 0x3f00000000ULL); \ - } while (0) -#define GET_FSR64(env) (env->fsr & 0x3fcfc1ffffULL) -#define PUT_FSR64(env, val) do { uint64_t _tmp = val; \ - env->fsr = _tmp & 0x3fcfc1c3ffULL; \ - } while (0) -#else -#define GET_FSR32(env) (env->fsr) -#define PUT_FSR32(env, val) do { uint32_t _tmp = val; \ - env->fsr = (_tmp & 0xcfc1dfff) | (env->fsr & 0x000e0000); \ - } while (0) -#endif - /* helper.c */ CPUSPARCState *cpu_sparc_init(const char *cpu_model); void cpu_sparc_set_id(CPUSPARCState *env, unsigned int cpu); Modified: trunk/target-sparc/helper.c =================================================================== --- trunk/target-sparc/helper.c 2008-09-09 18:56:59 UTC (rev 5184) +++ trunk/target-sparc/helper.c 2008-09-09 19:02:49 UTC (rev 5185) @@ -1412,7 +1412,7 @@ env->psrs?'S':'-', env->psrps?'P':'-', env->psret?'E':'-', env->wim); #endif - cpu_fprintf(f, "fsr: 0x%08x\n", GET_FSR32(env)); + cpu_fprintf(f, "fsr: 0x%08x\n", env->fsr); } #ifdef TARGET_SPARC64 Modified: trunk/target-sparc/helper.h =================================================================== --- trunk/target-sparc/helper.h 2008-09-09 18:56:59 UTC (rev 5184) +++ trunk/target-sparc/helper.h 2008-09-09 19:02:49 UTC (rev 5185) @@ -55,8 +55,7 @@ DEF_HELPER(void, helper_st_asi, (target_ulong addr, uint64_t val, int asi, \ int size)) #endif -DEF_HELPER(void, helper_ldfsr, (void)) -DEF_HELPER(void, helper_stfsr, (void)) +DEF_HELPER(void, helper_ldfsr, (uint32_t new_fsr)) DEF_HELPER(void, helper_check_ieee_exceptions, (void)) DEF_HELPER(void, helper_clear_float_exceptions, (void)) DEF_HELPER(void, helper_fabss, (void)) @@ -70,6 +69,7 @@ DEF_HELPER(void, helper_fcmpq, (void)) DEF_HELPER(void, helper_fcmpeq, (void)) #ifdef TARGET_SPARC64 +DEF_HELPER(void, helper_ldxfsr, (uint64_t new_fsr)) DEF_HELPER(void, helper_fabsd, (void)) DEF_HELPER(void, helper_fcmps_fcc1, (void)) DEF_HELPER(void, helper_fcmpd_fcc1, (void)) Modified: trunk/target-sparc/op_helper.c =================================================================== --- trunk/target-sparc/op_helper.c 2008-09-09 18:56:59 UTC (rev 5184) +++ trunk/target-sparc/op_helper.c 2008-09-09 19:02:49 UTC (rev 5185) @@ -2487,11 +2487,10 @@ #endif } -void helper_ldfsr(void) +static inline void set_fsr(void) { int rnd_mode; - PUT_FSR32(env, *((uint32_t *) &FT0)); switch (env->fsr & FSR_RD_MASK) { case FSR_RD_NEAREST: rnd_mode = float_round_nearest_even; @@ -2510,11 +2509,20 @@ set_float_rounding_mode(rnd_mode, &env->fp_status); } -void helper_stfsr(void) +void helper_ldfsr(uint32_t new_fsr) { - *((uint32_t *) &FT0) = GET_FSR32(env); + env->fsr = (new_fsr & FSR_LDFSR_MASK) | (env->fsr & FSR_LDFSR_OLDMASK); + set_fsr(); } +#ifdef TARGET_SPARC64 +void helper_ldxfsr(uint64_t new_fsr) +{ + env->fsr = (new_fsr & FSR_LDXFSR_MASK) | (env->fsr & FSR_LDXFSR_OLDMASK); + set_fsr(); +} +#endif + void helper_debug(void) { env->exception_index = EXCP_DEBUG; Modified: trunk/target-sparc/translate.c =================================================================== --- trunk/target-sparc/translate.c 2008-09-09 18:56:59 UTC (rev 5184) +++ trunk/target-sparc/translate.c 2008-09-09 19:02:49 UTC (rev 5185) @@ -4368,12 +4368,19 @@ tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUState, fpr[rd])); break; - case 0x21: /* load fsr */ + case 0x21: /* ldfsr, V9 ldxfsr */ +#ifdef TARGET_SPARC64 gen_address_mask(dc, cpu_addr); - tcg_gen_qemu_ld32u(cpu_tmp32, cpu_addr, dc->mem_idx); - tcg_gen_st_i32(cpu_tmp32, cpu_env, - offsetof(CPUState, ft0)); - tcg_gen_helper_0_0(helper_ldfsr); + if (rd == 1) { + tcg_gen_qemu_ld64(cpu_tmp64, cpu_addr, dc->mem_idx); + tcg_gen_helper_0_1(helper_ldxfsr, cpu_tmp64); + } else +#else + { + tcg_gen_qemu_ld32u(cpu_tmp32, cpu_addr, dc->mem_idx); + tcg_gen_helper_0_1(helper_ldfsr, cpu_tmp32); + } +#endif break; case 0x22: /* load quad fpreg */ { @@ -4506,11 +4513,19 @@ tcg_gen_qemu_st32(cpu_tmp32, cpu_addr, dc->mem_idx); break; case 0x25: /* stfsr, V9 stxfsr */ +#ifdef TARGET_SPARC64 gen_address_mask(dc, cpu_addr); - tcg_gen_helper_0_0(helper_stfsr); - tcg_gen_ld_i32(cpu_tmp32, cpu_env, - offsetof(CPUState, ft0)); + tcg_gen_ld_i64(cpu_tmp64, cpu_env, offsetof(CPUState, fsr)); + if (rd == 1) + tcg_gen_qemu_st64(cpu_tmp64, cpu_addr, dc->mem_idx); + else { + tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp64); + tcg_gen_qemu_st32(cpu_tmp32, cpu_addr, dc->mem_idx); + } +#else + tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUState, fsr)); tcg_gen_qemu_st32(cpu_tmp32, cpu_addr, dc->mem_idx); +#endif break; case 0x26: #ifdef TARGET_SPARC64