/src/compiler/access-builder.cc

https://gitlab.com/AnneSmile/v8 · C++ · 714 lines · 556 code · 93 blank · 65 comment · 5 complexity · 621ecf16759e711501479aaf7f6e22b4 MD5 · raw file

  1. // Copyright 2014 the V8 project authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "src/compiler/access-builder.h"
  5. #include "src/contexts.h"
  6. #include "src/frames.h"
  7. #include "src/handles-inl.h"
  8. #include "src/heap/heap.h"
  9. #include "src/type-cache.h"
  10. namespace v8 {
  11. namespace internal {
  12. namespace compiler {
  13. // static
  14. FieldAccess AccessBuilder::ForMap() {
  15. FieldAccess access = {
  16. kTaggedBase, HeapObject::kMapOffset, MaybeHandle<Name>(),
  17. Type::OtherInternal(), MachineType::AnyTagged(), kMapWriteBarrier};
  18. return access;
  19. }
  20. // static
  21. FieldAccess AccessBuilder::ForHeapNumberValue() {
  22. FieldAccess access = {kTaggedBase,
  23. HeapNumber::kValueOffset,
  24. MaybeHandle<Name>(),
  25. TypeCache::Get().kFloat64,
  26. MachineType::Float64(),
  27. kNoWriteBarrier};
  28. return access;
  29. }
  30. // static
  31. FieldAccess AccessBuilder::ForJSObjectProperties() {
  32. FieldAccess access = {
  33. kTaggedBase, JSObject::kPropertiesOffset, MaybeHandle<Name>(),
  34. Type::Internal(), MachineType::AnyTagged(), kPointerWriteBarrier};
  35. return access;
  36. }
  37. // static
  38. FieldAccess AccessBuilder::ForJSObjectElements() {
  39. FieldAccess access = {
  40. kTaggedBase, JSObject::kElementsOffset, MaybeHandle<Name>(),
  41. Type::Internal(), MachineType::AnyTagged(), kPointerWriteBarrier};
  42. return access;
  43. }
  44. // static
  45. FieldAccess AccessBuilder::ForJSObjectInObjectProperty(Handle<Map> map,
  46. int index) {
  47. int const offset = map->GetInObjectPropertyOffset(index);
  48. FieldAccess access = {kTaggedBase,
  49. offset,
  50. MaybeHandle<Name>(),
  51. Type::Tagged(),
  52. MachineType::AnyTagged(),
  53. kFullWriteBarrier};
  54. return access;
  55. }
  56. // static
  57. FieldAccess AccessBuilder::ForJSFunctionPrototypeOrInitialMap() {
  58. FieldAccess access = {kTaggedBase,
  59. JSFunction::kPrototypeOrInitialMapOffset,
  60. MaybeHandle<Name>(),
  61. Type::Any(),
  62. MachineType::AnyTagged(),
  63. kFullWriteBarrier};
  64. return access;
  65. }
  66. // static
  67. FieldAccess AccessBuilder::ForJSFunctionContext() {
  68. FieldAccess access = {
  69. kTaggedBase, JSFunction::kContextOffset, MaybeHandle<Name>(),
  70. Type::Internal(), MachineType::AnyTagged(), kPointerWriteBarrier};
  71. return access;
  72. }
  73. // static
  74. FieldAccess AccessBuilder::ForJSFunctionSharedFunctionInfo() {
  75. FieldAccess access = {kTaggedBase,
  76. JSFunction::kSharedFunctionInfoOffset,
  77. Handle<Name>(),
  78. Type::OtherInternal(),
  79. MachineType::AnyTagged(),
  80. kPointerWriteBarrier};
  81. return access;
  82. }
  83. // static
  84. FieldAccess AccessBuilder::ForJSFunctionLiterals() {
  85. FieldAccess access = {
  86. kTaggedBase, JSFunction::kLiteralsOffset, Handle<Name>(),
  87. Type::Internal(), MachineType::AnyTagged(), kPointerWriteBarrier};
  88. return access;
  89. }
  90. // static
  91. FieldAccess AccessBuilder::ForJSFunctionCodeEntry() {
  92. FieldAccess access = {kTaggedBase,
  93. JSFunction::kCodeEntryOffset,
  94. Handle<Name>(),
  95. Type::UntaggedPointer(),
  96. MachineType::Pointer(),
  97. kNoWriteBarrier};
  98. return access;
  99. }
  100. // static
  101. FieldAccess AccessBuilder::ForJSFunctionNextFunctionLink() {
  102. FieldAccess access = {kTaggedBase,
  103. JSFunction::kNextFunctionLinkOffset,
  104. Handle<Name>(),
  105. Type::Any(),
  106. MachineType::AnyTagged(),
  107. kPointerWriteBarrier};
  108. return access;
  109. }
  110. // static
  111. FieldAccess AccessBuilder::ForJSGeneratorObjectContext() {
  112. FieldAccess access = {kTaggedBase,
  113. JSGeneratorObject::kContextOffset,
  114. Handle<Name>(),
  115. Type::Internal(),
  116. MachineType::AnyTagged(),
  117. kPointerWriteBarrier};
  118. return access;
  119. }
  120. // static
  121. FieldAccess AccessBuilder::ForJSGeneratorObjectContinuation() {
  122. TypeCache const& type_cache = TypeCache::Get();
  123. FieldAccess access = {kTaggedBase,
  124. JSGeneratorObject::kContinuationOffset,
  125. Handle<Name>(),
  126. type_cache.kSmi,
  127. MachineType::AnyTagged(),
  128. kNoWriteBarrier};
  129. return access;
  130. }
  131. // static
  132. FieldAccess AccessBuilder::ForJSGeneratorObjectInputOrDebugPos() {
  133. FieldAccess access = {kTaggedBase,
  134. JSGeneratorObject::kInputOrDebugPosOffset,
  135. Handle<Name>(),
  136. Type::NonInternal(),
  137. MachineType::AnyTagged(),
  138. kFullWriteBarrier};
  139. return access;
  140. }
  141. // static
  142. FieldAccess AccessBuilder::ForJSGeneratorObjectOperandStack() {
  143. FieldAccess access = {kTaggedBase,
  144. JSGeneratorObject::kOperandStackOffset,
  145. Handle<Name>(),
  146. Type::Internal(),
  147. MachineType::AnyTagged(),
  148. kPointerWriteBarrier};
  149. return access;
  150. }
  151. // static
  152. FieldAccess AccessBuilder::ForJSGeneratorObjectResumeMode() {
  153. TypeCache const& type_cache = TypeCache::Get();
  154. FieldAccess access = {kTaggedBase,
  155. JSGeneratorObject::kResumeModeOffset,
  156. Handle<Name>(),
  157. type_cache.kSmi,
  158. MachineType::AnyTagged(),
  159. kNoWriteBarrier};
  160. return access;
  161. }
  162. // static
  163. FieldAccess AccessBuilder::ForJSArrayLength(ElementsKind elements_kind) {
  164. TypeCache const& type_cache = TypeCache::Get();
  165. FieldAccess access = {kTaggedBase,
  166. JSArray::kLengthOffset,
  167. Handle<Name>(),
  168. type_cache.kJSArrayLengthType,
  169. MachineType::AnyTagged(),
  170. kFullWriteBarrier};
  171. if (IsFastDoubleElementsKind(elements_kind)) {
  172. access.type = type_cache.kFixedDoubleArrayLengthType;
  173. access.write_barrier_kind = kNoWriteBarrier;
  174. } else if (IsFastElementsKind(elements_kind)) {
  175. access.type = type_cache.kFixedArrayLengthType;
  176. access.write_barrier_kind = kNoWriteBarrier;
  177. }
  178. return access;
  179. }
  180. // static
  181. FieldAccess AccessBuilder::ForJSArrayBufferBackingStore() {
  182. FieldAccess access = {kTaggedBase,
  183. JSArrayBuffer::kBackingStoreOffset,
  184. MaybeHandle<Name>(),
  185. Type::UntaggedPointer(),
  186. MachineType::Pointer(),
  187. kNoWriteBarrier};
  188. return access;
  189. }
  190. // static
  191. FieldAccess AccessBuilder::ForJSArrayBufferBitField() {
  192. FieldAccess access = {kTaggedBase, JSArrayBuffer::kBitFieldOffset,
  193. MaybeHandle<Name>(), TypeCache::Get().kUint8,
  194. MachineType::Uint32(), kNoWriteBarrier};
  195. return access;
  196. }
  197. // static
  198. FieldAccess AccessBuilder::ForJSArrayBufferViewBuffer() {
  199. FieldAccess access = {kTaggedBase,
  200. JSArrayBufferView::kBufferOffset,
  201. MaybeHandle<Name>(),
  202. Type::TaggedPointer(),
  203. MachineType::AnyTagged(),
  204. kPointerWriteBarrier};
  205. return access;
  206. }
  207. // static
  208. FieldAccess AccessBuilder::ForJSArrayBufferViewByteLength() {
  209. FieldAccess access = {kTaggedBase,
  210. JSArrayBufferView::kByteLengthOffset,
  211. MaybeHandle<Name>(),
  212. TypeCache::Get().kPositiveInteger,
  213. MachineType::AnyTagged(),
  214. kFullWriteBarrier};
  215. return access;
  216. }
  217. // static
  218. FieldAccess AccessBuilder::ForJSArrayBufferViewByteOffset() {
  219. FieldAccess access = {kTaggedBase,
  220. JSArrayBufferView::kByteOffsetOffset,
  221. MaybeHandle<Name>(),
  222. TypeCache::Get().kPositiveInteger,
  223. MachineType::AnyTagged(),
  224. kFullWriteBarrier};
  225. return access;
  226. }
  227. // static
  228. FieldAccess AccessBuilder::ForJSTypedArrayLength() {
  229. FieldAccess access = {kTaggedBase,
  230. JSTypedArray::kLengthOffset,
  231. MaybeHandle<Name>(),
  232. TypeCache::Get().kJSTypedArrayLengthType,
  233. MachineType::AnyTagged(),
  234. kNoWriteBarrier};
  235. return access;
  236. }
  237. // static
  238. FieldAccess AccessBuilder::ForJSDateField(JSDate::FieldIndex index) {
  239. FieldAccess access = {kTaggedBase,
  240. JSDate::kValueOffset + index * kPointerSize,
  241. MaybeHandle<Name>(),
  242. Type::Number(),
  243. MachineType::AnyTagged(),
  244. kFullWriteBarrier};
  245. return access;
  246. }
  247. // static
  248. FieldAccess AccessBuilder::ForJSIteratorResultDone() {
  249. FieldAccess access = {
  250. kTaggedBase, JSIteratorResult::kDoneOffset, MaybeHandle<Name>(),
  251. Type::NonInternal(), MachineType::AnyTagged(), kFullWriteBarrier};
  252. return access;
  253. }
  254. // static
  255. FieldAccess AccessBuilder::ForJSIteratorResultValue() {
  256. FieldAccess access = {
  257. kTaggedBase, JSIteratorResult::kValueOffset, MaybeHandle<Name>(),
  258. Type::NonInternal(), MachineType::AnyTagged(), kFullWriteBarrier};
  259. return access;
  260. }
  261. // static
  262. FieldAccess AccessBuilder::ForJSRegExpFlags() {
  263. FieldAccess access = {
  264. kTaggedBase, JSRegExp::kFlagsOffset, MaybeHandle<Name>(),
  265. Type::Tagged(), MachineType::AnyTagged(), kFullWriteBarrier};
  266. return access;
  267. }
  268. // static
  269. FieldAccess AccessBuilder::ForJSRegExpSource() {
  270. FieldAccess access = {
  271. kTaggedBase, JSRegExp::kSourceOffset, MaybeHandle<Name>(),
  272. Type::Tagged(), MachineType::AnyTagged(), kFullWriteBarrier};
  273. return access;
  274. }
  275. // static
  276. FieldAccess AccessBuilder::ForFixedArrayLength() {
  277. FieldAccess access = {kTaggedBase,
  278. FixedArray::kLengthOffset,
  279. MaybeHandle<Name>(),
  280. TypeCache::Get().kFixedArrayLengthType,
  281. MachineType::AnyTagged(),
  282. kNoWriteBarrier};
  283. return access;
  284. }
  285. // static
  286. FieldAccess AccessBuilder::ForFixedTypedArrayBaseBasePointer() {
  287. FieldAccess access = {kTaggedBase,
  288. FixedTypedArrayBase::kBasePointerOffset,
  289. MaybeHandle<Name>(),
  290. Type::Tagged(),
  291. MachineType::AnyTagged(),
  292. kPointerWriteBarrier};
  293. return access;
  294. }
  295. // static
  296. FieldAccess AccessBuilder::ForFixedTypedArrayBaseExternalPointer() {
  297. FieldAccess access = {kTaggedBase,
  298. FixedTypedArrayBase::kExternalPointerOffset,
  299. MaybeHandle<Name>(),
  300. Type::UntaggedPointer(),
  301. MachineType::Pointer(),
  302. kNoWriteBarrier};
  303. return access;
  304. }
  305. // static
  306. FieldAccess AccessBuilder::ForDescriptorArrayEnumCache() {
  307. FieldAccess access = {kTaggedBase,
  308. DescriptorArray::kEnumCacheOffset,
  309. Handle<Name>(),
  310. Type::TaggedPointer(),
  311. MachineType::AnyTagged(),
  312. kPointerWriteBarrier};
  313. return access;
  314. }
  315. // static
  316. FieldAccess AccessBuilder::ForDescriptorArrayEnumCacheBridgeCache() {
  317. FieldAccess access = {kTaggedBase,
  318. DescriptorArray::kEnumCacheBridgeCacheOffset,
  319. Handle<Name>(),
  320. Type::TaggedPointer(),
  321. MachineType::AnyTagged(),
  322. kPointerWriteBarrier};
  323. return access;
  324. }
  325. // static
  326. FieldAccess AccessBuilder::ForMapBitField() {
  327. FieldAccess access = {kTaggedBase, Map::kBitFieldOffset,
  328. Handle<Name>(), TypeCache::Get().kUint8,
  329. MachineType::Uint8(), kNoWriteBarrier};
  330. return access;
  331. }
  332. // static
  333. FieldAccess AccessBuilder::ForMapBitField3() {
  334. FieldAccess access = {kTaggedBase, Map::kBitField3Offset,
  335. Handle<Name>(), TypeCache::Get().kInt32,
  336. MachineType::Int32(), kNoWriteBarrier};
  337. return access;
  338. }
  339. // static
  340. FieldAccess AccessBuilder::ForMapDescriptors() {
  341. FieldAccess access = {
  342. kTaggedBase, Map::kDescriptorsOffset, Handle<Name>(),
  343. Type::TaggedPointer(), MachineType::AnyTagged(), kPointerWriteBarrier};
  344. return access;
  345. }
  346. // static
  347. FieldAccess AccessBuilder::ForMapInstanceType() {
  348. FieldAccess access = {kTaggedBase, Map::kInstanceTypeOffset,
  349. Handle<Name>(), TypeCache::Get().kUint8,
  350. MachineType::Uint8(), kNoWriteBarrier};
  351. return access;
  352. }
  353. // static
  354. FieldAccess AccessBuilder::ForMapPrototype() {
  355. FieldAccess access = {
  356. kTaggedBase, Map::kPrototypeOffset, Handle<Name>(),
  357. Type::TaggedPointer(), MachineType::AnyTagged(), kPointerWriteBarrier};
  358. return access;
  359. }
  360. // static
  361. FieldAccess AccessBuilder::ForNameHashField() {
  362. FieldAccess access = {kTaggedBase, Name::kHashFieldOffset,
  363. Handle<Name>(), Type::Internal(),
  364. MachineType::Uint32(), kNoWriteBarrier};
  365. return access;
  366. }
  367. // static
  368. FieldAccess AccessBuilder::ForStringLength() {
  369. FieldAccess access = {kTaggedBase,
  370. String::kLengthOffset,
  371. Handle<Name>(),
  372. TypeCache::Get().kStringLengthType,
  373. MachineType::AnyTagged(),
  374. kNoWriteBarrier};
  375. return access;
  376. }
  377. // static
  378. FieldAccess AccessBuilder::ForConsStringFirst() {
  379. FieldAccess access = {
  380. kTaggedBase, ConsString::kFirstOffset, Handle<Name>(),
  381. Type::String(), MachineType::AnyTagged(), kPointerWriteBarrier};
  382. return access;
  383. }
  384. // static
  385. FieldAccess AccessBuilder::ForConsStringSecond() {
  386. FieldAccess access = {
  387. kTaggedBase, ConsString::kSecondOffset, Handle<Name>(),
  388. Type::String(), MachineType::AnyTagged(), kPointerWriteBarrier};
  389. return access;
  390. }
  391. // static
  392. FieldAccess AccessBuilder::ForSlicedStringOffset() {
  393. FieldAccess access = {
  394. kTaggedBase, SlicedString::kOffsetOffset, Handle<Name>(),
  395. Type::SignedSmall(), MachineType::AnyTagged(), kNoWriteBarrier};
  396. return access;
  397. }
  398. // static
  399. FieldAccess AccessBuilder::ForSlicedStringParent() {
  400. FieldAccess access = {
  401. kTaggedBase, SlicedString::kParentOffset, Handle<Name>(),
  402. Type::String(), MachineType::AnyTagged(), kPointerWriteBarrier};
  403. return access;
  404. }
  405. // static
  406. FieldAccess AccessBuilder::ForExternalStringResourceData() {
  407. FieldAccess access = {kTaggedBase,
  408. ExternalString::kResourceDataOffset,
  409. Handle<Name>(),
  410. Type::UntaggedPointer(),
  411. MachineType::Pointer(),
  412. kNoWriteBarrier};
  413. return access;
  414. }
  415. // static
  416. ElementAccess AccessBuilder::ForExternalOneByteStringCharacter() {
  417. ElementAccess access = {kUntaggedBase, 0, TypeCache::Get().kUint8,
  418. MachineType::Uint8(), kNoWriteBarrier};
  419. return access;
  420. }
  421. // static
  422. ElementAccess AccessBuilder::ForExternalTwoByteStringCharacter() {
  423. ElementAccess access = {kUntaggedBase, 0, TypeCache::Get().kUint16,
  424. MachineType::Uint16(), kNoWriteBarrier};
  425. return access;
  426. }
  427. // static
  428. ElementAccess AccessBuilder::ForSeqOneByteStringCharacter() {
  429. ElementAccess access = {kTaggedBase, SeqOneByteString::kHeaderSize,
  430. TypeCache::Get().kUint8, MachineType::Uint8(),
  431. kNoWriteBarrier};
  432. return access;
  433. }
  434. // static
  435. ElementAccess AccessBuilder::ForSeqTwoByteStringCharacter() {
  436. ElementAccess access = {kTaggedBase, SeqTwoByteString::kHeaderSize,
  437. TypeCache::Get().kUint16, MachineType::Uint16(),
  438. kNoWriteBarrier};
  439. return access;
  440. }
  441. // static
  442. FieldAccess AccessBuilder::ForJSGlobalObjectGlobalProxy() {
  443. FieldAccess access = {kTaggedBase,
  444. JSGlobalObject::kGlobalProxyOffset,
  445. Handle<Name>(),
  446. Type::Receiver(),
  447. MachineType::AnyTagged(),
  448. kPointerWriteBarrier};
  449. return access;
  450. }
  451. // static
  452. FieldAccess AccessBuilder::ForJSGlobalObjectNativeContext() {
  453. FieldAccess access = {kTaggedBase,
  454. JSGlobalObject::kNativeContextOffset,
  455. Handle<Name>(),
  456. Type::Internal(),
  457. MachineType::AnyTagged(),
  458. kPointerWriteBarrier};
  459. return access;
  460. }
  461. // static
  462. FieldAccess AccessBuilder::ForValue() {
  463. FieldAccess access = {
  464. kTaggedBase, JSValue::kValueOffset, Handle<Name>(),
  465. Type::NonInternal(), MachineType::AnyTagged(), kFullWriteBarrier};
  466. return access;
  467. }
  468. // static
  469. FieldAccess AccessBuilder::ForArgumentsLength() {
  470. FieldAccess access = {
  471. kTaggedBase, JSArgumentsObject::kLengthOffset, Handle<Name>(),
  472. Type::NonInternal(), MachineType::AnyTagged(), kFullWriteBarrier};
  473. return access;
  474. }
  475. // static
  476. FieldAccess AccessBuilder::ForArgumentsCallee() {
  477. FieldAccess access = {kTaggedBase,
  478. JSSloppyArgumentsObject::kCalleeOffset,
  479. Handle<Name>(),
  480. Type::NonInternal(),
  481. MachineType::AnyTagged(),
  482. kPointerWriteBarrier};
  483. return access;
  484. }
  485. // static
  486. FieldAccess AccessBuilder::ForFixedArraySlot(size_t index) {
  487. int offset = FixedArray::OffsetOfElementAt(static_cast<int>(index));
  488. FieldAccess access = {kTaggedBase,
  489. offset,
  490. Handle<Name>(),
  491. Type::NonInternal(),
  492. MachineType::AnyTagged(),
  493. kFullWriteBarrier};
  494. return access;
  495. }
  496. // static
  497. FieldAccess AccessBuilder::ForContextSlot(size_t index) {
  498. int offset = Context::kHeaderSize + static_cast<int>(index) * kPointerSize;
  499. DCHECK_EQ(offset,
  500. Context::SlotOffset(static_cast<int>(index)) + kHeapObjectTag);
  501. FieldAccess access = {kTaggedBase,
  502. offset,
  503. Handle<Name>(),
  504. Type::Any(),
  505. MachineType::AnyTagged(),
  506. kFullWriteBarrier};
  507. return access;
  508. }
  509. // static
  510. FieldAccess AccessBuilder::ForPropertyCellValue() {
  511. return ForPropertyCellValue(Type::Tagged());
  512. }
  513. // static
  514. FieldAccess AccessBuilder::ForPropertyCellValue(Type* type) {
  515. FieldAccess access = {
  516. kTaggedBase, PropertyCell::kValueOffset, Handle<Name>(),
  517. type, MachineType::AnyTagged(), kFullWriteBarrier};
  518. return access;
  519. }
  520. // static
  521. ElementAccess AccessBuilder::ForFixedArrayElement() {
  522. ElementAccess access = {kTaggedBase, FixedArray::kHeaderSize, Type::Tagged(),
  523. MachineType::AnyTagged(), kFullWriteBarrier};
  524. return access;
  525. }
  526. // static
  527. ElementAccess AccessBuilder::ForFixedArrayElement(ElementsKind kind) {
  528. ElementAccess access = {kTaggedBase, FixedArray::kHeaderSize, Type::Any(),
  529. MachineType::AnyTagged(), kFullWriteBarrier};
  530. switch (kind) {
  531. case FAST_SMI_ELEMENTS:
  532. access.type = TypeCache::Get().kSmi;
  533. access.write_barrier_kind = kNoWriteBarrier;
  534. break;
  535. case FAST_HOLEY_SMI_ELEMENTS:
  536. access.type = TypeCache::Get().kHoleySmi;
  537. break;
  538. case FAST_ELEMENTS:
  539. access.type = Type::NonInternal();
  540. break;
  541. case FAST_HOLEY_ELEMENTS:
  542. break;
  543. case FAST_DOUBLE_ELEMENTS:
  544. access.type = Type::Number();
  545. access.write_barrier_kind = kNoWriteBarrier;
  546. access.machine_type = MachineType::Float64();
  547. break;
  548. case FAST_HOLEY_DOUBLE_ELEMENTS:
  549. access.type = Type::Number();
  550. access.write_barrier_kind = kNoWriteBarrier;
  551. access.machine_type = MachineType::Float64();
  552. break;
  553. default:
  554. UNREACHABLE();
  555. break;
  556. }
  557. return access;
  558. }
  559. // static
  560. ElementAccess AccessBuilder::ForFixedDoubleArrayElement() {
  561. ElementAccess access = {kTaggedBase, FixedDoubleArray::kHeaderSize,
  562. TypeCache::Get().kFloat64, MachineType::Float64(),
  563. kNoWriteBarrier};
  564. return access;
  565. }
  566. // static
  567. ElementAccess AccessBuilder::ForTypedArrayElement(ExternalArrayType type,
  568. bool is_external) {
  569. BaseTaggedness taggedness = is_external ? kUntaggedBase : kTaggedBase;
  570. int header_size = is_external ? 0 : FixedTypedArrayBase::kDataOffset;
  571. switch (type) {
  572. case kExternalInt8Array: {
  573. ElementAccess access = {taggedness, header_size, Type::Signed32(),
  574. MachineType::Int8(), kNoWriteBarrier};
  575. return access;
  576. }
  577. case kExternalUint8Array:
  578. case kExternalUint8ClampedArray: {
  579. ElementAccess access = {taggedness, header_size, Type::Unsigned32(),
  580. MachineType::Uint8(), kNoWriteBarrier};
  581. return access;
  582. }
  583. case kExternalInt16Array: {
  584. ElementAccess access = {taggedness, header_size, Type::Signed32(),
  585. MachineType::Int16(), kNoWriteBarrier};
  586. return access;
  587. }
  588. case kExternalUint16Array: {
  589. ElementAccess access = {taggedness, header_size, Type::Unsigned32(),
  590. MachineType::Uint16(), kNoWriteBarrier};
  591. return access;
  592. }
  593. case kExternalInt32Array: {
  594. ElementAccess access = {taggedness, header_size, Type::Signed32(),
  595. MachineType::Int32(), kNoWriteBarrier};
  596. return access;
  597. }
  598. case kExternalUint32Array: {
  599. ElementAccess access = {taggedness, header_size, Type::Unsigned32(),
  600. MachineType::Uint32(), kNoWriteBarrier};
  601. return access;
  602. }
  603. case kExternalFloat32Array: {
  604. ElementAccess access = {taggedness, header_size, Type::Number(),
  605. MachineType::Float32(), kNoWriteBarrier};
  606. return access;
  607. }
  608. case kExternalFloat64Array: {
  609. ElementAccess access = {taggedness, header_size, Type::Number(),
  610. MachineType::Float64(), kNoWriteBarrier};
  611. return access;
  612. }
  613. }
  614. UNREACHABLE();
  615. ElementAccess access = {kUntaggedBase, 0, Type::None(), MachineType::None(),
  616. kNoWriteBarrier};
  617. return access;
  618. }
  619. } // namespace compiler
  620. } // namespace internal
  621. } // namespace v8