]>
Commit | Line | Data |
---|---|---|
63cfcd47 SG |
1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* | |
3 | * Copyright (c) 2021 Loongson Technology Corporation Limited | |
4 | */ | |
5 | ||
6 | static void gen_sll_w(TCGv dest, TCGv src1, TCGv src2) | |
7 | { | |
8 | TCGv t0 = tcg_temp_new(); | |
9 | tcg_gen_andi_tl(t0, src2, 0x1f); | |
10 | tcg_gen_shl_tl(dest, src1, t0); | |
63cfcd47 SG |
11 | } |
12 | ||
13 | static void gen_srl_w(TCGv dest, TCGv src1, TCGv src2) | |
14 | { | |
15 | TCGv t0 = tcg_temp_new(); | |
16 | tcg_gen_andi_tl(t0, src2, 0x1f); | |
17 | tcg_gen_shr_tl(dest, src1, t0); | |
63cfcd47 SG |
18 | } |
19 | ||
20 | static void gen_sra_w(TCGv dest, TCGv src1, TCGv src2) | |
21 | { | |
22 | TCGv t0 = tcg_temp_new(); | |
23 | tcg_gen_andi_tl(t0, src2, 0x1f); | |
24 | tcg_gen_sar_tl(dest, src1, t0); | |
63cfcd47 SG |
25 | } |
26 | ||
27 | static void gen_sll_d(TCGv dest, TCGv src1, TCGv src2) | |
28 | { | |
29 | TCGv t0 = tcg_temp_new(); | |
30 | tcg_gen_andi_tl(t0, src2, 0x3f); | |
31 | tcg_gen_shl_tl(dest, src1, t0); | |
63cfcd47 SG |
32 | } |
33 | ||
34 | static void gen_srl_d(TCGv dest, TCGv src1, TCGv src2) | |
35 | { | |
36 | TCGv t0 = tcg_temp_new(); | |
37 | tcg_gen_andi_tl(t0, src2, 0x3f); | |
38 | tcg_gen_shr_tl(dest, src1, t0); | |
63cfcd47 SG |
39 | } |
40 | ||
41 | static void gen_sra_d(TCGv dest, TCGv src1, TCGv src2) | |
42 | { | |
43 | TCGv t0 = tcg_temp_new(); | |
44 | tcg_gen_andi_tl(t0, src2, 0x3f); | |
45 | tcg_gen_sar_tl(dest, src1, t0); | |
63cfcd47 SG |
46 | } |
47 | ||
48 | static void gen_rotr_w(TCGv dest, TCGv src1, TCGv src2) | |
49 | { | |
50 | TCGv_i32 t1 = tcg_temp_new_i32(); | |
51 | TCGv_i32 t2 = tcg_temp_new_i32(); | |
52 | TCGv t0 = tcg_temp_new(); | |
53 | ||
54 | tcg_gen_andi_tl(t0, src2, 0x1f); | |
55 | ||
56 | tcg_gen_trunc_tl_i32(t1, src1); | |
57 | tcg_gen_trunc_tl_i32(t2, t0); | |
58 | ||
59 | tcg_gen_rotr_i32(t1, t1, t2); | |
60 | tcg_gen_ext_i32_tl(dest, t1); | |
63cfcd47 SG |
61 | } |
62 | ||
63 | static void gen_rotr_d(TCGv dest, TCGv src1, TCGv src2) | |
64 | { | |
65 | TCGv t0 = tcg_temp_new(); | |
66 | tcg_gen_andi_tl(t0, src2, 0x3f); | |
67 | tcg_gen_rotr_tl(dest, src1, t0); | |
63cfcd47 SG |
68 | } |
69 | ||
70 | static bool trans_srai_w(DisasContext *ctx, arg_srai_w *a) | |
71 | { | |
72 | TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE); | |
73 | TCGv src1 = gpr_src(ctx, a->rj, EXT_ZERO); | |
74 | ||
c0c0461e SG |
75 | if (!avail_64(ctx)) { |
76 | return false; | |
77 | } | |
78 | ||
63cfcd47 SG |
79 | tcg_gen_sextract_tl(dest, src1, a->imm, 32 - a->imm); |
80 | gen_set_gpr(a->rd, dest, EXT_NONE); | |
81 | ||
82 | return true; | |
83 | } | |
84 | ||
ec3a9518 SG |
85 | TRANS(sll_w, ALL, gen_rrr, EXT_ZERO, EXT_NONE, EXT_SIGN, gen_sll_w) |
86 | TRANS(srl_w, ALL, gen_rrr, EXT_ZERO, EXT_NONE, EXT_SIGN, gen_srl_w) | |
87 | TRANS(sra_w, ALL, gen_rrr, EXT_SIGN, EXT_NONE, EXT_SIGN, gen_sra_w) | |
c0c0461e SG |
88 | TRANS(sll_d, 64, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_sll_d) |
89 | TRANS(srl_d, 64, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_srl_d) | |
90 | TRANS(sra_d, 64, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_sra_d) | |
91 | TRANS(rotr_w, 64, gen_rrr, EXT_ZERO, EXT_NONE, EXT_SIGN, gen_rotr_w) | |
92 | TRANS(rotr_d, 64, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_rotr_d) | |
ec3a9518 | 93 | TRANS(slli_w, ALL, gen_rri_c, EXT_NONE, EXT_SIGN, tcg_gen_shli_tl) |
c0c0461e | 94 | TRANS(slli_d, 64, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_shli_tl) |
ec3a9518 | 95 | TRANS(srli_w, ALL, gen_rri_c, EXT_ZERO, EXT_SIGN, tcg_gen_shri_tl) |
c0c0461e SG |
96 | TRANS(srli_d, 64, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_shri_tl) |
97 | TRANS(srai_d, 64, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_sari_tl) | |
98 | TRANS(rotri_w, 64, gen_rri_v, EXT_NONE, EXT_NONE, gen_rotr_w) | |
99 | TRANS(rotri_d, 64, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_rotri_tl) |