Commit 2959fce7 authored by Tiezhu Yang's avatar Tiezhu Yang Committed by Huacai Chen
Browse files

LoongArch: Use common function sign_extend64()



There exists a common function sign_extend64() to sign extend a 64-bit
value using specified bit as sign-bit in include/linux/bitops.h, it is
more efficient, let us use it and remove the arch-specific sign_extend()
under arch/loongarch.

Suggested-by: default avatarJinyang He <hejinyang@loongson.cn>
Signed-off-by: default avatarTiezhu Yang <yangtiezhu@loongson.cn>
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent d52fec86
Loading
Loading
Loading
Loading
+0 −8
Original line number Original line Diff line number Diff line
@@ -377,14 +377,6 @@ static inline bool unsigned_imm_check(unsigned long val, unsigned int bit)
	return val < (1UL << bit);
	return val < (1UL << bit);
}
}


static inline unsigned long sign_extend(unsigned long val, unsigned int idx)
{
	if (!is_imm_negative(val, idx + 1))
		return ((1UL << idx) - 1) & val;
	else
		return ~((1UL << idx) - 1) | val;
}

#define DEF_EMIT_REG0I26_FORMAT(NAME, OP)				\
#define DEF_EMIT_REG0I26_FORMAT(NAME, OP)				\
static inline void emit_##NAME(union loongarch_instruction *insn,	\
static inline void emit_##NAME(union loongarch_instruction *insn,	\
			       int offset)				\
			       int offset)				\
+3 −3
Original line number Original line Diff line number Diff line
@@ -74,7 +74,7 @@ static void __init_or_module recompute_jump(union loongarch_instruction *buf,
	switch (src->reg0i26_format.opcode) {
	switch (src->reg0i26_format.opcode) {
	case b_op:
	case b_op:
	case bl_op:
	case bl_op:
		jump_addr = cur_pc + sign_extend((si_h << 16 | si_l) << 2, 27);
		jump_addr = cur_pc + sign_extend64((si_h << 16 | si_l) << 2, 27);
		if (in_alt_jump(jump_addr, start, end))
		if (in_alt_jump(jump_addr, start, end))
			return;
			return;
		offset = jump_addr - pc;
		offset = jump_addr - pc;
@@ -93,7 +93,7 @@ static void __init_or_module recompute_jump(union loongarch_instruction *buf,
		fallthrough;
		fallthrough;
	case beqz_op:
	case beqz_op:
	case bnez_op:
	case bnez_op:
		jump_addr = cur_pc + sign_extend((si_h << 16 | si_l) << 2, 22);
		jump_addr = cur_pc + sign_extend64((si_h << 16 | si_l) << 2, 22);
		if (in_alt_jump(jump_addr, start, end))
		if (in_alt_jump(jump_addr, start, end))
			return;
			return;
		offset = jump_addr - pc;
		offset = jump_addr - pc;
@@ -112,7 +112,7 @@ static void __init_or_module recompute_jump(union loongarch_instruction *buf,
	case bge_op:
	case bge_op:
	case bltu_op:
	case bltu_op:
	case bgeu_op:
	case bgeu_op:
		jump_addr = cur_pc + sign_extend(si << 2, 17);
		jump_addr = cur_pc + sign_extend64(si << 2, 17);
		if (in_alt_jump(jump_addr, start, end))
		if (in_alt_jump(jump_addr, start, end))
			return;
			return;
		offset = jump_addr - pc;
		offset = jump_addr - pc;