| // 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_test |
| |
| import ( |
| "fmt" |
| |
| ani "github.com/google/wuffs/lib/armneonintrinsics" |
| ) |
| |
| func Example() { |
| { |
| const cTypeName = "uint64x2x3_t" |
| fmt.Printf("armneonintrinsics.TypeUint32x2 is %q\n", ani.TypeUint32x2) |
| fmt.Printf("%q is armneonintrinsics.Type(0x%02X)\n", |
| cTypeName, uint8(ani.ParseType(cTypeName))) |
| fmt.Println() |
| } |
| |
| { |
| fmt.Println("First 5 functions:") |
| for i, f := 0, ani.FirstFunction(); (i < 5) && f.IsValid(); i, f = i+1, f.NextFunction() { |
| fmt.Println(f) |
| } |
| fmt.Println() |
| } |
| |
| for _, cFuncName := range []string{"vsetq_lane_u8", "rumpelstiltskin"} { |
| f := ani.FindFunction(cFuncName) |
| fmt.Printf("armneonintrinsics.FindFunction(%q) is:\n%s\n", cFuncName, f) |
| fmt.Printf("f.IsValid(): %t\n", f.IsValid()) |
| fmt.Printf("f.Name(): %q\n", f.Name()) |
| fmt.Printf("f.ReturnType(): %v\n", f.ReturnType()) |
| fmt.Println() |
| } |
| |
| { |
| const typ = ani.TypeBfloat16x4 |
| fmt.Printf("Functions whose first argument has type %q:\n", typ) |
| for f := ani.FirstFunction(); f.IsValid(); f = f.NextFunction() { |
| if f.FirstArgument().Type() == typ { |
| fmt.Printf("%-24s has %d arguments\n", f.Name(), f.NumArguments()) |
| } |
| } |
| fmt.Println() |
| } |
| |
| // Output: |
| // armneonintrinsics.TypeUint32x2 is "uint32x2_t" |
| // "uint64x2x3_t" is armneonintrinsics.Type(0x7E) |
| // |
| // First 5 functions: |
| // int16x4_t vaba_s16(int16x4_t __a, int16x4_t __b, int16x4_t __c) |
| // int32x2_t vaba_s32(int32x2_t __a, int32x2_t __b, int32x2_t __c) |
| // int8x8_t vaba_s8(int8x8_t __a, int8x8_t __b, int8x8_t __c) |
| // uint16x4_t vaba_u16(uint16x4_t __a, uint16x4_t __b, uint16x4_t __c) |
| // uint32x2_t vaba_u32(uint32x2_t __a, uint32x2_t __b, uint32x2_t __c) |
| // |
| // armneonintrinsics.FindFunction("vsetq_lane_u8") is: |
| // uint8x16_t vsetq_lane_u8(uint8_t __elem, uint8x16_t __vec, const int32_t __index) |
| // f.IsValid(): true |
| // f.Name(): "vsetq_lane_u8" |
| // f.ReturnType(): uint8x16_t |
| // |
| // armneonintrinsics.FindFunction("rumpelstiltskin") is: |
| // no_such_function |
| // f.IsValid(): false |
| // f.Name(): "" |
| // f.ReturnType(): no_such_type |
| // |
| // Functions whose first argument has type "bfloat16x4_t": |
| // vcombine_bf16 has 2 arguments |
| // vcopy_lane_bf16 has 4 arguments |
| // vcopy_laneq_bf16 has 4 arguments |
| // vcvt_f32_bf16 has 1 arguments |
| // vdup_lane_bf16 has 2 arguments |
| // vduph_lane_bf16 has 2 arguments |
| // vdupq_lane_bf16 has 2 arguments |
| // vget_lane_bf16 has 2 arguments |
| // vreinterpret_f16_bf16 has 1 arguments |
| // vreinterpret_f32_bf16 has 1 arguments |
| // vreinterpret_f64_bf16 has 1 arguments |
| // vreinterpret_p16_bf16 has 1 arguments |
| // vreinterpret_p64_bf16 has 1 arguments |
| // vreinterpret_p8_bf16 has 1 arguments |
| // vreinterpret_s16_bf16 has 1 arguments |
| // vreinterpret_s32_bf16 has 1 arguments |
| // vreinterpret_s64_bf16 has 1 arguments |
| // vreinterpret_s8_bf16 has 1 arguments |
| // vreinterpret_u16_bf16 has 1 arguments |
| // vreinterpret_u32_bf16 has 1 arguments |
| // vreinterpret_u64_bf16 has 1 arguments |
| // vreinterpret_u8_bf16 has 1 arguments |
| } |