Message ID | 20200825205950.730499-74-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | target/microblaze improvements | expand |
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
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 --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} };
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