diff mbox series

[73/77] target/microblaze: Convert dec_stream to decodetree

Message ID 20200825205950.730499-74-richard.henderson@linaro.org
State Superseded
Headers show
Series target/microblaze improvements | expand

Commit Message

Richard Henderson Aug. 25, 2020, 8:59 p.m. UTC
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

---
 target/microblaze/insns.decode |  6 ++++
 target/microblaze/translate.c  | 64 ++++++++++++++++++++++++++--------
 2 files changed, 55 insertions(+), 15 deletions(-)

-- 
2.25.1

Comments

Edgar E. Iglesias Aug. 27, 2020, 9:10 p.m. UTC | #1
On Tue, Aug 25, 2020 at 01:59:46PM -0700, Richard Henderson wrote:
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

> ---

>  target/microblaze/insns.decode |  6 ++++

>  target/microblaze/translate.c  | 64 ++++++++++++++++++++++++++--------

>  2 files changed, 55 insertions(+), 15 deletions(-)

> 

> diff --git a/target/microblaze/insns.decode b/target/microblaze/insns.decode

> index 48c60082e0..79d32c826c 100644

> --- a/target/microblaze/insns.decode

> +++ b/target/microblaze/insns.decode

> @@ -156,6 +156,9 @@ flt             010110 ..... ..... ----- 0101 000 0000  @typea0

>  fint            010110 ..... ..... ----- 0110 000 0000  @typea0

>  fsqrt           010110 ..... ..... 00000 0111 000 0000  @typea0

>  

> +get             011011 rd:5  00000 0 ctrl:5 000000 imm:4

> +getd            010011 rd:5  00000 rb:5  0 ctrl:5  00000

> +

>  idiv            010010 ..... ..... ..... 000 0000 0000  @typea

>  idivu           010010 ..... ..... ..... 000 0000 0010  @typea

>  

> @@ -198,6 +201,9 @@ pcmpbf          100000 ..... ..... ..... 100 0000 0000  @typea

>  pcmpeq          100010 ..... ..... ..... 100 0000 0000  @typea

>  pcmpne          100011 ..... ..... ..... 100 0000 0000  @typea

>  

> +put             011011 00000 ra:5  1 ctrl:5 000000 imm:4

> +putd            010011 00000 ra:5  rb:5  1 ctrl:5  00000

> +

>  rsub            000001 ..... ..... ..... 000 0000 0000  @typea

>  rsubc           000011 ..... ..... ..... 000 0000 0000  @typea

>  rsubk           000101 ..... ..... ..... 000 0000 0000  @typea

> diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c

> index e9e4a0e1db..0a05b49f8e 100644

> --- a/target/microblaze/translate.c

> +++ b/target/microblaze/translate.c

> @@ -1587,33 +1587,68 @@ static void dec_null(DisasContext *dc)

>  }

>  

>  /* Insns connected to FSL or AXI stream attached devices.  */

> -static void dec_stream(DisasContext *dc)

> +static bool do_get(DisasContext *dc, int rd, int rb, int imm, int ctrl)

>  {

>      TCGv_i32 t_id, t_ctrl;

> -    int ctrl;

>  

>      if (trap_userspace(dc, true)) {

> -        return;

> +        return true;

>      }

>  

>      t_id = tcg_temp_new_i32();

> -    if (dc->type_b) {

> -        tcg_gen_movi_i32(t_id, dc->imm & 0xf);

> -        ctrl = dc->imm >> 10;

> +    if (rb) {

> +        tcg_gen_andi_i32(t_id, cpu_R[rb], 0xf);

>      } else {

> -        tcg_gen_andi_i32(t_id, cpu_R[dc->rb], 0xf);

> -        ctrl = dc->imm >> 5;

> +        tcg_gen_movi_i32(t_id, imm);

>      }

>  

>      t_ctrl = tcg_const_i32(ctrl);

> -

> -    if (dc->rd == 0) {

> -        gen_helper_put(t_id, t_ctrl, cpu_R[dc->ra]);

> -    } else {

> -        gen_helper_get(cpu_R[dc->rd], t_id, t_ctrl);

> -    }

> +    gen_helper_get(reg_for_write(dc, rd), t_id, t_ctrl);

>      tcg_temp_free_i32(t_id);

>      tcg_temp_free_i32(t_ctrl);

> +    return true;

> +}

> +

> +static bool trans_get(DisasContext *dc, arg_get *arg)

> +{

> +    return do_get(dc, arg->rd, 0, arg->imm, arg->ctrl);

> +}

> +

> +static bool trans_getd(DisasContext *dc, arg_getd *arg)

> +{

> +    return do_get(dc, arg->rd, arg->rb, 0, arg->ctrl);

> +}

> +

> +static bool do_put(DisasContext *dc, int ra, int rb, int imm, int ctrl)

> +{

> +    TCGv_i32 t_id, t_ctrl;

> +

> +    if (trap_userspace(dc, true)) {

> +        return true;

> +    }

> +

> +    t_id = tcg_temp_new_i32();

> +    if (rb) {

> +        tcg_gen_andi_i32(t_id, cpu_R[rb], 0xf);

> +    } else {

> +        tcg_gen_movi_i32(t_id, imm);

> +    }

> +

> +    t_ctrl = tcg_const_i32(ctrl);

> +    gen_helper_get(t_id, t_ctrl, reg_for_read(dc, ra));



I think you've got a typo here, get -> put.

Cheers,
Edgar
Richard Henderson Aug. 27, 2020, 9:12 p.m. UTC | #2
On 8/27/20 2:10 PM, Edgar E. Iglesias wrote:
> I think you've got a typo here, get -> put.


Oops, yes.


r~
diff mbox series

Patch

diff --git a/target/microblaze/insns.decode b/target/microblaze/insns.decode
index 48c60082e0..79d32c826c 100644
--- a/target/microblaze/insns.decode
+++ b/target/microblaze/insns.decode
@@ -156,6 +156,9 @@  flt             010110 ..... ..... ----- 0101 000 0000  @typea0
 fint            010110 ..... ..... ----- 0110 000 0000  @typea0
 fsqrt           010110 ..... ..... 00000 0111 000 0000  @typea0
 
+get             011011 rd:5  00000 0 ctrl:5 000000 imm:4
+getd            010011 rd:5  00000 rb:5  0 ctrl:5  00000
+
 idiv            010010 ..... ..... ..... 000 0000 0000  @typea
 idivu           010010 ..... ..... ..... 000 0000 0010  @typea
 
@@ -198,6 +201,9 @@  pcmpbf          100000 ..... ..... ..... 100 0000 0000  @typea
 pcmpeq          100010 ..... ..... ..... 100 0000 0000  @typea
 pcmpne          100011 ..... ..... ..... 100 0000 0000  @typea
 
+put             011011 00000 ra:5  1 ctrl:5 000000 imm:4
+putd            010011 00000 ra:5  rb:5  1 ctrl:5  00000
+
 rsub            000001 ..... ..... ..... 000 0000 0000  @typea
 rsubc           000011 ..... ..... ..... 000 0000 0000  @typea
 rsubk           000101 ..... ..... ..... 000 0000 0000  @typea
diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c
index e9e4a0e1db..0a05b49f8e 100644
--- a/target/microblaze/translate.c
+++ b/target/microblaze/translate.c
@@ -1587,33 +1587,68 @@  static void dec_null(DisasContext *dc)
 }
 
 /* Insns connected to FSL or AXI stream attached devices.  */
-static void dec_stream(DisasContext *dc)
+static bool do_get(DisasContext *dc, int rd, int rb, int imm, int ctrl)
 {
     TCGv_i32 t_id, t_ctrl;
-    int ctrl;
 
     if (trap_userspace(dc, true)) {
-        return;
+        return true;
     }
 
     t_id = tcg_temp_new_i32();
-    if (dc->type_b) {
-        tcg_gen_movi_i32(t_id, dc->imm & 0xf);
-        ctrl = dc->imm >> 10;
+    if (rb) {
+        tcg_gen_andi_i32(t_id, cpu_R[rb], 0xf);
     } else {
-        tcg_gen_andi_i32(t_id, cpu_R[dc->rb], 0xf);
-        ctrl = dc->imm >> 5;
+        tcg_gen_movi_i32(t_id, imm);
     }
 
     t_ctrl = tcg_const_i32(ctrl);
-
-    if (dc->rd == 0) {
-        gen_helper_put(t_id, t_ctrl, cpu_R[dc->ra]);
-    } else {
-        gen_helper_get(cpu_R[dc->rd], t_id, t_ctrl);
-    }
+    gen_helper_get(reg_for_write(dc, rd), t_id, t_ctrl);
     tcg_temp_free_i32(t_id);
     tcg_temp_free_i32(t_ctrl);
+    return true;
+}
+
+static bool trans_get(DisasContext *dc, arg_get *arg)
+{
+    return do_get(dc, arg->rd, 0, arg->imm, arg->ctrl);
+}
+
+static bool trans_getd(DisasContext *dc, arg_getd *arg)
+{
+    return do_get(dc, arg->rd, arg->rb, 0, arg->ctrl);
+}
+
+static bool do_put(DisasContext *dc, int ra, int rb, int imm, int ctrl)
+{
+    TCGv_i32 t_id, t_ctrl;
+
+    if (trap_userspace(dc, true)) {
+        return true;
+    }
+
+    t_id = tcg_temp_new_i32();
+    if (rb) {
+        tcg_gen_andi_i32(t_id, cpu_R[rb], 0xf);
+    } else {
+        tcg_gen_movi_i32(t_id, imm);
+    }
+
+    t_ctrl = tcg_const_i32(ctrl);
+    gen_helper_get(t_id, t_ctrl, reg_for_read(dc, ra));
+    tcg_temp_free_i32(t_id);
+    tcg_temp_free_i32(t_ctrl);
+    return true;
+}
+
+static bool trans_put(DisasContext *dc, arg_put *arg)
+{
+    return do_put(dc, arg->ra, 0, arg->imm, arg->ctrl);
+}
+
+static bool trans_putd(DisasContext *dc, arg_putd *arg)
+{
+    return do_put(dc, arg->ra, arg->rb, 0, arg->ctrl);
 }
 
 static struct decoder_info {
@@ -1623,7 +1658,6 @@  static struct decoder_info {
     };
     void (*dec)(DisasContext *dc);
 } decinfo[] = {
-    {DEC_STREAM, dec_stream},
     {{0, 0}, dec_null}
 };