1314 default: {
1315 TypedArrayType type = m_node->arrayMode().typedArrayType();
1316
1317 if (isTypedView(type)) {
1318 LValue array = lowCell(m_node->child1());
1319
1320 speculate(
1321 OutOfBounds, noValue(), 0,
1322 m_out.aboveOrEqual(
1323 index, m_out.load32(array, m_heaps.JSArrayBufferView_length)));
1324
1325 TypedPointer pointer = TypedPointer(
1326 m_heaps.typedArrayProperties,
1327 m_out.add(
1328 storage,
1329 m_out.shl(
1330 m_out.zeroExt(index, m_out.intPtr),
1331 m_out.constIntPtr(logElementSize(type)))));
1332
1333 if (isInt(type)) {
1334 LValue result;
1335 switch (elementSize(type)) {
1336 case 1:
1337 result = m_out.load8(pointer);
1338 break;
1339 case 2:
1340 result = m_out.load16(pointer);
1341 break;
1342 case 4:
1343 result = m_out.load32(pointer);
1344 break;
1345 default:
1346 RELEASE_ASSERT_NOT_REACHED();
1347 }
1348
1349 if (elementSize(type) < 4) {
1350 if (isSigned(type))
1351 result = m_out.signExt(result, m_out.int32);
1352 else
1353 result = m_out.zeroExt(result, m_out.int32);
1354 setInt32(result);
1355 return;
1356 }
1357
1358 if (isSigned(type)) {
1359 setInt32(result);
1360 return;
1361 }
1362
1363 if (m_node->shouldSpeculateInteger()) {
1364 speculateForward(
1365 Overflow, noValue(), 0, m_out.lessThan(result, m_out.int32Zero),
1366 uInt32Value(result));
1367 setInt32(result);
1368 return;
1369 }
1370
1371 setDouble(m_out.unsignedToFP(result, m_out.doubleType));
1372 return;
1373 }
1374
1375 ASSERT(isFloat(type));
1376
1377 LValue result;
1378 switch (type) {
1379 case TypeFloat32:
1380 result = m_out.loadFloat(pointer);
1381 break;
1382 case TypeFloat64:
1383 result = m_out.loadDouble(pointer);
1384 break;
1385 default:
1386 RELEASE_ASSERT_NOT_REACHED();
1387 }
1388
1389 result = m_out.select(
1390 m_out.doubleEqual(result, result), result, m_out.constDouble(QNaN));
1391 setDouble(result);
1392 return;
1393 }
1394