@@ -94,9 +94,6 @@ public IEnumerator<RtlInstructionCluster> GetEnumerator()
9494 case Mnemonic . fldmiax :
9595 case Mnemonic . fstmdbx :
9696 case Mnemonic . fstmiax :
97- case Mnemonic . ldrexb :
98- case Mnemonic . ldrexd :
99- case Mnemonic . ldrexh :
10097 case Mnemonic . mcr2 :
10198 case Mnemonic . mcrr2 :
10299 case Mnemonic . mrc2 :
@@ -132,7 +129,6 @@ public IEnumerator<RtlInstructionCluster> GetEnumerator()
132129 case Mnemonic . srsia :
133130 case Mnemonic . srsib :
134131 case Mnemonic . ssax :
135- case Mnemonic . strexd :
136132 case Mnemonic . sxtab16 :
137133 case Mnemonic . sxtb16 :
138134 case Mnemonic . uhadd16 :
@@ -270,12 +266,13 @@ public IEnumerator<RtlInstructionCluster> GetEnumerator()
270266 case Mnemonic . hvc : RewriteHvc ( ) ; break ;
271267 case Mnemonic . isb : RewriteIsb ( ) ; break ;
272268 case Mnemonic . it : RewriteIt ( ) ; break ;
273- case Mnemonic . lda : RewriteLoadAcquire ( lda_sig ) ; break ;
274- case Mnemonic . ldab : RewriteLoadAcquire ( ldab_sig ) ; break ;
275- case Mnemonic . ldaex : RewriteLoadAcquire ( ldaex_sig ) ; break ;
276- case Mnemonic . ldaexb : RewriteLoadAcquire ( ldaexb_sig ) ; break ;
277- case Mnemonic . ldaexd : RewriteLoadAcquireDouble ( ldaexd_sig ) ; break ;
278- case Mnemonic . ldah : RewriteLoadAcquire ( ldah_sig ) ; break ;
269+ case Mnemonic . lda : RewriteLoadAcquire ( lda_sig , PrimitiveType . Word32 ) ; break ;
270+ case Mnemonic . ldab : RewriteLoadAcquire ( lda_sig , PrimitiveType . Byte ) ; break ;
271+ case Mnemonic . ldaex : RewriteLoadAcquire ( ldaex_sig , PrimitiveType . Word32 ) ; break ;
272+ case Mnemonic . ldaexb : RewriteLoadAcquire ( ldaex_sig , PrimitiveType . Byte ) ; break ;
273+ case Mnemonic . ldaexd : RewriteLoadAcquireDouble ( ldaex_sig ) ; break ;
274+ case Mnemonic . ldaexh : RewriteLoadAcquire ( ldaex_sig , PrimitiveType . Word16 ) ; break ;
275+ case Mnemonic . ldah : RewriteLoadAcquire ( lda_sig , PrimitiveType . Word16 ) ; break ;
279276 case Mnemonic . ldc2l : RewriteLdc ( "__ldc2l" ) ; break ;
280277 case Mnemonic . ldc2 : RewriteLdc ( "__ldc2" ) ; break ;
281278 case Mnemonic . ldcl : RewriteLdc ( "__ldcl" ) ; break ;
@@ -295,7 +292,10 @@ public IEnumerator<RtlInstructionCluster> GetEnumerator()
295292 case Mnemonic . ldrsh : RewriteLdr ( PrimitiveType . Word32 , PrimitiveType . Int16 ) ; break ;
296293 case Mnemonic . ldrsht : RewriteLdr ( PrimitiveType . Word32 , PrimitiveType . Int16 ) ; break ;
297294 case Mnemonic . ldrd : RewriteLdrd ( ) ; break ;
298- case Mnemonic . ldrex : RewriteLdrex ( ) ; break ;
295+ case Mnemonic . ldrex : RewriteLdrex ( PrimitiveType . Word32 ) ; break ;
296+ case Mnemonic . ldrexb : RewriteLdrex ( PrimitiveType . Byte ) ; break ;
297+ case Mnemonic . ldrexd : RewriteLdrexd ( ) ; break ;
298+ case Mnemonic . ldrexh : RewriteLdrex ( PrimitiveType . Word16 ) ; break ;
299299 case Mnemonic . lsl : case Mnemonic . lsls : RewriteShift ( m . Shl ) ; break ;
300300 case Mnemonic . lsr : RewriteShift ( m . Shr ) ; break ;
301301 case Mnemonic . nop : m . Nop ( ) ; break ;
@@ -386,13 +386,13 @@ public IEnumerator<RtlInstructionCluster> GetEnumerator()
386386 case Mnemonic . stc2l : RewriteStc ( stc2l_intrinsic ) ; break ;
387387 case Mnemonic . stc2 : RewriteStc ( stc2_intrinsic ) ; break ;
388388 case Mnemonic . stcl : RewriteStc ( stcl_intrinsic ) ; break ;
389- case Mnemonic . stl : RewriteStoreRelease ( "__store_release_32" , PrimitiveType . Word32 ) ; break ;
390- case Mnemonic . stlb : RewriteStoreRelease ( "__store_release_8" , PrimitiveType . Byte ) ; break ;
391- case Mnemonic . stlh : RewriteStoreRelease ( "__store_release_16" , PrimitiveType . Word16 ) ; break ;
392- case Mnemonic . stlex : RewriteStoreExclusive ( "__store_release_exclusive_32" , PrimitiveType . Word32 ) ; break ;
393- case Mnemonic . stlexb : RewriteStoreExclusive ( "__store_release_exclusive_8" , PrimitiveType . Byte ) ; break ;
394- case Mnemonic . stlexh : RewriteStoreExclusive ( "__store_release_exclusive_16" , PrimitiveType . Word16 ) ; break ;
395- case Mnemonic . stlexd : RewriteStoreReleaseDoubleExclusive ( "__store_release_exclusive_64" ) ; break ;
389+ case Mnemonic . stl : RewriteStoreRelease ( stl_intrinsic , PrimitiveType . Word32 ) ; break ;
390+ case Mnemonic . stlb : RewriteStoreRelease ( stl_intrinsic , PrimitiveType . Byte ) ; break ;
391+ case Mnemonic . stlh : RewriteStoreRelease ( stl_intrinsic , PrimitiveType . Word16 ) ; break ;
392+ case Mnemonic . stlex : RewriteStoreExclusive ( stlex_intrinsic , PrimitiveType . Word32 ) ; break ;
393+ case Mnemonic . stlexb : RewriteStoreExclusive ( stlex_intrinsic , PrimitiveType . Byte ) ; break ;
394+ case Mnemonic . stlexh : RewriteStoreExclusive ( stlex_intrinsic , PrimitiveType . Word16 ) ; break ;
395+ case Mnemonic . stlexd : RewriteStoreReleaseDoubleExclusive ( stlex_intrinsic ) ; break ;
396396 case Mnemonic . stm : RewriteStm ( true , true ) ; break ;
397397 case Mnemonic . stmdb : RewriteStm ( false , false ) ; break ;
398398 case Mnemonic . stmda : RewriteStm ( false , true ) ; break ;
@@ -401,9 +401,10 @@ public IEnumerator<RtlInstructionCluster> GetEnumerator()
401401 case Mnemonic . strb : RewriteStr ( PrimitiveType . Byte ) ; break ;
402402 case Mnemonic . strbt : RewriteStr ( PrimitiveType . Byte ) ; break ;
403403 case Mnemonic . strd : RewriteStrd ( ) ; break ;
404- case Mnemonic . strex : RewriteStoreExclusive ( "__store_exclusive_32" , PrimitiveType . Word32 ) ; break ;
405- case Mnemonic . strexb : RewriteStoreExclusive ( "__store_exclusive_8" , PrimitiveType . Byte ) ; break ;
406- case Mnemonic . strexh : RewriteStoreExclusive ( "__store_exclusive_16" , PrimitiveType . Word16 ) ; break ;
404+ case Mnemonic . strex : RewriteStoreExclusive ( strex_intrinsic , PrimitiveType . Word32 ) ; break ;
405+ case Mnemonic . strexb : RewriteStoreExclusive ( strex_intrinsic , PrimitiveType . Byte ) ; break ;
406+ case Mnemonic . strexd : RewriteStoreReleaseDoubleExclusive ( strex_intrinsic ) ; break ;
407+ case Mnemonic . strexh : RewriteStoreExclusive ( strex_intrinsic , PrimitiveType . Word16 ) ; break ;
407408 case Mnemonic . strh : RewriteStr ( PrimitiveType . UInt16 ) ; break ;
408409 case Mnemonic . strht : RewriteStr ( PrimitiveType . UInt16 ) ; break ;
409410 case Mnemonic . strt : RewriteStr ( PrimitiveType . Word32 ) ; break ;
@@ -646,7 +647,17 @@ void RewriteB(bool link)
646647 else
647648 {
648649 ConditionalSkip ( true ) ;
649- m . Goto ( dst ) ;
650+ if ( instr . Operands [ 0 ] is RegisterStorage rop && rop == Registers . lr )
651+ {
652+ //$TODO: cheating a little since
653+ // one could consider lr being set explitly.
654+ // however, this is very uncommon.
655+ m . Return ( 0 , 0 ) ;
656+ }
657+ else
658+ {
659+ m . Goto ( dst ) ;
660+ }
650661 }
651662 }
652663 }
@@ -1068,16 +1079,14 @@ private void EmitUnitTest(AArch32Instruction instr)
10681079 . Void ( ) ;
10691080 private static readonly IntrinsicProcedure cps_id_intrinsic = new IntrinsicBuilder ( "__cps_id" , true )
10701081 . Void ( ) ;
1071- private static readonly IntrinsicProcedure lda_sig ;
1072- private static readonly IntrinsicProcedure ldab_sig ;
1073- private static readonly IntrinsicProcedure ldah_sig ;
1074- private static readonly IntrinsicProcedure ldaex_sig ;
1075- private static readonly IntrinsicProcedure ldaexb_sig ;
1076- private static readonly IntrinsicProcedure ldaexd_sig ;
1077- private static readonly IntrinsicProcedure ldaexh_sig ;
1082+ private static readonly IntrinsicProcedure lda_sig = new IntrinsicBuilder ( "__load_acquire" , true )
1083+ . GenericTypes ( "T" ) . PtrParam ( "T" ) . Returns ( "T" ) ;
1084+ private static readonly IntrinsicProcedure ldaex_sig = new IntrinsicBuilder ( "__load_acquire_exclusive" , true )
1085+ . GenericTypes ( "T" ) . PtrParam ( "T" ) . Returns ( "T" ) ;
10781086 private static readonly IntrinsicProcedure ldrex_intrinsic = new IntrinsicBuilder ( "__ldrex" , true )
1079- . PtrParam ( PrimitiveType . Word32 )
1080- . Returns ( PrimitiveType . Word32 ) ;
1087+ . GenericTypes ( "T" )
1088+ . PtrParam ( "T" )
1089+ . Returns ( "T" ) ;
10811090 private static readonly IntrinsicProcedure rev_intrinsic = new IntrinsicBuilder ( "__rev" , false )
10821091 . GenericTypes ( "T" )
10831092 . Param ( PrimitiveType . Word32 )
@@ -1104,6 +1113,21 @@ private void EmitUnitTest(AArch32Instruction instr)
11041113 . Param ( PrimitiveType . Word32 )
11051114 . Param ( PrimitiveType . Word32 )
11061115 . Void ( ) ;
1116+ private static readonly IntrinsicProcedure stl_intrinsic = new IntrinsicBuilder ( "__store_release" , true )
1117+ . GenericTypes ( "T" )
1118+ . PtrParam ( "T" )
1119+ . Param ( "T" )
1120+ . Void ( ) ;
1121+ private static readonly IntrinsicProcedure stlex_intrinsic = new IntrinsicBuilder ( "__store_release_exclusive" , true )
1122+ . GenericTypes ( "T" )
1123+ . PtrParam ( "T" )
1124+ . Param ( "T" )
1125+ . Returns ( "T" ) ;
1126+ private static readonly IntrinsicProcedure strex_intrinsic = new IntrinsicBuilder ( "__store_exclusive" , true )
1127+ . GenericTypes ( "T" )
1128+ . PtrParam ( "T" )
1129+ . Param ( "T" )
1130+ . Returns ( "T" ) ;
11071131 private static readonly IntrinsicProcedure usat_intrinsic = new IntrinsicBuilder ( "__usat" , false )
11081132 . Param ( PrimitiveType . Int32 )
11091133 . Param ( PrimitiveType . Int32 )
@@ -1118,20 +1142,6 @@ static ArmRewriter()
11181142 var p16 = new Pointer ( PrimitiveType . Word16 , 32 ) ;
11191143 var p32 = new Pointer ( PrimitiveType . Word32 , 32 ) ;
11201144 var p64 = new Pointer ( PrimitiveType . Word64 , 64 ) ;
1121- lda_sig = new IntrinsicBuilder ( "__load_acquire_32" , true )
1122- . Param ( p32 ) . Returns ( PrimitiveType . Word32 ) ;
1123- ldab_sig = new IntrinsicBuilder ( "__load_acquire_8" , true )
1124- . Param ( pb ) . Returns ( PrimitiveType . Byte ) ;
1125- ldah_sig = new IntrinsicBuilder ( "__load_acquire_16" , true )
1126- . Param ( p16 ) . Returns ( PrimitiveType . Byte ) ;
1127- ldaex_sig = new IntrinsicBuilder ( "__load_acquire_exclusive_32" , true )
1128- . Param ( p32 ) . Returns ( PrimitiveType . Word32 ) ;
1129- ldaexb_sig = new IntrinsicBuilder ( "__load_acquire_exclusive_8" , true )
1130- . Param ( pb ) . Returns ( PrimitiveType . Byte ) ;
1131- ldaexd_sig = new IntrinsicBuilder ( "__load_acquire_exclusive_64" , true )
1132- . Param ( p64 ) . Returns ( PrimitiveType . Word64 ) ;
1133- ldaexh_sig = new IntrinsicBuilder ( "__load_acquire_exclusive_16" , true )
1134- . Param ( p16 ) . Returns ( PrimitiveType . Word16 ) ;
11351145
11361146 ssat16_intrinsic = new IntrinsicBuilder ( "__ssat16" , false )
11371147 . Param ( PrimitiveType . Int32 )
0 commit comments