qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] target-mips: remove wrong checks for recip.fmt and rsqrt.fmt
@ 2015-08-18 17:35 Petar Jovanovic
  2015-08-25 17:57 ` Leon Alrae
  0 siblings, 1 reply; 4+ messages in thread
From: Petar Jovanovic @ 2015-08-18 17:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: petar.jovanovic, aurelien

From: Petar Jovanovic <petar.jovanovic@imgtec.com>

Instructions recip.{s|d} and rsqrt.{s|d} do not require 64-bit FPU neither
they require any particular mode for its FPU. This patch removes the checks
that may break a program that uses these instructions.

Signed-off-by: Petar Jovanovic <petar.jovanovic@imgtec.com>
---
 target-mips/translate.c |    4 ----
 1 file changed, 4 deletions(-)

diff --git a/target-mips/translate.c b/target-mips/translate.c
index 98cf72d..dcecfa0 100644
--- a/target-mips/translate.c
+++ b/target-mips/translate.c
@@ -9294,7 +9294,6 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1,
         opn = "movn.s";
         break;
     case OPC_RECIP_S:
-        check_cop1x(ctx);
         {
             TCGv_i32 fp0 = tcg_temp_new_i32();
 
@@ -9306,7 +9305,6 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1,
         opn = "recip.s";
         break;
     case OPC_RSQRT_S:
-        check_cop1x(ctx);
         {
             TCGv_i32 fp0 = tcg_temp_new_i32();
 
@@ -9839,7 +9837,6 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1,
         opn = "movn.d";
         break;
     case OPC_RECIP_D:
-        check_cp1_64bitmode(ctx);
         {
             TCGv_i64 fp0 = tcg_temp_new_i64();
 
@@ -9851,7 +9848,6 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1,
         opn = "recip.d";
         break;
     case OPC_RSQRT_D:
-        check_cp1_64bitmode(ctx);
         {
             TCGv_i64 fp0 = tcg_temp_new_i64();
 
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PATCH] target-mips: remove wrong checks for recip.fmt and rsqrt.fmt
  2015-08-18 17:35 [Qemu-devel] [PATCH] target-mips: remove wrong checks for recip.fmt and rsqrt.fmt Petar Jovanovic
@ 2015-08-25 17:57 ` Leon Alrae
  2015-08-25 22:40   ` Petar Jovanovic
  0 siblings, 1 reply; 4+ messages in thread
From: Leon Alrae @ 2015-08-25 17:57 UTC (permalink / raw)
  To: Petar Jovanovic, qemu-devel; +Cc: petar.jovanovic, aurelien

On 18/08/2015 18:35, Petar Jovanovic wrote:
> From: Petar Jovanovic <petar.jovanovic@imgtec.com>
> 
> Instructions recip.{s|d} and rsqrt.{s|d} do not require 64-bit FPU neither
> they require any particular mode for its FPU. This patch removes the checks
> that may break a program that uses these instructions.

This seems to be correct starting from MIPS32R2, but I'm not sure about older
cores. Do we really want to remove the restrictions for them as well?

> @@ -9839,7 +9837,6 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1,
>          opn = "movn.d";
>          break;
>      case OPC_RECIP_D:
> -        check_cp1_64bitmode(ctx);

I think this needs check_cp1_registers() now, i.e. check for odd fpu register
access when Status.FR = 0.

>          {
>              TCGv_i64 fp0 = tcg_temp_new_i64();
>  
> @@ -9851,7 +9848,6 @@ static void gen_farith (DisasContext *ctx, enum fopcode op1,
>          opn = "recip.d";
>          break;
>      case OPC_RSQRT_D:
> -        check_cp1_64bitmode(ctx);

same

Thanks,
Leon

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PATCH] target-mips: remove wrong checks for recip.fmt and rsqrt.fmt
  2015-08-25 17:57 ` Leon Alrae
@ 2015-08-25 22:40   ` Petar Jovanovic
  2015-08-26 11:53     ` Leon Alrae
  0 siblings, 1 reply; 4+ messages in thread
From: Petar Jovanovic @ 2015-08-25 22:40 UTC (permalink / raw)
  To: 'Leon Alrae', qemu-devel; +Cc: petar.jovanovic, aurelien

-----Original Message-----
From: Leon Alrae [mailto:leon.alrae@imgtec.com] 
Sent: Tuesday, August 25, 2015 7:58 PM
To: Petar Jovanovic <petar.jovanovic@rt-rk.com>; qemu-devel@nongnu.org
Cc: petar.jovanovic@imgtec.com; aurelien@aurel32.net
Subject: Re: [Qemu-devel] [PATCH] target-mips: remove wrong checks for
recip.fmt and rsqrt.fmt

On 18/08/2015 18:35, Petar Jovanovic wrote:
> From: Petar Jovanovic <petar.jovanovic@imgtec.com>
> 
> Instructions recip.{s|d} and rsqrt.{s|d} do not require 64-bit FPU 
> neither they require any particular mode for its FPU. This patch 
> removes the checks that may break a program that uses these instructions.

> This seems to be correct starting from MIPS32R2, but I'm not sure about
older cores. Do we really want to remove the restrictions for them as well?

IMHO, this restriction is wrong. So, yes, I believe we should remove it.
Whether we need to add a different restriction is a good question, but I am
inclined to think we may not need any here.

> @@ -9839,7 +9837,6 @@ static void gen_farith (DisasContext *ctx, enum
fopcode op1,
>          opn = "movn.d";
>          break;
>      case OPC_RECIP_D:
> -        check_cp1_64bitmode(ctx);

> I think this needs check_cp1_registers() now, i.e. check for odd fpu
register access when Status.FR = 0.

This would raise a "reserved instruction" exception. I am not aware that any
MIPS CPU implementation would throw an exception for e.g. "recip.d
$f21,$f11" (let me know if that is not the case), and I do not think MIPS
documentation obliges us to throw an exception either.

We may do that to make this irregular case more transparent though.

Regards,
Petar

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PATCH] target-mips: remove wrong checks for recip.fmt and rsqrt.fmt
  2015-08-25 22:40   ` Petar Jovanovic
@ 2015-08-26 11:53     ` Leon Alrae
  0 siblings, 0 replies; 4+ messages in thread
From: Leon Alrae @ 2015-08-26 11:53 UTC (permalink / raw)
  To: Petar Jovanovic, qemu-devel; +Cc: petar.jovanovic, aurelien

On 25/08/2015 23:40, Petar Jovanovic wrote:
>> @@ -9839,7 +9837,6 @@ static void gen_farith (DisasContext *ctx, enum
> fopcode op1,
>>          opn = "movn.d";
>>          break;
>>      case OPC_RECIP_D:
>> -        check_cp1_64bitmode(ctx);
> 
>> I think this needs check_cp1_registers() now, i.e. check for odd fpu
> register access when Status.FR = 0.
> 
> This would raise a "reserved instruction" exception. I am not aware that any
> MIPS CPU implementation would throw an exception for e.g. "recip.d
> $f21,$f11" (let me know if that is not the case), and I do not think MIPS
> documentation obliges us to throw an exception either.

MIPS documentation says that this operation is "UNPREDICTABLE" -- software can
never depend on a result and in QEMU we usually raise RI in such cases in
other *.D instructions which is quite handy (it usually indicates the "forgot
to set Status.FR bit" bug in the guest).

Leon

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2015-08-26 11:53 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-18 17:35 [Qemu-devel] [PATCH] target-mips: remove wrong checks for recip.fmt and rsqrt.fmt Petar Jovanovic
2015-08-25 17:57 ` Leon Alrae
2015-08-25 22:40   ` Petar Jovanovic
2015-08-26 11:53     ` Leon Alrae

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).