// Copyright 2018 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #if V8_TARGET_ARCH_ARM64 #include "src/codegen/arm64/register-arm64.h" namespace v8 { namespace internal { VectorFormat VectorFormatHalfWidth(VectorFormat vform) { DCHECK(vform == kFormat8H || vform == kFormat4S || vform == kFormat2D || vform == kFormatH || vform == kFormatS || vform == kFormatD); switch (vform) { case kFormat8H: return kFormat8B; case kFormat4S: return kFormat4H; case kFormat2D: return kFormat2S; case kFormatH: return kFormatB; case kFormatS: return kFormatH; case kFormatD: return kFormatS; default: UNREACHABLE(); } } VectorFormat VectorFormatDoubleWidth(VectorFormat vform) { DCHECK(vform == kFormat8B || vform == kFormat4H || vform == kFormat2S || vform == kFormatB || vform == kFormatH || vform == kFormatS); switch (vform) { case kFormat8B: return kFormat8H; case kFormat4H: return kFormat4S; case kFormat2S: return kFormat2D; case kFormatB: return kFormatH; case kFormatH: return kFormatS; case kFormatS: return kFormatD; default: UNREACHABLE(); } } VectorFormat VectorFormatFillQ(VectorFormat vform) { switch (vform) { case kFormatB: case kFormat8B: case kFormat16B: return kFormat16B; case kFormatH: case kFormat4H: case kFormat8H: return kFormat8H; case kFormatS: case kFormat2S: case kFormat4S: return kFormat4S; case kFormatD: case kFormat1D: case kFormat2D: return kFormat2D; default: UNREACHABLE(); } } VectorFormat VectorFormatHalfWidthDoubleLanes(VectorFormat vform) { switch (vform) { case kFormat4H: return kFormat8B; case kFormat8H: return kFormat16B; case kFormat2S: return kFormat4H; case kFormat4S: return kFormat8H; case kFormat1D: return kFormat2S; case kFormat2D: return kFormat4S; default: UNREACHABLE(); } } VectorFormat VectorFormatDoubleLanes(VectorFormat vform) { DCHECK(vform == kFormat8B || vform == kFormat4H || vform == kFormat2S); switch (vform) { case kFormat8B: return kFormat16B; case kFormat4H: return kFormat8H; case kFormat2S: return kFormat4S; default: UNREACHABLE(); } } VectorFormat VectorFormatHalfLanes(VectorFormat vform) { DCHECK(vform == kFormat16B || vform == kFormat8H || vform == kFormat4S); switch (vform) { case kFormat16B: return kFormat8B; case kFormat8H: return kFormat4H; case kFormat4S: return kFormat2S; default: UNREACHABLE(); } } VectorFormat ScalarFormatFromLaneSize(int laneSize) { switch (laneSize) { case 8: return kFormatB; case 16: return kFormatH; case 32: return kFormatS; case 64: return kFormatD; default: UNREACHABLE(); } } VectorFormat VectorFormatFillQ(int laneSize) { return VectorFormatFillQ(ScalarFormatFromLaneSize(laneSize)); } VectorFormat ScalarFormatFromFormat(VectorFormat vform) { return ScalarFormatFromLaneSize(LaneSizeInBitsFromFormat(vform)); } unsigned RegisterSizeInBytesFromFormat(VectorFormat vform) { return RegisterSizeInBitsFromFormat(vform) / 8; } unsigned RegisterSizeInBitsFromFormat(VectorFormat vform) { DCHECK_NE(vform, kFormatUndefined); switch (vform) { case kFormatB: return kBRegSizeInBits; case kFormatH: return kHRegSizeInBits; case kFormatS: return kSRegSizeInBits; case kFormatD: return kDRegSizeInBits; case kFormat8B: case kFormat4H: case kFormat2S: case kFormat1D: return kDRegSizeInBits; default: return kQRegSizeInBits; } } unsigned LaneSizeInBitsFromFormat(VectorFormat vform) { DCHECK_NE(vform, kFormatUndefined); switch (vform) { case kFormatB: case kFormat8B: case kFormat16B: return 8; case kFormatH: case kFormat4H: case kFormat8H: return 16; case kFormatS: case kFormat2S: case kFormat4S: return 32; case kFormatD: case kFormat1D: case kFormat2D: return 64; default: UNREACHABLE(); } } int LaneSizeInBytesFromFormat(VectorFormat vform) { return LaneSizeInBitsFromFormat(vform) / 8; } int LaneSizeInBytesLog2FromFormat(VectorFormat vform) { DCHECK_NE(vform, kFormatUndefined); switch (vform) { case kFormatB: case kFormat8B: case kFormat16B: return 0; case kFormatH: case kFormat4H: case kFormat8H: return 1; case kFormatS: case kFormat2S: case kFormat4S: return 2; case kFormatD: case kFormat1D: case kFormat2D: return 3; default: UNREACHABLE(); } } int LaneCountFromFormat(VectorFormat vform) { DCHECK_NE(vform, kFormatUndefined); switch (vform) { case kFormat16B: return 16; case kFormat8B: case kFormat8H: return 8; case kFormat4H: case kFormat4S: return 4; case kFormat2S: case kFormat2D: return 2; case kFormat1D: case kFormatB: case kFormatH: case kFormatS: case kFormatD: return 1; default: UNREACHABLE(); } } int MaxLaneCountFromFormat(VectorFormat vform) { DCHECK_NE(vform, kFormatUndefined); switch (vform) { case kFormatB: case kFormat8B: case kFormat16B: return 16; case kFormatH: case kFormat4H: case kFormat8H: return 8; case kFormatS: case kFormat2S: case kFormat4S: return 4; case kFormatD: case kFormat1D: case kFormat2D: return 2; default: UNREACHABLE(); } } // Does 'vform' indicate a vector format or a scalar format? bool IsVectorFormat(VectorFormat vform) { DCHECK_NE(vform, kFormatUndefined); switch (vform) { case kFormatB: case kFormatH: case kFormatS: case kFormatD: return false; default: return true; } } int64_t MaxIntFromFormat(VectorFormat vform) { return INT64_MAX >> (64 - LaneSizeInBitsFromFormat(vform)); } int64_t MinIntFromFormat(VectorFormat vform) { return INT64_MIN >> (64 - LaneSizeInBitsFromFormat(vform)); } uint64_t MaxUintFromFormat(VectorFormat vform) { return UINT64_MAX >> (64 - LaneSizeInBitsFromFormat(vform)); } } // namespace internal } // namespace v8 #endif // V8_TARGET_ARCH_ARM64