aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJacob Bramley <jacob.bramley@arm.com>2019-02-07 17:17:41 +0000
committerJacob Bramley <jacob.bramley@arm.com>2019-02-22 10:06:21 +0000
commit518bd7ec6d4eb50b6a85f830704ab77dec37015d (patch)
tree405bfde8d93c5e42d8dd239626e6e211390e98ef /src
parent18c97bde7e79589210a1b156f56e35964174b331 (diff)
Update the CPUFeatures tests.
Also fix issues in the CPUFeaturesAuditor and Assembler. Change-Id: I7404e63107d46812eb098d2e7166225136080687
Diffstat (limited to 'src')
-rw-r--r--src/aarch64/assembler-aarch64.cc21
-rw-r--r--src/aarch64/assembler-aarch64.h2
-rw-r--r--src/aarch64/cpu-features-auditor-aarch64.cc7
3 files changed, 24 insertions, 6 deletions
diff --git a/src/aarch64/assembler-aarch64.cc b/src/aarch64/assembler-aarch64.cc
index 74a89fef..d416441c 100644
--- a/src/aarch64/assembler-aarch64.cc
+++ b/src/aarch64/assembler-aarch64.cc
@@ -1523,7 +1523,7 @@ void Assembler::stlrb(const Register& rt, const MemOperand& dst) {
}
void Assembler::stlurb(const Register& rt, const MemOperand& dst) {
- VIXL_ASSERT(CPUHas(CPUFeatures::kRCpcImm));
+ VIXL_ASSERT(CPUHas(CPUFeatures::kRCpc, CPUFeatures::kRCpcImm));
VIXL_ASSERT(dst.IsImmediateOffset() && IsImmLSUnscaled(dst.GetOffset()));
Instr base = RnSP(dst.GetBaseRegister());
@@ -1538,7 +1538,7 @@ void Assembler::stlrh(const Register& rt, const MemOperand& dst) {
}
void Assembler::stlurh(const Register& rt, const MemOperand& dst) {
- VIXL_ASSERT(CPUHas(CPUFeatures::kRCpcImm));
+ VIXL_ASSERT(CPUHas(CPUFeatures::kRCpc, CPUFeatures::kRCpcImm));
VIXL_ASSERT(dst.IsImmediateOffset() && IsImmLSUnscaled(dst.GetOffset()));
Instr base = RnSP(dst.GetBaseRegister());
@@ -1554,7 +1554,7 @@ void Assembler::stlr(const Register& rt, const MemOperand& dst) {
}
void Assembler::stlur(const Register& rt, const MemOperand& dst) {
- VIXL_ASSERT(CPUHas(CPUFeatures::kRCpcImm));
+ VIXL_ASSERT(CPUHas(CPUFeatures::kRCpc, CPUFeatures::kRCpcImm));
VIXL_ASSERT(dst.IsImmediateOffset() && IsImmLSUnscaled(dst.GetOffset()));
Instr base = RnSP(dst.GetBaseRegister());
@@ -2620,12 +2620,14 @@ void Assembler::mvn(const Register& rd, const Operand& operand) {
void Assembler::mrs(const Register& xt, SystemRegister sysreg) {
VIXL_ASSERT(xt.Is64Bits());
+ VIXL_ASSERT(CPUHas(sysreg));
Emit(MRS | ImmSystemRegister(sysreg) | Rt(xt));
}
void Assembler::msr(SystemRegister sysreg, const Register& xt) {
VIXL_ASSERT(xt.Is64Bits());
+ VIXL_ASSERT(CPUHas(sysreg));
Emit(MSR | Rt(xt) | ImmSystemRegister(sysreg));
}
@@ -6147,6 +6149,19 @@ bool Assembler::CPUHas(const CPURegister& rt, const CPURegister& rt2) const {
}
+bool Assembler::CPUHas(SystemRegister sysreg) const {
+ switch (sysreg) {
+ case RNDR:
+ case RNDRRS:
+ return CPUHas(CPUFeatures::kRNG);
+ case FPCR:
+ case NZCV:
+ break;
+ }
+ return true;
+}
+
+
bool AreAliased(const CPURegister& reg1,
const CPURegister& reg2,
const CPURegister& reg3,
diff --git a/src/aarch64/assembler-aarch64.h b/src/aarch64/assembler-aarch64.h
index 250a0bc3..7b529344 100644
--- a/src/aarch64/assembler-aarch64.h
+++ b/src/aarch64/assembler-aarch64.h
@@ -4349,6 +4349,8 @@ class Assembler : public vixl::internal::AssemblerBase {
bool CPUHas(const CPURegister& rt) const;
bool CPUHas(const CPURegister& rt, const CPURegister& rt2) const;
+ bool CPUHas(SystemRegister sysreg) const;
+
private:
static uint32_t FP16ToImm8(Float16 imm);
static uint32_t FP32ToImm8(float imm);
diff --git a/src/aarch64/cpu-features-auditor-aarch64.cc b/src/aarch64/cpu-features-auditor-aarch64.cc
index 3207e73b..353e17aa 100644
--- a/src/aarch64/cpu-features-auditor-aarch64.cc
+++ b/src/aarch64/cpu-features-auditor-aarch64.cc
@@ -286,13 +286,14 @@ void CPUFeaturesAuditor::VisitLoadStoreRCpcUnscaledOffset(
case LDAPUR_w:
case LDAPURSW:
case LDAPUR_x:
- scope.Record(CPUFeatures::kRCpc);
- VIXL_FALLTHROUGH();
+
+ // These stores don't actually have RCpc semantics but they're included with
+ // the RCpc extensions.
case STLURB:
case STLURH:
case STLUR_w:
case STLUR_x:
- scope.Record(CPUFeatures::kRCpcImm);
+ scope.Record(CPUFeatures::kRCpc, CPUFeatures::kRCpcImm);
return;
}
}