/* * Copyright (c) 2022 ITE Corporation. * SPDX-License-Identifier: Apache-2.0 * * When the 'M' extension is disabled, compiler can not recognize div/mul * instructions. So mul/div instructions in the below integer arithmetic * routines are hard coded by opcodes. * * IMPORTANT: * The workaround requires the nop instruction, please don't optimize it. */ #ifdef CONFIG_SOC_IT8XXX2_USE_ILM #define SECTION .__ram_code.arithmetic. #else #define SECTION .text.it8xxx2.arithmetic. #endif .macro __int_arithmetic func opcode .section SECTION\func .align 2 .globl \func .type \func, @function \func: .word \opcode nop ret .size \func, .-\func .endm /* signed 32 bit multiplication. opcode of mul a0,a0,a1 is 0x02b50533 */ __int_arithmetic __mulsi3 0x02b50533 /* signed 32 bit division. opcode of div a0,a0,a1 is 0x02b54533 */ __int_arithmetic __divsi3 0x02b54533 /* unsigned 32 bit division. opcode of divu a0,a0,a1 is 0x02b55533 */ __int_arithmetic __udivsi3 0x02b55533 /* * This function return the remainder of the signed division. * opcode of rem a0,a0,a1 is 0x02b56533 */ __int_arithmetic __modsi3 0x02b56533 /* * This function return the remainder of the unsigned division. * opcode of remu a0,a0,a1 is 0x02b57533 */ __int_arithmetic __umodsi3 0x02b57533