Skip to content

Commit 8ffd2aa

Browse files
themakszznop
authored andcommitted
aarch64: implements lifting (intrinsics) for LDXP/STXP
1 parent 2897f79 commit 8ffd2aa

File tree

3 files changed

+12
-0
lines changed

3 files changed

+12
-0
lines changed

arch/arm64/arch_arm64.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,6 +1020,8 @@ class Arm64Architecture : public Architecture
10201020
return "__ldxrb";
10211021
case ARM64_INTRIN_LDXRH:
10221022
return "__ldxrh";
1023+
case ARM64_INTRIN_LDXP:
1024+
return "__ldxp";
10231025
case ARM64_INTRIN_LDAXR:
10241026
return "__ldaxr";
10251027
case ARM64_INTRIN_LDAXRB:
@@ -1032,6 +1034,8 @@ class Arm64Architecture : public Architecture
10321034
return "__stxrb";
10331035
case ARM64_INTRIN_STXRH:
10341036
return "__stxrh";
1037+
case ARM64_INTRIN_STXP:
1038+
return "__stxp";
10351039
case ARM64_INTRIN_STLXR:
10361040
return "__stlxr";
10371041
case ARM64_INTRIN_STLXRB:

arch/arm64/il.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2313,6 +2313,9 @@ bool GetLowLevelILForInstruction(
23132313
il.AddInstruction(il.Intrinsic({ RegisterOrFlag::Register(REG_O(operand1)) }, ARM64_INTRIN_LDXRH, { ILREG_O(operand2) }));
23142314
break;
23152315
// We don't have a way to specify intrinsic register size, so we explicitly embed the size in the intrinsic name.
2316+
case ARM64_LDXP:
2317+
il.AddInstruction(il.Intrinsic({ RegisterOrFlag::Register(REG_O(operand1)), RegisterOrFlag::Register(REG_O(operand2)) }, ARM64_INTRIN_LDXP, { ILREG_O(operand3) }));
2318+
break;
23162319
case ARM64_LDAXR:
23172320
il.AddInstruction(il.Intrinsic({ RegisterOrFlag::Register(REG_O(operand1)) }, ARM64_INTRIN_LDAXR, { ILREG_O(operand2) }));
23182321
break;
@@ -2331,6 +2334,9 @@ bool GetLowLevelILForInstruction(
23312334
case ARM64_STXRH:
23322335
il.AddInstruction(il.Intrinsic({ RegisterOrFlag::Register(REG_O(operand1)) }, ARM64_INTRIN_STXRH, { ILREG_O(operand2), ILREG_O(operand3) }));
23332336
break;
2337+
case ARM64_STXP:
2338+
il.AddInstruction(il.Intrinsic({ RegisterOrFlag::Register(REG_O(operand1)) }, ARM64_INTRIN_STXP, { ILREG_O(operand2), ILREG_O(operand3), ILREG_O(operand4) }));
2339+
break;
23342340
case ARM64_STLXR:
23352341
il.AddInstruction(il.Intrinsic({ RegisterOrFlag::Register(REG_O(operand1)) }, ARM64_INTRIN_STLXR, { ILREG_O(operand2), ILREG_O(operand3) }));
23362342
break;

arch/arm64/il.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,14 @@ enum Arm64Intrinsic : uint32_t
8585
ARM64_INTRIN_LDXR,
8686
ARM64_INTRIN_LDXRB,
8787
ARM64_INTRIN_LDXRH,
88+
ARM64_INTRIN_LDXP,
8889
ARM64_INTRIN_LDAXR,
8990
ARM64_INTRIN_LDAXRB,
9091
ARM64_INTRIN_LDAXRH,
9192
ARM64_INTRIN_STXR,
9293
ARM64_INTRIN_STXRB,
9394
ARM64_INTRIN_STXRH,
95+
ARM64_INTRIN_STXP,
9496
ARM64_INTRIN_STLXR,
9597
ARM64_INTRIN_STLXRB,
9698
ARM64_INTRIN_STLXRH,

0 commit comments

Comments
 (0)