Index: test/cctest/test-assembler-arm.cc |
diff --git a/test/cctest/test-assembler-arm.cc b/test/cctest/test-assembler-arm.cc |
index 68eaab16f6f55f2f0830027ecf2fc075914bd6ba..7d37bcdd2e3d8b7d75a4d55d18e79510a6071d8a 100644 |
--- a/test/cctest/test-assembler-arm.cc |
+++ b/test/cctest/test-assembler-arm.cc |
@@ -46,7 +46,7 @@ typedef Object* (*F1)(int x, int p1, int p2, int p3, int p4); |
typedef Object* (*F2)(int x, int y, int p2, int p3, int p4); |
typedef Object* (*F3)(void* p0, int p1, int p2, int p3, int p4); |
typedef Object* (*F4)(void* p0, void* p1, int p2, int p3, int p4); |
- |
+typedef Object* (*F5)(uint32_t p0, void* p1, void* p2, int p3, int p4); |
#define __ assm. |
@@ -1939,6 +1939,78 @@ TEST(code_relative_offset) { |
CHECK_EQ(42, res); |
} |
+TEST(msr_mrs) { |
+ // Test msr and mrs. |
+ CcTest::InitializeVM(); |
+ Isolate* isolate = CcTest::i_isolate(); |
+ HandleScope scope(isolate); |
+ |
+ Assembler assm(isolate, NULL, 0); |
+ |
+ // Create a helper function: |
+ // void TestMsrMrs(uint32_t nzcv, |
+ // uint32_t * result_conditionals, |
+ // uint32_t * result_mrs); |
+ __ msr(CPSR_f, Operand(r0)); |
+ |
+ // Test that the condition flags have taken effect. |
+ __ mov(r3, Operand(0)); |
+ __ orr(r3, r3, Operand(1 << 31), LeaveCC, mi); // N |
+ __ orr(r3, r3, Operand(1 << 30), LeaveCC, eq); // Z |
+ __ orr(r3, r3, Operand(1 << 29), LeaveCC, cs); // C |
+ __ orr(r3, r3, Operand(1 << 28), LeaveCC, vs); // V |
+ __ str(r3, MemOperand(r1)); |
+ |
+ // Also check mrs, ignoring everything other than the flags. |
+ __ mrs(r3, CPSR); |
+ __ and_(r3, r3, Operand(kSpecialCondition)); |
+ __ str(r3, MemOperand(r2)); |
+ |
+ __ bx(lr); |
+ |
+ CodeDesc desc; |
+ assm.GetCode(&desc); |
+ Handle<Code> code = isolate->factory()->NewCode( |
+ desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
+#ifdef DEBUG |
+ OFStream os(stdout); |
+ code->Print(os); |
+#endif |
+ F5 f = FUNCTION_CAST<F5>(code->entry()); |
+ Object* dummy = nullptr; |
+ USE(dummy); |
+ |
+#define CHECK_MSR_MRS(n, z, c, v) \ |
+ do { \ |
+ uint32_t nzcv = (n << 31) | (z << 30) | (c << 29) | (v << 28); \ |
+ uint32_t result_conditionals = -1; \ |
+ uint32_t result_mrs = -1; \ |
+ dummy = CALL_GENERATED_CODE(isolate, f, nzcv, &result_conditionals, \ |
+ &result_mrs, 0, 0); \ |
+ CHECK_EQ(nzcv, result_conditionals); \ |
+ CHECK_EQ(nzcv, result_mrs); \ |
+ } while (0); |
+ |
+ // N Z C V |
+ CHECK_MSR_MRS(0, 0, 0, 0); |
+ CHECK_MSR_MRS(0, 0, 0, 1); |
+ CHECK_MSR_MRS(0, 0, 1, 0); |
+ CHECK_MSR_MRS(0, 0, 1, 1); |
+ CHECK_MSR_MRS(0, 1, 0, 0); |
+ CHECK_MSR_MRS(0, 1, 0, 1); |
+ CHECK_MSR_MRS(0, 1, 1, 0); |
+ CHECK_MSR_MRS(0, 1, 1, 1); |
+ CHECK_MSR_MRS(1, 0, 0, 0); |
+ CHECK_MSR_MRS(1, 0, 0, 1); |
+ CHECK_MSR_MRS(1, 0, 1, 0); |
+ CHECK_MSR_MRS(1, 0, 1, 1); |
+ CHECK_MSR_MRS(1, 1, 0, 0); |
+ CHECK_MSR_MRS(1, 1, 0, 1); |
+ CHECK_MSR_MRS(1, 1, 1, 0); |
+ CHECK_MSR_MRS(1, 1, 1, 1); |
+ |
+#undef CHECK_MSR_MRS |
+} |
TEST(ARMv8_float32_vrintX) { |
// Test the vrintX floating point instructions. |