arm2x86_mul.c

来自「这是Skyeye 0.9 版本的源代码」· C语言 代码 · 共 69 行

C
69
字号
#include "armdefs.h"
#include "arm2x86_self.h"

uint8_t *
get_op_mul_T0_T1(int *len)
{
	unsigned int	begin=0, end=0;

	OP_BEGIN("get_op_mul_T0_T1");
	T0 = T0 * T1;
	OP_END("get_op_mul_T0_T1");
	*len = end - begin;

	return((uint8_t *)begin);
}

uint8_t *
get_op_umull_T0_T1(int *len)
{
	unsigned int	begin=0, end=0;

	OP_BEGIN("get_op_umull_T0_T1");
	__asm__ __volatile__ ("movl	%"AREG_T0", %eax");
	__asm__ __volatile__ ("mull	%"AREG_T1);
	__asm__ __volatile__ ("movl	%eax, %"AREG_T0);
	__asm__ __volatile__ ("movl	%edx, %"AREG_T1);
	OP_END("get_op_umull_T0_T1");
	*len = end - begin;

	return((uint8_t *)begin);
}

uint8_t *
get_op_smull_T0_T1(int *len)
{
	unsigned int	begin=0, end=0;

	OP_BEGIN("get_op_smull_T0_T1");
	__asm__ __volatile__ ("movl	%"AREG_T0", %eax");
	__asm__ __volatile__ ("imull	%"AREG_T1);
	__asm__ __volatile__ ("movl	%eax, %"AREG_T0);
	__asm__ __volatile__ ("movl	%edx, %"AREG_T1);
	OP_END("get_op_smull_T0_T1");
	*len = end - begin;

	return((uint8_t *)begin);
}

op_table_t	op_mul_T0_T1;
op_table_t	op_umull_T0_T1;
op_table_t	op_smull_T0_T1;
int
arm2x86_mul_init()
{
	op_mul_T0_T1.op = get_op_mul_T0_T1(&op_mul_T0_T1.len);
	if (op_mul_T0_T1.len <= 0)
		return(-1);

	op_umull_T0_T1.op = get_op_umull_T0_T1(&op_umull_T0_T1.len);
	if (op_umull_T0_T1.len <= 0)
		return(-1);

	op_smull_T0_T1.op = get_op_smull_T0_T1(&op_smull_T0_T1.len);
	if (op_smull_T0_T1.len <= 0)
		return(-1);

	return(0);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?