Chromium Code Reviews| 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..a3a64610405171def1e28788ea384a7e50622ac6 100644 |
| --- a/test/cctest/compiler/test-simplified-lowering.cc |
| +++ b/test/cctest/compiler/test-simplified-lowering.cc |
| @@ -86,14 +86,14 @@ class SimplifiedGraphBuilderTester : public GraphBuilderTester<ReturnType> { |
| namespace { |
| FieldAccess ForJSObjectMap() { |
| - FieldAccess access = {JSObject::kMapOffset, Handle<Name>(), Type::Any(), |
| + FieldAccess access = {true, JSObject::kMapOffset, Handle<Name>(), Type::Any(), |
|
Benedikt Meurer
2014/08/04 11:53:57
Can we have an enum here? Free-floating true/false
|
| kMachineTagged}; |
| return access; |
| } |
| FieldAccess ForJSObjectProperties() { |
| - FieldAccess access = {JSObject::kPropertiesOffset, Handle<Name>(), |
| + FieldAccess access = {true, JSObject::kPropertiesOffset, Handle<Name>(), |
| Type::Any(), kMachineTagged}; |
| return access; |
| } |
| @@ -101,7 +101,8 @@ FieldAccess ForJSObjectProperties() { |
| FieldAccess ForArrayBufferBackingStore() { |
| FieldAccess access = { |
| - JSArrayBuffer::kBackingStoreOffset, Handle<Name>(), Type::UntaggedPtr(), |
| + true, JSArrayBuffer::kBackingStoreOffset, |
| + Handle<Name>(), Type::UntaggedPtr(), |
| MachineOperatorBuilder::pointer_rep(), |
| }; |
| return access; |
| @@ -109,13 +110,15 @@ FieldAccess ForArrayBufferBackingStore() { |
| ElementAccess ForFixedArrayElement() { |
| - ElementAccess access = {FixedArray::kHeaderSize, Type::Any(), kMachineTagged}; |
| + ElementAccess access = {true, FixedArray::kHeaderSize, Type::Any(), |
| + kMachineTagged}; |
| return access; |
| } |
| ElementAccess ForBackingStoreElement(MachineRepresentation rep) { |
| - ElementAccess access = {kNonHeapObjectHeaderSize, Type::Any(), rep}; |
| + ElementAccess access = {false, kNonHeapObjectHeaderSize - kHeapObjectTag, |
| + Type::Any(), rep}; |
| return access; |
| } |
| } |
| @@ -311,3 +314,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 = {false, // 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 = {false, // 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 = {false, // 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 = {false, // 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]); |
| + } |
| + } |
| + } |
| +} |