@@ -1856,7 +1856,21 @@ object (self)
18561856 @ (get_all_rdefs_r xmem_r) in
18571857 let uses = [get_def_use_r vrt_r] in
18581858 let useshigh = [get_def_use_high_r vrt_r] in
1859+ let xxaddr_r = TR. tmap rewrite_expr xaddr_r in
1860+ let cxaddr_r = TR. tbind floc#convert_xpr_to_c_expr xxaddr_r in
18591861 let xrmem_r = TR. tmap rewrite_expr xmem_r in
1862+ let cxrmem_r = TR. tbind floc#convert_xpr_to_c_expr xrmem_r in
1863+ let cxrmem_r =
1864+ if Result. is_ok cxrmem_r then
1865+ cxrmem_r
1866+ else
1867+ let _ =
1868+ log_diagnostics_result
1869+ ~msg: (p2s floc#l#toPretty)
1870+ ~tag: " LDREX:fall-back address conversion"
1871+ __FILE__ __LINE__
1872+ [" xxaddr: " ^ (x_r2s xxaddr_r)] in
1873+ TR. tbind floc#convert_addr_to_c_pointed_to_expr xxaddr_r in
18601874 let _ =
18611875 TR. tfold_default
18621876 (fun xrmem -> ignore (get_string_reference floc xrmem)) () xrmem_r in
@@ -1870,7 +1884,8 @@ object (self)
18701884 let (tagstring, args) =
18711885 mk_instrx_data_r
18721886 ~vars_r: [vrt_r; vmem_r]
1873- ~xprs_r: [xrn_r; xrm_r; xmem_r; xrmem_r; xaddr_r]
1887+ ~xprs_r: [xrn_r; xrm_r; xmem_r; xrmem_r; xaddr_r; xxaddr_r]
1888+ ~cxprs_r: [cxrmem_r; cxaddr_r]
18741889 ~rdefs
18751890 ~uses
18761891 ~useshigh
@@ -2751,34 +2766,57 @@ object (self)
27512766 let regcount = rl#get_register_count in
27522767 let rhss_rl = rl#to_multiple_expr floc in
27532768 let rrhss_rl = List. map (TR. tmap rewrite_expr) rhss_rl in
2754- let (memlhss_rl, _) =
2769+ let crhss_rl =
2770+ List. map (fun rrhs_r ->
2771+ TR. tbind (floc#convert_xpr_to_c_expr ~size: (Some 4 )) rrhs_r)
2772+ rrhss_rl in
2773+ let (memlhss_rl, cmemlhss_rl, _) =
27552774 List. fold_left
2756- (fun (acc , off ) _reg ->
2775+ (fun (lhss , clhss , off ) _reg ->
27572776 let memop = arm_reg_deref ~with_offset: off basereg WR in
27582777 let memlhs_r = memop#to_variable floc in
2759- (acc @ [memlhs_r], off + 4 ))
2760- ([] , - (4 * regcount)) rl#get_register_op_list in
2778+ let cmemlhs_r =
2779+ TR. tbind
2780+ (floc#convert_var_to_c_variable ~size: (Some 4 )) memlhs_r in
2781+ (lhss @ [memlhs_r],
2782+ clhss @ [cmemlhs_r],
2783+ off + 4 )) ([] , [] , - (4 * regcount)) rl#get_register_op_list in
2784+ let xaddrs_r =
2785+ List. init
2786+ rl#get_register_count
2787+ (fun i ->
2788+ let xaddr_r =
2789+ TR. tmap
2790+ (fun baserhs ->
2791+ XOp (XPlus , [baserhs;
2792+ int_constant_expr ((i + 4 ) - (4 * regcount))]))
2793+ baserhs_r in
2794+ TR. tmap rewrite_expr xaddr_r) in
2795+ let cxaddrs_r =
2796+ List. map (fun xaddr_r ->
2797+ TR. tbind (floc#convert_xpr_to_c_expr ~size: (Some 4 )) xaddr_r)
2798+ xaddrs_r in
27612799 let rdefs = List. map get_rdef_r (baserhs_r :: rrhss_rl) in
27622800 let uses = List. map get_def_use_r (baselhs_r :: memlhss_rl) in
27632801 let useshigh = List. map get_def_use_high_r (baselhs_r :: memlhss_rl) in
2764- let wbackresults_r =
2802+ let vars_r = baselhs_r :: memlhss_rl in
2803+ let cvars_r = cmemlhss_rl in
2804+ let xprs_r = (baserhs_r :: rhss_rl) @ rrhss_rl @ xaddrs_r in
2805+ let cxprs_r = crhss_rl @ cxaddrs_r in
2806+ let (tagstring, args) =
2807+ mk_instrx_data_r
2808+ ~vars_r ~cvars_r ~xprs_r ~cxprs_r ~rdefs ~uses ~useshigh () in
2809+ let (tags, args) = add_optional_instr_condition tagstring args c in
2810+ let (tags, args) =
27652811 if wback then
2766- let decrem = int_constant_expr (4 * regcount) in
2812+ let decrem = 4 * regcount in
2813+ let xdecrem = int_constant_expr decrem in
27672814 let baseresult_r =
2768- TR. tmap (fun baserhs -> XOp (XMinus , [baserhs; decrem ])) baserhs_r in
2815+ TR. tmap (fun baserhs -> XOp (XMinus , [baserhs; xdecrem ])) baserhs_r in
27692816 let rbaseresult_r = TR. tmap rewrite_expr baseresult_r in
2770- [baseresult_r; rbaseresult_r]
2817+ add_base_update tags args baselhs_r decrem rbaseresult_r
27712818 else
2772- [baserhs_r; baserhs_r] in
2773- let (tagstring, args) =
2774- mk_instrx_data_r
2775- ~vars_r: (baselhs_r :: memlhss_rl)
2776- ~xprs_r: ((baserhs_r :: wbackresults_r) @ rrhss_rl)
2777- ~rdefs
2778- ~uses
2779- ~useshigh
2780- () in
2781- let (tags, args) = add_optional_instr_condition tagstring args c in
2819+ (tags, args) in
27822820 (tags, args)
27832821
27842822 | StoreMultipleIncrementAfter _ when instr#is_aggregate_anchor ->
@@ -3637,10 +3675,24 @@ object (self)
36373675 let vvd_r = vd#to_variable floc in
36383676 let xbase_r = base#to_expr floc in
36393677 let xaddr_r = mem#to_address floc in
3678+ let xxaddr_r = TR. tmap rewrite_expr xaddr_r in
3679+ let cxaddr_r = TR. tbind floc#convert_xpr_to_c_expr xxaddr_r in
36403680 let vmem_r = mem#to_variable floc in
36413681 let xmem_r = mem#to_expr floc in
36423682 let rxbase_r = TR. tmap rewrite_expr xbase_r in
36433683 let rxmem_r = TR. tmap rewrite_expr xmem_r in
3684+ let cxmem_r = TR. tbind floc#convert_xpr_to_c_expr rxmem_r in
3685+ let cxmem_r =
3686+ if Result. is_ok cxmem_r then
3687+ cxmem_r
3688+ else
3689+ let _ =
3690+ log_diagnostics_result
3691+ ~msg: (p2s floc#l#toPretty)
3692+ ~tag: " VLDR:fall-back address conversion"
3693+ __FILE__ __LINE__
3694+ [" xxaddr: " ^ (x_r2s xxaddr_r)] in
3695+ TR. tbind floc#convert_addr_to_c_pointed_to_expr xxaddr_r in
36443696 let rdefs =
36453697 [get_rdef_memvar_r vmem_r; get_rdef_r xmem_r]
36463698 @ (get_all_rdefs_r rxmem_r) in
@@ -3649,7 +3701,8 @@ object (self)
36493701 let (tagstring, args) =
36503702 mk_instrx_data_r
36513703 ~vars_r: [vvd_r; vmem_r]
3652- ~xprs_r: [xmem_r; rxmem_r; xbase_r; rxbase_r; xaddr_r]
3704+ ~xprs_r: [xmem_r; rxmem_r; xbase_r; rxbase_r; xaddr_r; xxaddr_r]
3705+ ~cxprs_r: [cxmem_r; cxaddr_r]
36533706 ~rdefs
36543707 ~uses
36553708 ~useshigh
@@ -3888,8 +3941,13 @@ object (self)
38883941 (tags, args)
38893942
38903943 | VStoreRegister (c , src , base , mem ) ->
3944+ let size = src#get_size in
38913945 let vmem_r = mem#to_variable floc in
3946+ let cvmem_r =
3947+ TR. tbind (floc#convert_var_to_c_variable ~size: (Some size)) vmem_r in
38923948 let xaddr_r = mem#to_address floc in
3949+ let xxaddr_r = TR. tmap rewrite_expr xaddr_r in
3950+ let cxaddr_r = TR. tbind floc#convert_xpr_to_c_expr xxaddr_r in
38933951 let xsrc_r = src#to_expr floc in
38943952 let xbase_r = base#to_expr floc in
38953953 let rxsrc_r = TR. tmap rewrite_expr xsrc_r in
@@ -3900,7 +3958,9 @@ object (self)
39003958 let (tagstring, args) =
39013959 mk_instrx_data_r
39023960 ~vars_r: [vmem_r]
3903- ~xprs_r: [xsrc_r; rxsrc_r; xbase_r; rxbase_r; xaddr_r]
3961+ ~xprs_r: [xsrc_r; rxsrc_r; xbase_r; rxbase_r; xaddr_r; xxaddr_r]
3962+ ~cvars_r: [cvmem_r]
3963+ ~cxprs_r: [cxaddr_r]
39043964 ~rdefs
39053965 ~uses
39063966 ~useshigh
0 commit comments