Skip to content

Commit 7980b9c

Browse files
committed
[bolt][aarch64] Add load-acquire & store-release instructions
This patch adds checking for the load-acquire & store-release instructions since a operand can be SP register.
1 parent 60a18d6 commit 7980b9c

File tree

1 file changed

+65
-25
lines changed

1 file changed

+65
-25
lines changed

bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp

Lines changed: 65 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,7 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
661661
case AArch64::LDTRBi:
662662
case AArch64::LDTRSBWi:
663663
case AArch64::LDTRSBXi:
664+
case AArch64::LDARB:
664665
return true;
665666
default:
666667
break;
@@ -699,6 +700,7 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
699700
case AArch64::LDTRHi:
700701
case AArch64::LDTRSHWi:
701702
case AArch64::LDTRSHXi:
703+
case AArch64::LDARH:
702704
return true;
703705
default:
704706
break;
@@ -733,6 +735,7 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
733735
case AArch64::LDPSWpost:
734736
case AArch64::LDPSWpre:
735737
case AArch64::LDNPWi:
738+
case AArch64::LDARW:
736739
return true;
737740
default:
738741
break;
@@ -756,6 +759,7 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
756759
case AArch64::LDPXi:
757760
case AArch64::LDPXpost:
758761
case AArch64::LDPXpre:
762+
case AArch64::LDARX:
759763
return true;
760764
default:
761765
break;
@@ -850,33 +854,55 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
850854
}
851855

852856
bool isAArch64ExclusiveLoad(const MCInst &Inst) const override {
853-
return (Inst.getOpcode() == AArch64::LDXPX ||
854-
Inst.getOpcode() == AArch64::LDXPW ||
855-
Inst.getOpcode() == AArch64::LDXRX ||
856-
Inst.getOpcode() == AArch64::LDXRW ||
857-
Inst.getOpcode() == AArch64::LDXRH ||
858-
Inst.getOpcode() == AArch64::LDXRB ||
859-
Inst.getOpcode() == AArch64::LDAXPX ||
860-
Inst.getOpcode() == AArch64::LDAXPW ||
861-
Inst.getOpcode() == AArch64::LDAXRX ||
862-
Inst.getOpcode() == AArch64::LDAXRW ||
863-
Inst.getOpcode() == AArch64::LDAXRH ||
864-
Inst.getOpcode() == AArch64::LDAXRB);
857+
const unsigned opcode = Inst.getOpcode();
858+
switch (opcode) {
859+
case AArch64::LDXPX:
860+
case AArch64::LDXPW:
861+
case AArch64::LDXRX:
862+
case AArch64::LDXRW:
863+
case AArch64::LDXRH:
864+
case AArch64::LDXRB:
865+
case AArch64::LDAXPX:
866+
case AArch64::LDAXPW:
867+
case AArch64::LDAXRX:
868+
case AArch64::LDAXRW:
869+
case AArch64::LDAXRH:
870+
case AArch64::LDAXRB:
871+
case AArch64::LDAEX:
872+
case AArch64::LDAEXB:
873+
case AArch64::LDAEXH:
874+
case AArch64::LDAEXD:
875+
return true;
876+
default:
877+
break;
878+
}
879+
return false;
865880
}
866881

867882
bool isAArch64ExclusiveStore(const MCInst &Inst) const override {
868-
return (Inst.getOpcode() == AArch64::STXPX ||
869-
Inst.getOpcode() == AArch64::STXPW ||
870-
Inst.getOpcode() == AArch64::STXRX ||
871-
Inst.getOpcode() == AArch64::STXRW ||
872-
Inst.getOpcode() == AArch64::STXRH ||
873-
Inst.getOpcode() == AArch64::STXRB ||
874-
Inst.getOpcode() == AArch64::STLXPX ||
875-
Inst.getOpcode() == AArch64::STLXPW ||
876-
Inst.getOpcode() == AArch64::STLXRX ||
877-
Inst.getOpcode() == AArch64::STLXRW ||
878-
Inst.getOpcode() == AArch64::STLXRH ||
879-
Inst.getOpcode() == AArch64::STLXRB);
883+
const unsigned opcode = Inst.getOpcode();
884+
switch (opcode) {
885+
case AArch64::STXPX:
886+
case AArch64::STXPW:
887+
case AArch64::STXRX:
888+
case AArch64::STXRW:
889+
case AArch64::STXRH:
890+
case AArch64::STXRB:
891+
case AArch64::STLXPX:
892+
case AArch64::STLXPW:
893+
case AArch64::STLXRX:
894+
case AArch64::STLXRW:
895+
case AArch64::STLXRH:
896+
case AArch64::STLXRB:
897+
case AArch64::STLEX:
898+
case AArch64::STLEXB:
899+
case AArch64::STLEXH:
900+
case AArch64::STLEXD:
901+
return true;
902+
default:
903+
break;
904+
}
905+
return false;
880906
}
881907

882908
bool isAArch64ExclusiveClear(const MCInst &Inst) const override {
@@ -1926,9 +1952,23 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
19261952
return false;
19271953
};
19281954

1955+
auto isStoreRelease = [&]() {
1956+
switch (opcode) {
1957+
case AArch64::STLRB:
1958+
case AArch64::STLRH:
1959+
case AArch64::STLRW:
1960+
case AArch64::STLRX:
1961+
return true;
1962+
default:
1963+
break;
1964+
}
1965+
1966+
return false;
1967+
};
1968+
19291969
return isStoreRegUnscaleImm() || isStoreRegScaledImm() ||
19301970
isStoreRegImmPreIndexed() || isStoreRegImmPostIndexed() ||
1931-
isStoreRegUnscaleUnpriv() || isStoreRegTrunc();
1971+
isStoreRegUnscaleUnpriv() || isStoreRegTrunc() || isStoreRelease();
19321972
}
19331973

19341974
bool mayStore(const MCInst &Inst) const override {

0 commit comments

Comments
 (0)