Skip to content

Commit fe4a014

Browse files
committed
CHB:ARM:more support for c-style representation
1 parent e849ead commit fe4a014

File tree

1 file changed

+51
-1
lines changed

1 file changed

+51
-1
lines changed

CodeHawk/CHB/bchlibarm32/bCHFnARMDictionary.ml

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1479,11 +1479,60 @@ object (self)
14791479
(tags, args)
14801480

14811481
| LoadMultipleIncrementBefore (wback, c, base, rl, _) ->
1482-
let reglhs_rl = rl#to_multiple_variable floc in
1482+
let lhsvars_rl = rl#to_multiple_variable floc in
14831483
let basereg = base#get_register in
14841484
let baselhs_r = base#to_variable floc in
14851485
let baserhs_r = base#to_expr floc in
14861486
let regcount = rl#get_register_count in
1487+
let (memrhss_r, rmemrhss_r, cmemrhss_r, _) =
1488+
List.fold_left
1489+
(fun (mems, rmems, cmems, off) _lhsvar ->
1490+
let memop = arm_reg_deref ~with_offset:off basereg RD in
1491+
let memrhs_r = memop#to_expr floc in
1492+
let rmemrhs_r = TR.tmap rewrite_expr memrhs_r in
1493+
let cmemrhs_r =
1494+
TR.tbind (floc#convert_xpr_to_c_expr ~size:(Some 4)) rmemrhs_r in
1495+
(mems @ [memrhs_r],
1496+
rmems @ [rmemrhs_r],
1497+
cmems @ [cmemrhs_r],
1498+
off + 4)) ([], [], [], 4) lhsvars_rl in
1499+
let xaddrs_r =
1500+
List.init
1501+
rl#get_register_count
1502+
(fun i ->
1503+
let xaddr_r =
1504+
TR.tmap
1505+
(fun baserhs ->
1506+
XOp (XPlus, [baserhs; int_constant_expr (i + 4)]))
1507+
baserhs_r in
1508+
TR.tmap rewrite_expr xaddr_r) in
1509+
let cxaddrs_r =
1510+
List.map (fun xaddr_r ->
1511+
TR.tbind (floc#convert_xpr_to_c_expr ~size:(Some 4)) xaddr_r)
1512+
xaddrs_r in
1513+
let rdefs = List.map get_rdef_r (baserhs_r :: memrhss_r) in
1514+
let uses = List.map get_def_use_high_r (baselhs_r :: lhsvars_rl) in
1515+
let useshigh = List.map get_def_use_high_r (baselhs_r :: lhsvars_rl) in
1516+
let vars_r = baselhs_r :: lhsvars_rl in
1517+
let xprs_r = baserhs_r :: (memrhss_r @ rmemrhss_r @ xaddrs_r) in
1518+
let cxprs_r = cmemrhss_r @ cxaddrs_r in
1519+
let (tagstring, args) =
1520+
mk_instrx_data_r
1521+
~vars_r ~xprs_r ~cxprs_r ~rdefs ~uses ~useshigh () in
1522+
let (tags, args) = add_optional_instr_condition tagstring args c in
1523+
let tags = add_optional_subsumption tags in
1524+
let (tags, args) =
1525+
if wback then
1526+
let inc = 4 * regcount in
1527+
let xinc = int_constant_expr inc in
1528+
let baseresult_r =
1529+
TR.tmap (fun baserhs -> XOp (XPlus, [baserhs; xinc])) baserhs_r in
1530+
let rbaseresult_r = TR.tmap rewrite_expr baseresult_r in
1531+
add_base_update tags args baselhs_r inc rbaseresult_r
1532+
else
1533+
(tags, args) in
1534+
(tags, args)
1535+
(*
14871536
let (memreads_r, _) =
14881537
List.fold_left
14891538
(fun (acc, off) _reglhs ->
@@ -1513,6 +1562,7 @@ object (self)
15131562
() in
15141563
let (tags, args) = add_optional_instr_condition tagstring args c in
15151564
(tags, args)
1565+
*)
15161566

15171567
| LoadRegister _ when instr#is_aggregate_anchor ->
15181568
let iaddr = instr#get_address in

0 commit comments

Comments
 (0)