@@ -208,6 +208,7 @@ object (self)
208208 match instr#get_opcode with
209209
210210 | Add (_ , _ , rd , rn , rm , _ ) ->
211+ let xrn = rn#to_expr floc in
211212 begin
212213
213214 (if rm#is_immediate && (rm#to_numerical#toInt < 256 ) then
@@ -245,6 +246,20 @@ object (self)
245246 | _ -> () )
246247 else
247248 ()
249+ | _ -> () );
250+
251+ (match getopt_initial_argument_value xrn with
252+ | Some (reg , _ ) ->
253+ let ftvar = mk_function_typevar faddr in
254+ let ftvar = add_freg_param_capability reg ftvar in
255+ let rdreg = rd#to_register in
256+ let lhstypevar = mk_reglhs_typevar rdreg faddr iaddr in
257+ let fttypeterm = mk_vty_term ftvar in
258+ let lhstypeterm = mk_vty_term lhstypevar in
259+ begin
260+ log_subtype_constraint " ADD-lhs-init" fttypeterm lhstypeterm;
261+ store#add_subtype_constraint fttypeterm lhstypeterm
262+ end
248263 | _ -> () )
249264 end
250265
@@ -312,6 +327,25 @@ object (self)
312327
313328 end
314329
330+ | BitwiseOr (_ , _ , rd , rn , _ , _ ) ->
331+ let rdreg = rd#to_register in
332+ let lhstypevar = mk_reglhs_typevar rdreg faddr iaddr in
333+ let rndefs = get_variable_rdefs (rn#to_variable floc) in
334+ let rnreg = rn#to_register in
335+ begin
336+
337+ List. iter (fun rnsym ->
338+ let rnaddr = rnsym#getBaseName in
339+ let rntypevar = mk_reglhs_typevar rnreg faddr rnaddr in
340+ let rntypeterm = mk_vty_term rntypevar in
341+ let lhstypeterm = mk_vty_term lhstypevar in
342+ begin
343+ log_subtype_constraint " AND-rdef-1" rntypeterm lhstypeterm;
344+ store#add_subtype_constraint rntypeterm lhstypeterm
345+ end ) rndefs
346+ end
347+
348+
315349 | Branch _ ->
316350 (* no type information gained *)
317351 ()
@@ -658,7 +692,17 @@ object (self)
658692 begin
659693 log_subtype_constraint " LDRB-imm-off" rdtypeterm rttypeterm;
660694 store#add_subtype_constraint rdtypeterm rttypeterm
661- end ) xrdefs)
695+ end ) xrdefs);
696+
697+ (* LDRB rt, ... : X_rt <: integer type *)
698+ (let tc = mk_int_type_constant Unsigned 8 in
699+ let tctypeterm = mk_cty_term tc in
700+ let rttypeterm = mk_vty_term rttypevar in
701+ begin
702+ log_subtype_constraint " LDRB-lhs-byte" tctypeterm rttypeterm;
703+ store#add_subtype_constraint tctypeterm rttypeterm
704+ end )
705+
662706 end
663707
664708 | LoadRegisterByte (_ , rt , _ , _ , _ , _ ) ->
@@ -741,6 +785,33 @@ object (self)
741785 store#add_subtype_constraint tctypeterm rntypeterm
742786 end ) rndefs)
743787
788+ | LogicalShiftRight (_ , _ , rd , rn , rm , _ ) when rm#is_immediate ->
789+ let rdreg = rd#to_register in
790+ let lhstypevar = mk_reglhs_typevar rdreg faddr iaddr in
791+ let rnreg = rn#to_register in
792+ let rndefs = get_variable_rdefs (rn#to_variable floc) in
793+
794+ (* LSR results in an unsigned integer *)
795+ (let tc = mk_int_type_constant Unsigned 32 in
796+ let tcterm = mk_cty_term tc in
797+ let lhstypeterm = mk_vty_term lhstypevar in
798+ begin
799+ log_subtype_constraint " LSR-lhs" tcterm lhstypeterm;
800+ store#add_subtype_constraint tcterm lhstypeterm
801+ end );
802+
803+ (* LSR is applied to an unsigned integer *)
804+ (List. iter (fun rnrdef ->
805+ let rnaddr = rnrdef#getBaseName in
806+ let rntypevar = mk_reglhs_typevar rnreg faddr rnaddr in
807+ let tyc = mk_int_type_constant Unsigned 32 in
808+ let tctypeterm = mk_cty_term tyc in
809+ let rntypeterm = mk_vty_term rntypevar in
810+ begin
811+ log_subtype_constraint " LSR-rhs" tctypeterm rntypeterm;
812+ store#add_subtype_constraint tctypeterm rntypeterm
813+ end ) rndefs)
814+
744815 | Move (_ , _ , rd , rm , _ , _ ) when rm#is_immediate ->
745816 let rmval = rm#to_numerical#toInt in
746817 (* 0 provides no information about the type *)
0 commit comments