xref: /openbmc/qemu/target/loongarch/tcg/insn_trans/trans_shift.c.inc (revision ba79ef143fbdf6a0b53cd48490ba1daa9014be60)
15c23704eSSong Gao/* SPDX-License-Identifier: GPL-2.0-or-later */
25c23704eSSong Gao/*
35c23704eSSong Gao * Copyright (c) 2021 Loongson Technology Corporation Limited
45c23704eSSong Gao */
55c23704eSSong Gao
65c23704eSSong Gaostatic void gen_sll_w(TCGv dest, TCGv src1, TCGv src2)
75c23704eSSong Gao{
85c23704eSSong Gao    TCGv t0 = tcg_temp_new();
95c23704eSSong Gao    tcg_gen_andi_tl(t0, src2, 0x1f);
105c23704eSSong Gao    tcg_gen_shl_tl(dest, src1, t0);
115c23704eSSong Gao}
125c23704eSSong Gao
135c23704eSSong Gaostatic void gen_srl_w(TCGv dest, TCGv src1, TCGv src2)
145c23704eSSong Gao{
155c23704eSSong Gao    TCGv t0 = tcg_temp_new();
165c23704eSSong Gao    tcg_gen_andi_tl(t0, src2, 0x1f);
175c23704eSSong Gao    tcg_gen_shr_tl(dest, src1, t0);
185c23704eSSong Gao}
195c23704eSSong Gao
205c23704eSSong Gaostatic void gen_sra_w(TCGv dest, TCGv src1, TCGv src2)
215c23704eSSong Gao{
225c23704eSSong Gao    TCGv t0 = tcg_temp_new();
235c23704eSSong Gao    tcg_gen_andi_tl(t0, src2, 0x1f);
245c23704eSSong Gao    tcg_gen_sar_tl(dest, src1, t0);
255c23704eSSong Gao}
265c23704eSSong Gao
275c23704eSSong Gaostatic void gen_sll_d(TCGv dest, TCGv src1, TCGv src2)
285c23704eSSong Gao{
295c23704eSSong Gao    TCGv t0 = tcg_temp_new();
305c23704eSSong Gao    tcg_gen_andi_tl(t0, src2, 0x3f);
315c23704eSSong Gao    tcg_gen_shl_tl(dest, src1, t0);
325c23704eSSong Gao}
335c23704eSSong Gao
345c23704eSSong Gaostatic void gen_srl_d(TCGv dest, TCGv src1, TCGv src2)
355c23704eSSong Gao{
365c23704eSSong Gao    TCGv t0 = tcg_temp_new();
375c23704eSSong Gao    tcg_gen_andi_tl(t0, src2, 0x3f);
385c23704eSSong Gao    tcg_gen_shr_tl(dest, src1, t0);
395c23704eSSong Gao}
405c23704eSSong Gao
415c23704eSSong Gaostatic void gen_sra_d(TCGv dest, TCGv src1, TCGv src2)
425c23704eSSong Gao{
435c23704eSSong Gao    TCGv t0 = tcg_temp_new();
445c23704eSSong Gao    tcg_gen_andi_tl(t0, src2, 0x3f);
455c23704eSSong Gao    tcg_gen_sar_tl(dest, src1, t0);
465c23704eSSong Gao}
475c23704eSSong Gao
485c23704eSSong Gaostatic void gen_rotr_w(TCGv dest, TCGv src1, TCGv src2)
495c23704eSSong Gao{
505c23704eSSong Gao    TCGv_i32 t1 = tcg_temp_new_i32();
515c23704eSSong Gao    TCGv_i32 t2 = tcg_temp_new_i32();
525c23704eSSong Gao    TCGv t0 = tcg_temp_new();
535c23704eSSong Gao
545c23704eSSong Gao    tcg_gen_andi_tl(t0, src2, 0x1f);
555c23704eSSong Gao
565c23704eSSong Gao    tcg_gen_trunc_tl_i32(t1, src1);
575c23704eSSong Gao    tcg_gen_trunc_tl_i32(t2, t0);
585c23704eSSong Gao
595c23704eSSong Gao    tcg_gen_rotr_i32(t1, t1, t2);
605c23704eSSong Gao    tcg_gen_ext_i32_tl(dest, t1);
615c23704eSSong Gao}
625c23704eSSong Gao
635c23704eSSong Gaostatic void gen_rotr_d(TCGv dest, TCGv src1, TCGv src2)
645c23704eSSong Gao{
655c23704eSSong Gao    TCGv t0 = tcg_temp_new();
665c23704eSSong Gao    tcg_gen_andi_tl(t0, src2, 0x3f);
675c23704eSSong Gao    tcg_gen_rotr_tl(dest, src1, t0);
685c23704eSSong Gao}
695c23704eSSong Gao
70*78587587SFeiyang Chenstatic void gen_sari_w(TCGv dest, TCGv src1, target_long imm)
715c23704eSSong Gao{
72*78587587SFeiyang Chen    tcg_gen_sextract_tl(dest, src1, imm, 32 - imm);
735c23704eSSong Gao}
745c23704eSSong Gao
755c23704eSSong GaoTRANS(sll_w, ALL, gen_rrr, EXT_ZERO, EXT_NONE, EXT_SIGN, gen_sll_w)
765c23704eSSong GaoTRANS(srl_w, ALL, gen_rrr, EXT_ZERO, EXT_NONE, EXT_SIGN, gen_srl_w)
775c23704eSSong GaoTRANS(sra_w, ALL, gen_rrr, EXT_SIGN, EXT_NONE, EXT_SIGN, gen_sra_w)
785c23704eSSong GaoTRANS(sll_d, 64, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_sll_d)
795c23704eSSong GaoTRANS(srl_d, 64, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_srl_d)
805c23704eSSong GaoTRANS(sra_d, 64, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_sra_d)
815c23704eSSong GaoTRANS(rotr_w, 64, gen_rrr, EXT_ZERO, EXT_NONE, EXT_SIGN, gen_rotr_w)
825c23704eSSong GaoTRANS(rotr_d, 64, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_rotr_d)
835c23704eSSong GaoTRANS(slli_w, ALL, gen_rri_c, EXT_NONE, EXT_SIGN, tcg_gen_shli_tl)
845c23704eSSong GaoTRANS(slli_d, 64, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_shli_tl)
855c23704eSSong GaoTRANS(srli_w, ALL, gen_rri_c, EXT_ZERO, EXT_SIGN, tcg_gen_shri_tl)
865c23704eSSong GaoTRANS(srli_d, 64, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_shri_tl)
87*78587587SFeiyang ChenTRANS(srai_w, ALL, gen_rri_c, EXT_NONE, EXT_NONE, gen_sari_w)
885c23704eSSong GaoTRANS(srai_d, 64, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_sari_tl)
895c23704eSSong GaoTRANS(rotri_w, 64, gen_rri_v, EXT_NONE, EXT_NONE, gen_rotr_w)
905c23704eSSong GaoTRANS(rotri_d, 64, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_rotri_tl)
91