@@ -421,6 +421,31 @@ let cosimulate_ldstrb() =
421421 else
422422 [add_Xn_SP_imm rn stackoff; movz_Xn_imm rm regoff; code; sub_Xn_SP_Xn rn];;
423423
424+ (* ** This covers LDURB/STURB, and LDUR/STUR for 64-bit and 32-bit values ***)
425+ let cosimulate_ldstu() =
426+ let is_not_b = Random. int 2 in
427+ let x = if is_not_b = 1 then Random. int 2 else 0 in
428+ let isld = Random. int 2
429+ and rn = Random. int 32 in
430+ let rt = (rn + 1 + Random. int 31 ) mod 32 in
431+ let stackoff =
432+ if rn = 31 then Random. int 15 * 16
433+ else Random. int 249 in
434+ (* May load/store at most 8 bytes. 256 - 8 + 1 = 249 *)
435+ let off = Random. int (249 - stackoff) in
436+ let code =
437+ pow2 31 */ num is_not_b +/
438+ pow2 30 */ num x +/
439+ pow2 23 */ num 0b1110000 +/
440+ pow2 22 */ num isld +/
441+ pow2 12 */ num off +/
442+ pow2 5 */ num rn +/
443+ num rt in
444+ if rn = 31 then
445+ [add_Xn_SP_imm 31 stackoff; code; sub_Xn_SP_imm 31 stackoff]
446+ else
447+ [add_Xn_SP_imm rn stackoff; code; sub_Xn_SP_Xn rn];;
448+
424449(* ** This covers LD1R ***)
425450
426451let cosimulate_ld1r() =
@@ -444,7 +469,7 @@ let cosimulate_ld1r() =
444469 [add_Xn_SP_imm rn stackoff; code; sub_Xn_SP_Xn rn];;
445470
446471let memclasses =
447- [cosimulate_ldst_12; cosimulate_ldst_1_2reg; cosimulate_ldstrb; cosimulate_ld1r];;
472+ [cosimulate_ldst_12; cosimulate_ldst_1_2reg; cosimulate_ldstrb; cosimulate_ld1r; cosimulate_ldstu ];;
448473
449474let run_random_memopsimulation() =
450475 let icodes = el (Random. int (length memclasses)) memclasses () in
0 commit comments