/*
 * Copyright (c) 2020 Stephanos Ioannidis <root@stephanos.io>
 * Copyright (C) 2010-2020 ARM Limited or its affiliates. All rights reserved.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/ztest.h>
#include <zephyr/kernel.h>
#include <stdlib.h>
#include <arm_math.h>
#include "../../common/benchmark_common.h"

#define PATTERN_LENGTH	(256)

static const q31_t input1[256] = {
	0xC631366A, 0xFB13DDA9, 0xEED09227, 0xD28B3673,
	0xE2196135, 0xF374965D, 0x02ACCA0C, 0xCB7C49FF,
	0x07379279, 0x1447DB6D, 0xC6573A28, 0x9B58C226,
	0x28DFD755, 0x3D3B07A2, 0x0D68B78C, 0xD7DCA4EE,
	0xDB0C855B, 0x023602B6, 0xF916B096, 0xEBF0F01A,
	0xEF2088F4, 0x271B8868, 0x27D08994, 0xD6A88ADC,
	0x32EC53E8, 0xE81E138E, 0xCD458FEA, 0xB954E128,
	0x1EDE0E95, 0xF552AE24, 0xE50ED7CD, 0xEA8006A8,
	0xD15FDC5B, 0xE6664B86, 0xF2D00F35, 0x580806BE,
	0xDEABF04F, 0x0ED614B8, 0x02DD4DB0, 0x31168702,
	0xE8E1C9F2, 0x057B8340, 0x140401B2, 0xE9CD8CA6,
	0xF32B25C9, 0xD6E1A540, 0x1F2B6682, 0xB50095B3,
	0x9F6DCA67, 0xE4B450BB, 0x4EB1B95A, 0xDB7BFF93,
	0xCBEAEC9B, 0x21F416A1, 0xCDE2CCB1, 0xBD7E7949,
	0x1FA7DD36, 0xE053411E, 0x11C4257F, 0xED7C5D35,
	0xC19ADE19, 0xCE19D0C7, 0xF74B2CB9, 0x2A399C7B,
	0x0535E354, 0xFBF6A6C0, 0x20863CC0, 0xDB69DB37,
	0xB4F29C11, 0xD6B22F7B, 0x038B9816, 0xE3C682A0,
	0xEDCBB8B7, 0xDE7C72C9, 0x32F8DD8B, 0x3A95873C,
	0xF2111759, 0xF7DA7E6A, 0xED96D85D, 0xD2362CAF,
	0xF2E7EF09, 0xD4AC5EF7, 0xFBC85EF5, 0x0C1C43AB,
	0x0DF7FEB7, 0x3E65BFDA, 0xBBEFE59B, 0xE9684971,
	0xD0395A63, 0x00748F9A, 0x0F3489D3, 0x040CB837,
	0xFBF33C8F, 0xF3071033, 0x21D0FB32, 0x032EEE15,
	0x0DD08506, 0xE353BDD5, 0x1DF580B8, 0x29D7206E,
	0xBB37A59D, 0x1C10046B, 0xE45E09A1, 0xF9905A90,
	0xEB10CB71, 0x0B15EBA8, 0x085EF241, 0x38FE421D,
	0xBDA824C3, 0xF4F75651, 0xEC519026, 0x37A99EC2,
	0xEAD68528, 0xF4AAD39D, 0x163E8F6E, 0xEE264172,
	0x18138FDC, 0xEED062BC, 0x4B543E58, 0x1A6C1F71,
	0xEDC2E5D1, 0x45451847, 0xDD23449A, 0x23DAB3A8,
	0xFEF8783A, 0x5F9B1AB0, 0x19217DD4, 0x1EA54ED7,
	0xE0BDADFE, 0xEDA12547, 0xFCD4F5D8, 0xE9FE19F6,
	0x0442389E, 0xFE9C42A5, 0xF509E355, 0x2AE61FA0,
	0x1BC01C55, 0xDE523096, 0x1E3AADDC, 0x0C2E1F51,
	0xD86F78CD, 0x327333F7, 0x19F2138F, 0x2F9F42BC,
	0xE3E5BD9B, 0xEF39864E, 0xE856DC90, 0xEF27A130,
	0xEBC4DCE8, 0x0F708DD1, 0x2778EC5B, 0xFA3C037A,
	0xC065422F, 0xDDE79F2C, 0xE880E4F0, 0xB14CE586,
	0x091F7AC1, 0xD6929567, 0x24C4425C, 0x100FEC70,
	0x0D2B053C, 0x23FACA44, 0xF99AAE94, 0xC135C785,
	0xFC28C4F4, 0x10D76869, 0x0A7B1272, 0x10608353,
	0x2E9C08B0, 0x59A18ED8, 0xF0D49846, 0xC8D1A81B,
	0x1BBDF0B6, 0xF289F305, 0x05E74FEC, 0x27EBFC25,
	0xF4EA822B, 0x0CB43282, 0x19B782A9, 0x233C62FC,
	0xE8EDF38F, 0x025E93FD, 0xF7D7D282, 0xA675C383,
	0x0171EB58, 0xCB893E3C, 0xEFB60317, 0xFB72B6EF,
	0xF05A1137, 0x42ACFE0E, 0x25EB1D6B, 0x1C9D26B4,
	0x215B4D22, 0xE1C1E29B, 0x3B3E68FD, 0xBFE233EE,
	0x336C6C8E, 0x079D9442, 0x097E9C6B, 0xF3C69D03,
	0xDC026526, 0x0C6A4F89, 0x1063CA94, 0x093E62E9,
	0x21F1CD33, 0x08991A66, 0x03385438, 0xEE1A0BD8,
	0xDD01E7C7, 0x2223F95A, 0xDECC8D24, 0xEC2DEE81,
	0xE5CB797B, 0xD73940C9, 0x2A6D5443, 0x347F86DD,
	0xF3950FA3, 0xDC9AB3D4, 0xDBE1D805, 0xFB6B0E5C,
	0x207C019F, 0xF1F00F8F, 0xED3E7606, 0x470168BA,
	0xF3061229, 0xD3526760, 0x0F2D08F3, 0x97CDCF77,
	0xC2D5A7AA, 0xE7752C0B, 0xECCE8901, 0x0BFDE47E,
	0x4CACC995, 0x0221E381, 0xE43CD3B4, 0xF2E1262A,
	0x18D68649, 0x07C9883C, 0x07239928, 0xC62A1170,
	0x24F5B0E5, 0x02A9DF50, 0x03E2DA18, 0xF06623E6,
	0xED03EB89, 0x1DC68DE4, 0x225EF5AE, 0x48005603,
	0x4C0CEE5E, 0xFE56170E, 0x80000000, 0x057AA227,
	0x0E600876, 0xFD1D866A, 0xEA74C1DB, 0x22ED63F0
	};

static const q31_t input2[256] = {
	0x1C0A13BC, 0x1B873800, 0xE34CB773, 0xDA6DADAE,
	0xFF8618DF, 0xF79C1734, 0x087D8481, 0x21A431EA,
	0xF840AF7D, 0x0AE2BCEE, 0x2A582599, 0x19EC693D,
	0x091B03C7, 0x4E3E7131, 0xF462C8D3, 0xFEC29627,
	0x0824B403, 0xE5605B52, 0x0FD08240, 0x0CDE1B94,
	0xCE1148E2, 0x1160A638, 0xB583AAE1, 0x44B1F71F,
	0x265DF7F3, 0xD4F1E9B5, 0x2EE474D4, 0xCD383FED,
	0x36A03599, 0x0D833B71, 0xCAF5999D, 0xDA601039,
	0x3D1BA57B, 0x12CA8626, 0x12B5DB84, 0xE7E396C3,
	0xDE5B5D5C, 0x0DA9623A, 0x1E4CD13C, 0x2AE25F57,
	0xCE7D118B, 0x1D17F86A, 0x30F5A933, 0xEFCC13E2,
	0xDBC3AD5F, 0x2BB33845, 0x0FD0F0FD, 0xD643FCCC,
	0xF6476F7F, 0xF1F1F7BD, 0xBA683437, 0xE87FCB22,
	0x210DD0F6, 0xF0738E7F, 0xF61B2952, 0xF9A85CFD,
	0xEF980CC1, 0x1C78B775, 0x5D937EC5, 0xEA54C61D,
	0x0B8AF897, 0xC9C3B40E, 0x1DBCFF62, 0xF1A1866F,
	0xCFE278AE, 0x04844959, 0x1A821BBA, 0xEFEC5903,
	0xFE724C57, 0x1FBFA58E, 0xBDBA24C0, 0x1489DE32,
	0xF0B04CF9, 0x03F7C82E, 0xFA6DB38E, 0xDF0EF9CB,
	0x057E618A, 0x3ADA9765, 0xDC214567, 0xBEFAEC05,
	0x07C36015, 0xD506010D, 0x23FC80EA, 0x1019EB8A,
	0xFC3FA8E9, 0xEF70F6CF, 0xC2E534C0, 0x00CA86AB,
	0x359CB10A, 0xCEEED4CD, 0xF7A108E0, 0xEE58A199,
	0xE9DB5FCC, 0xEC75497C, 0xDECA4BD8, 0xE9B39B39,
	0x24DC6736, 0xF58219E5, 0x18F2A349, 0x2DB6B98D,
	0x32F3CB95, 0xF7B5D2EB, 0xF2D98779, 0x0738182A,
	0xE91D0A75, 0xF0A3271F, 0xDC4338E3, 0x320EF7F1,
	0xA5F51F14, 0x229D5EB5, 0xE340F852, 0x109E486D,
	0x265AABD0, 0x00D30A8B, 0xFE0E4A39, 0xF211B88A,
	0x2684E20F, 0xF05DD624, 0xFBB526FD, 0x33BBC360,
	0x16BDF629, 0xEE2B449E, 0x0DBE4FE2, 0x176744B2,
	0xBCAE90B1, 0xD7506581, 0x0E084745, 0xF48548B8,
	0x0F7B2E33, 0x1C048268, 0x1DA01712, 0x0BD9FFFF,
	0x09071057, 0x15C78815, 0xFEF31ACF, 0x20A46B7F,
	0x1A201E7D, 0xC99A8A86, 0x07EB6EFA, 0x0C51BB67,
	0xE19171BB, 0xED7FB395, 0x2139EDC4, 0xF7B8731A,
	0x3147704D, 0x00CDE1E8, 0x0BDCE7A3, 0xDC6E4D8E,
	0xE472432E, 0xFBA6F1C2, 0xFA6ADCE7, 0xED4397A2,
	0xD91373D0, 0xFF761BFB, 0x80000000, 0x13A8BF6C,
	0x0A435241, 0x050FC71E, 0xE9FBFD16, 0xD7551A22,
	0xEA4BBE90, 0xE04F3D13, 0xEB821D9A, 0x0E3A1F7D,
	0xE497D3E1, 0xBD1DEBEF, 0x20A89097, 0xD3FCF04F,
	0xE0CF2CE8, 0xEAD4AB1D, 0xD1FE455F, 0x3826A092,
	0x05F55C1A, 0x02460DAC, 0xF2605E45, 0xF0E2F7E9,
	0x055B6EFF, 0x15026E0E, 0x0CE37D91, 0x0A6608DF,
	0x0816BED3, 0xFDCA18C4, 0x11A9FA87, 0xE897E122,
	0x15F7DEC7, 0x00BCD0F5, 0x08A61E81, 0xED1B06BF,
	0xC660A3D6, 0xD96AACC4, 0x108D13EB, 0xE04D11F8,
	0x10D1ECA1, 0xF79C5AA0, 0xF4EEB4A7, 0xFDA8B0D4,
	0xD7E48BEC, 0xC34688EB, 0x0B8D245B, 0x252EB410,
	0x23D68826, 0xF6684A2F, 0xEACB4E33, 0xFDDA246D,
	0xDCD3CBD5, 0x014DACE7, 0xD34FCA72, 0x0768A475,
	0x121B47FE, 0xFABBB9E9, 0xE1B27B22, 0xD2C319EF,
	0x08BD722A, 0xF3586DAE, 0xF2CF2D0D, 0xCB98E626,
	0xFAB40975, 0xF74793E7, 0x0E4FAECF, 0xCBF853B2,
	0xBD58E24C, 0x165711EA, 0xDB490DB3, 0x0CEE2B58,
	0x1C2BDE43, 0xDF5E5585, 0xE0E245B1, 0x1D12CF16,
	0xFA6030C3, 0x00202A46, 0xE7D2A60B, 0xE92A0C14,
	0xF5CC7899, 0x273C7A64, 0x1F8B8D48, 0xEF1B951A,
	0xEE0B4B6C, 0xC08FA7FB, 0xF7625189, 0x2FBE33F9,
	0x25F96B97, 0xE4079AFF, 0x05B10472, 0x2743154D,
	0x1733D292, 0x0C21E583, 0x28EB1125, 0x2861780A,
	0xF297AE48, 0x311766BE, 0xEDF26EF4, 0xD4B0C893,
	0x293701E2, 0xC0D85C67, 0x06D39B8C, 0x0B7E6C0C
	};

ZTEST(basicmath_q31_benchmark, test_benchmark_vec_add_q31)
{
	uint32_t irq_key, timestamp, timespan;
	q31_t *output;

	/* Allocate output buffer */
	output = malloc(PATTERN_LENGTH * sizeof(q31_t));
	zassert_not_null(output, "output buffer allocation failed");

	/* Begin benchmark */
	benchmark_begin(&irq_key, &timestamp);

	/* Execute function */
	arm_add_q31(input1, input2, output, PATTERN_LENGTH);

	/* End benchmark */
	timespan = benchmark_end(irq_key, timestamp);

	/* Free output buffer */
	free(output);

	/* Print result */
	TC_PRINT(BENCHMARK_TYPE " = %u\n", timespan);
}

ZTEST(basicmath_q31_benchmark, test_benchmark_vec_sub_q31)
{
	uint32_t irq_key, timestamp, timespan;
	q31_t *output;

	/* Allocate output buffer */
	output = malloc(PATTERN_LENGTH * sizeof(q31_t));
	zassert_not_null(output, "output buffer allocation failed");

	/* Begin benchmark */
	benchmark_begin(&irq_key, &timestamp);

	/* Execute function */
	arm_sub_q31(input1, input2, output, PATTERN_LENGTH);

	/* End benchmark */
	timespan = benchmark_end(irq_key, timestamp);

	/* Free output buffer */
	free(output);

	/* Print result */
	TC_PRINT(BENCHMARK_TYPE " = %u\n", timespan);
}

ZTEST(basicmath_q31_benchmark, test_benchmark_vec_mult_q31)
{
	uint32_t irq_key, timestamp, timespan;
	q31_t *output;

	/* Allocate output buffer */
	output = malloc(PATTERN_LENGTH * sizeof(q31_t));
	zassert_not_null(output, "output buffer allocation failed");

	/* Begin benchmark */
	benchmark_begin(&irq_key, &timestamp);

	/* Execute function */
	arm_mult_q31(input1, input2, output, PATTERN_LENGTH);

	/* End benchmark */
	timespan = benchmark_end(irq_key, timestamp);

	/* Free output buffer */
	free(output);

	/* Print result */
	TC_PRINT(BENCHMARK_TYPE " = %u\n", timespan);
}

ZTEST(basicmath_q31_benchmark, test_benchmark_vec_abs_q31)
{
	uint32_t irq_key, timestamp, timespan;
	q31_t *output;

	/* Allocate output buffer */
	output = malloc(PATTERN_LENGTH * sizeof(q31_t));
	zassert_not_null(output, "output buffer allocation failed");

	/* Begin benchmark */
	benchmark_begin(&irq_key, &timestamp);

	/* Execute function */
	arm_abs_q31(input1, output, PATTERN_LENGTH);

	/* End benchmark */
	timespan = benchmark_end(irq_key, timestamp);

	/* Free output buffer */
	free(output);

	/* Print result */
	TC_PRINT(BENCHMARK_TYPE " = %u\n", timespan);
}

ZTEST(basicmath_q31_benchmark, test_benchmark_vec_negate_q31)
{
	uint32_t irq_key, timestamp, timespan;
	q31_t *output;

	/* Allocate output buffer */
	output = malloc(PATTERN_LENGTH * sizeof(q31_t));
	zassert_not_null(output, "output buffer allocation failed");

	/* Begin benchmark */
	benchmark_begin(&irq_key, &timestamp);

	/* Execute function */
	arm_negate_q31(input1, output, PATTERN_LENGTH);

	/* End benchmark */
	timespan = benchmark_end(irq_key, timestamp);

	/* Free output buffer */
	free(output);

	/* Print result */
	TC_PRINT(BENCHMARK_TYPE " = %u\n", timespan);
}

ZTEST(basicmath_q31_benchmark, test_benchmark_vec_offset_q31)
{
	uint32_t irq_key, timestamp, timespan;
	q31_t *output;

	/* Allocate output buffer */
	output = malloc(PATTERN_LENGTH * sizeof(q31_t));
	zassert_not_null(output, "output buffer allocation failed");

	/* Begin benchmark */
	benchmark_begin(&irq_key, &timestamp);

	/* Execute function */
	arm_offset_q31(input1, 1.0, output, PATTERN_LENGTH);

	/* End benchmark */
	timespan = benchmark_end(irq_key, timestamp);

	/* Free output buffer */
	free(output);

	/* Print result */
	TC_PRINT(BENCHMARK_TYPE " = %u\n", timespan);
}

ZTEST(basicmath_q31_benchmark, test_benchmark_vec_scale_q31)
{
	uint32_t irq_key, timestamp, timespan;
	q31_t *output;

	/* Allocate output buffer */
	output = malloc(PATTERN_LENGTH * sizeof(q31_t));
	zassert_not_null(output, "output buffer allocation failed");

	/* Begin benchmark */
	benchmark_begin(&irq_key, &timestamp);

	/* Execute function */
	arm_scale_q31(input1, 0x45, 1, output, PATTERN_LENGTH);

	/* End benchmark */
	timespan = benchmark_end(irq_key, timestamp);

	/* Free output buffer */
	free(output);

	/* Print result */
	TC_PRINT(BENCHMARK_TYPE " = %u\n", timespan);
}

ZTEST(basicmath_q31_benchmark, test_benchmark_vec_dot_prod_q31)
{
	uint32_t irq_key, timestamp, timespan;
	q63_t output;

	/* Begin benchmark */
	benchmark_begin(&irq_key, &timestamp);

	/* Execute function */
	arm_dot_prod_q31(input1, input2, PATTERN_LENGTH, &output);

	/* End benchmark */
	timespan = benchmark_end(irq_key, timestamp);

	/* Print result */
	TC_PRINT(BENCHMARK_TYPE " = %u\n", timespan);
}

ZTEST_SUITE(basicmath_q31_benchmark, NULL, NULL, NULL, NULL, NULL);
