├── README.md ├── 01-HelloWorld ├── helloworld.c └── README.txt ├── 02-addition ├── addition.c └── README.txt ├── 06-hvx-example ├── 01-hvx-example.c ├── 02-hvx-example.c ├── 03-hvx-example.c ├── 05-hvx-example.c ├── 06-hvx-example.c ├── 04-hvx-example.c ├── 08-hvx-example.c ├── 07-hvx-example.c └── README.txt ├── 04-intrinsics ├── 01-negate.c ├── 03-signextend.c ├── 02-arithmetic.c └── README.txt ├── 03-minimum ├── README.txt └── minimum.c └── 05-decode-downscale ├── README.txt └── decode-downscale.c /README.md: -------------------------------------------------------------------------------- 1 | # Hexagon_DSP_programming 2 | Repository to learn Hexagon DSP and HVX Programming 3 | -------------------------------------------------------------------------------- /01-HelloWorld/helloworld.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main() 4 | { 5 | printf("Hello world\n"); 6 | return(0); 7 | } 8 | -------------------------------------------------------------------------------- /02-addition/addition.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main() 4 | { 5 | int a = 5, b = 6, c; 6 | 7 | c = a + b; 8 | printf("a = %d, b = %d, c = %d\n", a, b, c); 9 | return 0; 10 | } 11 | -------------------------------------------------------------------------------- /06-hvx-example/01-hvx-example.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | int main() 7 | { 8 | HVX_Vector v1; 9 | 10 | v1 = Q6_V_vzero(); 11 | 12 | printf("Simple HVX example\n"); 13 | 14 | return 0; 15 | } 16 | -------------------------------------------------------------------------------- /04-intrinsics/01-negate.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "hexagon_protos.h" 3 | 4 | int main() 5 | { 6 | unsigned int val = 0xa5a5a5a5; 7 | 8 | printf("Val = %x\n", val); 9 | // Negate the input value 10 | val = Q6_R_neg_R(val); 11 | printf("Negate Val = %x\n", val); 12 | 13 | return 0; 14 | } 15 | -------------------------------------------------------------------------------- /01-HelloWorld/README.txt: -------------------------------------------------------------------------------- 1 | $ hexagon-clang helloworld.c -o hello 2 | $ hexagon-sim hello 3 | hexagon-sim INFO: The rev_id used in the simulation is 0x00004060 (v60a_512) 4 | Hello world 5 | 6 | Done! 7 | T0: Insns=8123 Packets=4301 8 | T1: Insns=0 Packets=0 9 | T2: Insns=0 Packets=0 10 | T3: Insns=0 Packets=0 11 | Total: Insns=8123 Pcycles=8604 12 | -------------------------------------------------------------------------------- /02-addition/README.txt: -------------------------------------------------------------------------------- 1 | $ hexagon-clang addition.c -o addition 2 | $ hexagon-sim addition 3 | hexagon-sim INFO: The rev_id used in the simulation is 0x00004060 (v60a_512) 4 | a = 5, b = 6, c = 11 5 | 6 | Done! 7 | T0: Insns=12067 Packets=6127 8 | T1: Insns=0 Packets=0 9 | T2: Insns=0 Packets=0 10 | T3: Insns=0 Packets=0 11 | Total: Insns=12067 Pcycles=12256 12 | -------------------------------------------------------------------------------- /06-hvx-example/02-hvx-example.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | int main() 7 | { 8 | HVX_Vector v1, v2; 9 | HVX_VectorPair v; 10 | 11 | v1 = Q6_V_vzero(); 12 | v2 = Q6_V_vzero(); 13 | v = Q6_W_vcombine_VV(v1, v2); 14 | 15 | printf("Simple HVX example\n"); 16 | 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /03-minimum/README.txt: -------------------------------------------------------------------------------- 1 | $ hexagon-clang minimum.c -o minimum 2 | $ hexagon-sim minimum 3 | hexagon-sim INFO: The rev_id used in the simulation is 0x00004060 (v60a_512) 4 | v1 = ffff0000ffff0000 5 | v2 = ffff0000ffff 6 | Result = ffffffffffffffff 7 | v1 = 12345678abcdef12 8 | v2 = ef12abcd56781234 9 | Result = ef12abcdabcdef12 10 | 11 | Done! 12 | T0: Insns=51696 Packets=25270 13 | T1: Insns=0 Packets=0 14 | T2: Insns=0 Packets=0 15 | T3: Insns=0 Packets=0 16 | Total: Insns=51696 Pcycles=50542 17 | -------------------------------------------------------------------------------- /04-intrinsics/03-signextend.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "hexagon_protos.h" 3 | 4 | int main() 5 | { 6 | unsigned char r1 = 0x80; 7 | unsigned short r2 = 0x8000; 8 | unsigned int res; 9 | 10 | printf("Sign extend the least significant byte\n"); 11 | res = Q6_R_sxtb_R(r1); 12 | printf("Input = %x\n", r1); 13 | printf("Result = %x\n", res); 14 | 15 | printf("Sign extend the least significant half word\n"); 16 | res = Q6_R_sxth_R(r2); 17 | printf("Input = %x\n", r2); 18 | printf("Result = %x\n", res); 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /03-minimum/minimum.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "hexagon_protos.h" 3 | 4 | int main() 5 | { 6 | long long v1 = 0xFFFF0000FFFF0000; 7 | long long v2 = 0x0000FFFF0000FFFF; 8 | long long result; 9 | 10 | // find the minimum for each half-word in 64-bit vector 11 | result = Q6_P_vminh_PP(v1,v2); 12 | printf("v1 = %llx\n", v1); 13 | printf("v2 = %llx\n", v2); 14 | printf("Result = %llx\n", result); 15 | 16 | v1 = 0x12345678abcdef12; 17 | v2 = 0xef12abcd56781234; 18 | // find the minimum for each half-word in 64-bit vector 19 | result = Q6_P_vminh_PP(v1,v2); 20 | printf("v1 = %llx\n", v1); 21 | printf("v2 = %llx\n", v2); 22 | printf("Result = %llx\n", result); 23 | 24 | return 0; 25 | } 26 | -------------------------------------------------------------------------------- /06-hvx-example/03-hvx-example.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | #define N 128 8 | 9 | unsigned char a[N], b[N] __attribute__ ((aligned(128))); 10 | 11 | int main() 12 | { 13 | HVX_Vector v1, v2, *vptr; 14 | HVX_VectorPair v; 15 | int i; 16 | 17 | v1 = Q6_V_vzero(); 18 | v2 = Q6_V_vzero(); 19 | v = Q6_W_vcombine_VV(v1, v2); 20 | 21 | memset(a, 0xFF, N); 22 | memcpy(b, a, N); 23 | 24 | vptr = (HVX_Vector*) b; 25 | *vptr = v1; 26 | 27 | for(i = 0; i < N; i++) 28 | printf("%4d: %x %x\n", i, a[i], b[i]); 29 | 30 | printf("Simple HVX example %p\n", b); 31 | 32 | return 0; 33 | } 34 | -------------------------------------------------------------------------------- /06-hvx-example/05-hvx-example.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | #define N 128 8 | 9 | unsigned char a[N], b[N], c[2 * N]; 10 | 11 | int main() 12 | { 13 | HVX_Vector v1, v2, *vptr1, *vptr2; 14 | HVX_VectorPair v, *vdptr; 15 | int i; 16 | 17 | memset(a, 0xFF, N); 18 | memset(b, 0x80, N); 19 | 20 | vptr1 = (HVX_Vector*) a; 21 | vptr2 = (HVX_Vector*) b; 22 | vdptr = (HVX_VectorPair*) c; 23 | 24 | v1 = *vptr1; 25 | v2 = *vptr2; 26 | v = Q6_W_vcombine_VV(v1, v2); 27 | *vdptr = v; 28 | 29 | for(i = 0; i < N; i++) 30 | printf("%4d: %x %x %x\n", i, a[i], b[i], c[i]); 31 | 32 | printf("Simple HVX example %p, %p, %p\n", a, b, c); 33 | 34 | return 0; 35 | } 36 | -------------------------------------------------------------------------------- /06-hvx-example/06-hvx-example.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | #define N 128 8 | 9 | unsigned char a[N], b[N], c[2 * N]; 10 | 11 | int main() 12 | { 13 | HVX_Vector v1, v2, *vptr1, *vptr2; 14 | HVX_VectorPair v, *vdptr; 15 | int i; 16 | 17 | memset(a, 0xFF, N); 18 | memset(b, 0x80, N); 19 | 20 | vptr1 = (HVX_Vector*) a; 21 | vptr2 = (HVX_Vector*) b; 22 | vdptr = (HVX_VectorPair*) c; 23 | 24 | v1 = *vptr1; 25 | v2 = *vptr2; 26 | v = Q6_Wb_vshuffoe_VbVb(v1, v2); 27 | *vdptr = v; 28 | 29 | for(i = 0; i < N; i++) 30 | printf("%4d: %02x %02x %02x\n", i, a[i], b[i], c[i]); 31 | 32 | printf("Simple HVX example %p, %p, %p\n", a, b, c); 33 | 34 | return 0; 35 | } 36 | -------------------------------------------------------------------------------- /06-hvx-example/04-hvx-example.c: -------------------------------------------------------------------------------- 1 | // This program computes average of 4 values 2 | // a b 3 | // c d 4 | // Output = (a + b + c + d) / 4 5 | 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #define N 128 13 | 14 | unsigned char a[N], b[N]; 15 | 16 | int main() 17 | { 18 | HVX_Vector v1, v2, vsum, *vp; 19 | HEXAGON_Vect32 const_0x40404040 = 0x40404040; 20 | int i; 21 | 22 | *((unsigned int*) &b[28]) = 0x40404040; 23 | vp = (HVX_Vector*) b; 24 | v1 = Q6_V_vzero(); 25 | 26 | v2 = *vp; 27 | vsum = Q6_Vh_vdmpy_VubRb(v1, const_0x40404040); 28 | vsum = Q6_Vh_vdmpyacc_VhVubRb(vsum, v2, const_0x40404040); 29 | 30 | vsum = Q6_Vb_vpacko_VhVh(v1, vsum); 31 | *vp = vsum; 32 | 33 | for(i = 0; i < N; i++) 34 | printf("%4d: %x %x\n", i, a[i], b[i]); 35 | 36 | printf("Simple HVX example %p\n", b); 37 | 38 | return 0; 39 | } 40 | -------------------------------------------------------------------------------- /04-intrinsics/02-arithmetic.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "hexagon_protos.h" 3 | 4 | int main() 5 | { 6 | unsigned int val1 = 0x11111111, val2 = 0x22222222, add; 7 | 8 | // Add two words using Q6 intrinsics 9 | add = Q6_R_add_RR(val1, val2); 10 | printf("Val1 = %x\n", val1); 11 | printf("Val2 = %x\n", val2); 12 | printf("Add = %x\n", add); 13 | 14 | printf("\n"); 15 | val1 = 0x7fffffff; 16 | val2 = 0x7fffffff; 17 | // Add two words using Q6 intrinsics 18 | add = Q6_R_add_RR(val1, val2); 19 | printf("Val1 = %x\n", val1); 20 | printf("Val2 = %x\n", val2); 21 | printf("Add = %x\n", add); 22 | 23 | printf("\n"); 24 | printf("Adding using saturation\n"); 25 | val1 = 0x7fffffff; 26 | val2 = 0x7fffffff; 27 | // Add two words using Q6 intrinsics 28 | add = Q6_R_add_RR_sat(val1, val2); 29 | printf("Val1 = %x\n", val1); 30 | printf("Val2 = %x\n", val2); 31 | printf("Add = %x\n", add); 32 | 33 | return 0; 34 | } 35 | -------------------------------------------------------------------------------- /06-hvx-example/08-hvx-example.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | #define N 128 8 | 9 | unsigned char a[N], b[N], c[2 * N], d[N] __attribute__ ((aligned(128))); 10 | 11 | int main() 12 | { 13 | HVX_Vector v1, v2, *vptr1, *vptr2; 14 | HVX_VectorPair v, *vdptr; 15 | HVX_VectorPred p, *pptr; 16 | int i; 17 | 18 | memset(a, 0xFF, N); 19 | memset(b, 0x80, N); 20 | 21 | vptr1 = (HVX_Vector*) a; 22 | vptr2 = (HVX_Vector*) b; 23 | vdptr = (HVX_VectorPair*) c; 24 | pptr = (HVX_VectorPred*) d; 25 | 26 | v1 = *vptr1; 27 | v2 = *vptr2; 28 | p = Q6_Q_vcmp_gt_VubVub(v1, v2); 29 | v = Q6_Wb_vshuffoe_VbVb(v1, v2); 30 | *vdptr = v; 31 | *pptr = p; 32 | 33 | for(i = 0; i < N; i++) 34 | printf("%4d: %02x %02x %02x %02x\n", i, a[i], b[i], c[i], d[i]); 35 | 36 | printf("Simple HVX example %p, %p, %p, %p\n", a, b, c, d); 37 | 38 | return 0; 39 | } 40 | -------------------------------------------------------------------------------- /05-decode-downscale/README.txt: -------------------------------------------------------------------------------- 1 | This program is to decode the downscaleBy2 example program in Hexagon SDK 2 | 3 | $ hexagon-clang decode-downscale.c -o decode-downscale 4 | $ hexagon-sim decode-downscale 5 | hexagon-sim INFO: The rev_id used in the simulation is 0x00004060 (v60a_512) 6 | Original input values 7 | Top1 int = 01020304 8 | Top2 int = 05060708 9 | Bot1 int = 0a0b0c0d 10 | Bot2 int = 0e0f1011 11 | 12 | Zero extend bytes to half words 13 | Top1 long long = 0001000200030004 14 | Top2 long long = 0005000600070008 15 | Bot1 long long = 000a000b000c000d 16 | Bot2 long long = 000e000f00100011 17 | 18 | Vector reduce add into 4 32-bit sums, one for each 2x2 pixel block 19 | Top1 long long = 0000001800000020 20 | Top2 long long = 0000002800000030 21 | 22 | Vector shift to divide each sum by 4 and pack each to 16-bits 23 | Top1 long long = 000a000c00060008 24 | 25 | Pack to 8 bits 26 | Top1 int = 0a0c0608 27 | 28 | Done! 29 | T0: Insns=166162 Packets=77722 30 | T1: Insns=0 Packets=0 31 | T2: Insns=0 Packets=0 32 | T3: Insns=0 Packets=0 33 | Total: Insns=166162 Pcycles=155446 34 | -------------------------------------------------------------------------------- /04-intrinsics/README.txt: -------------------------------------------------------------------------------- 1 | $ hexagon-clang 01-negate.c -o 01-negate 2 | $ hexagon-sim 01-negate 3 | hexagon-sim INFO: The rev_id used in the simulation is 0x00004060 (v60a_512) 4 | Val = a5a5a5a5 5 | Negate Val = 5a5a5a5b 6 | 7 | Done! 8 | T0: Insns=15694 Packets=7874 9 | T1: Insns=0 Packets=0 10 | T2: Insns=0 Packets=0 11 | T3: Insns=0 Packets=0 12 | Total: Insns=15694 Pcycles=15750 13 | 14 | $ hexagon-clang 02-arithmetic.c -o 02-arithmetic 15 | $ hexagon-sim 02-arithmetic 16 | hexagon-sim INFO: The rev_id used in the simulation is 0x00004060 (v60a_512) 17 | Val1 = 11111111 18 | Val2 = 22222222 19 | Add = 33333333 20 | 21 | Val1 = 7fffffff 22 | Val2 = 7fffffff 23 | Add = fffffffe 24 | 25 | Adding using saturation 26 | Val1 = 7fffffff 27 | Val2 = 7fffffff 28 | Add = 7fffffff 29 | 30 | Done! 31 | T0: Insns=56854 Packets=27118 32 | T1: Insns=0 Packets=0 33 | T2: Insns=0 Packets=0 34 | T3: Insns=0 Packets=0 35 | Total: Insns=56854 Pcycles=54238 36 | 37 | $ hexagon-clang 03-signextend.c -o 03-signextend 38 | $ hexagon-sim 03-signextend 39 | hexagon-sim INFO: The rev_id used in the simulation is 0x00004060 (v60a_512) 40 | Sign extend the least significant byte 41 | Input = 80 42 | Result = ffffff80 43 | Sign extend the least significant half word 44 | Input = 8000 45 | Result = ffff8000 46 | 47 | Done! 48 | T0: Insns=48430 Packets=22868 49 | T1: Insns=0 Packets=0 50 | T2: Insns=0 Packets=0 51 | T3: Insns=0 Packets=0 52 | Total: Insns=48430 Pcycles=45738 53 | -------------------------------------------------------------------------------- /06-hvx-example/07-hvx-example.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | #define N 128 8 | 9 | unsigned char a[N], b[N], c[N] __attribute__ ((aligned(128))); 10 | 11 | int main() 12 | { 13 | HVX_VectorPair v1, v2, *vptr1, *vptr2; 14 | HVX_VectorPair v, *vdptr; 15 | int i; 16 | 17 | printf("Simple HVX example %p, %p, %p\n", a, b, c); 18 | 19 | memset(a, 0x40, N); 20 | memset(b, 0x80, N); 21 | 22 | vptr1 = (HVX_VectorPair*) a; 23 | vptr2 = (HVX_VectorPair*) b; 24 | vdptr = (HVX_VectorPair*) c; 25 | 26 | v1 = *vptr1; 27 | v2 = *vptr2; 28 | v = Q6_Wb_vadd_WbWb(v1, v2); 29 | *vdptr = v; 30 | 31 | printf("Adding bytes without saturation - Example 1\n"); 32 | for(i = 0; i < N; i++) 33 | printf("%4d: %02x %02x %02x\n", i, a[i], b[i], c[i]); 34 | 35 | memset(a, 0x80, N); 36 | memset(b, 0x80, N); 37 | v1 = *vptr1; 38 | v2 = *vptr2; 39 | v = Q6_Wb_vadd_WbWb(v1, v2); 40 | *vdptr = v; 41 | 42 | printf("Adding bytes without saturation - Example 2\n"); 43 | for(i = 0; i < N; i++) 44 | printf("%4d: %02x %02x %02x\n", i, a[i], b[i], c[i]); 45 | 46 | v = Q6_Wub_vadd_WubWub_sat(v1, v2); 47 | *vdptr = v; 48 | 49 | printf("Adding bytes with saturation - Example 3\n"); 50 | for(i = 0; i < N; i++) 51 | printf("%4d: %02x %02x %02x\n", i, a[i], b[i], c[i]); 52 | 53 | return 0; 54 | } 55 | -------------------------------------------------------------------------------- /05-decode-downscale/decode-downscale.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "hexagon_protos.h" 3 | 4 | int main() 5 | { 6 | unsigned int top1_i = 0x01020304; 7 | unsigned int top2_i = 0x05060708; 8 | unsigned int bot1_i = 0x0a0b0c0d; 9 | unsigned int bot2_i = 0x0e0f1011; 10 | unsigned long long top1_ll, top2_ll, bot1_ll, bot2_ll; 11 | 12 | // Zero extend byte to half word 13 | top1_ll = Q6_P_vzxtbh_R(top1_i); 14 | top2_ll = Q6_P_vzxtbh_R(top2_i); 15 | bot1_ll = Q6_P_vzxtbh_R(bot1_i); 16 | bot2_ll = Q6_P_vzxtbh_R(bot2_i); 17 | 18 | printf("Original input values\n"); 19 | printf("Top1 int = %08x\n", top1_i); 20 | printf("Top2 int = %08x\n", top2_i); 21 | printf("Bot1 int = %08x\n", bot1_i); 22 | printf("Bot2 int = %08x\n", bot2_i); 23 | 24 | printf("\n"); 25 | printf("Zero extend bytes to half words\n"); 26 | printf("Top1 long long = %016llx\n", top1_ll); 27 | printf("Top2 long long = %016llx\n", top2_ll); 28 | printf("Bot1 long long = %016llx\n", bot1_ll); 29 | printf("Bot2 long long = %016llx\n", bot2_ll); 30 | 31 | // Vector-reduce add into 4 32-bit sums, one for each 2x2 pixel block 32 | top1_ll = Q6_P_vraddub_PP(top1_ll, bot1_ll); 33 | top2_ll = Q6_P_vraddub_PP(top2_ll, bot2_ll); 34 | 35 | printf("\n"); 36 | printf("Vector reduce add into 4 32-bit sums, one for each 2x2 pixel block\n"); 37 | printf("Top1 long long = %016llx\n", top1_ll); 38 | printf("Top2 long long = %016llx\n", top2_ll); 39 | 40 | // vector shift to divide each sum by 4, and pack each to 16 bits 41 | top1_ll = Q6_R_vasrw_PI(top1_ll, 2) | ((unsigned long long)Q6_R_vasrw_PI(top2_ll, 2) << 32); 42 | 43 | printf("\n"); 44 | printf("Vector shift to divide each sum by 4 and pack each to 16-bits\n"); 45 | printf("Top1 long long = %016llx\n", top1_ll); 46 | 47 | // Pack to 8 bits 48 | top1_i = Q6_R_vtrunehb_P(top1_ll); 49 | 50 | printf("\n"); 51 | printf("Pack to 8 bits\n"); 52 | printf("Top1 int = %08x\n", top1_i); 53 | 54 | return 0; 55 | } 56 | -------------------------------------------------------------------------------- /06-hvx-example/README.txt: -------------------------------------------------------------------------------- 1 | $ hexagon-clang -mhvx -mv65 -DLOG2VLEN=7 01-hvx-example.c -o hvx-example 2 | hexagon-clang: warning: The HVX vector length of 64 Bytes will soon be deprecated. Please switch to 128 Byte mode. [-Wdeprecated-hvx-length] 3 | 4 | $ hexagon-sim hvx-example 5 | hexagon-sim INFO: The rev_id used in the simulation is 0x00004065 (v65a_512) 6 | Simple HVX example 7 | 8 | Done! 9 | T0: Insns=9342 Packets=4870 10 | T1: Insns=0 Packets=0 11 | T2: Insns=0 Packets=0 12 | T3: Insns=0 Packets=0 13 | Total: Insns=9342 Pcycles=9742 14 | 15 | 16 | 17 | 18 | $ hexagon-clang -mhvx -mv65 -DLOG2VLEN=7 03-hvx-example.c -o hvx-example 19 | hexagon-clang: warning: The HVX vector length of 64 Bytes will soon be deprecated. Please switch to 128 Byte mode. [-Wdeprecated-hvx-length] 20 | 21 | $ hexagon-sim hvx-example 22 | hexagon-sim INFO: The rev_id used in the simulation is 0x00004065 (v65a_512) 23 | 0: ff 0 24 | 1: ff 0 25 | 2: ff 0 26 | 3: ff 0 27 | 4: ff 0 28 | 5: ff 0 29 | 6: ff 0 30 | 7: ff 0 31 | 8: ff 0 32 | 9: ff 0 33 | 10: ff 0 34 | 11: ff 0 35 | 12: ff 0 36 | 13: ff 0 37 | 14: ff 0 38 | 15: ff 0 39 | 16: ff 0 40 | 17: ff 0 41 | 18: ff 0 42 | 19: ff 0 43 | 20: ff 0 44 | 21: ff 0 45 | 22: ff 0 46 | 23: ff 0 47 | 24: ff 0 48 | 25: ff 0 49 | 26: ff 0 50 | 27: ff 0 51 | 28: ff 0 52 | 29: ff 0 53 | 30: ff 0 54 | 31: ff 0 55 | 32: ff 0 56 | 33: ff 0 57 | 34: ff 0 58 | 35: ff 0 59 | 36: ff 0 60 | 37: ff 0 61 | 38: ff 0 62 | 39: ff 0 63 | 40: ff 0 64 | 41: ff 0 65 | 42: ff 0 66 | 43: ff 0 67 | 44: ff 0 68 | 45: ff 0 69 | 46: ff 0 70 | 47: ff 0 71 | 48: ff 0 72 | 49: ff 0 73 | 50: ff 0 74 | 51: ff 0 75 | 52: ff 0 76 | 53: ff 0 77 | 54: ff 0 78 | 55: ff 0 79 | 56: ff 0 80 | 57: ff 0 81 | 58: ff 0 82 | 59: ff 0 83 | 60: ff 0 84 | 61: ff 0 85 | 62: ff 0 86 | 63: ff 0 87 | 64: ff ff 88 | 65: ff ff 89 | 66: ff ff 90 | 67: ff ff 91 | 68: ff ff 92 | 69: ff ff 93 | 70: ff ff 94 | 71: ff ff 95 | 72: ff ff 96 | 73: ff ff 97 | 74: ff ff 98 | 75: ff ff 99 | 76: ff ff 100 | 77: ff ff 101 | 78: ff ff 102 | 79: ff ff 103 | 80: ff ff 104 | 81: ff ff 105 | 82: ff ff 106 | 83: ff ff 107 | 84: ff ff 108 | 85: ff ff 109 | 86: ff ff 110 | 87: ff ff 111 | 88: ff ff 112 | 89: ff ff 113 | 90: ff ff 114 | 91: ff ff 115 | 92: ff ff 116 | 93: ff ff 117 | 94: ff ff 118 | 95: ff ff 119 | 96: ff ff 120 | 97: ff ff 121 | 98: ff ff 122 | 99: ff ff 123 | 100: ff ff 124 | 101: ff ff 125 | 102: ff ff 126 | 103: ff ff 127 | 104: ff ff 128 | 105: ff ff 129 | 106: ff ff 130 | 107: ff ff 131 | 108: ff ff 132 | 109: ff ff 133 | 110: ff ff 134 | 111: ff ff 135 | 112: ff ff 136 | 113: ff ff 137 | 114: ff ff 138 | 115: ff ff 139 | 116: ff ff 140 | 117: ff ff 141 | 118: ff ff 142 | 119: ff ff 143 | 120: ff ff 144 | 121: ff ff 145 | 122: ff ff 146 | 123: ff ff 147 | 124: ff ff 148 | 125: ff ff 149 | 126: ff ff 150 | 127: ff ff 151 | Simple HVX example 152 | 153 | Done! 154 | T0: Insns=505325 Packets=230478 155 | T1: Insns=0 Packets=0 156 | T2: Insns=0 Packets=0 157 | T3: Insns=0 Packets=0 158 | Total: Insns=505325 Pcycles=460958 159 | 160 | 161 | $ hexagon-clang -mhvx -mv65 -DLOG2VLEN=7 -mhvx-length=128B 07-hvx-example.c -o hvx-example 162 | --------------------------------------------------------------------------------