Shifting encoding value

Hi,

I am a newbie trying to implement a proprietary target.
I want to encode the value which involves shifting of binary encoding
of the operand value.

Currently i have the following in the td file

class XFForm_1<bits<4> opcode, int shift, dag OOL, dag IOL, string asmstr,
              InstrItinClass itin, list<dag> pattern>
  : I16_2<opcode, OOL, IOL, asmstr, itin> {
  bits<4> RS;
  bits<8> Addr;

  let Pattern = pattern;

  let Inst{4-7} = Addr{0-3}; // Displacement
  let Inst{8-11} = RZ; // Dest
  let Inst{12-15} = Addr{7-4}; // Base Reg
}

The issue is that in the final encoding the displacement value should
be shifted 1,2 or 3 bits depending on the type of the instruction. So
for that i am passing the argument 'shift' into the class

like

def X_STW : XFForm_1<13, 2, (outs), (ins gprc:$rS, memri:$src),
                  "se_stw $rZ, $src", IC_LdSt,
                  >;

The issue that i am facing is for the displacement calculation i tried
the following :

  let Inst{4-7} = !srl(Addr{0-3}, shift); // Displacement

Though the compiler builds, i dont see the change. Infact after the
change now the .inc file does have displacement calculation at all.
I think the current solution that i have is to have different 'memri'
operand variants depending on the shift amount.
But i would like to know if there is any better solution.

Please CC me in your replay as i have not subscribed to the list yet.

Regards,
Shafi