anchor.diff:        end
     end.
   
  +conv_src_noimm(Opnd, Map) ->
  +  R={FixSrc0, Src, NewMap} = conv_src(Opnd, Map),
  +  case hipe_x86:is_imm(Src) of
  +    false -> R;
  +    true ->
  +      Tmp = new_untagged_temp(),
  +      {FixSrc0 ++ [hipe_x86:mk_move(Src, Tmp)],
  +       Tmp, NewMap}
  +  end.
  +
   %%% Convert an RTL source operand (imm/var/reg).
   
   conv_src(Opnd, Map) ->
  
positive.code:       {I2, Map, Data};
      #load{} ->
        {Dst, Map0} = conv_dst(hipe_rtl:load_dst(I), Map),
        {FixSrc, Src, Map1} = conv_src(hipe_rtl:load_src(I), Map0),
        {FixOff, Off, Map2} = conv_src(hipe_rtl:load_offset(I), Map1),
        I2 = case {hipe_rtl:load_size(I), hipe_rtl:load_sign(I)} of
  	     {byte, signed} ->
  
negative.code:       I2 = move_retvals(Args, [hipe_x86:mk_ret(-1)]),
        {FixArgs++I2, Map0, Data};
      #store{} ->
        {FixPtr, Ptr, Map0} = conv_src_noimm(hipe_rtl:store_base(I), Map),
        {FixSrc, Src, Map1} = conv_src(hipe_rtl:store_src(I), Map0),
        {FixOff, Off, Map2} = conv_src(hipe_rtl:store_offset(I), Map1),
        I2 = mk_store(hipe_rtl:store_size(I), Src, Ptr, Off),
        {FixPtr++FixSrc++FixOff++I2, Map2, Data};
      #switch{} ->	% this one also updates Data :-(
        %% from hipe_rtl2sparc, but we use a hairy addressing mode
        %% instead of doing the arithmetic manually
  