| // Copyright 2021 The Wuffs Authors. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package armneonintrinsics |
| |
| import ( |
| "strings" |
| ) |
| |
| const ( |
| baseSize___8Bits = 0 |
| baseSize__16Bits = 1 |
| baseSize__32Bits = 2 |
| baseSize__64Bits = 3 |
| baseSize_128Bits = 4 |
| ) |
| |
| // Type is a NEON C type. Not all valid C types have an armneonintrinsics.Type, |
| // only those C types used by "arm_neon.h". |
| type Type uint8 |
| |
| const ( |
| TypeBits0_Mask = 0xF0 |
| TypeBits0_Shift = 4 |
| |
| TypeBits0_I008 Type = 0x00 |
| TypeBits0_I016 Type = 0x10 |
| TypeBits0_I032 Type = 0x20 |
| TypeBits0_I064 Type = 0x30 |
| TypeBits0_U008 Type = 0x40 |
| TypeBits0_U016 Type = 0x50 |
| TypeBits0_U032 Type = 0x60 |
| TypeBits0_U064 Type = 0x70 |
| TypeBits0_B016 Type = 0x80 |
| TypeBits0_F016 Type = 0x90 |
| TypeBits0_F032 Type = 0xA0 |
| TypeBits0_F064 Type = 0xB0 |
| TypeBits0_P008 Type = 0xC0 |
| TypeBits0_P016 Type = 0xD0 |
| TypeBits0_P064 Type = 0xE0 |
| TypeBits0_P128 Type = 0xF0 |
| ) |
| |
| const ( |
| TypeBits1_Mask = 0x0C |
| TypeBits1_Shift = 2 |
| |
| TypeBits1____Void Type = 0x00 // Only "void" if combined with TypeBits0_P128. |
| TypeBits1__Scalar Type = 0x04 |
| TypeBits1_DVector Type = 0x08 // 64-bit D (double-word) register. |
| TypeBits1_QVector Type = 0x0C // 128-bit Q ( quad-word) register. |
| ) |
| |
| const ( |
| TypeBits2_Mask = 0x03 |
| TypeBits2_Shift = 0 |
| |
| TypeBits2_ScaRegMutbl Type = 0x00 // foo |
| TypeBits2_ScaRegConst Type = 0x01 // const foo |
| TypeBits2_ScaPtrMutbl Type = 0x02 // foo * |
| TypeBits2_ScaPtrConst Type = 0x03 // const foo * |
| |
| TypeBits2_VecX1 Type = 0x00 |
| TypeBits2_VecX2 Type = 0x01 |
| TypeBits2_VecX3 Type = 0x02 |
| TypeBits2_VecX4 Type = 0x03 |
| ) |
| |
| const ( |
| TypeInvalid Type = 0 |
| |
| TypeVoid Type = TypeBits0_P128 | TypeBits1____Void |
| |
| // Scalar ScaRegMutbl types. |
| TypeInt8 Type = TypeBits0_I008 | TypeBits1__Scalar | TypeBits2_ScaRegMutbl |
| TypeInt16 Type = TypeBits0_I016 | TypeBits1__Scalar | TypeBits2_ScaRegMutbl |
| TypeInt32 Type = TypeBits0_I032 | TypeBits1__Scalar | TypeBits2_ScaRegMutbl |
| TypeInt64 Type = TypeBits0_I064 | TypeBits1__Scalar | TypeBits2_ScaRegMutbl |
| TypeUint8 Type = TypeBits0_U008 | TypeBits1__Scalar | TypeBits2_ScaRegMutbl |
| TypeUint16 Type = TypeBits0_U016 | TypeBits1__Scalar | TypeBits2_ScaRegMutbl |
| TypeUint32 Type = TypeBits0_U032 | TypeBits1__Scalar | TypeBits2_ScaRegMutbl |
| TypeUint64 Type = TypeBits0_U064 | TypeBits1__Scalar | TypeBits2_ScaRegMutbl |
| TypeBfloat16 Type = TypeBits0_B016 | TypeBits1__Scalar | TypeBits2_ScaRegMutbl |
| TypeFloat16 Type = TypeBits0_F016 | TypeBits1__Scalar | TypeBits2_ScaRegMutbl |
| TypeFloat32 Type = TypeBits0_F032 | TypeBits1__Scalar | TypeBits2_ScaRegMutbl |
| TypeFloat64 Type = TypeBits0_F064 | TypeBits1__Scalar | TypeBits2_ScaRegMutbl |
| TypePoly8 Type = TypeBits0_P008 | TypeBits1__Scalar | TypeBits2_ScaRegMutbl |
| TypePoly16 Type = TypeBits0_P016 | TypeBits1__Scalar | TypeBits2_ScaRegMutbl |
| TypePoly64 Type = TypeBits0_P064 | TypeBits1__Scalar | TypeBits2_ScaRegMutbl |
| TypePoly128 Type = TypeBits0_P128 | TypeBits1__Scalar | TypeBits2_ScaRegMutbl |
| |
| // Scalar ScaRegConst types. |
| TypeConstInt8 Type = TypeBits0_I008 | TypeBits1__Scalar | TypeBits2_ScaRegConst |
| TypeConstInt16 Type = TypeBits0_I016 | TypeBits1__Scalar | TypeBits2_ScaRegConst |
| TypeConstInt32 Type = TypeBits0_I032 | TypeBits1__Scalar | TypeBits2_ScaRegConst |
| TypeConstInt64 Type = TypeBits0_I064 | TypeBits1__Scalar | TypeBits2_ScaRegConst |
| TypeConstUint8 Type = TypeBits0_U008 | TypeBits1__Scalar | TypeBits2_ScaRegConst |
| TypeConstUint16 Type = TypeBits0_U016 | TypeBits1__Scalar | TypeBits2_ScaRegConst |
| TypeConstUint32 Type = TypeBits0_U032 | TypeBits1__Scalar | TypeBits2_ScaRegConst |
| TypeConstUint64 Type = TypeBits0_U064 | TypeBits1__Scalar | TypeBits2_ScaRegConst |
| TypeConstBfloat16 Type = TypeBits0_B016 | TypeBits1__Scalar | TypeBits2_ScaRegConst |
| TypeConstFloat16 Type = TypeBits0_F016 | TypeBits1__Scalar | TypeBits2_ScaRegConst |
| TypeConstFloat32 Type = TypeBits0_F032 | TypeBits1__Scalar | TypeBits2_ScaRegConst |
| TypeConstFloat64 Type = TypeBits0_F064 | TypeBits1__Scalar | TypeBits2_ScaRegConst |
| TypeConstPoly8 Type = TypeBits0_P008 | TypeBits1__Scalar | TypeBits2_ScaRegConst |
| TypeConstPoly16 Type = TypeBits0_P016 | TypeBits1__Scalar | TypeBits2_ScaRegConst |
| TypeConstPoly64 Type = TypeBits0_P064 | TypeBits1__Scalar | TypeBits2_ScaRegConst |
| TypeConstPoly128 Type = TypeBits0_P128 | TypeBits1__Scalar | TypeBits2_ScaRegConst |
| |
| // DVector VecX1 types. |
| TypeInt8x8 Type = TypeBits0_I008 | TypeBits1_DVector | TypeBits2_VecX1 |
| TypeInt16x4 Type = TypeBits0_I016 | TypeBits1_DVector | TypeBits2_VecX1 |
| TypeInt32x2 Type = TypeBits0_I032 | TypeBits1_DVector | TypeBits2_VecX1 |
| TypeInt64x1 Type = TypeBits0_I064 | TypeBits1_DVector | TypeBits2_VecX1 |
| TypeUint8x8 Type = TypeBits0_U008 | TypeBits1_DVector | TypeBits2_VecX1 |
| TypeUint16x4 Type = TypeBits0_U016 | TypeBits1_DVector | TypeBits2_VecX1 |
| TypeUint32x2 Type = TypeBits0_U032 | TypeBits1_DVector | TypeBits2_VecX1 |
| TypeUint64x1 Type = TypeBits0_U064 | TypeBits1_DVector | TypeBits2_VecX1 |
| TypeBfloat16x4 Type = TypeBits0_B016 | TypeBits1_DVector | TypeBits2_VecX1 |
| TypeFloat16x4 Type = TypeBits0_F016 | TypeBits1_DVector | TypeBits2_VecX1 |
| TypeFloat32x2 Type = TypeBits0_F032 | TypeBits1_DVector | TypeBits2_VecX1 |
| TypeFloat64x1 Type = TypeBits0_F064 | TypeBits1_DVector | TypeBits2_VecX1 |
| TypePoly8x8 Type = TypeBits0_P008 | TypeBits1_DVector | TypeBits2_VecX1 |
| TypePoly16x4 Type = TypeBits0_P016 | TypeBits1_DVector | TypeBits2_VecX1 |
| TypePoly64x1 Type = TypeBits0_P064 | TypeBits1_DVector | TypeBits2_VecX1 |
| |
| // DVector VecX2 types. |
| TypeInt8x8x2 Type = TypeBits0_I008 | TypeBits1_DVector | TypeBits2_VecX2 |
| TypeInt16x4x2 Type = TypeBits0_I016 | TypeBits1_DVector | TypeBits2_VecX2 |
| TypeInt32x2x2 Type = TypeBits0_I032 | TypeBits1_DVector | TypeBits2_VecX2 |
| TypeInt64x1x2 Type = TypeBits0_I064 | TypeBits1_DVector | TypeBits2_VecX2 |
| TypeUint8x8x2 Type = TypeBits0_U008 | TypeBits1_DVector | TypeBits2_VecX2 |
| TypeUint16x4x2 Type = TypeBits0_U016 | TypeBits1_DVector | TypeBits2_VecX2 |
| TypeUint32x2x2 Type = TypeBits0_U032 | TypeBits1_DVector | TypeBits2_VecX2 |
| TypeUint64x1x2 Type = TypeBits0_U064 | TypeBits1_DVector | TypeBits2_VecX2 |
| TypeBfloat16x4x2 Type = TypeBits0_B016 | TypeBits1_DVector | TypeBits2_VecX2 |
| TypeFloat16x4x2 Type = TypeBits0_F016 | TypeBits1_DVector | TypeBits2_VecX2 |
| TypeFloat32x2x2 Type = TypeBits0_F032 | TypeBits1_DVector | TypeBits2_VecX2 |
| TypeFloat64x1x2 Type = TypeBits0_F064 | TypeBits1_DVector | TypeBits2_VecX2 |
| TypePoly8x8x2 Type = TypeBits0_P008 | TypeBits1_DVector | TypeBits2_VecX2 |
| TypePoly16x4x2 Type = TypeBits0_P016 | TypeBits1_DVector | TypeBits2_VecX2 |
| TypePoly64x1x2 Type = TypeBits0_P064 | TypeBits1_DVector | TypeBits2_VecX2 |
| |
| // DVector VecX3 types. |
| TypeInt8x8x3 Type = TypeBits0_I008 | TypeBits1_DVector | TypeBits2_VecX3 |
| TypeInt16x4x3 Type = TypeBits0_I016 | TypeBits1_DVector | TypeBits2_VecX3 |
| TypeInt32x2x3 Type = TypeBits0_I032 | TypeBits1_DVector | TypeBits2_VecX3 |
| TypeInt64x1x3 Type = TypeBits0_I064 | TypeBits1_DVector | TypeBits2_VecX3 |
| TypeUint8x8x3 Type = TypeBits0_U008 | TypeBits1_DVector | TypeBits2_VecX3 |
| TypeUint16x4x3 Type = TypeBits0_U016 | TypeBits1_DVector | TypeBits2_VecX3 |
| TypeUint32x2x3 Type = TypeBits0_U032 | TypeBits1_DVector | TypeBits2_VecX3 |
| TypeUint64x1x3 Type = TypeBits0_U064 | TypeBits1_DVector | TypeBits2_VecX3 |
| TypeBfloat16x4x3 Type = TypeBits0_B016 | TypeBits1_DVector | TypeBits2_VecX3 |
| TypeFloat16x4x3 Type = TypeBits0_F016 | TypeBits1_DVector | TypeBits2_VecX3 |
| TypeFloat32x2x3 Type = TypeBits0_F032 | TypeBits1_DVector | TypeBits2_VecX3 |
| TypeFloat64x1x3 Type = TypeBits0_F064 | TypeBits1_DVector | TypeBits2_VecX3 |
| TypePoly8x8x3 Type = TypeBits0_P008 | TypeBits1_DVector | TypeBits2_VecX3 |
| TypePoly16x4x3 Type = TypeBits0_P016 | TypeBits1_DVector | TypeBits2_VecX3 |
| TypePoly64x1x3 Type = TypeBits0_P064 | TypeBits1_DVector | TypeBits2_VecX3 |
| |
| // DVector VecX4 types. |
| TypeInt8x8x4 Type = TypeBits0_I008 | TypeBits1_DVector | TypeBits2_VecX4 |
| TypeInt16x4x4 Type = TypeBits0_I016 | TypeBits1_DVector | TypeBits2_VecX4 |
| TypeInt32x2x4 Type = TypeBits0_I032 | TypeBits1_DVector | TypeBits2_VecX4 |
| TypeInt64x1x4 Type = TypeBits0_I064 | TypeBits1_DVector | TypeBits2_VecX4 |
| TypeUint8x8x4 Type = TypeBits0_U008 | TypeBits1_DVector | TypeBits2_VecX4 |
| TypeUint16x4x4 Type = TypeBits0_U016 | TypeBits1_DVector | TypeBits2_VecX4 |
| TypeUint32x2x4 Type = TypeBits0_U032 | TypeBits1_DVector | TypeBits2_VecX4 |
| TypeUint64x1x4 Type = TypeBits0_U064 | TypeBits1_DVector | TypeBits2_VecX4 |
| TypeBfloat16x4x4 Type = TypeBits0_B016 | TypeBits1_DVector | TypeBits2_VecX4 |
| TypeFloat16x4x4 Type = TypeBits0_F016 | TypeBits1_DVector | TypeBits2_VecX4 |
| TypeFloat32x2x4 Type = TypeBits0_F032 | TypeBits1_DVector | TypeBits2_VecX4 |
| TypeFloat64x1x4 Type = TypeBits0_F064 | TypeBits1_DVector | TypeBits2_VecX4 |
| TypePoly8x8x4 Type = TypeBits0_P008 | TypeBits1_DVector | TypeBits2_VecX4 |
| TypePoly16x4x4 Type = TypeBits0_P016 | TypeBits1_DVector | TypeBits2_VecX4 |
| TypePoly64x1x4 Type = TypeBits0_P064 | TypeBits1_DVector | TypeBits2_VecX4 |
| |
| // QVector VecX1 types. |
| TypeInt8x16 Type = TypeBits0_I008 | TypeBits1_QVector | TypeBits2_VecX1 |
| TypeInt16x8 Type = TypeBits0_I016 | TypeBits1_QVector | TypeBits2_VecX1 |
| TypeInt32x4 Type = TypeBits0_I032 | TypeBits1_QVector | TypeBits2_VecX1 |
| TypeInt64x2 Type = TypeBits0_I064 | TypeBits1_QVector | TypeBits2_VecX1 |
| TypeUint8x16 Type = TypeBits0_U008 | TypeBits1_QVector | TypeBits2_VecX1 |
| TypeUint16x8 Type = TypeBits0_U016 | TypeBits1_QVector | TypeBits2_VecX1 |
| TypeUint32x4 Type = TypeBits0_U032 | TypeBits1_QVector | TypeBits2_VecX1 |
| TypeUint64x2 Type = TypeBits0_U064 | TypeBits1_QVector | TypeBits2_VecX1 |
| TypeBfloat16x8 Type = TypeBits0_B016 | TypeBits1_QVector | TypeBits2_VecX1 |
| TypeFloat16x8 Type = TypeBits0_F016 | TypeBits1_QVector | TypeBits2_VecX1 |
| TypeFloat32x4 Type = TypeBits0_F032 | TypeBits1_QVector | TypeBits2_VecX1 |
| TypeFloat64x2 Type = TypeBits0_F064 | TypeBits1_QVector | TypeBits2_VecX1 |
| TypePoly8x16 Type = TypeBits0_P008 | TypeBits1_QVector | TypeBits2_VecX1 |
| TypePoly16x8 Type = TypeBits0_P016 | TypeBits1_QVector | TypeBits2_VecX1 |
| TypePoly64x2 Type = TypeBits0_P064 | TypeBits1_QVector | TypeBits2_VecX1 |
| |
| // QVector VecX2 types. |
| TypeInt8x16x2 Type = TypeBits0_I008 | TypeBits1_QVector | TypeBits2_VecX2 |
| TypeInt16x8x2 Type = TypeBits0_I016 | TypeBits1_QVector | TypeBits2_VecX2 |
| TypeInt32x4x2 Type = TypeBits0_I032 | TypeBits1_QVector | TypeBits2_VecX2 |
| TypeInt64x2x2 Type = TypeBits0_I064 | TypeBits1_QVector | TypeBits2_VecX2 |
| TypeUint8x16x2 Type = TypeBits0_U008 | TypeBits1_QVector | TypeBits2_VecX2 |
| TypeUint16x8x2 Type = TypeBits0_U016 | TypeBits1_QVector | TypeBits2_VecX2 |
| TypeUint32x4x2 Type = TypeBits0_U032 | TypeBits1_QVector | TypeBits2_VecX2 |
| TypeUint64x2x2 Type = TypeBits0_U064 | TypeBits1_QVector | TypeBits2_VecX2 |
| TypeBfloat16x8x2 Type = TypeBits0_B016 | TypeBits1_QVector | TypeBits2_VecX2 |
| TypeFloat16x8x2 Type = TypeBits0_F016 | TypeBits1_QVector | TypeBits2_VecX2 |
| TypeFloat32x4x2 Type = TypeBits0_F032 | TypeBits1_QVector | TypeBits2_VecX2 |
| TypeFloat64x2x2 Type = TypeBits0_F064 | TypeBits1_QVector | TypeBits2_VecX2 |
| TypePoly8x16x2 Type = TypeBits0_P008 | TypeBits1_QVector | TypeBits2_VecX2 |
| TypePoly16x8x2 Type = TypeBits0_P016 | TypeBits1_QVector | TypeBits2_VecX2 |
| TypePoly64x2x2 Type = TypeBits0_P064 | TypeBits1_QVector | TypeBits2_VecX2 |
| |
| // QVector VecX3 types. |
| TypeInt8x16x3 Type = TypeBits0_I008 | TypeBits1_QVector | TypeBits2_VecX3 |
| TypeInt16x8x3 Type = TypeBits0_I016 | TypeBits1_QVector | TypeBits2_VecX3 |
| TypeInt32x4x3 Type = TypeBits0_I032 | TypeBits1_QVector | TypeBits2_VecX3 |
| TypeInt64x2x3 Type = TypeBits0_I064 | TypeBits1_QVector | TypeBits2_VecX3 |
| TypeUint8x16x3 Type = TypeBits0_U008 | TypeBits1_QVector | TypeBits2_VecX3 |
| TypeUint16x8x3 Type = TypeBits0_U016 | TypeBits1_QVector | TypeBits2_VecX3 |
| TypeUint32x4x3 Type = TypeBits0_U032 | TypeBits1_QVector | TypeBits2_VecX3 |
| TypeUint64x2x3 Type = TypeBits0_U064 | TypeBits1_QVector | TypeBits2_VecX3 |
| TypeBfloat16x8x3 Type = TypeBits0_B016 | TypeBits1_QVector | TypeBits2_VecX3 |
| TypeFloat16x8x3 Type = TypeBits0_F016 | TypeBits1_QVector | TypeBits2_VecX3 |
| TypeFloat32x4x3 Type = TypeBits0_F032 | TypeBits1_QVector | TypeBits2_VecX3 |
| TypeFloat64x2x3 Type = TypeBits0_F064 | TypeBits1_QVector | TypeBits2_VecX3 |
| TypePoly8x16x3 Type = TypeBits0_P008 | TypeBits1_QVector | TypeBits2_VecX3 |
| TypePoly16x8x3 Type = TypeBits0_P016 | TypeBits1_QVector | TypeBits2_VecX3 |
| TypePoly64x2x3 Type = TypeBits0_P064 | TypeBits1_QVector | TypeBits2_VecX3 |
| |
| // QVector VecX4 types. |
| TypeInt8x16x4 Type = TypeBits0_I008 | TypeBits1_QVector | TypeBits2_VecX4 |
| TypeInt16x8x4 Type = TypeBits0_I016 | TypeBits1_QVector | TypeBits2_VecX4 |
| TypeInt32x4x4 Type = TypeBits0_I032 | TypeBits1_QVector | TypeBits2_VecX4 |
| TypeInt64x2x4 Type = TypeBits0_I064 | TypeBits1_QVector | TypeBits2_VecX4 |
| TypeUint8x16x4 Type = TypeBits0_U008 | TypeBits1_QVector | TypeBits2_VecX4 |
| TypeUint16x8x4 Type = TypeBits0_U016 | TypeBits1_QVector | TypeBits2_VecX4 |
| TypeUint32x4x4 Type = TypeBits0_U032 | TypeBits1_QVector | TypeBits2_VecX4 |
| TypeUint64x2x4 Type = TypeBits0_U064 | TypeBits1_QVector | TypeBits2_VecX4 |
| TypeBfloat16x8x4 Type = TypeBits0_B016 | TypeBits1_QVector | TypeBits2_VecX4 |
| TypeFloat16x8x4 Type = TypeBits0_F016 | TypeBits1_QVector | TypeBits2_VecX4 |
| TypeFloat32x4x4 Type = TypeBits0_F032 | TypeBits1_QVector | TypeBits2_VecX4 |
| TypeFloat64x2x4 Type = TypeBits0_F064 | TypeBits1_QVector | TypeBits2_VecX4 |
| TypePoly8x16x4 Type = TypeBits0_P008 | TypeBits1_QVector | TypeBits2_VecX4 |
| TypePoly16x8x4 Type = TypeBits0_P016 | TypeBits1_QVector | TypeBits2_VecX4 |
| TypePoly64x2x4 Type = TypeBits0_P064 | TypeBits1_QVector | TypeBits2_VecX4 |
| ) |
| |
| // IsValid returns whether t is a valid Type. |
| func (t Type) IsValid() bool { |
| return t != 0 |
| } |
| |
| // String returns the C type name like "uint16x4x3_t". |
| func (t Type) String() string { |
| return string(t.appendString(nil)) |
| } |
| |
| func (t Type) appendString(b []byte) []byte { |
| switch (t >> 2) & 3 { |
| case TypeBits1____Void >> 2: |
| if t == TypeVoid { |
| return append(b, "void"...) |
| } |
| case TypeBits1__Scalar >> 2: |
| if (t & TypeBits2_ScaRegConst) != 0 { |
| b = append(b, "const "...) |
| } |
| b = append(b, typeBits0Strings[t>>4]...) |
| b = append(b, "_t"...) |
| if (t & TypeBits2_ScaPtrMutbl) != 0 { |
| b = append(b, " *"...) |
| } |
| return b |
| case TypeBits1_DVector >> 2: |
| if baseSize := typeBits0BaseSizes[t>>4]; baseSize <= baseSize__64Bits { |
| b = append(b, typeBits0Strings[t>>4]...) |
| b = append(b, dVectorStrings[baseSize]...) |
| b = append(b, vectorXNStrings[t&3]...) |
| return append(b, "_t"...) |
| } |
| case TypeBits1_QVector >> 2: |
| if baseSize := typeBits0BaseSizes[t>>4]; baseSize <= baseSize__64Bits { |
| b = append(b, typeBits0Strings[t>>4]...) |
| b = append(b, qVectorStrings[baseSize]...) |
| b = append(b, vectorXNStrings[t&3]...) |
| return append(b, "_t"...) |
| } |
| } |
| return append(b, "no_such_type"...) |
| } |
| |
| // ParseType parses a C type name like "uint16x4x3_t" as TypeUint16x4x3. It |
| // returns TypeInvalid (also known as 0) for unrecognized strings. |
| func ParseType(cTypeName string) (t Type) { |
| s := cTypeName |
| if s == "void" { |
| return TypeVoid |
| } |
| |
| const const0 = "const " |
| const const1 = "__const " |
| isConst := false |
| if strings.HasPrefix(s, const0) { |
| isConst, s = true, trimLeading(s[len(const0):]) |
| } else if strings.HasPrefix(s, const1) { |
| isConst, s = true, trimLeading(s[len(const1):]) |
| } |
| |
| isPointer := false |
| if strings.HasSuffix(s, "*") { |
| isPointer, s = true, trimTrailing(s[:len(s)-1]) |
| } |
| |
| if s == "int" { |
| switch { |
| case !isConst && !isPointer: |
| return TypeInt32 | TypeBits2_ScaRegMutbl |
| case isConst && !isPointer: |
| return TypeInt32 | TypeBits2_ScaRegConst |
| case !isConst && isPointer: |
| return TypeInt32 | TypeBits2_ScaPtrMutbl |
| case isConst && isPointer: |
| return TypeInt32 | TypeBits2_ScaPtrConst |
| } |
| |
| } else if strings.HasSuffix(s, "_t") { |
| s = s[:len(s)-2] |
| |
| for i := 0; ; i++ { |
| if i >= len(typeBits0Strings) { |
| return TypeInvalid |
| } else if prefix := typeBits0Strings[i]; strings.HasPrefix(s, prefix) { |
| s = s[len(prefix):] |
| t |= Type(i) << 4 |
| break |
| } |
| } |
| |
| if s == "" { |
| switch { |
| case !isConst && !isPointer: |
| return t | TypeBits1__Scalar | TypeBits2_ScaRegMutbl |
| case isConst && !isPointer: |
| return t | TypeBits1__Scalar | TypeBits2_ScaRegConst |
| case !isConst && isPointer: |
| return t | TypeBits1__Scalar | TypeBits2_ScaPtrMutbl |
| case isConst && isPointer: |
| return t | TypeBits1__Scalar | TypeBits2_ScaPtrConst |
| } |
| } |
| |
| if isConst || isPointer { |
| return TypeInvalid |
| } |
| |
| if baseSize := typeBits0BaseSizes[t>>4]; baseSize <= baseSize__64Bits { |
| if dv := dVectorStrings[baseSize]; strings.HasPrefix(s, dv) { |
| s = s[len(dv):] |
| t |= TypeBits1_DVector |
| } else if qv := qVectorStrings[baseSize]; strings.HasPrefix(s, qv) { |
| s = s[len(qv):] |
| t |= TypeBits1_QVector |
| } else { |
| return TypeInvalid |
| } |
| for i, xn := range vectorXNStrings { |
| if s == xn { |
| return t | Type(i) |
| } |
| } |
| } |
| } |
| return TypeInvalid |
| } |
| |
| func trimLeading(s string) string { |
| for (len(s) > 0) && (s[0] <= ' ') { |
| s = s[1:] |
| } |
| return s |
| } |
| |
| func trimTrailing(s string) string { |
| for (len(s) > 0) && (s[len(s)-1] <= ' ') { |
| s = s[:len(s)-1] |
| } |
| return s |
| } |
| |
| var typeBits0BaseSizes = [16]uint8{ |
| TypeBits0_I008 >> 4: baseSize___8Bits, |
| TypeBits0_I016 >> 4: baseSize__16Bits, |
| TypeBits0_I032 >> 4: baseSize__32Bits, |
| TypeBits0_I064 >> 4: baseSize__64Bits, |
| TypeBits0_U008 >> 4: baseSize___8Bits, |
| TypeBits0_U016 >> 4: baseSize__16Bits, |
| TypeBits0_U032 >> 4: baseSize__32Bits, |
| TypeBits0_U064 >> 4: baseSize__64Bits, |
| TypeBits0_B016 >> 4: baseSize__16Bits, |
| TypeBits0_F016 >> 4: baseSize__16Bits, |
| TypeBits0_F032 >> 4: baseSize__32Bits, |
| TypeBits0_F064 >> 4: baseSize__64Bits, |
| TypeBits0_P008 >> 4: baseSize___8Bits, |
| TypeBits0_P016 >> 4: baseSize__16Bits, |
| TypeBits0_P064 >> 4: baseSize__64Bits, |
| TypeBits0_P128 >> 4: baseSize_128Bits, |
| } |
| |
| var typeBits0Strings = [16]string{ |
| TypeBits0_I008 >> 4: "int8", |
| TypeBits0_I016 >> 4: "int16", |
| TypeBits0_I032 >> 4: "int32", |
| TypeBits0_I064 >> 4: "int64", |
| TypeBits0_U008 >> 4: "uint8", |
| TypeBits0_U016 >> 4: "uint16", |
| TypeBits0_U032 >> 4: "uint32", |
| TypeBits0_U064 >> 4: "uint64", |
| TypeBits0_B016 >> 4: "bfloat16", |
| TypeBits0_F016 >> 4: "float16", |
| TypeBits0_F032 >> 4: "float32", |
| TypeBits0_F064 >> 4: "float64", |
| TypeBits0_P008 >> 4: "poly8", |
| TypeBits0_P016 >> 4: "poly16", |
| TypeBits0_P064 >> 4: "poly64", |
| TypeBits0_P128 >> 4: "poly128", |
| } |
| |
| var dVectorStrings = [4]string{ |
| baseSize___8Bits: "x8", |
| baseSize__16Bits: "x4", |
| baseSize__32Bits: "x2", |
| baseSize__64Bits: "x1", |
| } |
| |
| var qVectorStrings = [4]string{ |
| baseSize___8Bits: "x16", |
| baseSize__16Bits: "x8", |
| baseSize__32Bits: "x4", |
| baseSize__64Bits: "x2", |
| } |
| |
| var vectorXNStrings = [4]string{ |
| 0: "", |
| 1: "x2", |
| 2: "x3", |
| 3: "x4", |
| } |