On Tue, Oct 8, 2013 at 9:01 AM, Olof Kindgren <[email protected]> wrote:
> This patch fixes bug 97
>
> Instead of throwing an illegal instruction exception when the rotate
> instructions are disabled (OR1200_ALU_IMPL_ROTATE is undefined), another
> instruction (slr?) is executed instead.
>
> Not sure if GCC emits l.rori instructions and none of our testcases seems to
> exercise it either, which might be the reason why this hasn't been detected
> before. I created a new testcase to check the l.rori instructions, and added
> it to the bug report until we have a common tests repository.

Hi Olof

Good catch here.

>
> With the old code I get these results:
>
> --OR1200_IMPL_ALU_ROTATE undefined:
> report(0x00000007);
> exit(7)
>
> --OR1200_IMPL_ALU_ROTATE defined:
> report(0x80000003);
> exit(0)
>
> --OR1200_IMPL_ALU_ROTATE undefined:
>
> Illegal instruction!
> exit(10)
>
> --OR1200_IMPL_ALU_ROTATE defined:
> report(0x80000003);
> exit(0)

This looks great.

>
>
>
>
> Index: rtl/verilog/or1200_ctrl.v
> ===================================================================
>
> --- rtl/verilog/or1200_ctrl.v   (revision 852)
> +++ rtl/verilog/or1200_ctrl.v   (working copy)
> @@ -698,7 +698,9 @@
>  `ifdef OR1200_MULT_IMPLEMENTED
>                 `OR1200_OR32_MULI,
>  `endif
> +`ifdef OR1200_IMPL_ALU_ROTATE
>
>                 `OR1200_OR32_SH_ROTI,
> +`endif
>                 `OR1200_OR32_SFXXI,
>                 `OR1200_OR32_MTSPR,
>  `ifdef OR1200_MAC_IMPLEMENTED
> @@ -810,11 +812,11 @@
>             `OR1200_OR32_MULI:
>
>               alu_op <=  `OR1200_ALUOP_MUL;
>  `endif
> -
> +`ifdef OR1200_IMPL_ALU_ROTATE
>             // Shift and rotate insns with immediate
>             `OR1200_OR32_SH_ROTI:
>               alu_op <=  `OR1200_ALUOP_SHROT;
>
> -
> +`endif
>             // SFXX insns with immediate
>             `OR1200_OR32_SFXXI:
>               alu_op <=  `OR1200_ALUOP_COMP;
> @@ -1008,9 +1010,10 @@
>  `endif
>
>                 // Shift and rotate insns with immediate
>
> +`ifdef OR1200_IMPL_ALU_ROTATE
>                 `OR1200_OR32_SH_ROTI:
>                         rfwb_op <=  {`OR1200_RFWBOP_ALU, 1'b1};
> -
> +`endif
>                 // ALU instructions except the one with immediate
>
>                 `OR1200_OR32_ALU:
>                         rfwb_op <=  {`OR1200_RFWBOP_ALU, 1'b1};
>
>

Yep, all good with me.

Cheers

Julius
_______________________________________________
OpenRISC mailing list
[email protected]
http://lists.openrisc.net/listinfo/openrisc

Reply via email to