On Tue, Jun 02, 2015 at 05:32:02PM +0200, Andreas Krebbel wrote:

...
> +(define_insn "*<shift><mode>3_imm"
> +  [(set (match_operand:GPR 0 "register_operand" "=d")
> +        (SHIFT:GPR (match_operand:GPR 1 "register_operand" "<d0>")
> +                   (match_operand     2 "immediate_operand" "J")))]
> +  ""
> +  "s<lr>l<g>\t%0,<1>%2"
> +  [(set_attr "op_type"  "RS<E>")
> +   (set_attr "atype"    "reg")])
> +
> +(define_insn "*<shift><mode>3_immreg"
> +  [(set (match_operand:GPR 0 "register_operand" "=d")
> +        (SHIFT:GPR (match_operand:GPR 1 "register_operand" "<d0>")
> +                (plus:SI
> +                 (match_operand:SI 2 "register_operand"    "a")
> +                 (match_operand    3 "immediate_operand"   "J"))))]
> +  ""
> +  "s<lr>l<g>\t%0,<1>%2(%3)"
>    [(set_attr "op_type"  "RS<E>")
>     (set_attr "atype"    "reg")])
> 
> 
> With this we still get:
> 
> shift:
>         sll     %r2,%r3(3)
>         llgfr   %r2,%r2
>         br      %r14
> 
> for:
> 
> unsigned int
> shift (unsigned int s, unsigned  int a)
> {
>   return s << (a + 3);
> }
> 
> I'm still hoping for a better idea though ...

I've implemented it differently now. Regarding generated code it is
not perfect but its the I have so far. Further ideas are welcome.

[PATCH] S/390: Disallow SImode addresses in 64 bit
https://gcc.gnu.org/ml/gcc-patches/2015-08/msg00346.html

Bye,

-Andreas-

Reply via email to