@@ -3141,7 +3141,7 @@ let parse_thumb32_31_0
31413141 let offset = arm_shifted_index_offset (get_arm_reg (b 3 0 )) reg_srt in
31423142 let mem =
31433143 mk_arm_offset_address_op
3144- rnreg offset ~isadd: true ~isindex: true ~iswback: false in
3144+ rnreg offset ~size: 1 ~ isadd:true ~isindex: true ~iswback: false in
31453145 (* STRB<c>.W <Rt>, [<Rn>, <Rm>{, LSL #<imm2>}] *)
31463146 StoreRegisterByte (cc, rt RD , rn RD , rm RD , mem WR , true )
31473147
@@ -3152,7 +3152,8 @@ let parse_thumb32_31_0
31523152 let isindex = (b 10 10 ) = 1 in
31533153 let isadd = (b 9 9 ) = 1 in
31543154 let iswback = (b 8 8 ) = 1 in
3155- let mem = mk_arm_offset_address_op rnreg offset ~isadd ~isindex ~iswback in
3155+ let mem =
3156+ mk_arm_offset_address_op ~size: 1 rnreg offset ~isadd ~isindex ~iswback in
31563157 (* STRB<c> <Rt>, [<Rn>, #-<imm8>]
31573158 STRB<c> <Rt>, [<Rn>], #+/-<imm8>
31583159 STRB<c> <Rt>, [<Rn>, #+/-<imm8>]! *)
@@ -3199,7 +3200,7 @@ let parse_thumb32_31_0
31993200 let offset = arm_shifted_index_offset (get_arm_reg (b 3 0 )) reg_srt in
32003201 let mem =
32013202 mk_arm_offset_address_op
3202- rnreg offset ~isadd: true ~isindex: true ~iswback: false in
3203+ rnreg offset ~size: 2 ~ isadd:true ~isindex: true ~iswback: false in
32033204 (* STRH<c>.W <Rt>, [<Rn>, <Rm>{, LSL #<imm2>}] *)
32043205 StoreRegisterHalfword (cc, rt RD , rn RD , rm RD , mem WR , true )
32053206
@@ -3209,7 +3210,8 @@ let parse_thumb32_31_0
32093210 let isindex = (b 10 10 ) = 1 in
32103211 let isadd = (b 9 9 ) = 1 in
32113212 let iswback = (b 8 8 ) = 1 in
3212- let mem = mk_arm_offset_address_op rnreg offset ~isadd ~isindex ~iswback in
3213+ let mem =
3214+ mk_arm_offset_address_op ~size: 2 rnreg offset ~isadd ~isindex ~iswback in
32133215 (* STRH<c> <Rt>, [<Rn>, #-<imm8>]
32143216 STRH<c> <Rt>, [<Rn>], #+/-<imm8>
32153217 STRH<c> <Rt>, [<Rn>, #+/-<imm8>]! *)
@@ -3222,7 +3224,7 @@ let parse_thumb32_31_0
32223224 let offset = arm_shifted_index_offset (get_arm_reg (b 3 0 )) reg_srt in
32233225 let mem =
32243226 mk_arm_offset_address_op
3225- rnreg offset ~isadd: true ~isindex: true ~iswback: false in
3227+ rnreg offset ~size: 2 ~ isadd:true ~isindex: true ~iswback: false in
32263228 (* LDRH<c>.W <Rt>, [<Rn>, <Rm>{, LSL #<imm2>}] *)
32273229 LoadRegisterHalfword (cc, rt WR , rn RD , rm RD , mem RD , true )
32283230
@@ -3234,7 +3236,7 @@ let parse_thumb32_31_0
32343236 let iswback = (b 8 8 ) = 1 in
32353237 let imm = arm_immediate_op (TR. tget_ok (signed_immediate_from_int (b 7 0 ))) in
32363238 let mem =
3237- mk_arm_offset_address_op rnreg offset ~isadd ~isindex ~iswback in
3239+ mk_arm_offset_address_op ~size: 2 rnreg offset ~isadd ~isindex ~iswback in
32383240 (* LDRH<c>.W <Rt>, [<Rn>{, #+/-<imm8>}] Offset: (index,wback) = (T,F)
32393241 * LDRH<c>.W <Rt>, [<Rn>, #+/-<imm8>]! Pre-x : (index,wback) = (T,T)
32403242 * LDRH<c>.W <Rt>, [<Rn>], #+/-<imm8> Post-x: (index,wback) = (F,T) *)
@@ -3319,7 +3321,7 @@ let parse_thumb32_31_0
33193321 TR. tget_ok (mk_arm_immediate_op false 4 (mkNumerical (b 11 0 ))) in
33203322 let mem =
33213323 mk_arm_offset_address_op
3322- rnreg offset ~isadd: true ~isindex: true ~iswback: false in
3324+ rnreg offset ~size: 1 ~ isadd:true ~isindex: true ~iswback: false in
33233325 StoreRegisterByte (cc, rt RD , rn RD , immop, mem WR , true )
33243326
33253327 (* < 31>00010W1<rn><15><--imm12---> PLD (immediate, T1) *)
@@ -3345,15 +3347,15 @@ let parse_thumb32_31_0
33453347 (* STRH<c>.W <Rt>, [<Rn>, #<imm12>] *)
33463348 let mem =
33473349 mk_arm_offset_address_op
3348- rnreg offset ~isadd: true ~isindex: true ~iswback: false in
3350+ rnreg offset ~size: 2 ~ isadd:true ~isindex: true ~iswback: false in
33493351 StoreRegisterHalfword (cc, rt RD , rn RD , rm RD , mem WR , true )
33503352
33513353 (* < 31>00< 11><rn><rt><--imm12---> LDRH (immediate) - T2 *)
33523354 | 11 ->
33533355 (* LDRH<c>.W <Rt>, [<Rn>{, #<imm12>} *)
33543356 let mem =
33553357 mk_arm_offset_address_op
3356- rnreg offset ~isadd: true ~isindex: true ~iswback: false in
3358+ rnreg offset ~size: 2 ~ isadd:true ~isindex: true ~iswback: false in
33573359 LoadRegisterHalfword (cc, rt WR , rn RD , rm RD , mem RD , true )
33583360
33593361 (* < 31>00< 12><rn><rt><--imm12---> STR (immediate) - T3 *)
@@ -3395,7 +3397,7 @@ let parse_thumb32_31_0
33953397 let offset = arm_shifted_index_offset rmreg reg_srt in
33963398 let memi =
33973399 mk_arm_offset_address_op
3398- rnreg offset ~align: 1 ~isadd: true ~isindex: true ~iswback: false in
3400+ rnreg offset ~size: 1 ~ align:1 ~isadd: true ~isindex: true ~iswback: false in
33993401 (* LDRSB<c>.W, <Rt>, [<Rn>, <Rm>{, LSL #<imm2>}] *)
34003402 LoadRegisterSignedByte (cc, rt WR , rn RD , rm RD , memi RD , true )
34013403
@@ -3408,7 +3410,8 @@ let parse_thumb32_31_0
34083410 let imm =
34093411 arm_immediate_op (TR. tget_ok (signed_immediate_from_int (b 7 0 ))) in
34103412 let mem =
3411- mk_arm_offset_address_op ~align: 1 rnreg offset ~isadd ~isindex ~iswback in
3413+ mk_arm_offset_address_op
3414+ ~size: 1 ~align: 1 rnreg offset ~isadd ~isindex ~iswback in
34123415 (* LDRSB<c> <Rt>, [<Rn>, #-<imm8>]
34133416 LDRSB<c> <Rt>, [<Rn>], #+/-<imm8>
34143417 LDRSB<c> <Rt>, [<Rn>, #+/-<imm8>]! *)
@@ -3532,7 +3535,7 @@ let parse_thumb32_31_0
35323535 let offset = arm_shifted_index_offset rmreg reg_srt in
35333536 let memi =
35343537 mk_arm_offset_address_op
3535- rnreg offset ~align: 1 ~isadd: true ~isindex: true ~iswback: false in
3538+ rnreg offset ~size: 2 ~ align:2 ~isadd: true ~isindex: true ~iswback: false in
35363539 (* LDRSH<c>.W, <Rt>, [<Rn>, <Rm>{, LSL #<imm2>}] *)
35373540 LoadRegisterSignedHalfword (cc, rt WR , rn RD , rm RD , memi RD , true )
35383541
@@ -3545,7 +3548,8 @@ let parse_thumb32_31_0
35453548 let imm =
35463549 arm_immediate_op (TR. tget_ok (signed_immediate_from_int (b 7 0 ))) in
35473550 let mem =
3548- mk_arm_offset_address_op ~align: 1 rnreg offset ~isadd ~isindex ~iswback in
3551+ mk_arm_offset_address_op
3552+ ~size: 2 ~align: 2 rnreg offset ~isadd ~isindex ~iswback in
35493553 (* LDRSH<c> <Rt>, [<Rn>, #-<imm8>]
35503554 LDRSH<c> <Rt>, [<Rn>], #+/-<imm8>
35513555 LDRSH<c> <Rt>, [<Rn>, #+/-<imm8>]! *)
@@ -3558,7 +3562,7 @@ let parse_thumb32_31_0
35583562 let offset = ARMImmOffset imm12 in
35593563 let mem =
35603564 mk_arm_offset_address_op
3561- rnreg offset ~align: 1 ~isadd: true ~isindex: true ~iswback: false in
3565+ rnreg offset ~size: 2 ~ align:1 ~isadd: true ~isindex: true ~iswback: false in
35623566 (* LDRSB<c> <Rt>, [<Rn>, #<imm12>] *)
35633567 LoadRegisterSignedByte (cc, rt WR , rn RD , imm, mem RD , false )
35643568
@@ -3737,7 +3741,7 @@ let parse_thumb32_31_0
37373741 let offset = ARMImmOffset imm12 in
37383742 let mem =
37393743 mk_arm_offset_address_op
3740- rnreg offset ~align: 1 ~isadd: true ~isindex: true ~iswback: false in
3744+ rnreg offset ~size: 2 ~ align:2 ~isadd: true ~isindex: true ~iswback: false in
37413745 (* LDRSH<c> <Rt>, [<Rn>, #<imm12>] *)
37423746 LoadRegisterSignedHalfword (cc, rt WR , rn RD , imm, mem RD , false )
37433747
@@ -5288,9 +5292,9 @@ let parse_t16_load_store_reg
52885292 let rt = regop rtreg in
52895293 let reg_srt = ARMImmSRT (SRType_LSL , 0 ) in
52905294 let offset = arm_shifted_index_offset rmreg reg_srt in
5291- let mem ?(size =4 ) m =
5295+ let mem ?(size =4 ) ( mode : arm_operand_mode_t ) =
52925296 mk_arm_offset_address_op
5293- ~size rnreg offset ~isadd: true ~isindex: true ~iswback: false m in
5297+ ~size rnreg offset ~isadd: true ~isindex: true ~iswback: false mode in
52945298
52955299 match (b 11 9 ) with
52965300
@@ -5302,17 +5306,17 @@ let parse_t16_load_store_reg
53025306 (* 0101001<r><r><r> STRH (register) - T1 *)
53035307 | 1 ->
53045308 (* STRH<c> <Rt>, [<Rn>, <Rm>] *)
5305- StoreRegisterHalfword (cc, rt RD , rn RD , rm RD , mem WR , false )
5309+ StoreRegisterHalfword (cc, rt RD , rn RD , rm RD , mem ~size: 2 WR , false )
53065310
53075311 (* 0101010<r><r><r> STRB (register) - T1 *)
53085312 | 2 ->
53095313 (* STRB<c> <Rt>, [<Rn>, <Rm>] *)
5310- StoreRegisterByte (cc, rt RD , rn RD , rm RD , mem WR , false )
5314+ StoreRegisterByte (cc, rt RD , rn RD , rm RD , mem ~size: 1 WR , false )
53115315
53125316 (* 0101011<r><r><r> LDRSB (register) - T1 *)
53135317 | 3 ->
53145318 (* LDRSB<c> <Rt>, [<Rn>, <Rm>] *)
5315- LoadRegisterSignedByte (cc, rt WR , rn RD , rm RD , mem RD , false )
5319+ LoadRegisterSignedByte (cc, rt WR , rn RD , rm RD , mem ~size: 1 RD , false )
53165320
53175321 (* 0101100<r><r><r> LDR (register) - T1 *)
53185322 | 4 ->
@@ -5332,7 +5336,7 @@ let parse_t16_load_store_reg
53325336 (* 0101111<r><r><r> LDRSH (register) - T1 *)
53335337 | 7 ->
53345338 (* LDRSH<c> <Rt>, [<Rn>, <Rm>] *)
5335- LoadRegisterSignedHalfword (cc, rt WR , rn RD , rm RD , mem RD , false )
5339+ LoadRegisterSignedHalfword (cc, rt WR , rn RD , rm RD , mem ~size: 2 RD , false )
53365340
53375341 | tag -> NotRecognized (" t16_load_store_reg:" ^ (stri tag), instr)
53385342
@@ -5370,16 +5374,16 @@ let parse_t16_load_store_imm
53705374 arm_immediate_op
53715375 (TR. tget_ok (signed_immediate_from_int (mult * (b 10 6 )))) in
53725376 let offset (m :int ) = ARMImmOffset (m * (b 10 6 )) in
5373- let mem (mult : int ) m =
5377+ let mem (mult : int ) ?( size = 4 ) ( mode : arm_operand_mode_t ) =
53745378 mk_arm_offset_address_op
5375- rnreg (offset mult) ~isadd: true ~isindex: true ~iswback: false m in
5379+ rnreg (offset mult) ~size ~ isadd:true ~isindex: true ~iswback: false mode in
53765380
53775381 match (b 12 11 ) with
53785382 (* 10000<imm><r><r> STRH (immediate) - T1 *)
53795383 | 0 when hw ->
53805384 let immop = imm 2 in
53815385 (* STRH<c> <Rt>, [<Rn>, #<imm>] *)
5382- StoreRegisterHalfword (cc, rt RD , rn RD , immop, mem 2 WR , false )
5386+ StoreRegisterHalfword (cc, rt RD , rn RD , immop, mem 2 ~size: 2 WR , false )
53835387
53845388 (* 01100<imm><r><r> STR (immediate) - T1 *)
53855389 | 0 ->
@@ -5391,7 +5395,7 @@ let parse_t16_load_store_imm
53915395 | 1 when hw ->
53925396 let immop = imm 2 in
53935397 (* LDRH<c> <Rt>, [<Rn>, #<imm>] - T1 *)
5394- LoadRegisterHalfword (cc, rt WR , rn RD , immop, mem 2 RD , false )
5398+ LoadRegisterHalfword (cc, rt WR , rn RD , immop, mem 2 ~size: 2 RD , false )
53955399
53965400 (* 01101<imm><r><r> LDR (immediate) - T1 *)
53975401 | 1 ->
@@ -5403,13 +5407,13 @@ let parse_t16_load_store_imm
54035407 | 2 ->
54045408 let immop = imm 1 in
54055409 (* STRB<c> <Rt>, [<Rn>, #<imm5>] *)
5406- StoreRegisterByte (cc, rt RD , rn RD , immop, mem 1 WR , false )
5410+ StoreRegisterByte (cc, rt RD , rn RD , immop, mem 1 ~size: 1 WR , false )
54075411
54085412 (* 01111<imm><r><r> LDRB (immediate) - T1*)
54095413 | 3 ->
54105414 let immop = imm 1 in
54115415 (* LDRB<c> <Rt>, [<Rn>, #<imm5>] *)
5412- LoadRegisterByte (cc, rt WR , rn RD , immop, mem 1 RD , false )
5416+ LoadRegisterByte (cc, rt WR , rn RD , immop, mem 1 ~size: 1 RD , false )
54135417
54145418 | tag -> NotRecognized (" t16_load_store_imm:" ^ (stri tag), instr)
54155419
0 commit comments