qemu/target/loongarch/insn_trans/trans_extra.c.inc
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/*
   3 * Copyright (c) 2021 Loongson Technology Corporation Limited
   4 */
   5
   6static bool trans_break(DisasContext *ctx, arg_break *a)
   7{
   8    generate_exception(ctx, EXCCODE_BRK);
   9    return true;
  10}
  11
  12static bool trans_syscall(DisasContext *ctx, arg_syscall *a)
  13{
  14    generate_exception(ctx, EXCCODE_SYS);
  15    return true;
  16}
  17
  18static bool trans_asrtle_d(DisasContext *ctx, arg_asrtle_d * a)
  19{
  20    TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
  21    TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
  22
  23    gen_helper_asrtle_d(cpu_env, src1, src2);
  24    return true;
  25}
  26
  27static bool trans_asrtgt_d(DisasContext *ctx, arg_asrtgt_d * a)
  28{
  29    TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
  30    TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
  31
  32    gen_helper_asrtgt_d(cpu_env, src1, src2);
  33    return true;
  34}
  35
  36static bool gen_rdtime(DisasContext *ctx, arg_rr *a,
  37                       bool word, bool high)
  38{
  39    TCGv dst1 = gpr_dst(ctx, a->rd, EXT_NONE);
  40    TCGv dst2 = gpr_dst(ctx, a->rj, EXT_NONE);
  41
  42    if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
  43        gen_io_start();
  44    }
  45    gen_helper_rdtime_d(dst1, cpu_env);
  46    if (word) {
  47        tcg_gen_sextract_tl(dst1, dst1, high ? 32 : 0, 32);
  48    }
  49    tcg_gen_ld_i64(dst2, cpu_env, offsetof(CPULoongArchState, CSR_TID));
  50
  51    return true;
  52}
  53
  54static bool trans_rdtimel_w(DisasContext *ctx, arg_rdtimel_w *a)
  55{
  56    return gen_rdtime(ctx, a, 1, 0);
  57}
  58
  59static bool trans_rdtimeh_w(DisasContext *ctx, arg_rdtimeh_w *a)
  60{
  61    return gen_rdtime(ctx, a, 1, 1);
  62}
  63
  64static bool trans_rdtime_d(DisasContext *ctx, arg_rdtime_d *a)
  65{
  66    return gen_rdtime(ctx, a, 0, 0);
  67}
  68
  69static bool trans_cpucfg(DisasContext *ctx, arg_cpucfg *a)
  70{
  71    TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE);
  72    TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
  73
  74    gen_helper_cpucfg(dest, cpu_env, src1);
  75    gen_set_gpr(a->rd, dest, EXT_NONE);
  76
  77    return true;
  78}
  79
  80static bool gen_crc(DisasContext *ctx, arg_rrr *a,
  81                    void (*func)(TCGv, TCGv, TCGv, TCGv),
  82                    TCGv tsz)
  83{
  84    TCGv dest = gpr_dst(ctx, a->rd, EXT_SIGN);
  85    TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
  86    TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
  87
  88    func(dest, src2, src1, tsz);
  89    gen_set_gpr(a->rd, dest, EXT_SIGN);
  90
  91    return true;
  92}
  93
  94TRANS(crc_w_b_w, gen_crc, gen_helper_crc32, tcg_constant_tl(1))
  95TRANS(crc_w_h_w, gen_crc, gen_helper_crc32, tcg_constant_tl(2))
  96TRANS(crc_w_w_w, gen_crc, gen_helper_crc32, tcg_constant_tl(4))
  97TRANS(crc_w_d_w, gen_crc, gen_helper_crc32, tcg_constant_tl(8))
  98TRANS(crcc_w_b_w, gen_crc, gen_helper_crc32c, tcg_constant_tl(1))
  99TRANS(crcc_w_h_w, gen_crc, gen_helper_crc32c, tcg_constant_tl(2))
 100TRANS(crcc_w_w_w, gen_crc, gen_helper_crc32c, tcg_constant_tl(4))
 101TRANS(crcc_w_d_w, gen_crc, gen_helper_crc32c, tcg_constant_tl(8))
 102