Index: test/cctest/compiler/test-simplified-lowering.cc |
diff --git a/test/cctest/compiler/test-simplified-lowering.cc b/test/cctest/compiler/test-simplified-lowering.cc |
index 43a6594e609747eacd0787c94f2b8817445a63d3..97b42adf42a22aaef2eaeaf15adbc6382765e882 100644 |
--- a/test/cctest/compiler/test-simplified-lowering.cc |
+++ b/test/cctest/compiler/test-simplified-lowering.cc |
@@ -86,22 +86,23 @@ class SimplifiedGraphBuilderTester : public GraphBuilderTester<ReturnType> { |
namespace { |
FieldAccess ForJSObjectMap() { |
- FieldAccess access = {JSObject::kMapOffset, Handle<Name>(), Type::Any(), |
- kMachineTagged}; |
+ FieldAccess access = {kTaggedBase, JSObject::kMapOffset, Handle<Name>(), |
+ Type::Any(), kMachineTagged}; |
return access; |
} |
FieldAccess ForJSObjectProperties() { |
- FieldAccess access = {JSObject::kPropertiesOffset, Handle<Name>(), |
- Type::Any(), kMachineTagged}; |
+ FieldAccess access = {kTaggedBase, JSObject::kPropertiesOffset, |
+ Handle<Name>(), Type::Any(), kMachineTagged}; |
return access; |
} |
FieldAccess ForArrayBufferBackingStore() { |
FieldAccess access = { |
- JSArrayBuffer::kBackingStoreOffset, Handle<Name>(), Type::UntaggedPtr(), |
+ kTaggedBase, JSArrayBuffer::kBackingStoreOffset, |
+ Handle<Name>(), Type::UntaggedPtr(), |
MachineOperatorBuilder::pointer_rep(), |
}; |
return access; |
@@ -109,13 +110,16 @@ FieldAccess ForArrayBufferBackingStore() { |
ElementAccess ForFixedArrayElement() { |
- ElementAccess access = {FixedArray::kHeaderSize, Type::Any(), kMachineTagged}; |
+ ElementAccess access = {kTaggedBase, FixedArray::kHeaderSize, Type::Any(), |
+ kMachineTagged}; |
return access; |
} |
ElementAccess ForBackingStoreElement(MachineRepresentation rep) { |
- ElementAccess access = {kNonHeapObjectHeaderSize, Type::Any(), rep}; |
+ ElementAccess access = {kUntaggedBase, |
+ kNonHeapObjectHeaderSize - kHeapObjectTag, |
+ Type::Any(), rep}; |
return access; |
} |
} |
@@ -311,3 +315,102 @@ TEST(RunCopyFixedArray) { |
CHECK_EQ(src_copy->get(i), dst->get(i)); |
} |
} |
+ |
+ |
+TEST(RunLoadFieldFromUntaggedBase) { |
+ Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3)}; |
+ |
+ for (size_t i = 0; i < ARRAY_SIZE(smis); i++) { |
+ FieldAccess access = {kUntaggedBase, // untagged base |
+ i * sizeof(Smi*), // offset |
+ Handle<Name>(), Type::Integral32(), kMachineTagged}; |
+ |
+ SimplifiedGraphBuilderTester<Object*> t; |
+ Node* load = t.LoadField(access, t.PointerConstant(smis)); |
+ t.Return(load); |
+ t.LowerAllNodes(); |
+ |
+ for (int j = -5; j <= 5; j++) { |
+ Smi* expected = Smi::FromInt(j); |
+ smis[i] = expected; |
+ CHECK_EQ(expected, t.Call()); |
+ } |
+ } |
+} |
+ |
+ |
+TEST(RunStoreFieldToUntaggedBase) { |
+ Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3)}; |
+ |
+ for (size_t i = 0; i < ARRAY_SIZE(smis); i++) { |
+ FieldAccess access = {kUntaggedBase, // untagged base |
+ i * sizeof(Smi*), // offset |
+ Handle<Name>(), Type::Integral32(), kMachineTagged}; |
+ |
+ SimplifiedGraphBuilderTester<Object*> t(kMachineTagged); |
+ Node* p0 = t.Parameter(0); |
+ t.StoreField(access, t.PointerConstant(smis), p0); |
+ t.Return(p0); |
+ t.LowerAllNodes(); |
+ |
+ for (int j = -5; j <= 5; j++) { |
+ Smi* expected = Smi::FromInt(j); |
+ smis[i] = Smi::FromInt(-100); |
+ CHECK_EQ(expected, t.Call(expected)); |
+ CHECK_EQ(expected, smis[i]); |
+ } |
+ } |
+} |
+ |
+ |
+TEST(RunLoadElementFromUntaggedBase) { |
+ Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3), |
+ Smi::FromInt(4), Smi::FromInt(5)}; |
+ |
+ for (size_t i = 0; i < ARRAY_SIZE(smis); i++) { // for header sizes |
+ for (size_t j = i; j < ARRAY_SIZE(smis); j++) { // for element index |
+ ElementAccess access = {kUntaggedBase, // untagged base |
+ i * sizeof(Smi*), // header size |
+ Type::Integral32(), kMachineTagged}; |
+ |
+ SimplifiedGraphBuilderTester<Object*> t; |
+ Node* load = |
+ t.LoadElement(access, t.PointerConstant(smis), t.Int32Constant(j)); |
+ t.Return(load); |
+ t.LowerAllNodes(); |
+ |
+ for (int k = -5; k <= 5; k++) { |
+ Smi* expected = Smi::FromInt(k); |
+ smis[i + j] = expected; |
+ CHECK_EQ(expected, t.Call()); |
+ } |
+ } |
+ } |
+} |
+ |
+ |
+TEST(RunStoreElementFromUntaggedBase) { |
+ Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3), |
+ Smi::FromInt(4), Smi::FromInt(5)}; |
+ |
+ for (size_t i = 0; i < ARRAY_SIZE(smis); i++) { // for header sizes |
+ for (size_t j = i; j < ARRAY_SIZE(smis); j++) { // for element index |
+ ElementAccess access = {kUntaggedBase, // untagged base |
+ i * sizeof(Smi*), // header size |
+ Type::Integral32(), kMachineTagged}; |
+ |
+ SimplifiedGraphBuilderTester<Object*> t(kMachineTagged); |
+ Node* p0 = t.Parameter(0); |
+ t.StoreElement(access, t.PointerConstant(smis), t.Int32Constant(j), p0); |
+ t.Return(p0); |
+ t.LowerAllNodes(); |
+ |
+ for (int k = -5; k <= 5; k++) { |
+ Smi* expected = Smi::FromInt(k); |
+ smis[i + j] = Smi::FromInt(-100); |
+ CHECK_EQ(expected, t.Call(expected)); |
+ CHECK_EQ(expected, smis[i + j]); |
+ } |
+ } |
+ } |
+} |