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