From patchwork Mon Apr 5 14:31:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cupertino Miranda X-Patchwork-Id: 1462442 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=HHUeiGQ4; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4FDYbg6Y3Kz9sV5 for ; Tue, 6 Apr 2021 00:54:55 +1000 (AEST) Received: from localhost ([::1]:44522 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lTQcu-0003rM-F5 for incoming@patchwork.ozlabs.org; Mon, 05 Apr 2021 10:54:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:42522) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lTQHm-0001c8-Av for qemu-devel@nongnu.org; Mon, 05 Apr 2021 10:33:03 -0400 Received: from mail-wm1-x32e.google.com ([2a00:1450:4864:20::32e]:37808) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lTQHO-0001qI-Hd for qemu-devel@nongnu.org; Mon, 05 Apr 2021 10:33:00 -0400 Received: by mail-wm1-x32e.google.com with SMTP id f22-20020a7bc8d60000b029010c024a1407so7681479wml.2 for ; Mon, 05 Apr 2021 07:32:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=C6re8nrFnSD80kPEoh/uNAa6UCsxYF85n+mTQNJubQw=; b=HHUeiGQ4DpcaMZ5IbHh1HpHAaHRi5pIfJ3VsQEslidiIVzCEqS2d2jcb9vVLf2vuHD yq9hE40668g5Iaz2morZxnT7m8n1OBw4DE0LKjWz/rEOdgwuu++qIqCmPISB9radAmP8 n67Pj0dhRZ1v1UtPQVGX64W6XCOhoaIyCA/YAW8F94ry7YIL2pubr8p1IvKy5Kzk5lh+ QSLE/1MliqFEGVXTNVhOHVioPGTJ3K0/vvv5LkCyvoEoSmNavyrLOGoatBVANUEIPpkX i7BTqTF1WE0t14lMA1+JVCxEuWnwkgPMdsUltyasBb/RVqL3A9oL8DcFH/AIbeYbX+6o nYHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=C6re8nrFnSD80kPEoh/uNAa6UCsxYF85n+mTQNJubQw=; b=PWynR8bog6NsdcbjCzYEbyfd7A35JMy8p/lp4ytiXpu1lDDx7GgXpJirPiHtS66L10 /+muTzGC1fng+CTEslN2V0kEq3F9padKDYSaKEzf1Jr3/UKhrE9ALZHo4EFwlw2cnd2G 2H4z8hK0AQC50oFMD4VrwtN47wdU6oexNdhhCkv5vaLvJGT9BLRonAwQDng1dxHhlSvw /94IWkThbCGs0v0yL5fflP0FjWGcNDgUhW9cQFeRVoCLB1xNMT07gKpzCjD5Qykv1AzA hkzilKDUJXdLRCk5o/v4s8qmvdM4w3zA8Dr/G4KUbCvQ8KuhRezPsqzDPiDSuWElGUT2 0e1A== X-Gm-Message-State: AOAM531Xnq7dfb8eRncB1DX8SqaL4XGS6wBL8/oA94pp4PQnJIA22/qb c5hHz3DBwAKZoTQnVrPFuDEYp7OtIUOaEg== X-Google-Smtp-Source: ABdhPJwTz3CthJRm9qxKlyZ2P+EIyf5bedvcrXqCtCLyA5QdHd4/0xY/J6xKTXTPe7Wu+XvPdVoP9A== X-Received: by 2002:a05:600c:2215:: with SMTP id z21mr25783990wml.86.1617633153625; Mon, 05 Apr 2021 07:32:33 -0700 (PDT) Received: from cmiranda-laptop.localdomain (bl15-158-218.dsl.telepac.pt. [188.80.158.218]) by smtp.gmail.com with ESMTPSA id k3sm8231552wrc.67.2021.04.05.07.32.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Apr 2021 07:32:32 -0700 (PDT) From: cupertinomiranda@gmail.com To: qemu-devel@nongnu.org Subject: [PATCH 22/27] arcv3: TCG instruction definitions Date: Mon, 5 Apr 2021 15:31:33 +0100 Message-Id: <20210405143138.17016-23-cupertinomiranda@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210405143138.17016-1-cupertinomiranda@gmail.com> References: <20210405143138.17016-1-cupertinomiranda@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2a00:1450:4864:20::32e; envelope-from=cupertinomiranda@gmail.com; helo=mail-wm1-x32e.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: shahab@synopsys.com, linux-snps-arc@lists.infradead.org, claziss@synopsys.com, cmiranda@synopsys.com Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Cupertino Miranda --- target/arc/semfunc-helper.c | 13 + target/arc/semfunc-helper.h | 31 + target/arc/semfunc-v3.c | 14653 ++++++++++++++++++++++++++++++++++ target/arc/semfunc-v3.h | 55 + 4 files changed, 14752 insertions(+) create mode 100644 target/arc/semfunc-v3.c create mode 100644 target/arc/semfunc-v3.h diff --git a/target/arc/semfunc-helper.c b/target/arc/semfunc-helper.c index 5f952d80b6..4ed2edfba1 100644 --- a/target/arc/semfunc-helper.c +++ b/target/arc/semfunc-helper.c @@ -127,15 +127,26 @@ void arc_gen_verifyCCFlag(const DisasCtxt *ctx, TCGv ret) #define MEMIDX (ctx->mem_idx) +#ifdef TARGET_ARCV2 const MemOp memop_for_size_sign[2][3] = { { MO_UL, MO_UB, MO_UW }, /* non sign-extended */ { MO_UL, MO_SB, MO_SW } /* sign-extended */ }; +#endif + +#ifdef TARGET_ARCV3 +const MemOp memop_for_size_sign[2][4] = { + { MO_UL, MO_UB, MO_UW, MO_Q }, /* non sign-extended */ + { MO_SL, MO_SB, MO_SW, MO_Q } /* sign-extended */ +}; +#endif void arc_gen_set_memory(const DisasCtxt *ctx, TCGv vaddr, int size, TCGv src, bool sign_extend) { +#ifdef TARGET_ARCV2 assert(size != 0x3); +#endif tcg_gen_qemu_st_tl(src, vaddr, MEMIDX, memop_for_size_sign[sign_extend][size]); @@ -144,7 +155,9 @@ void arc_gen_set_memory(const DisasCtxt *ctx, TCGv vaddr, int size, void arc_gen_get_memory(const DisasCtxt *ctx, TCGv dest, TCGv vaddr, int size, bool sign_extend) { +#ifdef TARGET_ARCV2 assert(size != 0x3); +#endif tcg_gen_qemu_ld_tl(dest, vaddr, MEMIDX, memop_for_size_sign[sign_extend][size]); diff --git a/target/arc/semfunc-helper.h b/target/arc/semfunc-helper.h index b89a8e916e..5a89da588c 100644 --- a/target/arc/semfunc-helper.h +++ b/target/arc/semfunc-helper.h @@ -118,6 +118,9 @@ void arc_gen_execute_delayslot(DisasCtxt *ctx, TCGv bta, TCGv take_branch); #define getNFlag(R) cpu_Nf #define setNFlag(ELEM) tcg_gen_shri_tl(cpu_Nf, ELEM, (TARGET_LONG_BITS - 1)) +#ifdef TARGET_ARCV3 +#define setNFlag32(ELEM) tcg_gen_shri_tl(cpu_Nf, ELEM, 31) +#endif #define setCFlag(ELEM) tcg_gen_andi_tl(cpu_Cf, ELEM, 1) #define getCFlag(R) tcg_gen_mov_tl(R, cpu_Cf) @@ -151,8 +154,22 @@ void arc_gen_execute_delayslot(DisasCtxt *ctx, TCGv bta, TCGv take_branch); #define setBLINK(BLINK_ADDR) \ tcg_gen_mov_tl(cpu_blink, BLINK_ADDR); +#ifdef TARGET_ARCV2 + #define Carry(R, A) tcg_gen_shri_tl(R, A, 31); +#endif + + +#ifdef TARGET_ARCV3 + +#define Carry(R, A) tcg_gen_shri_tl(R, A, 63); +#define Carry32(R, A) \ + tcg_gen_shri_tl(R, A, 31); \ + tcg_gen_andi_tl(R, R, 0x1); + +#endif + #define CarryADD(R, A, B, C) gen_helper_carry_add_flag(R, A, B, C) #define OverflowADD(R, A, B, C) gen_helper_overflow_add_flag(R, A, B, C) @@ -176,6 +193,13 @@ void arc_gen_sub_Cf(TCGv ret, TCGv dest, TCGv src1, TCGv src2); #define rotateLeft(R, B, C) tcg_gen_rotl_tl(R, B, C) #define rotateRight(R, B, C) tcg_gen_rotr_tl(R, B, C) +#ifdef TARGET_ARCV3 +#define rotateLeft32(R, B, C) gen_helper_rotate_left32(R, B, C) +#define rotateRight32(R, B, C) gen_helper_rotate_right32(R, B, C) + +#define arithmeticShiftRight32(R, B, C) gen_helper_asr_32(R, B, C) +#endif + void arc_gen_get_bit(TCGv ret, TCGv a, TCGv pos); #define getBit(R, A, POS) arc_gen_get_bit(R, A, POS) @@ -286,6 +310,13 @@ bool arc_is_instruction_operand_a_register(const DisasCtxt *ctx, int nop); void tcg_gen_shlfi_tl(TCGv a, int b, TCGv c); +#ifdef TARGET_ARCV3 + +//#define se32to64(A, B) gen_helper_se32to64(A, B) +#define se32to64(A, B) tcg_gen_ext32s_tl(A, B) + +#endif + #endif /* SEMFUNC_HELPER_H_ */ diff --git a/target/arc/semfunc-v3.c b/target/arc/semfunc-v3.c new file mode 100644 index 0000000000..f0eccf2124 --- /dev/null +++ b/target/arc/semfunc-v3.c @@ -0,0 +1,14653 @@ +/* + * QEMU ARC CPU + * + * Copyright (c) 2017 Cupertino Miranda + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see + * + */ + +#include "qemu/osdep.h" +#include "translate.h" +#include "semfunc-v3.h" + + + + +/* FLAG + * Variables: @src + * Functions: getCCFlag, getRegister, getBit, hasInterrupts, Halt, ReplMask, targetHasOption, setRegister +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + status32 = getRegister (R_STATUS32); + if(((getBit (@src, 0) == 1) && (getBit (status32, 7) == 0))) + { + if((hasInterrupts () > 0)) + { + status32 = (status32 | 1); + Halt (); + }; + } + else + { + ReplMask (status32, @src, 3840); + if(((getBit (status32, 7) == 0) && (hasInterrupts () > 0))) + { + ReplMask (status32, @src, 30); + if(targetHasOption (DIV_REM_OPTION)) + { + ReplMask (status32, @src, 8192); + }; + if(targetHasOption (STACK_CHECKING)) + { + ReplMask (status32, @src, 16384); + }; + if(targetHasOption (LL64_OPTION)) + { + ReplMask (status32, @src, 524288); + }; + ReplMask (status32, @src, 1048576); + }; + }; + setRegister (R_STATUS32, status32); + }; +} + */ + +int +arc_gen_FLAG (DisasCtxt *ctx, TCGv src) +{ + int ret = DISAS_NEXT; + TCGv temp_13 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_14 = tcg_temp_local_new(); + TCGv status32 = tcg_temp_local_new(); + TCGv temp_16 = tcg_temp_local_new(); + TCGv temp_15 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_18 = tcg_temp_local_new(); + TCGv temp_17 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_19 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_20 = tcg_temp_local_new(); + TCGv temp_22 = tcg_temp_local_new(); + TCGv temp_21 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_23 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv temp_12 = tcg_temp_local_new(); + TCGv temp_24 = tcg_temp_local_new(); + TCGv temp_25 = tcg_temp_local_new(); + TCGv temp_26 = tcg_temp_local_new(); + TCGv temp_27 = tcg_temp_local_new(); + TCGv temp_28 = tcg_temp_local_new(); + getCCFlag(temp_13); + tcg_gen_mov_tl(cc_flag, temp_13); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + getRegister(temp_14, R_STATUS32); + tcg_gen_mov_tl(status32, temp_14); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_movi_tl(temp_16, 0); + getBit(temp_15, src, temp_16); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_3, temp_15, 1); + tcg_gen_movi_tl(temp_18, 7); + getBit(temp_17, status32, temp_18); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_4, temp_17, 0); + tcg_gen_and_tl(temp_5, temp_3, temp_4); + tcg_gen_xori_tl(temp_6, temp_5, 1); tcg_gen_andi_tl(temp_6, temp_6, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_6, arc_true, else_2);; + TCGLabel *done_3 = gen_new_label(); + hasInterrupts(temp_19); + tcg_gen_setcondi_tl(TCG_COND_GT, temp_7, temp_19, 0); + tcg_gen_xori_tl(temp_8, temp_7, 1); tcg_gen_andi_tl(temp_8, temp_8, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_8, arc_true, done_3);; + tcg_gen_ori_tl(status32, status32, 1); + Halt(); + gen_set_label(done_3); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_movi_tl(temp_20, 3840); + ReplMask(status32, src, temp_20); + TCGLabel *done_4 = gen_new_label(); + tcg_gen_movi_tl(temp_22, 7); + getBit(temp_21, status32, temp_22); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_9, temp_21, 0); + hasInterrupts(temp_23); + tcg_gen_setcondi_tl(TCG_COND_GT, temp_10, temp_23, 0); + tcg_gen_and_tl(temp_11, temp_9, temp_10); + tcg_gen_xori_tl(temp_12, temp_11, 1); tcg_gen_andi_tl(temp_12, temp_12, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_12, arc_true, done_4);; + tcg_gen_movi_tl(temp_24, 30); + ReplMask(status32, src, temp_24); + if (targetHasOption (DIV_REM_OPTION)) + { + tcg_gen_movi_tl(temp_25, 8192); + ReplMask(status32, src, temp_25); +; + } + else + { + ; + } + if (targetHasOption (STACK_CHECKING)) + { + tcg_gen_movi_tl(temp_26, 16384); + ReplMask(status32, src, temp_26); +; + } + else + { + ; + } + if (targetHasOption (LL64_OPTION)) + { + tcg_gen_movi_tl(temp_27, 524288); + ReplMask(status32, src, temp_27); +; + } + else + { + ; + } + tcg_gen_movi_tl(temp_28, 1048576); + ReplMask(status32, src, temp_28); + gen_set_label(done_4); + gen_set_label(done_2); + setRegister(R_STATUS32, status32); + gen_set_label(done_1); + tcg_temp_free(temp_13); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_14); + tcg_temp_free(status32); + tcg_temp_free(temp_16); + tcg_temp_free(temp_15); + tcg_temp_free(temp_3); + tcg_temp_free(temp_18); + tcg_temp_free(temp_17); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + tcg_temp_free(temp_19); + tcg_temp_free(temp_7); + tcg_temp_free(temp_8); + tcg_temp_free(temp_20); + tcg_temp_free(temp_22); + tcg_temp_free(temp_21); + tcg_temp_free(temp_9); + tcg_temp_free(temp_23); + tcg_temp_free(temp_10); + tcg_temp_free(temp_11); + tcg_temp_free(temp_12); + tcg_temp_free(temp_24); + tcg_temp_free(temp_25); + tcg_temp_free(temp_26); + tcg_temp_free(temp_27); + tcg_temp_free(temp_28); + + return ret; +} + + + + + +/* KFLAG + * Variables: @src + * Functions: getCCFlag, getRegister, getBit, hasInterrupts, Halt, ReplMask, targetHasOption, setRegister +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + status32 = getRegister (R_STATUS32); + if(((getBit (@src, 0) == 1) && (getBit (status32, 7) == 0))) + { + if((hasInterrupts () > 0)) + { + status32 = (status32 | 1); + Halt (); + }; + } + else + { + ReplMask (status32, @src, 3840); + if(((getBit (status32, 7) == 0) && (hasInterrupts () > 0))) + { + ReplMask (status32, @src, 62); + if(targetHasOption (DIV_REM_OPTION)) + { + ReplMask (status32, @src, 8192); + }; + if(targetHasOption (STACK_CHECKING)) + { + ReplMask (status32, @src, 16384); + }; + ReplMask (status32, @src, 65536); + if(targetHasOption (LL64_OPTION)) + { + ReplMask (status32, @src, 524288); + }; + ReplMask (status32, @src, 1048576); + ReplMask (status32, @src, 2147483648); + }; + }; + setRegister (R_STATUS32, status32); + }; +} + */ + +int +arc_gen_KFLAG (DisasCtxt *ctx, TCGv src) +{ + int ret = DISAS_NEXT; + TCGv temp_13 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_14 = tcg_temp_local_new(); + TCGv status32 = tcg_temp_local_new(); + TCGv temp_16 = tcg_temp_local_new(); + TCGv temp_15 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_18 = tcg_temp_local_new(); + TCGv temp_17 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_19 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_20 = tcg_temp_local_new(); + TCGv temp_22 = tcg_temp_local_new(); + TCGv temp_21 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_23 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv temp_12 = tcg_temp_local_new(); + TCGv temp_24 = tcg_temp_local_new(); + TCGv temp_25 = tcg_temp_local_new(); + TCGv temp_26 = tcg_temp_local_new(); + TCGv temp_27 = tcg_temp_local_new(); + TCGv temp_28 = tcg_temp_local_new(); + TCGv temp_29 = tcg_temp_local_new(); + TCGv temp_30 = tcg_temp_local_new(); + getCCFlag(temp_13); + tcg_gen_mov_tl(cc_flag, temp_13); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + getRegister(temp_14, R_STATUS32); + tcg_gen_mov_tl(status32, temp_14); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_movi_tl(temp_16, 0); + getBit(temp_15, src, temp_16); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_3, temp_15, 1); + tcg_gen_movi_tl(temp_18, 7); + getBit(temp_17, status32, temp_18); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_4, temp_17, 0); + tcg_gen_and_tl(temp_5, temp_3, temp_4); + tcg_gen_xori_tl(temp_6, temp_5, 1); tcg_gen_andi_tl(temp_6, temp_6, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_6, arc_true, else_2);; + TCGLabel *done_3 = gen_new_label(); + hasInterrupts(temp_19); + tcg_gen_setcondi_tl(TCG_COND_GT, temp_7, temp_19, 0); + tcg_gen_xori_tl(temp_8, temp_7, 1); tcg_gen_andi_tl(temp_8, temp_8, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_8, arc_true, done_3);; + tcg_gen_ori_tl(status32, status32, 1); + Halt(); + gen_set_label(done_3); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_movi_tl(temp_20, 3840); + ReplMask(status32, src, temp_20); + TCGLabel *done_4 = gen_new_label(); + tcg_gen_movi_tl(temp_22, 7); + getBit(temp_21, status32, temp_22); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_9, temp_21, 0); + hasInterrupts(temp_23); + tcg_gen_setcondi_tl(TCG_COND_GT, temp_10, temp_23, 0); + tcg_gen_and_tl(temp_11, temp_9, temp_10); + tcg_gen_xori_tl(temp_12, temp_11, 1); tcg_gen_andi_tl(temp_12, temp_12, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_12, arc_true, done_4);; + tcg_gen_movi_tl(temp_24, 62); + ReplMask(status32, src, temp_24); + if (targetHasOption (DIV_REM_OPTION)) + { + tcg_gen_movi_tl(temp_25, 8192); + ReplMask(status32, src, temp_25); +; + } + else + { + ; + } + if (targetHasOption (STACK_CHECKING)) + { + tcg_gen_movi_tl(temp_26, 16384); + ReplMask(status32, src, temp_26); +; + } + else + { + ; + } + tcg_gen_movi_tl(temp_27, 65536); + ReplMask(status32, src, temp_27); + if (targetHasOption (LL64_OPTION)) + { + tcg_gen_movi_tl(temp_28, 524288); + ReplMask(status32, src, temp_28); +; + } + else + { + ; + } + tcg_gen_movi_tl(temp_29, 1048576); + ReplMask(status32, src, temp_29); + tcg_gen_movi_tl(temp_30, 2147483648); + ReplMask(status32, src, temp_30); + gen_set_label(done_4); + gen_set_label(done_2); + setRegister(R_STATUS32, status32); + gen_set_label(done_1); + tcg_temp_free(temp_13); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_14); + tcg_temp_free(status32); + tcg_temp_free(temp_16); + tcg_temp_free(temp_15); + tcg_temp_free(temp_3); + tcg_temp_free(temp_18); + tcg_temp_free(temp_17); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + tcg_temp_free(temp_19); + tcg_temp_free(temp_7); + tcg_temp_free(temp_8); + tcg_temp_free(temp_20); + tcg_temp_free(temp_22); + tcg_temp_free(temp_21); + tcg_temp_free(temp_9); + tcg_temp_free(temp_23); + tcg_temp_free(temp_10); + tcg_temp_free(temp_11); + tcg_temp_free(temp_12); + tcg_temp_free(temp_24); + tcg_temp_free(temp_25); + tcg_temp_free(temp_26); + tcg_temp_free(temp_27); + tcg_temp_free(temp_28); + tcg_temp_free(temp_29); + tcg_temp_free(temp_30); + + return ret; +} + + + + + +/* ADD + * Variables: @b, @c, @a + * Functions: getCCFlag, se32to64, getFFlag, setZFlag, setNFlag32, setCFlag, CarryADD32, setVFlag, OverflowADD32 +--- code --- +{ + cc_flag = getCCFlag (); + lb = se32to64 (@b); + lc = se32to64 (@c); + if((cc_flag == true)) + { + @a = ((lb + lc) & 4294967295); + @a = (@a & 4294967295); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag32 (@a); + setCFlag (CarryADD32 (@a, lb, lc)); + setVFlag (OverflowADD32 (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_ADD (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + se32to64(temp_4, b); + tcg_gen_mov_tl(lb, temp_4); + se32to64(temp_5, c); + tcg_gen_mov_tl(lc, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_add_tl(temp_6, lb, lc); + tcg_gen_andi_tl(a, temp_6, 4294967295); + tcg_gen_andi_tl(a, a, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag32(a); + CarryADD32(temp_8, a, lb, lc); + tcg_gen_mov_tl(temp_7, temp_8); + setCFlag(temp_7); + OverflowADD32(temp_10, a, lb, lc); + tcg_gen_mov_tl(temp_9, temp_10); + setVFlag(temp_9); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_4); + tcg_temp_free(lb); + tcg_temp_free(temp_5); + tcg_temp_free(lc); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + tcg_temp_free(temp_10); + tcg_temp_free(temp_9); + + return ret; +} + + + + + +/* ADD1 + * Variables: @b, @c, @a + * Functions: getCCFlag, se32to64, getFFlag, setZFlag, setNFlag32, setCFlag, CarryADD32, setVFlag, OverflowADD32 +--- code --- +{ + cc_flag = getCCFlag (); + lb = se32to64 (@b); + lc = se32to64 (@c); + if((cc_flag == true)) + { + @a = ((lb + (lc << 1)) & 4294967295); + @a = (@a & 4294967295); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag32 (@a); + setCFlag (CarryADD32 (@a, lb, lc)); + setVFlag (OverflowADD32 (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_ADD1 (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + se32to64(temp_4, b); + tcg_gen_mov_tl(lb, temp_4); + se32to64(temp_5, c); + tcg_gen_mov_tl(lc, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_shli_tl(temp_7, lc, 1); + tcg_gen_add_tl(temp_6, lb, temp_7); + tcg_gen_andi_tl(a, temp_6, 4294967295); + tcg_gen_andi_tl(a, a, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag32(a); + CarryADD32(temp_9, a, lb, lc); + tcg_gen_mov_tl(temp_8, temp_9); + setCFlag(temp_8); + OverflowADD32(temp_11, a, lb, lc); + tcg_gen_mov_tl(temp_10, temp_11); + setVFlag(temp_10); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_4); + tcg_temp_free(lb); + tcg_temp_free(temp_5); + tcg_temp_free(lc); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(temp_11); + tcg_temp_free(temp_10); + + return ret; +} + + + + + +/* ADD2 + * Variables: @b, @c, @a + * Functions: getCCFlag, se32to64, getFFlag, setZFlag, setNFlag32, setCFlag, CarryADD32, setVFlag, OverflowADD32 +--- code --- +{ + cc_flag = getCCFlag (); + lb = se32to64 (@b); + lc = se32to64 (@c); + if((cc_flag == true)) + { + @a = ((lb + (lc << 2)) & 4294967295); + @a = (@a & 4294967295); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag32 (@a); + setCFlag (CarryADD32 (@a, lb, lc)); + setVFlag (OverflowADD32 (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_ADD2 (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + se32to64(temp_4, b); + tcg_gen_mov_tl(lb, temp_4); + se32to64(temp_5, c); + tcg_gen_mov_tl(lc, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_shli_tl(temp_7, lc, 2); + tcg_gen_add_tl(temp_6, lb, temp_7); + tcg_gen_andi_tl(a, temp_6, 4294967295); + tcg_gen_andi_tl(a, a, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag32(a); + CarryADD32(temp_9, a, lb, lc); + tcg_gen_mov_tl(temp_8, temp_9); + setCFlag(temp_8); + OverflowADD32(temp_11, a, lb, lc); + tcg_gen_mov_tl(temp_10, temp_11); + setVFlag(temp_10); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_4); + tcg_temp_free(lb); + tcg_temp_free(temp_5); + tcg_temp_free(lc); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(temp_11); + tcg_temp_free(temp_10); + + return ret; +} + + + + + +/* ADD3 + * Variables: @b, @c, @a + * Functions: getCCFlag, se32to64, getFFlag, setZFlag, setNFlag32, setCFlag, CarryADD32, setVFlag, OverflowADD32 +--- code --- +{ + cc_flag = getCCFlag (); + lb = se32to64 (@b); + lc = se32to64 (@c); + if((cc_flag == true)) + { + @a = ((lb + (lc << 3)) & 4294967295); + @a = (@a & 4294967295); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag32 (@a); + setCFlag (CarryADD32 (@a, lb, lc)); + setVFlag (OverflowADD32 (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_ADD3 (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + se32to64(temp_4, b); + tcg_gen_mov_tl(lb, temp_4); + se32to64(temp_5, c); + tcg_gen_mov_tl(lc, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_shli_tl(temp_7, lc, 3); + tcg_gen_add_tl(temp_6, lb, temp_7); + tcg_gen_andi_tl(a, temp_6, 4294967295); + tcg_gen_andi_tl(a, a, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag32(a); + CarryADD32(temp_9, a, lb, lc); + tcg_gen_mov_tl(temp_8, temp_9); + setCFlag(temp_8); + OverflowADD32(temp_11, a, lb, lc); + tcg_gen_mov_tl(temp_10, temp_11); + setVFlag(temp_10); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_4); + tcg_temp_free(lb); + tcg_temp_free(temp_5); + tcg_temp_free(lc); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(temp_11); + tcg_temp_free(temp_10); + + return ret; +} + + + + + +/* ADC + * Variables: @b, @c, @a + * Functions: getCCFlag, se32to64, getCFlag, getFFlag, setZFlag, setNFlag32, setCFlag, CarryADD32, setVFlag, OverflowADD32 +--- code --- +{ + cc_flag = getCCFlag (); + lb = se32to64 (@b); + lc = se32to64 (@c); + if((cc_flag == true)) + { + @a = ((lb + lc) + getCFlag ()); + @a = (@a & 4294967295); + @a = (@a & 4294967295); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag32 (@a); + setCFlag (CarryADD32 (@a, lb, lc)); + setVFlag (OverflowADD32 (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_ADC (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_12 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + se32to64(temp_4, b); + tcg_gen_mov_tl(lb, temp_4); + se32to64(temp_5, c); + tcg_gen_mov_tl(lc, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_add_tl(temp_6, lb, lc); + getCFlag(temp_8); + tcg_gen_mov_tl(temp_7, temp_8); + tcg_gen_add_tl(a, temp_6, temp_7); + tcg_gen_andi_tl(a, a, 4294967295); + tcg_gen_andi_tl(a, a, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag32(a); + CarryADD32(temp_10, a, lb, lc); + tcg_gen_mov_tl(temp_9, temp_10); + setCFlag(temp_9); + OverflowADD32(temp_12, a, lb, lc); + tcg_gen_mov_tl(temp_11, temp_12); + setVFlag(temp_11); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_4); + tcg_temp_free(lb); + tcg_temp_free(temp_5); + tcg_temp_free(lc); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + tcg_temp_free(temp_10); + tcg_temp_free(temp_9); + tcg_temp_free(temp_12); + tcg_temp_free(temp_11); + + return ret; +} + + + + + +/* SBC + * Variables: @b, @c, @a + * Functions: getCCFlag, se32to64, getCFlag, getFFlag, setZFlag, setNFlag32, setCFlag, CarryADD32, setVFlag, OverflowADD32 +--- code --- +{ + cc_flag = getCCFlag (); + lb = se32to64 (@b); + lc = se32to64 (@c); + if((cc_flag == true)) + { + @a = ((lb - lc) - getCFlag ()); + @a = (@a & 4294967295); + @a = (@a & 4294967295); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag32 (@a); + setCFlag (CarryADD32 (@a, lb, lc)); + setVFlag (OverflowADD32 (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_SBC (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_12 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + se32to64(temp_4, b); + tcg_gen_mov_tl(lb, temp_4); + se32to64(temp_5, c); + tcg_gen_mov_tl(lc, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_sub_tl(temp_6, lb, lc); + getCFlag(temp_8); + tcg_gen_mov_tl(temp_7, temp_8); + tcg_gen_sub_tl(a, temp_6, temp_7); + tcg_gen_andi_tl(a, a, 4294967295); + tcg_gen_andi_tl(a, a, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag32(a); + CarryADD32(temp_10, a, lb, lc); + tcg_gen_mov_tl(temp_9, temp_10); + setCFlag(temp_9); + OverflowADD32(temp_12, a, lb, lc); + tcg_gen_mov_tl(temp_11, temp_12); + setVFlag(temp_11); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_4); + tcg_temp_free(lb); + tcg_temp_free(temp_5); + tcg_temp_free(lc); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + tcg_temp_free(temp_10); + tcg_temp_free(temp_9); + tcg_temp_free(temp_12); + tcg_temp_free(temp_11); + + return ret; +} + + + + + +/* NEG + * Variables: @b, @a + * Functions: getCCFlag, se32to64, getFFlag, setZFlag, setNFlag32, setCFlag, CarrySUB32, setVFlag, OverflowSUB32 +--- code --- +{ + cc_flag = getCCFlag (); + lb = se32to64 (@b); + if((cc_flag == true)) + { + @a = (0 - @b); + @a = (@a & 4294967295); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag32 (@a); + setCFlag (CarrySUB32 (@a, 0, lb)); + setVFlag (OverflowSUB32 (@a, 0, lb)); + }; + }; +} + */ + +int +arc_gen_NEG (DisasCtxt *ctx, TCGv b, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + se32to64(temp_4, b); + tcg_gen_mov_tl(lb, temp_4); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_subfi_tl(a, 0, b); + tcg_gen_andi_tl(a, a, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag32(a); + tcg_gen_movi_tl(temp_7, 0); + CarrySUB32(temp_6, a, temp_7, lb); + tcg_gen_mov_tl(temp_5, temp_6); + setCFlag(temp_5); + tcg_gen_movi_tl(temp_10, 0); + OverflowSUB32(temp_9, a, temp_10, lb); + tcg_gen_mov_tl(temp_8, temp_9); + setVFlag(temp_8); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_4); + tcg_temp_free(lb); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_10); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + + return ret; +} + + + + + +/* SUB + * Variables: @b, @c, @a + * Functions: getCCFlag, se32to64, getFFlag, setZFlag, setNFlag32, setCFlag, CarrySUB32, setVFlag, OverflowSUB32 +--- code --- +{ + cc_flag = getCCFlag (); + lb = se32to64 (@b); + if((cc_flag == true)) + { + lc = se32to64 (@c); + @a = ((lb - lc) & 4294967295); + @a = (@a & 4294967295); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag32 (@a); + setCFlag (CarrySUB32 (@a, lb, lc)); + setVFlag (OverflowSUB32 (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_SUB (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + se32to64(temp_4, b); + tcg_gen_mov_tl(lb, temp_4); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + se32to64(temp_5, c); + tcg_gen_mov_tl(lc, temp_5); + tcg_gen_sub_tl(temp_6, lb, lc); + tcg_gen_andi_tl(a, temp_6, 4294967295); + tcg_gen_andi_tl(a, a, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag32(a); + CarrySUB32(temp_8, a, lb, lc); + tcg_gen_mov_tl(temp_7, temp_8); + setCFlag(temp_7); + OverflowSUB32(temp_10, a, lb, lc); + tcg_gen_mov_tl(temp_9, temp_10); + setVFlag(temp_9); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_4); + tcg_temp_free(lb); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_5); + tcg_temp_free(lc); + tcg_temp_free(temp_6); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + tcg_temp_free(temp_10); + tcg_temp_free(temp_9); + + return ret; +} + + + + + +/* SUB1 + * Variables: @b, @c, @a + * Functions: getCCFlag, se32to64, getFFlag, setZFlag, setNFlag32, setCFlag, CarrySUB32, setVFlag, OverflowSUB32 +--- code --- +{ + cc_flag = getCCFlag (); + lb = se32to64 (@b); + if((cc_flag == true)) + { + lc = (se32to64 (@c) << 1); + @a = ((lb - lc) & 4294967295); + @a = (@a & 4294967295); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag32 (@a); + setCFlag (CarrySUB32 (@a, lb, lc)); + setVFlag (OverflowSUB32 (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_SUB1 (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + se32to64(temp_4, b); + tcg_gen_mov_tl(lb, temp_4); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + se32to64(temp_6, c); + tcg_gen_mov_tl(temp_5, temp_6); + tcg_gen_shli_tl(lc, temp_5, 1); + tcg_gen_sub_tl(temp_7, lb, lc); + tcg_gen_andi_tl(a, temp_7, 4294967295); + tcg_gen_andi_tl(a, a, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag32(a); + CarrySUB32(temp_9, a, lb, lc); + tcg_gen_mov_tl(temp_8, temp_9); + setCFlag(temp_8); + OverflowSUB32(temp_11, a, lb, lc); + tcg_gen_mov_tl(temp_10, temp_11); + setVFlag(temp_10); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_4); + tcg_temp_free(lb); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(lc); + tcg_temp_free(temp_7); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(temp_11); + tcg_temp_free(temp_10); + + return ret; +} + + + + + +/* SUB2 + * Variables: @b, @c, @a + * Functions: getCCFlag, se32to64, getFFlag, setZFlag, setNFlag32, setCFlag, CarrySUB32, setVFlag, OverflowSUB32 +--- code --- +{ + cc_flag = getCCFlag (); + lb = se32to64 (@b); + if((cc_flag == true)) + { + lc = (se32to64 (@c) << 2); + @a = ((lb - lc) & 4294967295); + @a = (@a & 4294967295); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag32 (@a); + setCFlag (CarrySUB32 (@a, lb, lc)); + setVFlag (OverflowSUB32 (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_SUB2 (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + se32to64(temp_4, b); + tcg_gen_mov_tl(lb, temp_4); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + se32to64(temp_6, c); + tcg_gen_mov_tl(temp_5, temp_6); + tcg_gen_shli_tl(lc, temp_5, 2); + tcg_gen_sub_tl(temp_7, lb, lc); + tcg_gen_andi_tl(a, temp_7, 4294967295); + tcg_gen_andi_tl(a, a, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag32(a); + CarrySUB32(temp_9, a, lb, lc); + tcg_gen_mov_tl(temp_8, temp_9); + setCFlag(temp_8); + OverflowSUB32(temp_11, a, lb, lc); + tcg_gen_mov_tl(temp_10, temp_11); + setVFlag(temp_10); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_4); + tcg_temp_free(lb); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(lc); + tcg_temp_free(temp_7); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(temp_11); + tcg_temp_free(temp_10); + + return ret; +} + + + + + +/* SUB3 + * Variables: @b, @c, @a + * Functions: getCCFlag, se32to64, getFFlag, setZFlag, setNFlag32, setCFlag, CarrySUB32, setVFlag, OverflowSUB32 +--- code --- +{ + cc_flag = getCCFlag (); + lb = se32to64 (@b); + if((cc_flag == true)) + { + lc = (se32to64 (@c) << 3); + @a = ((lb - lc) & 4294967295); + @a = (@a & 4294967295); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag32 (@a); + setCFlag (CarrySUB32 (@a, lb, lc)); + setVFlag (OverflowSUB32 (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_SUB3 (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + se32to64(temp_4, b); + tcg_gen_mov_tl(lb, temp_4); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + se32to64(temp_6, c); + tcg_gen_mov_tl(temp_5, temp_6); + tcg_gen_shli_tl(lc, temp_5, 3); + tcg_gen_sub_tl(temp_7, lb, lc); + tcg_gen_andi_tl(a, temp_7, 4294967295); + tcg_gen_andi_tl(a, a, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag32(a); + CarrySUB32(temp_9, a, lb, lc); + tcg_gen_mov_tl(temp_8, temp_9); + setCFlag(temp_8); + OverflowSUB32(temp_11, a, lb, lc); + tcg_gen_mov_tl(temp_10, temp_11); + setVFlag(temp_10); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_4); + tcg_temp_free(lb); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(lc); + tcg_temp_free(temp_7); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(temp_11); + tcg_temp_free(temp_10); + + return ret; +} + + + + + +/* MAX + * Variables: @b, @c, @a + * Functions: getCCFlag, se32to64, getFFlag, setZFlag, setNFlag32, setCFlag, CarrySUB32, setVFlag, OverflowSUB32 +--- code --- +{ + cc_flag = getCCFlag (); + lb = se32to64 (@b); + if((cc_flag == true)) + { + lc = se32to64 (@c); + alu = (lb - lc); + if((lc >= lb)) + { + @a = lc; + } + else + { + @a = lb; + }; + alu = (alu & 4294967295); + if((getFFlag () == true)) + { + setZFlag (alu); + setNFlag32 (alu); + setCFlag (CarrySUB32 (@a, lb, lc)); + setVFlag (OverflowSUB32 (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_MAX (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv alu = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + se32to64(temp_6, b); + tcg_gen_mov_tl(lb, temp_6); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + se32to64(temp_7, c); + tcg_gen_mov_tl(lc, temp_7); + tcg_gen_sub_tl(alu, lb, lc); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_GE, temp_3, lc, lb); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_mov_tl(a, lc); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_mov_tl(a, lb); + gen_set_label(done_2); + tcg_gen_andi_tl(alu, alu, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(alu); + setNFlag32(alu); + CarrySUB32(temp_9, a, lb, lc); + tcg_gen_mov_tl(temp_8, temp_9); + setCFlag(temp_8); + OverflowSUB32(temp_11, a, lb, lc); + tcg_gen_mov_tl(temp_10, temp_11); + setVFlag(temp_10); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_6); + tcg_temp_free(lb); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_7); + tcg_temp_free(lc); + tcg_temp_free(alu); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(temp_11); + tcg_temp_free(temp_10); + + return ret; +} + + + + + +/* MIN + * Variables: @b, @c, @a + * Functions: getCCFlag, se32to64, getFFlag, setZFlag, setNFlag32, setCFlag, CarrySUB32, setVFlag, OverflowSUB32 +--- code --- +{ + cc_flag = getCCFlag (); + lb = se32to64 (@b); + if((cc_flag == true)) + { + lc = se32to64 (@c); + alu = (lb - lc); + if((lc <= lb)) + { + @a = lc; + } + else + { + @a = lb; + }; + alu = (alu & 4294967295); + if((getFFlag () == true)) + { + setZFlag (alu); + setNFlag32 (alu); + setCFlag (CarrySUB32 (@a, lb, lc)); + setVFlag (OverflowSUB32 (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_MIN (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv alu = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + se32to64(temp_6, b); + tcg_gen_mov_tl(lb, temp_6); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + se32to64(temp_7, c); + tcg_gen_mov_tl(lc, temp_7); + tcg_gen_sub_tl(alu, lb, lc); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_LE, temp_3, lc, lb); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_mov_tl(a, lc); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_mov_tl(a, lb); + gen_set_label(done_2); + tcg_gen_andi_tl(alu, alu, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(alu); + setNFlag32(alu); + CarrySUB32(temp_9, a, lb, lc); + tcg_gen_mov_tl(temp_8, temp_9); + setCFlag(temp_8); + OverflowSUB32(temp_11, a, lb, lc); + tcg_gen_mov_tl(temp_10, temp_11); + setVFlag(temp_10); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_6); + tcg_temp_free(lb); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_7); + tcg_temp_free(lc); + tcg_temp_free(alu); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(temp_11); + tcg_temp_free(temp_10); + + return ret; +} + + + + + +/* CMP + * Variables: @b, @c + * Functions: getCCFlag, setZFlag, setNFlag32, setCFlag, CarrySUB32, setVFlag, OverflowSUB32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + v = 4294967295; + lb = (@b & v); + lc = (@c & v); + alu = (lb - lc); + alu = (alu & 4294967295); + setZFlag (alu); + setNFlag32 (alu); + setCFlag (CarrySUB32 (alu, lb, lc)); + setVFlag (OverflowSUB32 (alu, lb, lc)); + }; +} + */ + +int +arc_gen_CMP (DisasCtxt *ctx, TCGv b, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv v = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv alu = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_movi_tl(v, 4294967295); + tcg_gen_and_tl(lb, b, v); + tcg_gen_and_tl(lc, c, v); + tcg_gen_sub_tl(alu, lb, lc); + tcg_gen_andi_tl(alu, alu, 4294967295); + setZFlag(alu); + setNFlag32(alu); + CarrySUB32(temp_5, alu, lb, lc); + tcg_gen_mov_tl(temp_4, temp_5); + setCFlag(temp_4); + OverflowSUB32(temp_7, alu, lb, lc); + tcg_gen_mov_tl(temp_6, temp_7); + setVFlag(temp_6); + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(v); + tcg_temp_free(lb); + tcg_temp_free(lc); + tcg_temp_free(alu); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* AND + * Variables: @a, @b, @c + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @a = (@b & @c); + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + }; + }; +} + */ + +int +arc_gen_AND (DisasCtxt *ctx, TCGv a, TCGv b, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_and_tl(a, b, c); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + + return ret; +} + + + + + +/* OR + * Variables: @a, @b, @c + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @a = (@b | @c); + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + }; + }; +} + */ + +int +arc_gen_OR (DisasCtxt *ctx, TCGv a, TCGv b, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_or_tl(a, b, c); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + + return ret; +} + + + + + +/* XOR + * Variables: @a, @b, @c + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @a = (@b ^ @c); + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + }; + }; +} + */ + +int +arc_gen_XOR (DisasCtxt *ctx, TCGv a, TCGv b, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_xor_tl(a, b, c); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + + return ret; +} + + + + + +/* MOV + * Variables: @a, @b + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @a = @b; + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + }; + }; +} + */ + +int +arc_gen_MOV (DisasCtxt *ctx, TCGv a, TCGv b) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(a, b); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + + return ret; +} + + + + + +/* ASL + * Variables: @b, @c, @a + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag32, setCFlag, getBit, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lb = (@b & 4294967295); + lc = (@c & 31); + la = (lb << lc); + la = (la & 4294967295); + @a = la; + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + if((lc == 0)) + { + setCFlag (0); + } + else + { + setCFlag (getBit (lb, (32 - lc))); + }; + if((@c == 268435457)) + { + t1 = getBit (la, 31); + t2 = getBit (lb, 31); + if((t1 == t2)) + { + setVFlag (0); + } + else + { + setVFlag (1); + }; + }; + }; + }; +} + */ + +int +arc_gen_ASL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_9 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv la = tcg_temp_local_new(); + int f_flag; + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_13 = tcg_temp_local_new(); + TCGv temp_12 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_15 = tcg_temp_local_new(); + TCGv temp_14 = tcg_temp_local_new(); + TCGv t1 = tcg_temp_local_new(); + TCGv temp_17 = tcg_temp_local_new(); + TCGv temp_16 = tcg_temp_local_new(); + TCGv t2 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_18 = tcg_temp_local_new(); + TCGv temp_19 = tcg_temp_local_new(); + getCCFlag(temp_9); + tcg_gen_mov_tl(cc_flag, temp_9); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(lb, b, 4294967295); + tcg_gen_andi_tl(lc, c, 31); + tcg_gen_shl_tl(la, lb, lc); + tcg_gen_andi_tl(la, la, 4294967295); + tcg_gen_mov_tl(a, la); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_3, lc, 0); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_movi_tl(temp_10, 0); + setCFlag(temp_10); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_subfi_tl(temp_13, 32, lc); + getBit(temp_12, lb, temp_13); + tcg_gen_mov_tl(temp_11, temp_12); + setCFlag(temp_11); + gen_set_label(done_2); + TCGLabel *done_3 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_5, c, 268435457); + tcg_gen_xori_tl(temp_6, temp_5, 1); tcg_gen_andi_tl(temp_6, temp_6, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_6, arc_true, done_3);; + tcg_gen_movi_tl(temp_15, 31); + getBit(temp_14, la, temp_15); + tcg_gen_mov_tl(t1, temp_14); + tcg_gen_movi_tl(temp_17, 31); + getBit(temp_16, lb, temp_17); + tcg_gen_mov_tl(t2, temp_16); + TCGLabel *else_4 = gen_new_label(); + TCGLabel *done_4 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_7, t1, t2); + tcg_gen_xori_tl(temp_8, temp_7, 1); tcg_gen_andi_tl(temp_8, temp_8, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_8, arc_true, else_4);; + tcg_gen_movi_tl(temp_18, 0); + setVFlag(temp_18); + tcg_gen_br(done_4); + gen_set_label(else_4); + tcg_gen_movi_tl(temp_19, 1); + setVFlag(temp_19); + gen_set_label(done_4); + gen_set_label(done_3); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_9); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lb); + tcg_temp_free(lc); + tcg_temp_free(la); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_10); + tcg_temp_free(temp_13); + tcg_temp_free(temp_12); + tcg_temp_free(temp_11); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + tcg_temp_free(temp_15); + tcg_temp_free(temp_14); + tcg_temp_free(t1); + tcg_temp_free(temp_17); + tcg_temp_free(temp_16); + tcg_temp_free(t2); + tcg_temp_free(temp_7); + tcg_temp_free(temp_8); + tcg_temp_free(temp_18); + tcg_temp_free(temp_19); + + return ret; +} + + + + + +/* ASR + * Variables: @b, @c, @a + * Functions: getCCFlag, arithmeticShiftRight32, getFFlag, setZFlag, setNFlag32, setCFlag, getBit +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lb = (@b & 4294967295); + lc = (@c & 31); + @a = arithmeticShiftRight32 (lb, lc); + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + if((lc == 0)) + { + setCFlag (0); + } + else + { + setCFlag (getBit (lb, (lc - 1))); + }; + }; + }; +} + */ + +int +arc_gen_ASR (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + int f_flag; + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(lb, b, 4294967295); + tcg_gen_andi_tl(lc, c, 31); + arithmeticShiftRight32(temp_6, lb, lc); + tcg_gen_mov_tl(a, temp_6); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_3, lc, 0); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_movi_tl(temp_7, 0); + setCFlag(temp_7); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_subi_tl(temp_10, lc, 1); + getBit(temp_9, lb, temp_10); + tcg_gen_mov_tl(temp_8, temp_9); + setCFlag(temp_8); + gen_set_label(done_2); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lb); + tcg_temp_free(lc); + tcg_temp_free(temp_6); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_7); + tcg_temp_free(temp_10); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + + return ret; +} + + + + + +/* ASR8 + * Variables: @b, @a + * Functions: getCCFlag, arithmeticShiftRight32, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lb = (@b & 4294967295); + @a = arithmeticShiftRight32 (lb, 8); + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + }; + }; +} + */ + +int +arc_gen_ASR8 (DisasCtxt *ctx, TCGv b, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(lb, b, 4294967295); + tcg_gen_movi_tl(temp_5, 8); + arithmeticShiftRight32(temp_4, lb, temp_5); + tcg_gen_mov_tl(a, temp_4); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lb); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* ASR16 + * Variables: @b, @a + * Functions: getCCFlag, arithmeticShiftRight32, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lb = (@b & 4294967295); + @a = arithmeticShiftRight32 (lb, 16); + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + }; + }; +} + */ + +int +arc_gen_ASR16 (DisasCtxt *ctx, TCGv b, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(lb, b, 4294967295); + tcg_gen_movi_tl(temp_5, 16); + arithmeticShiftRight32(temp_4, lb, temp_5); + tcg_gen_mov_tl(a, temp_4); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lb); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* LSL16 + * Variables: @b, @a + * Functions: getCCFlag, logicalShiftLeft, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lb = (@b & 4294967295); + @a = logicalShiftLeft (lb, 16); + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + }; + }; +} + */ + +int +arc_gen_LSL16 (DisasCtxt *ctx, TCGv b, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(lb, b, 4294967295); + tcg_gen_movi_tl(temp_5, 16); + logicalShiftLeft(temp_4, lb, temp_5); + tcg_gen_mov_tl(a, temp_4); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lb); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* LSL8 + * Variables: @b, @a + * Functions: getCCFlag, logicalShiftLeft, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lb = (@b & 4294967295); + @a = logicalShiftLeft (lb, 8); + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + }; + }; +} + */ + +int +arc_gen_LSL8 (DisasCtxt *ctx, TCGv b, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(lb, b, 4294967295); + tcg_gen_movi_tl(temp_5, 8); + logicalShiftLeft(temp_4, lb, temp_5); + tcg_gen_mov_tl(a, temp_4); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lb); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* LSR + * Variables: @b, @c, @a + * Functions: getCCFlag, logicalShiftRight, getFFlag, setZFlag, setNFlag32, setCFlag, getBit +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lb = (@b & 4294967295); + lc = (@c & 31); + @a = logicalShiftRight (lb, lc); + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + if((lc == 0)) + { + setCFlag (0); + } + else + { + setCFlag (getBit (lb, (lc - 1))); + }; + }; + }; +} + */ + +int +arc_gen_LSR (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + int f_flag; + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(lb, b, 4294967295); + tcg_gen_andi_tl(lc, c, 31); + logicalShiftRight(temp_6, lb, lc); + tcg_gen_mov_tl(a, temp_6); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_3, lc, 0); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_movi_tl(temp_7, 0); + setCFlag(temp_7); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_subi_tl(temp_10, lc, 1); + getBit(temp_9, lb, temp_10); + tcg_gen_mov_tl(temp_8, temp_9); + setCFlag(temp_8); + gen_set_label(done_2); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lb); + tcg_temp_free(lc); + tcg_temp_free(temp_6); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_7); + tcg_temp_free(temp_10); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + + return ret; +} + + + + + +/* LSR16 + * Variables: @b, @a + * Functions: getCCFlag, logicalShiftRight, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lb = (@b & 4294967295); + @a = logicalShiftRight (lb, 16); + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + }; + }; +} + */ + +int +arc_gen_LSR16 (DisasCtxt *ctx, TCGv b, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(lb, b, 4294967295); + tcg_gen_movi_tl(temp_5, 16); + logicalShiftRight(temp_4, lb, temp_5); + tcg_gen_mov_tl(a, temp_4); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lb); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* LSR8 + * Variables: @b, @a + * Functions: getCCFlag, logicalShiftRight, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lb = (@b & 4294967295); + @a = logicalShiftRight (lb, 8); + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + }; + }; +} + */ + +int +arc_gen_LSR8 (DisasCtxt *ctx, TCGv b, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(lb, b, 4294967295); + tcg_gen_movi_tl(temp_5, 8); + logicalShiftRight(temp_4, lb, temp_5); + tcg_gen_mov_tl(a, temp_4); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lb); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* BIC + * Variables: @a, @b, @c + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @a = (@b & ~@c); + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + }; + }; +} + */ + +int +arc_gen_BIC (DisasCtxt *ctx, TCGv a, TCGv b, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_not_tl(temp_4, c); + tcg_gen_and_tl(a, b, temp_4); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* BCLR + * Variables: @c, @a, @b + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + tmp = (1 << (@c & 31)); + @a = (@b & ~tmp); + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + }; + }; +} + */ + +int +arc_gen_BCLR (DisasCtxt *ctx, TCGv c, TCGv a, TCGv b) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv tmp = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(temp_4, c, 31); + tcg_gen_shlfi_tl(tmp, 1, temp_4); + tcg_gen_not_tl(temp_5, tmp); + tcg_gen_and_tl(a, b, temp_5); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(tmp); + tcg_temp_free(temp_5); + + return ret; +} + + + + + +/* BMSK + * Variables: @c, @a, @b + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + tmp1 = ((@c & 31) + 1); + if((tmp1 == 32)) + { + tmp2 = 0xffffffff; + } + else + { + tmp2 = ((1 << tmp1) - 1); + }; + @a = (@b & tmp2); + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + }; + }; +} + */ + +int +arc_gen_BMSK (DisasCtxt *ctx, TCGv c, TCGv a, TCGv b) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv tmp1 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv tmp2 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(temp_6, c, 31); + tcg_gen_addi_tl(tmp1, temp_6, 1); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_3, tmp1, 32); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_movi_tl(tmp2, 0xffffffff); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_shlfi_tl(temp_7, 1, tmp1); + tcg_gen_subi_tl(tmp2, temp_7, 1); + gen_set_label(done_2); + tcg_gen_and_tl(a, b, tmp2); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(tmp1); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(tmp2); + tcg_temp_free(temp_7); + + return ret; +} + + + + + +/* BMSKN + * Variables: @c, @a, @b + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + tmp1 = ((@c & 31) + 1); + if((tmp1 == 32)) + { + tmp2 = 0xffffffff; + } + else + { + tmp2 = ((1 << tmp1) - 1); + }; + @a = (@b & ~tmp2); + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + }; + }; +} + */ + +int +arc_gen_BMSKN (DisasCtxt *ctx, TCGv c, TCGv a, TCGv b) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv tmp1 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv tmp2 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(temp_6, c, 31); + tcg_gen_addi_tl(tmp1, temp_6, 1); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_3, tmp1, 32); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_movi_tl(tmp2, 0xffffffff); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_shlfi_tl(temp_7, 1, tmp1); + tcg_gen_subi_tl(tmp2, temp_7, 1); + gen_set_label(done_2); + tcg_gen_not_tl(temp_8, tmp2); + tcg_gen_and_tl(a, b, temp_8); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(tmp1); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(tmp2); + tcg_temp_free(temp_7); + tcg_temp_free(temp_8); + + return ret; +} + + + + + +/* BSET + * Variables: @c, @a, @b + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + tmp = (1 << (@c & 31)); + @a = (@b | tmp); + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + }; + }; +} + */ + +int +arc_gen_BSET (DisasCtxt *ctx, TCGv c, TCGv a, TCGv b) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv tmp = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(temp_4, c, 31); + tcg_gen_shlfi_tl(tmp, 1, temp_4); + tcg_gen_or_tl(a, b, tmp); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(tmp); + + return ret; +} + + + + + +/* BXOR + * Variables: @c, @a, @b + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + tmp = (1 << @c); + @a = (@b ^ tmp); + f_flag = getFFlag (); + @a = (@a & 4294967295); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag32 (@a); + }; + }; +} + */ + +int +arc_gen_BXOR (DisasCtxt *ctx, TCGv c, TCGv a, TCGv b) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv tmp = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_shlfi_tl(tmp, 1, c); + tcg_gen_xor_tl(a, b, tmp); + f_flag = getFFlag (); + tcg_gen_andi_tl(a, a, 4294967295); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag32(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(tmp); + + return ret; +} + + + + + +/* ROL + * Variables: @src, @n, @dest + * Functions: getCCFlag, rotateLeft32, getFFlag, setZFlag, setNFlag32, setCFlag, extractBits +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lsrc = (@src & 4294967295); + ln = (@n & 31); + @dest = rotateLeft32 (lsrc, ln); + f_flag = getFFlag (); + @dest = (@dest & 4294967295); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag32 (@dest); + setCFlag (extractBits (lsrc, 31, 31)); + }; + }; +} + */ + +int +arc_gen_ROL (DisasCtxt *ctx, TCGv src, TCGv n, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lsrc = tcg_temp_local_new(); + TCGv ln = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(lsrc, src, 4294967295); + tcg_gen_andi_tl(ln, n, 31); + rotateLeft32(temp_4, lsrc, ln); + tcg_gen_mov_tl(dest, temp_4); + f_flag = getFFlag (); + tcg_gen_andi_tl(dest, dest, 4294967295); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag32(dest); + tcg_gen_movi_tl(temp_8, 31); + tcg_gen_movi_tl(temp_7, 31); + extractBits(temp_6, lsrc, temp_7, temp_8); + tcg_gen_mov_tl(temp_5, temp_6); + setCFlag(temp_5); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lsrc); + tcg_temp_free(ln); + tcg_temp_free(temp_4); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + + return ret; +} + + + + + +/* ROL8 + * Variables: @src, @dest + * Functions: getCCFlag, rotateLeft32, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lsrc = (@src & 4294967295); + @dest = rotateLeft32 (lsrc, 8); + f_flag = getFFlag (); + @dest = (@dest & 4294967295); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag32 (@dest); + }; + }; +} + */ + +int +arc_gen_ROL8 (DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lsrc = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(lsrc, src, 4294967295); + tcg_gen_movi_tl(temp_5, 8); + rotateLeft32(temp_4, lsrc, temp_5); + tcg_gen_mov_tl(dest, temp_4); + f_flag = getFFlag (); + tcg_gen_andi_tl(dest, dest, 4294967295); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag32(dest); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lsrc); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* ROR + * Variables: @src, @n, @dest + * Functions: getCCFlag, rotateRight32, getFFlag, setZFlag, setNFlag32, setCFlag, extractBits +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lsrc = (@src & 4294967295); + ln = (@n & 31); + @dest = rotateRight32 (lsrc, ln); + f_flag = getFFlag (); + @dest = (@dest & 4294967295); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag32 (@dest); + setCFlag (extractBits (lsrc, (ln - 1), (ln - 1))); + }; + }; +} + */ + +int +arc_gen_ROR (DisasCtxt *ctx, TCGv src, TCGv n, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lsrc = tcg_temp_local_new(); + TCGv ln = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(lsrc, src, 4294967295); + tcg_gen_andi_tl(ln, n, 31); + rotateRight32(temp_4, lsrc, ln); + tcg_gen_mov_tl(dest, temp_4); + f_flag = getFFlag (); + tcg_gen_andi_tl(dest, dest, 4294967295); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag32(dest); + tcg_gen_subi_tl(temp_8, ln, 1); + tcg_gen_subi_tl(temp_7, ln, 1); + extractBits(temp_6, lsrc, temp_7, temp_8); + tcg_gen_mov_tl(temp_5, temp_6); + setCFlag(temp_5); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lsrc); + tcg_temp_free(ln); + tcg_temp_free(temp_4); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + + return ret; +} + + + + + +/* ROR8 + * Variables: @src, @dest + * Functions: getCCFlag, rotateRight32, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lsrc = (@src & 4294967295); + @dest = rotateRight32 (lsrc, 8); + f_flag = getFFlag (); + @dest = (@dest & 4294967295); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag32 (@dest); + }; + }; +} + */ + +int +arc_gen_ROR8 (DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lsrc = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(lsrc, src, 4294967295); + tcg_gen_movi_tl(temp_5, 8); + rotateRight32(temp_4, lsrc, temp_5); + tcg_gen_mov_tl(dest, temp_4); + f_flag = getFFlag (); + tcg_gen_andi_tl(dest, dest, 4294967295); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag32(dest); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lsrc); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* RLC + * Variables: @src, @dest + * Functions: getCCFlag, getCFlag, getFFlag, setZFlag, setNFlag32, setCFlag, extractBits +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lsrc = (@src & 4294967295); + @dest = (lsrc << 1); + @dest = (@dest | getCFlag ()); + f_flag = getFFlag (); + @dest = (@dest & 4294967295); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag32 (@dest); + setCFlag (extractBits (lsrc, 31, 31)); + }; + }; +} + */ + +int +arc_gen_RLC (DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lsrc = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(lsrc, src, 4294967295); + tcg_gen_shli_tl(dest, lsrc, 1); + getCFlag(temp_5); + tcg_gen_mov_tl(temp_4, temp_5); + tcg_gen_or_tl(dest, dest, temp_4); + f_flag = getFFlag (); + tcg_gen_andi_tl(dest, dest, 4294967295); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag32(dest); + tcg_gen_movi_tl(temp_9, 31); + tcg_gen_movi_tl(temp_8, 31); + extractBits(temp_7, lsrc, temp_8, temp_9); + tcg_gen_mov_tl(temp_6, temp_7); + setCFlag(temp_6); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lsrc); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* RRC + * Variables: @src, @dest + * Functions: getCCFlag, getCFlag, getFFlag, setZFlag, setNFlag32, setCFlag, extractBits +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lsrc = (@src & 4294967295); + @dest = (lsrc >> 1); + @dest = (@dest | (getCFlag () << 31)); + f_flag = getFFlag (); + @dest = (@dest & 4294967295); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag32 (@dest); + setCFlag (extractBits (lsrc, 0, 0)); + }; + }; +} + */ + +int +arc_gen_RRC (DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lsrc = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(lsrc, src, 4294967295); + tcg_gen_shri_tl(dest, lsrc, 1); + getCFlag(temp_6); + tcg_gen_mov_tl(temp_5, temp_6); + tcg_gen_shli_tl(temp_4, temp_5, 31); + tcg_gen_or_tl(dest, dest, temp_4); + f_flag = getFFlag (); + tcg_gen_andi_tl(dest, dest, 4294967295); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag32(dest); + tcg_gen_movi_tl(temp_10, 0); + tcg_gen_movi_tl(temp_9, 0); + extractBits(temp_8, lsrc, temp_9, temp_10); + tcg_gen_mov_tl(temp_7, temp_8); + setCFlag(temp_7); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lsrc); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + tcg_temp_free(temp_10); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + + return ret; +} + + + + + +/* SEXB + * Variables: @dest, @src + * Functions: getCCFlag, arithmeticShiftRight, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @dest = arithmeticShiftRight ((@src << 56), 56); + f_flag = getFFlag (); + @dest = (@dest & 4294967295); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag32 (@dest); + }; + }; +} + */ + +int +arc_gen_SEXB (DisasCtxt *ctx, TCGv dest, TCGv src) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_movi_tl(temp_6, 56); + tcg_gen_shli_tl(temp_5, src, 56); + arithmeticShiftRight(temp_4, temp_5, temp_6); + tcg_gen_mov_tl(dest, temp_4); + f_flag = getFFlag (); + tcg_gen_andi_tl(dest, dest, 4294967295); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag32(dest); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* SEXH + * Variables: @dest, @src + * Functions: getCCFlag, arithmeticShiftRight, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @dest = arithmeticShiftRight ((@src << 48), 48); + f_flag = getFFlag (); + @dest = (@dest & 4294967295); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag32 (@dest); + }; + }; +} + */ + +int +arc_gen_SEXH (DisasCtxt *ctx, TCGv dest, TCGv src) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_movi_tl(temp_6, 48); + tcg_gen_shli_tl(temp_5, src, 48); + arithmeticShiftRight(temp_4, temp_5, temp_6); + tcg_gen_mov_tl(dest, temp_4); + f_flag = getFFlag (); + tcg_gen_andi_tl(dest, dest, 4294967295); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag32(dest); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* EXTB + * Variables: @dest, @src + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @dest = (@src & 255); + f_flag = getFFlag (); + @dest = (@dest & 4294967295); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag32 (@dest); + }; + }; +} + */ + +int +arc_gen_EXTB (DisasCtxt *ctx, TCGv dest, TCGv src) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(dest, src, 255); + f_flag = getFFlag (); + tcg_gen_andi_tl(dest, dest, 4294967295); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag32(dest); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + + return ret; +} + + + + + +/* EXTH + * Variables: @dest, @src + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @dest = (@src & 65535); + f_flag = getFFlag (); + @dest = (@dest & 4294967295); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag32 (@dest); + }; + }; +} + */ + +int +arc_gen_EXTH (DisasCtxt *ctx, TCGv dest, TCGv src) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(dest, src, 65535); + f_flag = getFFlag (); + tcg_gen_andi_tl(dest, dest, 4294967295); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag32(dest); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + + return ret; +} + + + + + +/* BTST + * Variables: @c, @b + * Functions: getCCFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + tmp = (1 << (@c & 31)); + alu = (@b & tmp); + alu = (alu & 4294967295); + setZFlag (alu); + setNFlag32 (alu); + }; +} + */ + +int +arc_gen_BTST (DisasCtxt *ctx, TCGv c, TCGv b) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv tmp = tcg_temp_local_new(); + TCGv alu = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(temp_4, c, 31); + tcg_gen_shlfi_tl(tmp, 1, temp_4); + tcg_gen_and_tl(alu, b, tmp); + tcg_gen_andi_tl(alu, alu, 4294967295); + setZFlag(alu); + setNFlag32(alu); + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(tmp); + tcg_temp_free(alu); + + return ret; +} + + + + + +/* TST + * Variables: @b, @c + * Functions: getCCFlag, setZFlag, setNFlag32 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + alu = (@b & @c); + alu = (alu & 4294967295); + setZFlag (alu); + setNFlag32 (alu); + }; +} + */ + +int +arc_gen_TST (DisasCtxt *ctx, TCGv b, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv alu = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_and_tl(alu, b, c); + tcg_gen_andi_tl(alu, alu, 4294967295); + setZFlag(alu); + setNFlag32(alu); + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(alu); + + return ret; +} + + + + + +/* XBFU + * Variables: @src2, @src1, @dest + * Functions: getCCFlag, extractBits, getFFlag, setZFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + N = extractBits (@src2, 4, 0); + M = (extractBits (@src2, 9, 5) + 1); + tmp1 = (@src1 >> N); + tmp2 = ((1 << M) - 1); + @dest = (tmp1 & tmp2); + @dest = (@dest & 4294967295); + if((getFFlag () == true)) + { + setZFlag (@dest); + }; + }; +} + */ + +int +arc_gen_XBFU (DisasCtxt *ctx, TCGv src2, TCGv src1, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv N = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv M = tcg_temp_local_new(); + TCGv tmp1 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv tmp2 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_movi_tl(temp_6, 0); + tcg_gen_movi_tl(temp_5, 4); + extractBits(temp_4, src2, temp_5, temp_6); + tcg_gen_mov_tl(N, temp_4); + tcg_gen_movi_tl(temp_10, 5); + tcg_gen_movi_tl(temp_9, 9); + extractBits(temp_8, src2, temp_9, temp_10); + tcg_gen_mov_tl(temp_7, temp_8); + tcg_gen_addi_tl(M, temp_7, 1); + tcg_gen_shr_tl(tmp1, src1, N); + tcg_gen_shlfi_tl(temp_11, 1, M); + tcg_gen_subi_tl(tmp2, temp_11, 1); + tcg_gen_and_tl(dest, tmp1, tmp2); + tcg_gen_andi_tl(dest, dest, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(dest); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + tcg_temp_free(N); + tcg_temp_free(temp_10); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + tcg_temp_free(M); + tcg_temp_free(tmp1); + tcg_temp_free(temp_11); + tcg_temp_free(tmp2); + + return ret; +} + + + + + +/* AEX + * Variables: @src2, @b + * Functions: getCCFlag, readAuxReg, writeAuxReg +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + tmp = readAuxReg (@src2); + writeAuxReg (@src2, @b); + @b = tmp; + }; +} + */ + +int +arc_gen_AEX (DisasCtxt *ctx, TCGv src2, TCGv b) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv tmp = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + readAuxReg(temp_4, src2); + tcg_gen_mov_tl(tmp, temp_4); + writeAuxReg(src2, b); + tcg_gen_mov_tl(b, tmp); + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(tmp); + + return ret; +} + + + + + +/* LR + * Variables: @dest, @src + * Functions: readAuxReg +--- code --- +{ + @dest = readAuxReg (@src); +} + */ + +int +arc_gen_LR (DisasCtxt *ctx, TCGv dest, TCGv src) +{ + int ret = DISAS_NEXT; + TCGv temp_1 = tcg_temp_local_new(); + readAuxReg(temp_1, src); + tcg_gen_andi_tl(temp_1, temp_1, 0xffffffff); + tcg_gen_mov_tl(dest, temp_1); + tcg_temp_free(temp_1); + + return ret; +} + + + + + +/* CLRI + * Variables: @c + * Functions: getRegister, setRegister +--- code --- +{ + status32 = getRegister (R_STATUS32); + ie = (status32 & 2147483648); + ie = (ie >> 27); + e = ((status32 & 30) >> 1); + a = 32; + @c = ((ie | e) | a); + mask = 2147483648; + mask = ~mask; + status32 = (status32 & mask); + setRegister (R_STATUS32, status32); +} + */ + +int +arc_gen_CLRI (DisasCtxt *ctx, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_1 = tcg_temp_local_new(); + TCGv status32 = tcg_temp_local_new(); + TCGv ie = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv e = tcg_temp_local_new(); + TCGv a = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv mask = tcg_temp_local_new(); + getRegister(temp_1, R_STATUS32); + tcg_gen_mov_tl(status32, temp_1); + tcg_gen_andi_tl(ie, status32, 2147483648); + tcg_gen_shri_tl(ie, ie, 27); + tcg_gen_andi_tl(temp_2, status32, 30); + tcg_gen_shri_tl(e, temp_2, 1); + tcg_gen_movi_tl(a, 32); + tcg_gen_or_tl(temp_3, ie, e); + tcg_gen_or_tl(c, temp_3, a); + tcg_gen_movi_tl(mask, 2147483648); + tcg_gen_not_tl(mask, mask); + tcg_gen_and_tl(status32, status32, mask); + setRegister(R_STATUS32, status32); + tcg_temp_free(temp_1); + tcg_temp_free(status32); + tcg_temp_free(ie); + tcg_temp_free(temp_2); + tcg_temp_free(e); + tcg_temp_free(a); + tcg_temp_free(temp_3); + tcg_temp_free(mask); + + return ret; +} + + + + + +/* SETI + * Variables: @c + * Functions: getRegister, setRegister +--- code --- +{ + status32 = getRegister (R_STATUS32); + e_mask = 30; + e_mask = ~e_mask; + e_value = ((@c & 15) << 1); + temp1 = (@c & 32); + if((temp1 != 0)) + { + status32 = ((status32 & e_mask) | e_value); + ie_mask = 2147483648; + ie_mask = ~ie_mask; + ie_value = ((@c & 16) << 27); + status32 = ((status32 & ie_mask) | ie_value); + } + else + { + status32 = (status32 | 2147483648); + temp2 = (@c & 16); + if((temp2 != 0)) + { + status32 = ((status32 & e_mask) | e_value); + }; + }; + setRegister (R_STATUS32, status32); +} + */ + +int +arc_gen_SETI (DisasCtxt *ctx, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv status32 = tcg_temp_local_new(); + TCGv e_mask = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv e_value = tcg_temp_local_new(); + TCGv temp1 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv ie_mask = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv ie_value = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp2 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + getRegister(temp_5, R_STATUS32); + tcg_gen_mov_tl(status32, temp_5); + tcg_gen_movi_tl(e_mask, 30); + tcg_gen_not_tl(e_mask, e_mask); + tcg_gen_andi_tl(temp_6, c, 15); + tcg_gen_shli_tl(e_value, temp_6, 1); + tcg_gen_andi_tl(temp1, c, 32); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_1, temp1, 0); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_1);; + tcg_gen_and_tl(temp_7, status32, e_mask); + tcg_gen_or_tl(status32, temp_7, e_value); + tcg_gen_movi_tl(ie_mask, 2147483648); + tcg_gen_not_tl(ie_mask, ie_mask); + tcg_gen_andi_tl(temp_8, c, 16); + tcg_gen_shli_tl(ie_value, temp_8, 27); + tcg_gen_and_tl(temp_9, status32, ie_mask); + tcg_gen_or_tl(status32, temp_9, ie_value); + tcg_gen_br(done_1); + gen_set_label(else_1); + tcg_gen_ori_tl(status32, status32, 2147483648); + tcg_gen_andi_tl(temp2, c, 16); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_3, temp2, 0); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, done_2);; + tcg_gen_and_tl(temp_10, status32, e_mask); + tcg_gen_or_tl(status32, temp_10, e_value); + gen_set_label(done_2); + gen_set_label(done_1); + setRegister(R_STATUS32, status32); + tcg_temp_free(temp_5); + tcg_temp_free(status32); + tcg_temp_free(e_mask); + tcg_temp_free(temp_6); + tcg_temp_free(e_value); + tcg_temp_free(temp1); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_7); + tcg_temp_free(ie_mask); + tcg_temp_free(temp_8); + tcg_temp_free(ie_value); + tcg_temp_free(temp_9); + tcg_temp_free(temp2); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_10); + + return ret; +} + + + + + +/* NOP + * Variables: + * Functions: doNothing +--- code --- +{ + doNothing (); +} + */ + +int +arc_gen_NOP (DisasCtxt *ctx) +{ + int ret = DISAS_NEXT; + + return ret; +} + + + + + +/* PREALLOC + * Variables: + * Functions: doNothing +--- code --- +{ + doNothing (); +} + */ + +int +arc_gen_PREALLOC (DisasCtxt *ctx) +{ + int ret = DISAS_NEXT; + + return ret; +} + + + + + +/* PREFETCH + * Variables: @src1, @src2 + * Functions: getAAFlag, doNothing +--- code --- +{ + AA = getAAFlag (); + if(((AA == 1) || (AA == 2))) + { + @src1 = (@src1 + @src2); + } + else + { + doNothing (); + }; +} + */ + +int +arc_gen_PREFETCH (DisasCtxt *ctx, TCGv src1, TCGv src2) +{ + int ret = DISAS_NEXT; + int AA; + AA = getAAFlag (); + if (((AA == 1) || (AA == 2))) + { + tcg_gen_add_tl(src1, src1, src2); +; + } + else + { + doNothing(); +; + } + + return ret; +} + + + + + +/* MPY + * Variables: @b, @c, @a + * Functions: getCCFlag, getFFlag, HELPER, setZFlag, setNFlag32, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + _b = @b; + _c = @c; + @a = ((_b * _c) & 4294967295); + @a = (@a & 4294967295); + if((getFFlag () == true)) + { + high_part = HELPER (mpym, _b, _c); + tmp1 = (high_part & 2147483648); + tmp2 = (@a & 2147483648); + setZFlag (@a); + setNFlag32 (high_part); + setVFlag ((tmp1 != tmp2)); + }; + }; +} + */ + +int +arc_gen_MPY (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv _b = tcg_temp_local_new(); + TCGv _c = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv high_part = tcg_temp_local_new(); + TCGv tmp1 = tcg_temp_local_new(); + TCGv tmp2 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(_b, b); + tcg_gen_mov_tl(_c, c); + tcg_gen_mul_tl(temp_4, _b, _c); + tcg_gen_andi_tl(a, temp_4, 4294967295); + tcg_gen_andi_tl(a, a, 4294967295); + if ((getFFlag () == true)) + { + ARC_HELPER(mpym, high_part, _b, _c); + tcg_gen_andi_tl(tmp1, high_part, 2147483648); + tcg_gen_andi_tl(tmp2, a, 2147483648); + setZFlag(a); + setNFlag32(high_part); + tcg_gen_setcond_tl(TCG_COND_NE, temp_5, tmp1, tmp2); + setVFlag(temp_5); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(_b); + tcg_temp_free(_c); + tcg_temp_free(temp_4); + tcg_temp_free(high_part); + tcg_temp_free(tmp1); + tcg_temp_free(tmp2); + tcg_temp_free(temp_5); + + return ret; +} + + + + + +/* MPYMU + * Variables: @a, @b, @c + * Functions: getCCFlag, HELPER, getFFlag, setZFlag, setNFlag32, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @a = HELPER (mpymu, @b, @c); + @a = (@a & 4294967295); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag32 (0); + setVFlag (0); + }; + }; +} + */ + +int +arc_gen_MPYMU (DisasCtxt *ctx, TCGv a, TCGv b, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + ARC_HELPER(mpymu, a, b, c); + tcg_gen_andi_tl(a, a, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(a); + tcg_gen_movi_tl(temp_4, 0); + setNFlag32(temp_4); + tcg_gen_movi_tl(temp_5, 0); + setVFlag(temp_5); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + + return ret; +} + + + + + +/* MPYM + * Variables: @a, @b, @c + * Functions: getCCFlag, HELPER, getFFlag, setZFlag, setNFlag32, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @a = HELPER (mpym, @b, @c); + @a = (@a & 4294967295); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag32 (@a); + setVFlag (0); + }; + }; +} + */ + +int +arc_gen_MPYM (DisasCtxt *ctx, TCGv a, TCGv b, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + ARC_HELPER(mpym, a, b, c); + tcg_gen_andi_tl(a, a, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag32(a); + tcg_gen_movi_tl(temp_4, 0); + setVFlag(temp_4); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* MPYU + * Variables: @b, @c, @a + * Functions: getCCFlag, getFFlag, HELPER, setZFlag, setNFlag32, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + _b = @b; + _c = @c; + @a = ((_b * _c) & 4294967295); + @a = (@a & 4294967295); + if((getFFlag () == true)) + { + high_part = HELPER (mpym, _b, _c); + setZFlag (@a); + setNFlag32 (0); + setVFlag ((high_part > 0)); + }; + }; +} + */ + +int +arc_gen_MPYU (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv _b = tcg_temp_local_new(); + TCGv _c = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv high_part = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(_b, b); + tcg_gen_mov_tl(_c, c); + tcg_gen_mul_tl(temp_4, _b, _c); + tcg_gen_andi_tl(a, temp_4, 4294967295); + tcg_gen_andi_tl(a, a, 4294967295); + if ((getFFlag () == true)) + { + ARC_HELPER(mpym, high_part, _b, _c); + setZFlag(a); + tcg_gen_movi_tl(temp_5, 0); + setNFlag32(temp_5); + tcg_gen_setcondi_tl(TCG_COND_GT, temp_6, high_part, 0); + setVFlag(temp_6); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(_b); + tcg_temp_free(_c); + tcg_temp_free(temp_4); + tcg_temp_free(high_part); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* MPYUW + * Variables: @a, @b, @c + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag32, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @a = ((@b & 65535) * (@c & 65535)); + @a = (@a & 4294967295); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag32 (0); + setVFlag (0); + }; + }; +} + */ + +int +arc_gen_MPYUW (DisasCtxt *ctx, TCGv a, TCGv b, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(temp_5, c, 65535); + tcg_gen_andi_tl(temp_4, b, 65535); + tcg_gen_mul_tl(a, temp_4, temp_5); + tcg_gen_andi_tl(a, a, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(a); + tcg_gen_movi_tl(temp_6, 0); + setNFlag32(temp_6); + tcg_gen_movi_tl(temp_7, 0); + setVFlag(temp_7); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + tcg_temp_free(temp_6); + tcg_temp_free(temp_7); + + return ret; +} + + + + + +/* MPYW + * Variables: @a, @b, @c + * Functions: getCCFlag, arithmeticShiftRight, getFFlag, setZFlag, setNFlag32, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @a = (arithmeticShiftRight ((@b << 48), 48) * arithmeticShiftRight ((@c << 48), 48)); + @a = (@a & 4294967295); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag32 (@a); + setVFlag (0); + }; + }; +} + */ + +int +arc_gen_MPYW (DisasCtxt *ctx, TCGv a, TCGv b, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_12 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_movi_tl(temp_11, 48); + tcg_gen_shli_tl(temp_10, c, 48); + tcg_gen_movi_tl(temp_7, 48); + tcg_gen_shli_tl(temp_6, b, 48); + arithmeticShiftRight(temp_5, temp_6, temp_7); + tcg_gen_mov_tl(temp_4, temp_5); + arithmeticShiftRight(temp_9, temp_10, temp_11); + tcg_gen_mov_tl(temp_8, temp_9); + tcg_gen_mul_tl(a, temp_4, temp_8); + tcg_gen_andi_tl(a, a, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag32(a); + tcg_gen_movi_tl(temp_12, 0); + setVFlag(temp_12); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_11); + tcg_temp_free(temp_10); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(temp_12); + + return ret; +} + + + + + +/* DIV + * Variables: @src2, @src1, @dest + * Functions: getCCFlag, divSigned, getFFlag, setZFlag, setNFlag32, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + if(((@src2 != 0) && ((@src1 != 2147483648) || (@src2 != 4294967295)))) + { + @dest = divSigned (@src1, @src2); + if((getFFlag () == true)) + { + setZFlag (@dest); + setNFlag32 (@dest); + setVFlag (0); + }; + } + else + { + }; + }; +} + */ + +int +arc_gen_DIV (DisasCtxt *ctx, TCGv src2, TCGv src1, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_9 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + getCCFlag(temp_9); + tcg_gen_mov_tl(cc_flag, temp_9); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_3, src2, 0); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_4, src1, 2147483648); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_5, src2, 4294967295); + tcg_gen_or_tl(temp_6, temp_4, temp_5); + tcg_gen_and_tl(temp_7, temp_3, temp_6); + tcg_gen_xori_tl(temp_8, temp_7, 1); tcg_gen_andi_tl(temp_8, temp_8, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_8, arc_true, else_2);; + divSigned(temp_10, src1, src2); + tcg_gen_mov_tl(dest, temp_10); + if ((getFFlag () == true)) + { + setZFlag(dest); + setNFlag32(dest); + tcg_gen_movi_tl(temp_11, 0); + setVFlag(temp_11); +; + } + else + { + ; + } + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + gen_set_label(done_1); + tcg_temp_free(temp_9); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + tcg_temp_free(temp_7); + tcg_temp_free(temp_8); + tcg_temp_free(temp_10); + tcg_temp_free(temp_11); + + return ret; +} + + + + + +/* DIVU + * Variables: @src2, @dest, @src1 + * Functions: getCCFlag, divUnsigned, getFFlag, setZFlag, setNFlag32, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + if((@src2 != 0)) + { + @dest = divUnsigned (@src1, @src2); + if((getFFlag () == true)) + { + setZFlag (@dest); + setNFlag32 (0); + setVFlag (0); + }; + } + else + { + }; + }; +} + */ + +int +arc_gen_DIVU (DisasCtxt *ctx, TCGv src2, TCGv dest, TCGv src1) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_3, src2, 0); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + divUnsigned(temp_6, src1, src2); + tcg_gen_mov_tl(dest, temp_6); + if ((getFFlag () == true)) + { + setZFlag(dest); + tcg_gen_movi_tl(temp_7, 0); + setNFlag32(temp_7); + tcg_gen_movi_tl(temp_8, 0); + setVFlag(temp_8); +; + } + else + { + ; + } + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_6); + tcg_temp_free(temp_7); + tcg_temp_free(temp_8); + + return ret; +} + + + + + +/* REM + * Variables: @src2, @src1, @dest + * Functions: getCCFlag, divRemainingSigned, getFFlag, setZFlag, setNFlag32, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + if(((@src2 != 0) && ((@src1 != 2147483648) || (@src2 != 4294967295)))) + { + @dest = divRemainingSigned (@src1, @src2); + if((getFFlag () == true)) + { + setZFlag (@dest); + setNFlag32 (@dest); + setVFlag (0); + }; + } + else + { + }; + }; +} + */ + +int +arc_gen_REM (DisasCtxt *ctx, TCGv src2, TCGv src1, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_9 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + getCCFlag(temp_9); + tcg_gen_mov_tl(cc_flag, temp_9); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_3, src2, 0); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_4, src1, 2147483648); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_5, src2, 4294967295); + tcg_gen_or_tl(temp_6, temp_4, temp_5); + tcg_gen_and_tl(temp_7, temp_3, temp_6); + tcg_gen_xori_tl(temp_8, temp_7, 1); tcg_gen_andi_tl(temp_8, temp_8, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_8, arc_true, else_2);; + divRemainingSigned(temp_10, src1, src2); + tcg_gen_mov_tl(dest, temp_10); + if ((getFFlag () == true)) + { + setZFlag(dest); + setNFlag32(dest); + tcg_gen_movi_tl(temp_11, 0); + setVFlag(temp_11); +; + } + else + { + ; + } + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + gen_set_label(done_1); + tcg_temp_free(temp_9); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + tcg_temp_free(temp_7); + tcg_temp_free(temp_8); + tcg_temp_free(temp_10); + tcg_temp_free(temp_11); + + return ret; +} + + + + + +/* REMU + * Variables: @src2, @dest, @src1 + * Functions: getCCFlag, divRemainingUnsigned, getFFlag, setZFlag, setNFlag32, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + if((@src2 != 0)) + { + @dest = divRemainingUnsigned (@src1, @src2); + if((getFFlag () == true)) + { + setZFlag (@dest); + setNFlag32 (0); + setVFlag (0); + }; + } + else + { + }; + }; +} + */ + +int +arc_gen_REMU (DisasCtxt *ctx, TCGv src2, TCGv dest, TCGv src1) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_3, src2, 0); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + divRemainingUnsigned(temp_6, src1, src2); + tcg_gen_mov_tl(dest, temp_6); + if ((getFFlag () == true)) + { + setZFlag(dest); + tcg_gen_movi_tl(temp_7, 0); + setNFlag32(temp_7); + tcg_gen_movi_tl(temp_8, 0); + setVFlag(temp_8); +; + } + else + { + ; + } + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_6); + tcg_temp_free(temp_7); + tcg_temp_free(temp_8); + + return ret; +} + + + + + +/* MAC + * Variables: @b, @c, @a + * Functions: getCCFlag, getRegister, MAC, getFFlag, setNFlag32, OverflowADD, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + old_acchi = getRegister (R_ACCHI); + high_mul = MAC (@b, @c); + @a = getRegister (R_ACCLO); + @a = @a & 0xffffffff; + if((getFFlag () == true)) + { + new_acchi = getRegister (R_ACCHI); + setNFlag32 (new_acchi); + if((OverflowADD (new_acchi, old_acchi, high_mul) == true)) + { + setVFlag (1); + }; + }; + }; +} + */ + +int +arc_gen_MAC (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv old_acchi = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv high_mul = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv new_acchi = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + getRegister(temp_6, R_ACCHI); + tcg_gen_mov_tl(old_acchi, temp_6); + MAC(temp_7, b, c); + tcg_gen_mov_tl(high_mul, temp_7); + getRegister(temp_8, R_ACCLO); + tcg_gen_andi_tl(a, a, 0xffffffff); + tcg_gen_mov_tl(a, temp_8); + if ((getFFlag () == true)) + { + getRegister(temp_9, R_ACCHI); + tcg_gen_mov_tl(new_acchi, temp_9); + setNFlag32(new_acchi); + TCGLabel *done_2 = gen_new_label(); + OverflowADD(temp_10, new_acchi, old_acchi, high_mul); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_3, temp_10, arc_true); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, done_2);; + tcg_gen_movi_tl(temp_11, 1); + setVFlag(temp_11); + gen_set_label(done_2); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(old_acchi); + tcg_temp_free(temp_7); + tcg_temp_free(high_mul); + tcg_temp_free(temp_8); + tcg_temp_free(temp_9); + tcg_temp_free(new_acchi); + tcg_temp_free(temp_10); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_11); + + return ret; +} + + + + + +/* MACU + * Variables: @b, @c, @a + * Functions: getCCFlag, getRegister, MACU, getFFlag, CarryADD32, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + old_acchi = getRegister (R_ACCHI); + high_mul = MACU (@b, @c); + @a = getRegister (R_ACCLO); + if((getFFlag () == true)) + { + new_acchi = getRegister (R_ACCHI); + if((CarryADD32 (new_acchi, old_acchi, high_mul) == true)) + { + setVFlag (1); + }; + }; + }; +} + */ + +int +arc_gen_MACU (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv old_acchi = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv high_mul = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv new_acchi = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + getRegister(temp_6, R_ACCHI); + tcg_gen_mov_tl(old_acchi, temp_6); + MACU(temp_7, b, c); + tcg_gen_mov_tl(high_mul, temp_7); + getRegister(temp_8, R_ACCLO); + tcg_gen_mov_tl(a, temp_8); + if ((getFFlag () == true)) + { + getRegister(temp_9, R_ACCHI); + tcg_gen_mov_tl(new_acchi, temp_9); + TCGLabel *done_2 = gen_new_label(); + CarryADD32(temp_10, new_acchi, old_acchi, high_mul); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_3, temp_10, arc_true); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, done_2);; + tcg_gen_movi_tl(temp_11, 1); + setVFlag(temp_11); + gen_set_label(done_2); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(old_acchi); + tcg_temp_free(temp_7); + tcg_temp_free(high_mul); + tcg_temp_free(temp_8); + tcg_temp_free(temp_9); + tcg_temp_free(new_acchi); + tcg_temp_free(temp_10); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_11); + + return ret; +} + + + + + +/* MACD + * Variables: @b, @c, @a + * Functions: getCCFlag, getRegister, MAC, nextReg, getFFlag, setNFlag32, OverflowADD32, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + old_acchi = getRegister (R_ACCHI); + high_mul = MAC (@b, @c); + @a = getRegister (R_ACCLO); + pair = nextReg (a); + pair = getRegister (R_ACCHI); + if((getFFlag () == true)) + { + new_acchi = getRegister (R_ACCHI); + setNFlag32 (new_acchi); + if((OverflowADD32 (new_acchi, old_acchi, high_mul) == true)) + { + setVFlag (1); + }; + }; + }; +} + */ + +int +arc_gen_MACD (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv old_acchi = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv high_mul = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv pair = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv new_acchi = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_12 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + getRegister(temp_6, R_ACCHI); + tcg_gen_mov_tl(old_acchi, temp_6); + MAC(temp_7, b, c); + tcg_gen_mov_tl(high_mul, temp_7); + getRegister(temp_8, R_ACCLO); + tcg_gen_mov_tl(a, temp_8); + pair = nextReg (a); + getRegister(temp_9, R_ACCHI); + tcg_gen_mov_tl(pair, temp_9); + if ((getFFlag () == true)) + { + getRegister(temp_10, R_ACCHI); + tcg_gen_mov_tl(new_acchi, temp_10); + setNFlag32(new_acchi); + TCGLabel *done_2 = gen_new_label(); + OverflowADD32(temp_11, new_acchi, old_acchi, high_mul); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_3, temp_11, arc_true); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, done_2);; + tcg_gen_movi_tl(temp_12, 1); + setVFlag(temp_12); + gen_set_label(done_2); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(old_acchi); + tcg_temp_free(temp_7); + tcg_temp_free(high_mul); + tcg_temp_free(temp_8); + tcg_temp_free(temp_9); + tcg_temp_free(temp_10); + tcg_temp_free(new_acchi); + tcg_temp_free(temp_11); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_12); + + return ret; +} + + + + + +/* MACDU + * Variables: @b, @c, @a + * Functions: getCCFlag, getRegister, MACU, nextReg, getFFlag, CarryADD32, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + old_acchi = getRegister (R_ACCHI); + high_mul = MACU (@b, @c); + @a = getRegister (R_ACCLO); + pair = nextReg (a); + pair = getRegister (R_ACCHI); + if((getFFlag () == true)) + { + new_acchi = getRegister (R_ACCHI); + if((CarryADD32 (new_acchi, old_acchi, high_mul) == true)) + { + setVFlag (1); + }; + }; + }; +} + */ + +int +arc_gen_MACDU (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv old_acchi = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv high_mul = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv pair = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv new_acchi = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_12 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + getRegister(temp_6, R_ACCHI); + tcg_gen_mov_tl(old_acchi, temp_6); + MACU(temp_7, b, c); + tcg_gen_mov_tl(high_mul, temp_7); + getRegister(temp_8, R_ACCLO); + tcg_gen_mov_tl(a, temp_8); + pair = nextReg (a); + getRegister(temp_9, R_ACCHI); + tcg_gen_mov_tl(pair, temp_9); + if ((getFFlag () == true)) + { + getRegister(temp_10, R_ACCHI); + tcg_gen_mov_tl(new_acchi, temp_10); + TCGLabel *done_2 = gen_new_label(); + CarryADD32(temp_11, new_acchi, old_acchi, high_mul); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_3, temp_11, arc_true); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, done_2);; + tcg_gen_movi_tl(temp_12, 1); + setVFlag(temp_12); + gen_set_label(done_2); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(old_acchi); + tcg_temp_free(temp_7); + tcg_temp_free(high_mul); + tcg_temp_free(temp_8); + tcg_temp_free(temp_9); + tcg_temp_free(temp_10); + tcg_temp_free(new_acchi); + tcg_temp_free(temp_11); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_12); + + return ret; +} + + + + + +/* ABS + * Variables: @src, @dest + * Functions: se32to64, Carry32, getFFlag, setZFlag, setNFlag32, setCFlag, Zero, setVFlag, getNFlag +--- code --- +{ + lsrc = se32to64 (@src); + alu = (0 - lsrc); + if((Carry32 (lsrc) == 1)) + { + @dest = alu; + } + else + { + @dest = lsrc; + }; + @dest = (@dest & 4294967295); + if((getFFlag () == true)) + { + setZFlag (@dest); + setNFlag32 (@dest); + setCFlag (Zero ()); + setVFlag (getNFlag ()); + }; +} + */ + +int +arc_gen_ABS (DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv lsrc = tcg_temp_local_new(); + TCGv alu = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + se32to64(temp_3, src); + tcg_gen_mov_tl(lsrc, temp_3); + tcg_gen_subfi_tl(alu, 0, lsrc); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + Carry32(temp_4, lsrc); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_1, temp_4, 1); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_1);; + tcg_gen_mov_tl(dest, alu); + tcg_gen_br(done_1); + gen_set_label(else_1); + tcg_gen_mov_tl(dest, lsrc); + gen_set_label(done_1); + tcg_gen_andi_tl(dest, dest, 4294967295); + if ((getFFlag () == true)) + { + setZFlag(dest); + setNFlag32(dest); + tcg_gen_mov_tl(temp_5, Zero()); + setCFlag(temp_5); + tcg_gen_mov_tl(temp_6, getNFlag()); + setVFlag(temp_6); +; + } + else + { + ; + } + tcg_temp_free(temp_3); + tcg_temp_free(lsrc); + tcg_temp_free(alu); + tcg_temp_free(temp_4); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* SWAP + * Variables: @src, @dest + * Functions: getFFlag, setZFlag, setNFlag32 +--- code --- +{ + tmp1 = (@src << 16); + tmp2 = ((@src >> 16) & 65535); + @dest = (tmp1 | tmp2); + f_flag = getFFlag (); + @dest = (@dest & 4294967295); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag32 (@dest); + }; +} + */ + +int +arc_gen_SWAP (DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv tmp1 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv tmp2 = tcg_temp_local_new(); + int f_flag; + tcg_gen_shli_tl(tmp1, src, 16); + tcg_gen_shri_tl(temp_1, src, 16); + tcg_gen_andi_tl(tmp2, temp_1, 65535); + tcg_gen_or_tl(dest, tmp1, tmp2); + f_flag = getFFlag (); + tcg_gen_andi_tl(dest, dest, 4294967295); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag32(dest); +; + } + else + { + ; + } + tcg_temp_free(tmp1); + tcg_temp_free(temp_1); + tcg_temp_free(tmp2); + + return ret; +} + + + + + +/* SWAPE + * Variables: @src, @dest + * Functions: getFFlag, setZFlag, setNFlag32 +--- code --- +{ + tmp1 = ((@src << 24) & 4278190080); + tmp2 = ((@src << 8) & 16711680); + tmp3 = ((@src >> 8) & 65280); + tmp4 = ((@src >> 24) & 255); + @dest = (((tmp1 | tmp2) | tmp3) | tmp4); + f_flag = getFFlag (); + @dest = (@dest & 4294967295); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag32 (@dest); + }; +} + */ + +int +arc_gen_SWAPE (DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_1 = tcg_temp_local_new(); + TCGv tmp1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv tmp2 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv tmp3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv tmp4 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + int f_flag; + tcg_gen_shli_tl(temp_1, src, 24); + tcg_gen_andi_tl(tmp1, temp_1, 4278190080); + tcg_gen_shli_tl(temp_2, src, 8); + tcg_gen_andi_tl(tmp2, temp_2, 16711680); + tcg_gen_shri_tl(temp_3, src, 8); + tcg_gen_andi_tl(tmp3, temp_3, 65280); + tcg_gen_shri_tl(temp_4, src, 24); + tcg_gen_andi_tl(tmp4, temp_4, 255); + tcg_gen_or_tl(temp_6, tmp1, tmp2); + tcg_gen_or_tl(temp_5, temp_6, tmp3); + tcg_gen_or_tl(dest, temp_5, tmp4); + f_flag = getFFlag (); + tcg_gen_andi_tl(dest, dest, 4294967295); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag32(dest); +; + } + else + { + ; + } + tcg_temp_free(temp_1); + tcg_temp_free(tmp1); + tcg_temp_free(temp_2); + tcg_temp_free(tmp2); + tcg_temp_free(temp_3); + tcg_temp_free(tmp3); + tcg_temp_free(temp_4); + tcg_temp_free(tmp4); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + + return ret; +} + + + + + +/* NOT + * Variables: @dest, @src + * Functions: getFFlag, setZFlag, setNFlag32 +--- code --- +{ + @dest = ~@src; + f_flag = getFFlag (); + @dest = (@dest & 4294967295); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag32 (@dest); + }; +} + */ + +int +arc_gen_NOT (DisasCtxt *ctx, TCGv dest, TCGv src) +{ + int ret = DISAS_NEXT; + int f_flag; + tcg_gen_not_tl(dest, src); + f_flag = getFFlag (); + tcg_gen_andi_tl(dest, dest, 4294967295); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag32(dest); +; + } + else + { + ; + } + + return ret; +} + + + + + +/* BI + * Variables: @c + * Functions: setPC, nextInsnAddress +--- code --- +{ + setPC ((nextInsnAddress () + (@c << 2))); +} + */ + +int +arc_gen_BI (DisasCtxt *ctx, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + tcg_gen_shli_tl(temp_4, c, 2); + nextInsnAddress(temp_3); + tcg_gen_mov_tl(temp_2, temp_3); + tcg_gen_add_tl(temp_1, temp_2, temp_4); + setPC(temp_1); + tcg_temp_free(temp_4); + tcg_temp_free(temp_3); + tcg_temp_free(temp_2); + tcg_temp_free(temp_1); + + return ret; +} + + + + + +/* BIH + * Variables: @c + * Functions: setPC, nextInsnAddress +--- code --- +{ + setPC ((nextInsnAddress () + (@c << 1))); +} + */ + +int +arc_gen_BIH (DisasCtxt *ctx, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + tcg_gen_shli_tl(temp_4, c, 1); + nextInsnAddress(temp_3); + tcg_gen_mov_tl(temp_2, temp_3); + tcg_gen_add_tl(temp_1, temp_2, temp_4); + setPC(temp_1); + tcg_temp_free(temp_4); + tcg_temp_free(temp_3); + tcg_temp_free(temp_2); + tcg_temp_free(temp_1); + + return ret; +} + + + + + +/* B + * Variables: @rd + * Functions: getCCFlag, getPCL, shouldExecuteDelaySlot, executeDelaySlot, setPC +--- code --- +{ + take_branch = false; + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + take_branch = true; + }; + bta = (getPCL () + @rd); + if((shouldExecuteDelaySlot () == true)) + { + executeDelaySlot (bta, take_branch); + }; + if((cc_flag == true)) + { + setPC (bta); + }; +} + */ + +int +arc_gen_B (DisasCtxt *ctx, TCGv rd) +{ + int ret = DISAS_NEXT; + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv bta = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + tcg_gen_mov_tl(take_branch, arc_false); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(take_branch, arc_true); + gen_set_label(done_1); + getPCL(temp_7); + tcg_gen_mov_tl(temp_6, temp_7); + tcg_gen_add_tl(bta, temp_6, rd); + if ((shouldExecuteDelaySlot () == true)) + { + executeDelaySlot(bta, take_branch); +; + } + else + { + ; + } + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_3, cc_flag, arc_true); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, done_2);; + setPC(bta); + gen_set_label(done_2); + tcg_temp_free(take_branch); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + tcg_temp_free(bta); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* B_S + * Variables: @rd + * Functions: getCCFlag, setPC, getPCL +--- code --- +{ + take_branch = false; + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + }; + if((cc_flag == true)) + { + setPC ((getPCL () + @rd)); + }; +} + */ + +int +arc_gen_B_S (DisasCtxt *ctx, TCGv rd) +{ + int ret = DISAS_NEXT; + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + tcg_gen_mov_tl(take_branch, arc_false); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + gen_set_label(done_1); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_3, cc_flag, arc_true); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, done_2);; + getPCL(temp_8); + tcg_gen_mov_tl(temp_7, temp_8); + tcg_gen_add_tl(temp_6, temp_7, rd); + setPC(temp_6); + gen_set_label(done_2); + tcg_temp_free(take_branch); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* BBIT0 + * Variables: @b, @c, @rd + * Functions: getCCFlag, getPCL, shouldExecuteDelaySlot, executeDelaySlot, setPC +--- code --- +{ + take_branch = false; + cc_flag = getCCFlag (); + p_b = @b; + p_c = (@c & 31); + tmp = (1 << p_c); + if((cc_flag == true)) + { + if(((p_b && tmp) == 0)) + { + take_branch = true; + }; + }; + bta = (getPCL () + @rd); + if((shouldExecuteDelaySlot () == true)) + { + executeDelaySlot (bta, take_branch); + }; + if((cc_flag == true)) + { + if(((p_b && tmp) == 0)) + { + setPC (bta); + }; + }; +} + */ + +int +arc_gen_BBIT0 (DisasCtxt *ctx, TCGv b, TCGv c, TCGv rd) +{ + int ret = DISAS_NEXT; + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv tmp = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_13 = tcg_temp_local_new(); + TCGv temp_12 = tcg_temp_local_new(); + TCGv bta = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + tcg_gen_mov_tl(take_branch, arc_false); + getCCFlag(temp_11); + tcg_gen_mov_tl(cc_flag, temp_11); + tcg_gen_mov_tl(p_b, b); + tcg_gen_andi_tl(p_c, c, 31); + tcg_gen_shlfi_tl(tmp, 1, p_c); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + TCGLabel *done_2 = gen_new_label(); + tcg_gen_and_tl(temp_3, p_b, tmp); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_4, temp_3, 0); + tcg_gen_xori_tl(temp_5, temp_4, 1); tcg_gen_andi_tl(temp_5, temp_5, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_5, arc_true, done_2);; + tcg_gen_mov_tl(take_branch, arc_true); + gen_set_label(done_2); + gen_set_label(done_1); + getPCL(temp_13); + tcg_gen_mov_tl(temp_12, temp_13); + tcg_gen_add_tl(bta, temp_12, rd); + if ((shouldExecuteDelaySlot () == true)) + { + executeDelaySlot(bta, take_branch); +; + } + else + { + ; + } + TCGLabel *done_3 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_6, cc_flag, arc_true); + tcg_gen_xori_tl(temp_7, temp_6, 1); tcg_gen_andi_tl(temp_7, temp_7, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_7, arc_true, done_3);; + TCGLabel *done_4 = gen_new_label(); + tcg_gen_and_tl(temp_8, p_b, tmp); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_9, temp_8, 0); + tcg_gen_xori_tl(temp_10, temp_9, 1); tcg_gen_andi_tl(temp_10, temp_10, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_10, arc_true, done_4);; + setPC(bta); + gen_set_label(done_4); + gen_set_label(done_3); + tcg_temp_free(take_branch); + tcg_temp_free(temp_11); + tcg_temp_free(cc_flag); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(tmp); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + tcg_temp_free(temp_13); + tcg_temp_free(temp_12); + tcg_temp_free(bta); + tcg_temp_free(temp_6); + tcg_temp_free(temp_7); + tcg_temp_free(temp_8); + tcg_temp_free(temp_9); + tcg_temp_free(temp_10); + + return ret; +} + + + + + +/* BBIT1 + * Variables: @b, @c, @rd + * Functions: getCCFlag, getPCL, shouldExecuteDelaySlot, executeDelaySlot, setPC +--- code --- +{ + take_branch = false; + cc_flag = getCCFlag (); + p_b = @b; + p_c = (@c & 31); + tmp = (1 << p_c); + if((cc_flag == true)) + { + if(((p_b && tmp) != 0)) + { + take_branch = true; + }; + }; + bta = (getPCL () + @rd); + if((shouldExecuteDelaySlot () == true)) + { + executeDelaySlot (bta, take_branch); + }; + if((cc_flag == true)) + { + if(((p_b && tmp) != 0)) + { + setPC (bta); + }; + }; +} + */ + +int +arc_gen_BBIT1 (DisasCtxt *ctx, TCGv b, TCGv c, TCGv rd) +{ + int ret = DISAS_NEXT; + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv tmp = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_13 = tcg_temp_local_new(); + TCGv temp_12 = tcg_temp_local_new(); + TCGv bta = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + tcg_gen_mov_tl(take_branch, arc_false); + getCCFlag(temp_11); + tcg_gen_mov_tl(cc_flag, temp_11); + tcg_gen_mov_tl(p_b, b); + tcg_gen_andi_tl(p_c, c, 31); + tcg_gen_shlfi_tl(tmp, 1, p_c); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + TCGLabel *done_2 = gen_new_label(); + tcg_gen_and_tl(temp_3, p_b, tmp); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_4, temp_3, 0); + tcg_gen_xori_tl(temp_5, temp_4, 1); tcg_gen_andi_tl(temp_5, temp_5, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_5, arc_true, done_2);; + tcg_gen_mov_tl(take_branch, arc_true); + gen_set_label(done_2); + gen_set_label(done_1); + getPCL(temp_13); + tcg_gen_mov_tl(temp_12, temp_13); + tcg_gen_add_tl(bta, temp_12, rd); + if ((shouldExecuteDelaySlot () == true)) + { + executeDelaySlot(bta, take_branch); +; + } + else + { + ; + } + TCGLabel *done_3 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_6, cc_flag, arc_true); + tcg_gen_xori_tl(temp_7, temp_6, 1); tcg_gen_andi_tl(temp_7, temp_7, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_7, arc_true, done_3);; + TCGLabel *done_4 = gen_new_label(); + tcg_gen_and_tl(temp_8, p_b, tmp); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_9, temp_8, 0); + tcg_gen_xori_tl(temp_10, temp_9, 1); tcg_gen_andi_tl(temp_10, temp_10, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_10, arc_true, done_4);; + setPC(bta); + gen_set_label(done_4); + gen_set_label(done_3); + tcg_temp_free(take_branch); + tcg_temp_free(temp_11); + tcg_temp_free(cc_flag); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(tmp); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + tcg_temp_free(temp_13); + tcg_temp_free(temp_12); + tcg_temp_free(bta); + tcg_temp_free(temp_6); + tcg_temp_free(temp_7); + tcg_temp_free(temp_8); + tcg_temp_free(temp_9); + tcg_temp_free(temp_10); + + return ret; +} + + + + + +/* BL + * Variables: @rd + * Functions: getCCFlag, getPCL, shouldExecuteDelaySlot, setBLINK, nextInsnAddressAfterDelaySlot, executeDelaySlot, nextInsnAddress, setPC +--- code --- +{ + take_branch = false; + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + take_branch = true; + }; + bta = (getPCL () + @rd); + if((shouldExecuteDelaySlot () == 1)) + { + if(take_branch) + { + setBLINK (nextInsnAddressAfterDelaySlot ()); + }; + executeDelaySlot (bta, take_branch); + } + else + { + if(take_branch) + { + setBLINK (nextInsnAddress ()); + }; + }; + if((cc_flag == true)) + { + setPC (bta); + }; +} + */ + +int +arc_gen_BL (DisasCtxt *ctx, TCGv rd) +{ + int ret = DISAS_NEXT; + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv bta = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_13 = tcg_temp_local_new(); + TCGv temp_12 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + tcg_gen_mov_tl(take_branch, arc_false); + getCCFlag(temp_7); + tcg_gen_mov_tl(cc_flag, temp_7); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(take_branch, arc_true); + gen_set_label(done_1); + getPCL(temp_9); + tcg_gen_mov_tl(temp_8, temp_9); + tcg_gen_add_tl(bta, temp_8, rd); + if ((shouldExecuteDelaySlot () == 1)) + { + TCGLabel *done_2 = gen_new_label(); + tcg_gen_xori_tl(temp_3, take_branch, 1); tcg_gen_andi_tl(temp_3, temp_3, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_3, arc_true, done_2);; + nextInsnAddressAfterDelaySlot(temp_11); + tcg_gen_mov_tl(temp_10, temp_11); + setBLINK(temp_10); + gen_set_label(done_2); + executeDelaySlot(bta, take_branch); +; + } + else + { + TCGLabel *done_3 = gen_new_label(); + tcg_gen_xori_tl(temp_4, take_branch, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, done_3);; + nextInsnAddress(temp_13); + tcg_gen_mov_tl(temp_12, temp_13); + setBLINK(temp_12); + gen_set_label(done_3); +; + } + TCGLabel *done_4 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_5, cc_flag, arc_true); + tcg_gen_xori_tl(temp_6, temp_5, 1); tcg_gen_andi_tl(temp_6, temp_6, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_6, arc_true, done_4);; + setPC(bta); + gen_set_label(done_4); + tcg_temp_free(take_branch); + tcg_temp_free(temp_7); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(bta); + tcg_temp_free(temp_3); + tcg_temp_free(temp_11); + tcg_temp_free(temp_10); + tcg_temp_free(temp_4); + tcg_temp_free(temp_13); + tcg_temp_free(temp_12); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* J + * Variables: @src + * Functions: getCCFlag, shouldExecuteDelaySlot, executeDelaySlot, setPC +--- code --- +{ + take_branch = false; + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + take_branch = true; + }; + bta = @src; + if((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot (bta, take_branch); + }; + if((cc_flag == true)) + { + setPC (bta); + }; +} + */ + +int +arc_gen_J (DisasCtxt *ctx, TCGv src) +{ + int ret = DISAS_NEXT; + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv bta = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + tcg_gen_mov_tl(take_branch, arc_false); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(take_branch, arc_true); + gen_set_label(done_1); + tcg_gen_mov_tl(bta, src); + if ((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot(bta, take_branch); +; + } + else + { + ; + } + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_3, cc_flag, arc_true); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, done_2);; + setPC(bta); + gen_set_label(done_2); + tcg_temp_free(take_branch); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(bta); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* JL + * Variables: @src + * Functions: getCCFlag, shouldExecuteDelaySlot, setBLINK, nextInsnAddressAfterDelaySlot, executeDelaySlot, nextInsnAddress, setPC +--- code --- +{ + take_branch = false; + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + take_branch = true; + }; + bta = @src; + if((shouldExecuteDelaySlot () == 1)) + { + if(take_branch) + { + setBLINK (nextInsnAddressAfterDelaySlot ()); + }; + executeDelaySlot (bta, take_branch); + } + else + { + if(take_branch) + { + setBLINK (nextInsnAddress ()); + }; + }; + if((cc_flag == true)) + { + setPC (bta); + }; +} + */ + +int +arc_gen_JL (DisasCtxt *ctx, TCGv src) +{ + int ret = DISAS_NEXT; + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv bta = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + tcg_gen_mov_tl(take_branch, arc_false); + getCCFlag(temp_7); + tcg_gen_mov_tl(cc_flag, temp_7); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(take_branch, arc_true); + gen_set_label(done_1); + tcg_gen_mov_tl(bta, src); + if ((shouldExecuteDelaySlot () == 1)) + { + TCGLabel *done_2 = gen_new_label(); + tcg_gen_xori_tl(temp_3, take_branch, 1); tcg_gen_andi_tl(temp_3, temp_3, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_3, arc_true, done_2);; + nextInsnAddressAfterDelaySlot(temp_9); + tcg_gen_mov_tl(temp_8, temp_9); + setBLINK(temp_8); + gen_set_label(done_2); + executeDelaySlot(bta, take_branch); +; + } + else + { + TCGLabel *done_3 = gen_new_label(); + tcg_gen_xori_tl(temp_4, take_branch, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, done_3);; + nextInsnAddress(temp_11); + tcg_gen_mov_tl(temp_10, temp_11); + setBLINK(temp_10); + gen_set_label(done_3); +; + } + TCGLabel *done_4 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_5, cc_flag, arc_true); + tcg_gen_xori_tl(temp_6, temp_5, 1); tcg_gen_andi_tl(temp_6, temp_6, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_6, arc_true, done_4);; + setPC(bta); + gen_set_label(done_4); + tcg_temp_free(take_branch); + tcg_temp_free(temp_7); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(bta); + tcg_temp_free(temp_3); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(temp_4); + tcg_temp_free(temp_11); + tcg_temp_free(temp_10); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* SETEQ + * Variables: @b, @c, @a + * Functions: getCCFlag, se32to64 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + p_b = (@b & 4294967295); + p_c = (@c & 4294967295); + p_b = se32to64 (p_b); + p_c = se32to64 (p_c); + take_branch = false; + if((p_b == p_c)) + { + } + else + { + }; + if((p_b == p_c)) + { + @a = true; + } + else + { + @a = false; + }; + }; +} + */ + +int +arc_gen_SETEQ (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_7 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + getCCFlag(temp_7); + tcg_gen_mov_tl(cc_flag, temp_7); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(p_b, b, 4294967295); + tcg_gen_andi_tl(p_c, c, 4294967295); + se32to64(temp_8, p_b); + tcg_gen_mov_tl(p_b, temp_8); + se32to64(temp_9, p_c); + tcg_gen_mov_tl(p_c, temp_9); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + TCGLabel *else_3 = gen_new_label(); + TCGLabel *done_3 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_5, p_b, p_c); + tcg_gen_xori_tl(temp_6, temp_5, 1); tcg_gen_andi_tl(temp_6, temp_6, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_6, arc_true, else_3);; + tcg_gen_mov_tl(a, arc_true); + tcg_gen_br(done_3); + gen_set_label(else_3); + tcg_gen_mov_tl(a, arc_false); + gen_set_label(done_3); + gen_set_label(done_1); + tcg_temp_free(temp_7); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(temp_8); + tcg_temp_free(temp_9); + tcg_temp_free(take_branch); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* BREQ + * Variables: @b, @c, @offset + * Functions: se32to64, getPCL, shouldExecuteDelaySlot, executeDelaySlot, setPC +--- code --- +{ + p_b = (@b & 4294967295); + p_c = (@c & 4294967295); + p_b = se32to64 (p_b); + p_c = se32to64 (p_c); + take_branch = false; + if((p_b == p_c)) + { + take_branch = true; + } + else + { + }; + bta = (getPCL () + @offset); + if((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot (bta, take_branch); + }; + if((p_b == p_c)) + { + setPC (bta); + } + else + { + }; +} + */ + +int +arc_gen_BREQ (DisasCtxt *ctx, TCGv b, TCGv c, TCGv offset) +{ + int ret = DISAS_NEXT; + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv bta = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + tcg_gen_andi_tl(p_b, b, 4294967295); + tcg_gen_andi_tl(p_c, c, 4294967295); + se32to64(temp_5, p_b); + tcg_gen_mov_tl(p_b, temp_5); + se32to64(temp_6, p_c); + tcg_gen_mov_tl(p_c, temp_6); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, p_b, p_c); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_1);; + tcg_gen_mov_tl(take_branch, arc_true); + tcg_gen_br(done_1); + gen_set_label(else_1); + gen_set_label(done_1); + getPCL(temp_8); + tcg_gen_mov_tl(temp_7, temp_8); + tcg_gen_add_tl(bta, temp_7, offset); + if ((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot(bta, take_branch); +; + } + else + { + ; + } + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + setPC(bta); + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + tcg_temp_free(take_branch); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + tcg_temp_free(bta); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* SETNE + * Variables: @b, @c, @a + * Functions: getCCFlag, se32to64 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + p_b = (@b & 4294967295); + p_c = (@c & 4294967295); + p_b = se32to64 (p_b); + p_c = se32to64 (p_c); + take_branch = false; + if((p_b != p_c)) + { + } + else + { + }; + if((p_b != p_c)) + { + @a = 0; + @a = true; + } + else + { + @a = false; + }; + }; +} + */ + +int +arc_gen_SETNE (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_7 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + getCCFlag(temp_7); + tcg_gen_mov_tl(cc_flag, temp_7); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(p_b, b, 4294967295); + tcg_gen_andi_tl(p_c, c, 4294967295); + se32to64(temp_8, p_b); + tcg_gen_mov_tl(p_b, temp_8); + se32to64(temp_9, p_c); + tcg_gen_mov_tl(p_c, temp_9); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_NE, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + TCGLabel *else_3 = gen_new_label(); + TCGLabel *done_3 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_NE, temp_5, p_b, p_c); + tcg_gen_xori_tl(temp_6, temp_5, 1); tcg_gen_andi_tl(temp_6, temp_6, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_6, arc_true, else_3);; + tcg_gen_mov_tl(a, arc_true); + tcg_gen_br(done_3); + gen_set_label(else_3); + tcg_gen_mov_tl(a, arc_false); + gen_set_label(done_3); + gen_set_label(done_1); + tcg_temp_free(temp_7); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(temp_8); + tcg_temp_free(temp_9); + tcg_temp_free(take_branch); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* BRNE + * Variables: @b, @c, @offset + * Functions: se32to64, getPCL, shouldExecuteDelaySlot, executeDelaySlot, setPC +--- code --- +{ + p_b = (@b & 4294967295); + p_c = (@c & 4294967295); + p_b = se32to64 (p_b); + p_c = se32to64 (p_c); + take_branch = false; + if((p_b != p_c)) + { + take_branch = true; + } + else + { + }; + bta = (getPCL () + @offset); + if((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot (bta, take_branch); + }; + if((p_b != p_c)) + { + setPC (bta); + } + else + { + }; +} + */ + +int +arc_gen_BRNE (DisasCtxt *ctx, TCGv b, TCGv c, TCGv offset) +{ + int ret = DISAS_NEXT; + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv bta = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + tcg_gen_andi_tl(p_b, b, 4294967295); + tcg_gen_andi_tl(p_c, c, 4294967295); + se32to64(temp_5, p_b); + tcg_gen_mov_tl(p_b, temp_5); + se32to64(temp_6, p_c); + tcg_gen_mov_tl(p_c, temp_6); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_NE, temp_1, p_b, p_c); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_1);; + tcg_gen_mov_tl(take_branch, arc_true); + tcg_gen_br(done_1); + gen_set_label(else_1); + gen_set_label(done_1); + getPCL(temp_8); + tcg_gen_mov_tl(temp_7, temp_8); + tcg_gen_add_tl(bta, temp_7, offset); + if ((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot(bta, take_branch); +; + } + else + { + ; + } + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_NE, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + setPC(bta); + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + tcg_temp_free(take_branch); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + tcg_temp_free(bta); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* SETLT + * Variables: @b, @c, @a + * Functions: getCCFlag, se32to64 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + p_b = (@b & 4294967295); + p_c = (@c & 4294967295); + p_b = se32to64 (p_b); + p_c = se32to64 (p_c); + take_branch = false; + if((p_b < p_c)) + { + } + else + { + }; + if((p_b < p_c)) + { + @a = true; + } + else + { + @a = false; + }; + }; +} + */ + +int +arc_gen_SETLT (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_7 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + getCCFlag(temp_7); + tcg_gen_mov_tl(cc_flag, temp_7); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(p_b, b, 4294967295); + tcg_gen_andi_tl(p_c, c, 4294967295); + se32to64(temp_8, p_b); + tcg_gen_mov_tl(p_b, temp_8); + se32to64(temp_9, p_c); + tcg_gen_mov_tl(p_c, temp_9); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_LT, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + TCGLabel *else_3 = gen_new_label(); + TCGLabel *done_3 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_LT, temp_5, p_b, p_c); + tcg_gen_xori_tl(temp_6, temp_5, 1); tcg_gen_andi_tl(temp_6, temp_6, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_6, arc_true, else_3);; + tcg_gen_mov_tl(a, arc_true); + tcg_gen_br(done_3); + gen_set_label(else_3); + tcg_gen_mov_tl(a, arc_false); + gen_set_label(done_3); + gen_set_label(done_1); + tcg_temp_free(temp_7); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(temp_8); + tcg_temp_free(temp_9); + tcg_temp_free(take_branch); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* BRLT + * Variables: @b, @c, @offset + * Functions: se32to64, getPCL, shouldExecuteDelaySlot, executeDelaySlot, setPC +--- code --- +{ + p_b = (@b & 4294967295); + p_c = (@c & 4294967295); + p_b = se32to64 (p_b); + p_c = se32to64 (p_c); + take_branch = false; + if((p_b < p_c)) + { + take_branch = true; + } + else + { + }; + bta = (getPCL () + @offset); + if((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot (bta, take_branch); + }; + if((p_b < p_c)) + { + setPC (bta); + } + else + { + }; +} + */ + +int +arc_gen_BRLT (DisasCtxt *ctx, TCGv b, TCGv c, TCGv offset) +{ + int ret = DISAS_NEXT; + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv bta = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + tcg_gen_andi_tl(p_b, b, 4294967295); + tcg_gen_andi_tl(p_c, c, 4294967295); + se32to64(temp_5, p_b); + tcg_gen_mov_tl(p_b, temp_5); + se32to64(temp_6, p_c); + tcg_gen_mov_tl(p_c, temp_6); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_LT, temp_1, p_b, p_c); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_1);; + tcg_gen_mov_tl(take_branch, arc_true); + tcg_gen_br(done_1); + gen_set_label(else_1); + gen_set_label(done_1); + getPCL(temp_8); + tcg_gen_mov_tl(temp_7, temp_8); + tcg_gen_add_tl(bta, temp_7, offset); + if ((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot(bta, take_branch); +; + } + else + { + ; + } + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_LT, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + setPC(bta); + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + tcg_temp_free(take_branch); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + tcg_temp_free(bta); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* SETGE + * Variables: @b, @c, @a + * Functions: getCCFlag, se32to64 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + p_b = (@b & 4294967295); + p_c = (@c & 4294967295); + p_b = se32to64 (p_b); + p_c = se32to64 (p_c); + take_branch = false; + if((p_b >= p_c)) + { + } + else + { + }; + if((p_b >= p_c)) + { + @a = true; + } + else + { + @a = false; + }; + }; +} + */ + +int +arc_gen_SETGE (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_7 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + getCCFlag(temp_7); + tcg_gen_mov_tl(cc_flag, temp_7); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(p_b, b, 4294967295); + tcg_gen_andi_tl(p_c, c, 4294967295); + se32to64(temp_8, p_b); + tcg_gen_mov_tl(p_b, temp_8); + se32to64(temp_9, p_c); + tcg_gen_mov_tl(p_c, temp_9); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_GE, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + TCGLabel *else_3 = gen_new_label(); + TCGLabel *done_3 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_GE, temp_5, p_b, p_c); + tcg_gen_xori_tl(temp_6, temp_5, 1); tcg_gen_andi_tl(temp_6, temp_6, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_6, arc_true, else_3);; + tcg_gen_mov_tl(a, arc_true); + tcg_gen_br(done_3); + gen_set_label(else_3); + tcg_gen_mov_tl(a, arc_false); + gen_set_label(done_3); + gen_set_label(done_1); + tcg_temp_free(temp_7); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(temp_8); + tcg_temp_free(temp_9); + tcg_temp_free(take_branch); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* BRGE + * Variables: @b, @c, @offset + * Functions: se32to64, getPCL, shouldExecuteDelaySlot, executeDelaySlot, setPC +--- code --- +{ + p_b = (@b & 4294967295); + p_c = (@c & 4294967295); + p_b = se32to64 (p_b); + p_c = se32to64 (p_c); + take_branch = false; + if((p_b >= p_c)) + { + take_branch = true; + } + else + { + }; + bta = (getPCL () + @offset); + if((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot (bta, take_branch); + }; + if((p_b >= p_c)) + { + setPC (bta); + } + else + { + }; +} + */ + +int +arc_gen_BRGE (DisasCtxt *ctx, TCGv b, TCGv c, TCGv offset) +{ + int ret = DISAS_NEXT; + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv bta = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + tcg_gen_andi_tl(p_b, b, 4294967295); + tcg_gen_andi_tl(p_c, c, 4294967295); + se32to64(temp_5, p_b); + tcg_gen_mov_tl(p_b, temp_5); + se32to64(temp_6, p_c); + tcg_gen_mov_tl(p_c, temp_6); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_GE, temp_1, p_b, p_c); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_1);; + tcg_gen_mov_tl(take_branch, arc_true); + tcg_gen_br(done_1); + gen_set_label(else_1); + gen_set_label(done_1); + getPCL(temp_8); + tcg_gen_mov_tl(temp_7, temp_8); + tcg_gen_add_tl(bta, temp_7, offset); + if ((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot(bta, take_branch); +; + } + else + { + ; + } + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_GE, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + setPC(bta); + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + tcg_temp_free(take_branch); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + tcg_temp_free(bta); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* SETLE + * Variables: @b, @c, @a + * Functions: getCCFlag, se32to64 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + p_b = (@b & 4294967295); + p_c = (@c & 4294967295); + p_b = se32to64 (p_b); + p_c = se32to64 (p_c); + take_branch = false; + if((p_b <= p_c)) + { + } + else + { + }; + if((p_b <= p_c)) + { + @a = true; + } + else + { + @a = false; + }; + }; +} + */ + +int +arc_gen_SETLE (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_7 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + getCCFlag(temp_7); + tcg_gen_mov_tl(cc_flag, temp_7); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(p_b, b, 4294967295); + tcg_gen_andi_tl(p_c, c, 4294967295); + se32to64(temp_8, p_b); + tcg_gen_mov_tl(p_b, temp_8); + se32to64(temp_9, p_c); + tcg_gen_mov_tl(p_c, temp_9); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_LE, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + TCGLabel *else_3 = gen_new_label(); + TCGLabel *done_3 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_LE, temp_5, p_b, p_c); + tcg_gen_xori_tl(temp_6, temp_5, 1); tcg_gen_andi_tl(temp_6, temp_6, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_6, arc_true, else_3);; + tcg_gen_mov_tl(a, arc_true); + tcg_gen_br(done_3); + gen_set_label(else_3); + tcg_gen_mov_tl(a, arc_false); + gen_set_label(done_3); + gen_set_label(done_1); + tcg_temp_free(temp_7); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(temp_8); + tcg_temp_free(temp_9); + tcg_temp_free(take_branch); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* SETGT + * Variables: @b, @c, @a + * Functions: getCCFlag, se32to64 +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + p_b = (@b & 4294967295); + p_c = (@c & 4294967295); + p_b = se32to64 (p_b); + p_c = se32to64 (p_c); + take_branch = false; + if((p_b > p_c)) + { + } + else + { + }; + if((p_b > p_c)) + { + @a = true; + } + else + { + @a = false; + }; + }; +} + */ + +int +arc_gen_SETGT (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_7 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + getCCFlag(temp_7); + tcg_gen_mov_tl(cc_flag, temp_7); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(p_b, b, 4294967295); + tcg_gen_andi_tl(p_c, c, 4294967295); + se32to64(temp_8, p_b); + tcg_gen_mov_tl(p_b, temp_8); + se32to64(temp_9, p_c); + tcg_gen_mov_tl(p_c, temp_9); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_GT, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + TCGLabel *else_3 = gen_new_label(); + TCGLabel *done_3 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_GT, temp_5, p_b, p_c); + tcg_gen_xori_tl(temp_6, temp_5, 1); tcg_gen_andi_tl(temp_6, temp_6, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_6, arc_true, else_3);; + tcg_gen_mov_tl(a, arc_true); + tcg_gen_br(done_3); + gen_set_label(else_3); + tcg_gen_mov_tl(a, arc_false); + gen_set_label(done_3); + gen_set_label(done_1); + tcg_temp_free(temp_7); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(temp_8); + tcg_temp_free(temp_9); + tcg_temp_free(take_branch); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* BRLO + * Variables: @b, @c, @offset + * Functions: se32to64, unsignedLT, getPCL, shouldExecuteDelaySlot, executeDelaySlot, setPC +--- code --- +{ + p_b = se32to64 (@b); + p_c = se32to64 (@c); + take_branch = false; + if(unsignedLT (p_b, p_c)) + { + take_branch = true; + } + else + { + }; + bta = (getPCL () + @offset); + if((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot (bta, take_branch); + }; + if(unsignedLT (p_b, p_c)) + { + setPC (bta); + } + else + { + }; +} + */ + +int +arc_gen_BRLO (DisasCtxt *ctx, TCGv b, TCGv c, TCGv offset) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv p_b = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv bta = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + se32to64(temp_3, b); + tcg_gen_mov_tl(p_b, temp_3); + se32to64(temp_4, c); + tcg_gen_mov_tl(p_c, temp_4); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + unsignedLT(temp_5, p_b, p_c); + tcg_gen_xori_tl(temp_1, temp_5, 1); tcg_gen_andi_tl(temp_1, temp_1, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_1, arc_true, else_1);; + tcg_gen_mov_tl(take_branch, arc_true); + tcg_gen_br(done_1); + gen_set_label(else_1); + gen_set_label(done_1); + getPCL(temp_7); + tcg_gen_mov_tl(temp_6, temp_7); + tcg_gen_add_tl(bta, temp_6, offset); + if ((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot(bta, take_branch); +; + } + else + { + ; + } + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + unsignedLT(temp_8, p_b, p_c); + tcg_gen_xori_tl(temp_2, temp_8, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_2);; + setPC(bta); + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + tcg_temp_free(temp_3); + tcg_temp_free(p_b); + tcg_temp_free(temp_4); + tcg_temp_free(p_c); + tcg_temp_free(take_branch); + tcg_temp_free(temp_5); + tcg_temp_free(temp_1); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + tcg_temp_free(bta); + tcg_temp_free(temp_8); + tcg_temp_free(temp_2); + + return ret; +} + + + + + +/* SETLO + * Variables: @b, @c, @a + * Functions: se32to64, unsignedLT +--- code --- +{ + p_b = se32to64 (@b); + p_c = se32to64 (@c); + take_branch = false; + if(unsignedLT (p_b, p_c)) + { + } + else + { + }; + if(unsignedLT (p_b, p_c)) + { + @a = true; + } + else + { + @a = false; + }; +} + */ + +int +arc_gen_SETLO (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv p_b = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + se32to64(temp_3, b); + tcg_gen_mov_tl(p_b, temp_3); + se32to64(temp_4, c); + tcg_gen_mov_tl(p_c, temp_4); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + unsignedLT(temp_5, p_b, p_c); + tcg_gen_xori_tl(temp_1, temp_5, 1); tcg_gen_andi_tl(temp_1, temp_1, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_1, arc_true, else_1);; + tcg_gen_br(done_1); + gen_set_label(else_1); + gen_set_label(done_1); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + unsignedLT(temp_6, p_b, p_c); + tcg_gen_xori_tl(temp_2, temp_6, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_2);; + tcg_gen_mov_tl(a, arc_true); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_mov_tl(a, arc_false); + gen_set_label(done_2); + tcg_temp_free(temp_3); + tcg_temp_free(p_b); + tcg_temp_free(temp_4); + tcg_temp_free(p_c); + tcg_temp_free(take_branch); + tcg_temp_free(temp_5); + tcg_temp_free(temp_1); + tcg_temp_free(temp_6); + tcg_temp_free(temp_2); + + return ret; +} + + + + + +/* BRHS + * Variables: @b, @c, @offset + * Functions: se32to64, unsignedGE, getPCL, shouldExecuteDelaySlot, executeDelaySlot, setPC +--- code --- +{ + p_b = se32to64 (@b); + p_c = se32to64 (@c); + take_branch = false; + if(unsignedGE (p_b, p_c)) + { + take_branch = true; + } + else + { + }; + bta = (getPCL () + @offset); + if((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot (bta, take_branch); + }; + if(unsignedGE (p_b, p_c)) + { + setPC (bta); + } + else + { + }; +} + */ + +int +arc_gen_BRHS (DisasCtxt *ctx, TCGv b, TCGv c, TCGv offset) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv p_b = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv bta = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + se32to64(temp_3, b); + tcg_gen_mov_tl(p_b, temp_3); + se32to64(temp_4, c); + tcg_gen_mov_tl(p_c, temp_4); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + unsignedGE(temp_5, p_b, p_c); + tcg_gen_xori_tl(temp_1, temp_5, 1); tcg_gen_andi_tl(temp_1, temp_1, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_1, arc_true, else_1);; + tcg_gen_mov_tl(take_branch, arc_true); + tcg_gen_br(done_1); + gen_set_label(else_1); + gen_set_label(done_1); + getPCL(temp_7); + tcg_gen_mov_tl(temp_6, temp_7); + tcg_gen_add_tl(bta, temp_6, offset); + if ((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot(bta, take_branch); +; + } + else + { + ; + } + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + unsignedGE(temp_8, p_b, p_c); + tcg_gen_xori_tl(temp_2, temp_8, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_2);; + setPC(bta); + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + tcg_temp_free(temp_3); + tcg_temp_free(p_b); + tcg_temp_free(temp_4); + tcg_temp_free(p_c); + tcg_temp_free(take_branch); + tcg_temp_free(temp_5); + tcg_temp_free(temp_1); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + tcg_temp_free(bta); + tcg_temp_free(temp_8); + tcg_temp_free(temp_2); + + return ret; +} + + + + + +/* SETHS + * Variables: @b, @c, @a + * Functions: se32to64, unsignedGE +--- code --- +{ + p_b = se32to64 (@b); + p_c = se32to64 (@c); + take_branch = false; + if(unsignedGE (p_b, p_c)) + { + } + else + { + }; + if(unsignedGE (p_b, p_c)) + { + @a = true; + } + else + { + @a = false; + }; +} + */ + +int +arc_gen_SETHS (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv p_b = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + se32to64(temp_3, b); + tcg_gen_mov_tl(p_b, temp_3); + se32to64(temp_4, c); + tcg_gen_mov_tl(p_c, temp_4); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + unsignedGE(temp_5, p_b, p_c); + tcg_gen_xori_tl(temp_1, temp_5, 1); tcg_gen_andi_tl(temp_1, temp_1, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_1, arc_true, else_1);; + tcg_gen_br(done_1); + gen_set_label(else_1); + gen_set_label(done_1); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + unsignedGE(temp_6, p_b, p_c); + tcg_gen_xori_tl(temp_2, temp_6, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_2);; + tcg_gen_mov_tl(a, arc_true); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_mov_tl(a, arc_false); + gen_set_label(done_2); + tcg_temp_free(temp_3); + tcg_temp_free(p_b); + tcg_temp_free(temp_4); + tcg_temp_free(p_c); + tcg_temp_free(take_branch); + tcg_temp_free(temp_5); + tcg_temp_free(temp_1); + tcg_temp_free(temp_6); + tcg_temp_free(temp_2); + + return ret; +} + + + + + +/* EX + * Variables: @b, @c + * Functions: getMemory, setMemory +--- code --- +{ + temp = @b; + @b = getMemory (@c, LONG); + setMemory (@c, LONG, temp); +} + */ + +int +arc_gen_EX (DisasCtxt *ctx, TCGv b, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + tcg_gen_mov_tl(temp, b); + getMemory(temp_1, c, LONG); + tcg_gen_mov_tl(b, temp_1); + setMemory(c, LONG, temp); + tcg_temp_free(temp); + tcg_temp_free(temp_1); + + return ret; +} + + + + + +/* LLOCK + * Variables: @dest, @src + * Functions: getMemory, setLF +--- code --- +{ + @dest = getMemory (@src, LONG); + setLF (1); +} + */ + +int +arc_gen_LLOCK (DisasCtxt *ctx, TCGv dest, TCGv src) +{ + int ret = DISAS_NEXT; + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + getMemory(temp_1, src, LONG); + tcg_gen_mov_tl(dest, temp_1); + tcg_gen_movi_tl(temp_2, 1); + setLF(temp_2); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + + return ret; +} + + + + + +/* LLOCKD + * Variables: @dest, @src + * Functions: getMemory, nextReg, setLF +--- code --- +{ + @dest = getMemory (@src, LONG); + pair = nextReg (dest); + pair = getMemory ((@src + 4), LONG); + setLF (1); +} + */ + +int +arc_gen_LLOCKD (DisasCtxt *ctx, TCGv dest, TCGv src) +{ + int ret = DISAS_NEXT; + TCGv temp_1 = tcg_temp_local_new(); + TCGv pair = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + getMemory(temp_1, src, LONG); + tcg_gen_mov_tl(dest, temp_1); + pair = nextReg (dest); + tcg_gen_addi_tl(temp_3, src, 4); + getMemory(temp_2, temp_3, LONG); + tcg_gen_mov_tl(pair, temp_2); + tcg_gen_movi_tl(temp_4, 1); + setLF(temp_4); + tcg_temp_free(temp_1); + tcg_temp_free(temp_3); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* SCOND + * Variables: @src, @dest + * Functions: getLF, setMemory, setZFlag, setLF +--- code --- +{ + lf = getLF (); + if((lf == 1)) + { + setMemory (@src, LONG, @dest); + }; + setZFlag (!lf); + setLF (0); +} + */ + +int +arc_gen_SCOND (DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv lf = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + getLF(temp_3); + tcg_gen_mov_tl(lf, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_1, lf, 1); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + setMemory(src, LONG, dest); + gen_set_label(done_1); + tcg_gen_xori_tl(temp_4, lf, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + setZFlag(temp_4); + tcg_gen_movi_tl(temp_5, 0); + setLF(temp_5); + tcg_temp_free(temp_3); + tcg_temp_free(lf); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + + return ret; +} + + + + + +/* SCONDD + * Variables: @src, @dest + * Functions: getLF, setMemory, nextReg, setZFlag, setLF +--- code --- +{ + lf = getLF (); + if((lf == 1)) + { + setMemory (@src, LONG, @dest); + pair = nextReg (dest); + setMemory ((@src + 4), LONG, pair); + }; + setZFlag (!lf); + setLF (0); +} + */ + +int +arc_gen_SCONDD (DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv lf = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv pair = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + getLF(temp_3); + tcg_gen_mov_tl(lf, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_1, lf, 1); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + setMemory(src, LONG, dest); + pair = nextReg (dest); + tcg_gen_addi_tl(temp_4, src, 4); + setMemory(temp_4, LONG, pair); + gen_set_label(done_1); + tcg_gen_xori_tl(temp_5, lf, 1); tcg_gen_andi_tl(temp_5, temp_5, 1);; + setZFlag(temp_5); + tcg_gen_movi_tl(temp_6, 0); + setLF(temp_6); + tcg_temp_free(temp_3); + tcg_temp_free(lf); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* DMB + * Variables: @a + * Functions: +--- code --- +{ + @a = @a; +} + */ + +int +arc_gen_DMB (DisasCtxt *ctx, TCGv a) +{ + int ret = DISAS_NEXT; + + return ret; +} + + + + + +/* LD + * Variables: @src1, @src2, @dest + * Functions: getAAFlag, getZZFlag, setDebugLD, getMemory, getFlagX, SignExtend, NoFurtherLoadsPending +--- code --- +{ + AA = getAAFlag (); + ZZ = getZZFlag (); + address = 0; + if(((AA == 0) || (AA == 1))) + { + address = (@src1 + @src2); + }; + if((AA == 2)) + { + address = @src1; + }; + if(((AA == 3) && ((ZZ == 0) || (ZZ == 3)))) + { + address = (@src1 + (@src2 << 2)); + }; + if(((AA == 3) && (ZZ == 2))) + { + address = (@src1 + (@src2 << 1)); + }; + l_src1 = @src1; + l_src2 = @src2; + setDebugLD (1); + new_dest = getMemory (address, ZZ); + if(((AA == 1) || (AA == 2))) + { + @src1 = (l_src1 + l_src2); + }; + if((getFlagX () == 1)) + { + new_dest = SignExtend (new_dest, ZZ); + }; + if(NoFurtherLoadsPending ()) + { + setDebugLD (0); + }; + @dest = new_dest; +} + */ + +int +arc_gen_LD (DisasCtxt *ctx, TCGv src1, TCGv src2, TCGv dest) +{ + int ret = DISAS_NEXT; + int AA; + int ZZ; + TCGv address = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv l_src1 = tcg_temp_local_new(); + TCGv l_src2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv new_dest = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + AA = getAAFlag (); + ZZ = getZZFlag (); + tcg_gen_movi_tl(address, 0); + if (((AA == 0) || (AA == 1))) + { + tcg_gen_add_tl(address, src1, src2); +; + } + else + { + ; + } + if ((AA == 2)) + { + tcg_gen_mov_tl(address, src1); +; + } + else + { + ; + } + if (((AA == 3) && ((ZZ == 0) || (ZZ == 3)))) + { + tcg_gen_shli_tl(temp_2, src2, 2); + tcg_gen_add_tl(address, src1, temp_2); +; + } + else + { + ; + } + if (((AA == 3) && (ZZ == 2))) + { + tcg_gen_shli_tl(temp_3, src2, 1); + tcg_gen_add_tl(address, src1, temp_3); +; + } + else + { + ; + } + tcg_gen_mov_tl(l_src1, src1); + tcg_gen_mov_tl(l_src2, src2); + tcg_gen_movi_tl(temp_4, 1); + setDebugLD(temp_4); + getMemory(temp_5, address, ZZ); + tcg_gen_mov_tl(new_dest, temp_5); + if (((AA == 1) || (AA == 2))) + { + tcg_gen_add_tl(src1, l_src1, l_src2); +; + } + else + { + ; + } + if ((getFlagX () == 1)) + { + new_dest = SignExtend (new_dest, ZZ); +; + } + else + { + ; + } + TCGLabel *done_1 = gen_new_label(); + NoFurtherLoadsPending(temp_6); + tcg_gen_xori_tl(temp_1, temp_6, 1); tcg_gen_andi_tl(temp_1, temp_1, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_1, arc_true, done_1);; + tcg_gen_movi_tl(temp_7, 0); + setDebugLD(temp_7); + gen_set_label(done_1); + tcg_gen_mov_tl(dest, new_dest); + tcg_temp_free(address); + tcg_temp_free(temp_2); + tcg_temp_free(temp_3); + tcg_temp_free(l_src1); + tcg_temp_free(l_src2); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + tcg_temp_free(new_dest); + tcg_temp_free(temp_6); + tcg_temp_free(temp_1); + tcg_temp_free(temp_7); + + return ret; +} + + + + + +/* LDD + * Variables: @src1, @src2, @dest + * Functions: getAAFlag, getZZFlag, setDebugLD, getMemory, nextReg, NoFurtherLoadsPending +--- code --- +{ + AA = getAAFlag (); + ZZ = getZZFlag (); + address = 0; + if(((AA == 0) || (AA == 1))) + { + address = (@src1 + @src2); + }; + if((AA == 2)) + { + address = @src1; + }; + if(((AA == 3) && ((ZZ == 0) || (ZZ == 3)))) + { + address = (@src1 + (@src2 << 2)); + }; + if(((AA == 3) && (ZZ == 2))) + { + address = (@src1 + (@src2 << 1)); + }; + l_src1 = @src1; + l_src2 = @src2; + setDebugLD (1); + new_dest = getMemory (address, LONG); + pair = nextReg (dest); + pair = getMemory ((address + 4), LONG); + if(((AA == 1) || (AA == 2))) + { + @src1 = (l_src1 + l_src2); + }; + if(NoFurtherLoadsPending ()) + { + setDebugLD (0); + }; + @dest = new_dest; +} + */ + +int +arc_gen_LDD (DisasCtxt *ctx, TCGv src1, TCGv src2, TCGv dest) +{ + int ret = DISAS_NEXT; + int AA; + int ZZ; + TCGv address = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv l_src1 = tcg_temp_local_new(); + TCGv l_src2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv new_dest = tcg_temp_local_new(); + TCGv pair = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + AA = getAAFlag (); + ZZ = getZZFlag (); + tcg_gen_movi_tl(address, 0); + if (((AA == 0) || (AA == 1))) + { + tcg_gen_add_tl(address, src1, src2); +; + } + else + { + ; + } + if ((AA == 2)) + { + tcg_gen_mov_tl(address, src1); +; + } + else + { + ; + } + if (((AA == 3) && ((ZZ == 0) || (ZZ == 3)))) + { + tcg_gen_shli_tl(temp_2, src2, 2); + tcg_gen_add_tl(address, src1, temp_2); +; + } + else + { + ; + } + if (((AA == 3) && (ZZ == 2))) + { + tcg_gen_shli_tl(temp_3, src2, 1); + tcg_gen_add_tl(address, src1, temp_3); +; + } + else + { + ; + } + tcg_gen_mov_tl(l_src1, src1); + tcg_gen_mov_tl(l_src2, src2); + tcg_gen_movi_tl(temp_4, 1); + setDebugLD(temp_4); + getMemory(temp_5, address, LONG); + tcg_gen_mov_tl(new_dest, temp_5); + pair = nextReg (dest); + tcg_gen_addi_tl(temp_7, address, 4); + getMemory(temp_6, temp_7, LONG); + tcg_gen_mov_tl(pair, temp_6); + if (((AA == 1) || (AA == 2))) + { + tcg_gen_add_tl(src1, l_src1, l_src2); +; + } + else + { + ; + } + TCGLabel *done_1 = gen_new_label(); + NoFurtherLoadsPending(temp_8); + tcg_gen_xori_tl(temp_1, temp_8, 1); tcg_gen_andi_tl(temp_1, temp_1, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_1, arc_true, done_1);; + tcg_gen_movi_tl(temp_9, 0); + setDebugLD(temp_9); + gen_set_label(done_1); + tcg_gen_mov_tl(dest, new_dest); + tcg_temp_free(address); + tcg_temp_free(temp_2); + tcg_temp_free(temp_3); + tcg_temp_free(l_src1); + tcg_temp_free(l_src2); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + tcg_temp_free(new_dest); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + tcg_temp_free(temp_8); + tcg_temp_free(temp_1); + tcg_temp_free(temp_9); + + return ret; +} + + + + + +/* ST + * Variables: @src1, @src2, @dest + * Functions: getAAFlag, getZZFlag, setMemory +--- code --- +{ + AA = getAAFlag (); + ZZ = getZZFlag (); + address = 0; + if(((AA == 0) || (AA == 1))) + { + address = (@src1 + @src2); + }; + if((AA == 2)) + { + address = @src1; + }; + if(((AA == 3) && ((ZZ == 0) || (ZZ == 3)))) + { + address = (@src1 + (@src2 << 2)); + }; + if(((AA == 3) && (ZZ == 2))) + { + address = (@src1 + (@src2 << 1)); + }; + setMemory (address, ZZ, @dest); + if(((AA == 1) || (AA == 2))) + { + @src1 = (@src1 + @src2); + }; +} + */ + +int +arc_gen_ST (DisasCtxt *ctx, TCGv src1, TCGv src2, TCGv dest) +{ + int ret = DISAS_NEXT; + int AA; + int ZZ; + TCGv address = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + AA = getAAFlag (); + ZZ = getZZFlag (); + tcg_gen_movi_tl(address, 0); + if (((AA == 0) || (AA == 1))) + { + tcg_gen_add_tl(address, src1, src2); +; + } + else + { + ; + } + if ((AA == 2)) + { + tcg_gen_mov_tl(address, src1); +; + } + else + { + ; + } + if (((AA == 3) && ((ZZ == 0) || (ZZ == 3)))) + { + tcg_gen_shli_tl(temp_1, src2, 2); + tcg_gen_add_tl(address, src1, temp_1); +; + } + else + { + ; + } + if (((AA == 3) && (ZZ == 2))) + { + tcg_gen_shli_tl(temp_2, src2, 1); + tcg_gen_add_tl(address, src1, temp_2); +; + } + else + { + ; + } + setMemory(address, ZZ, dest); + if (((AA == 1) || (AA == 2))) + { + tcg_gen_add_tl(src1, src1, src2); +; + } + else + { + ; + } + tcg_temp_free(address); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + + return ret; +} + + + + + +/* STD + * Variables: @src1, @src2, @dest + * Functions: getAAFlag, getZZFlag, setMemory, instructionHasRegisterOperandIn, nextReg, getBit +--- code --- +{ + AA = getAAFlag (); + ZZ = getZZFlag (); + address = 0; + if(((AA == 0) || (AA == 1))) + { + address = (@src1 + @src2); + }; + if((AA == 2)) + { + address = @src1; + }; + if(((AA == 3) && ((ZZ == 0) || (ZZ == 3)))) + { + address = (@src1 + (@src2 << 2)); + }; + if(((AA == 3) && (ZZ == 2))) + { + address = (@src1 + (@src2 << 1)); + }; + setMemory (address, LONG, @dest); + if(instructionHasRegisterOperandIn (0)) + { + pair = nextReg (dest); + } + else + { + if((getBit (@dest, 31) == 1)) + { + pair = 4294967295; + } + else + { + pair = 0; + }; + }; + setMemory ((address + 4), LONG, pair); + if(((AA == 1) || (AA == 2))) + { + @src1 = (@src1 + @src2); + }; +} + */ + +int +arc_gen_STD (DisasCtxt *ctx, TCGv src1, TCGv src2, TCGv dest) +{ + int ret = DISAS_NEXT; + int AA; + int ZZ; + TCGv address = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv pair = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + AA = getAAFlag (); + ZZ = getZZFlag (); + tcg_gen_movi_tl(address, 0); + if (((AA == 0) || (AA == 1))) + { + tcg_gen_add_tl(address, src1, src2); +; + } + else + { + ; + } + if ((AA == 2)) + { + tcg_gen_mov_tl(address, src1); +; + } + else + { + ; + } + if (((AA == 3) && ((ZZ == 0) || (ZZ == 3)))) + { + tcg_gen_shli_tl(temp_3, src2, 2); + tcg_gen_add_tl(address, src1, temp_3); +; + } + else + { + ; + } + if (((AA == 3) && (ZZ == 2))) + { + tcg_gen_shli_tl(temp_4, src2, 1); + tcg_gen_add_tl(address, src1, temp_4); +; + } + else + { + ; + } + setMemory(address, LONG, dest); + if (instructionHasRegisterOperandIn (0)) + { + pair = nextReg (dest); +; + } + else + { + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_movi_tl(temp_6, 31); + getBit(temp_5, dest, temp_6); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_1, temp_5, 1); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_1);; + tcg_gen_movi_tl(pair, 4294967295); + tcg_gen_br(done_1); + gen_set_label(else_1); + tcg_gen_movi_tl(pair, 0); + gen_set_label(done_1); +; + } + tcg_gen_addi_tl(temp_7, address, 4); + setMemory(temp_7, LONG, pair); + if (((AA == 1) || (AA == 2))) + { + tcg_gen_add_tl(src1, src1, src2); +; + } + else + { + ; + } + tcg_temp_free(address); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_7); + + return ret; +} + + + + + +/* POP + * Variables: @dest + * Functions: getMemory, getRegister, setRegister +--- code --- +{ + new_dest = getMemory (getRegister (R_SP), LONG); + setRegister (R_SP, (getRegister (R_SP) + 4)); + @dest = new_dest; +} + */ + +int +arc_gen_POP (DisasCtxt *ctx, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv new_dest = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + getRegister(temp_3, R_SP); + tcg_gen_mov_tl(temp_2, temp_3); + getMemory(temp_1, temp_2, LONG); + tcg_gen_mov_tl(new_dest, temp_1); + getRegister(temp_6, R_SP); + tcg_gen_mov_tl(temp_5, temp_6); + tcg_gen_addi_tl(temp_4, temp_5, 4); + setRegister(R_SP, temp_4); + tcg_gen_mov_tl(dest, new_dest); + tcg_temp_free(temp_3); + tcg_temp_free(temp_2); + tcg_temp_free(temp_1); + tcg_temp_free(new_dest); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* PUSH + * Variables: @src + * Functions: setMemory, getRegister, setRegister +--- code --- +{ + local_src = @src; + setMemory ((getRegister (R_SP) - 4), LONG, local_src); + setRegister (R_SP, (getRegister (R_SP) - 4)); +} + */ + +int +arc_gen_PUSH (DisasCtxt *ctx, TCGv src) +{ + int ret = DISAS_NEXT; + TCGv local_src = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + tcg_gen_mov_tl(local_src, src); + getRegister(temp_3, R_SP); + tcg_gen_mov_tl(temp_2, temp_3); + tcg_gen_subi_tl(temp_1, temp_2, 4); + setMemory(temp_1, LONG, local_src); + getRegister(temp_6, R_SP); + tcg_gen_mov_tl(temp_5, temp_6); + tcg_gen_subi_tl(temp_4, temp_5, 4); + setRegister(R_SP, temp_4); + tcg_temp_free(local_src); + tcg_temp_free(temp_3); + tcg_temp_free(temp_2); + tcg_temp_free(temp_1); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* LP + * Variables: @rd + * Functions: getCCFlag, getRegIndex, writeAuxReg, nextInsnAddress, getPCL, setPC +--- code --- +{ + if((getCCFlag () == true)) + { + lp_start_index = getRegIndex (LP_START); + lp_end_index = getRegIndex (LP_END); + writeAuxReg (lp_start_index, nextInsnAddress ()); + writeAuxReg (lp_end_index, (getPCL () + @rd)); + } + else + { + setPC ((getPCL () + @rd)); + }; +} + */ + +int +arc_gen_LP (DisasCtxt *ctx, TCGv rd) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv lp_start_index = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv lp_end_index = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_13 = tcg_temp_local_new(); + TCGv temp_12 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + getCCFlag(temp_3); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, temp_3, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_1);; + getRegIndex(temp_4, LP_START); + tcg_gen_mov_tl(lp_start_index, temp_4); + getRegIndex(temp_5, LP_END); + tcg_gen_mov_tl(lp_end_index, temp_5); + nextInsnAddress(temp_7); + tcg_gen_mov_tl(temp_6, temp_7); + writeAuxReg(lp_start_index, temp_6); + getPCL(temp_10); + tcg_gen_mov_tl(temp_9, temp_10); + tcg_gen_add_tl(temp_8, temp_9, rd); + writeAuxReg(lp_end_index, temp_8); + tcg_gen_br(done_1); + gen_set_label(else_1); + getPCL(temp_13); + tcg_gen_mov_tl(temp_12, temp_13); + tcg_gen_add_tl(temp_11, temp_12, rd); + setPC(temp_11); + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(lp_start_index); + tcg_temp_free(temp_5); + tcg_temp_free(lp_end_index); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + tcg_temp_free(temp_10); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(temp_13); + tcg_temp_free(temp_12); + tcg_temp_free(temp_11); + + return ret; +} + + + + +/* + * NORM + * Variables: @src, @dest + * Functions: CRLSB, getFFlag, setZFlag, setNFlag + * --- code --- + * { + * psrc = @src; + * psrc = SignExtend16to32 (psrc); + * @dest = 32 - CRLSB (psrc); + * if((getFFlag () == true)) + * { + * setZFlag (psrc); + * setNFlag (psrc); + * }; + * } + */ + +int +arc_gen_NORM(DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv psrc = tcg_temp_local_new(); + tcg_gen_mov_tl(psrc, src); + tcg_gen_ext32s_tl(psrc, psrc); + tcg_gen_clrsb_tl(dest, psrc); + tcg_gen_subi_tl(dest, dest, 32); + if ((getFFlag () == true)) { + setZFlag(psrc); + setNFlag(psrc); + } + tcg_temp_free(psrc); + + return ret; +} + + +/* + * NORMH + * Variables: @src, @dest + * Functions: SignExtend16to32, CRLSB, getFFlag, setZFlag, setNFlag + * --- code --- + * { + * psrc = (@src & 65535); + * psrc = SignExtend16to32 (psrc); + * @dest = CRLSB (psrc); + * @dest = (@dest - 16); + * if((getFFlag () == true)) + * { + * setZFlag (psrc); + * setNFlag (psrc); + * }; + * } + */ + +int +arc_gen_NORMH(DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv psrc = tcg_temp_local_new(); + tcg_gen_andi_tl(psrc, src, 65535); + tcg_gen_ext16s_tl(psrc, psrc); + tcg_gen_clrsb_tl(dest, psrc); + tcg_gen_subi_tl(dest, dest, 16); + if ((getFFlag () == true)) { + setZFlag(psrc); + setNFlag(psrc); + } + tcg_temp_free(psrc); + + return ret; +} + + +/* + * FLS + * Variables: @src, @dest + * Functions: CLZ, getFFlag, setZFlag, setNFlag + * --- code --- + * { + * psrc = @src & 0xffffffff; + * if((psrc == 0)) + * { + * @dest = 0; + * } + * else + * { + * @dest = 63 - CLZ (psrc, 32); + * }; + * if((getFFlag () == true)) + * { + * setZFlag (psrc); + * setNFlag (psrc); + * }; + * } + */ + +int +arc_gen_FLS(DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv psrc = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + tcg_gen_andi_tl(psrc, src, 0xffffffff); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_1, psrc, 0); + tcg_gen_xori_tl(temp_2, temp_1, 1); + tcg_gen_andi_tl(temp_2, temp_2, 1); + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_1); + tcg_gen_movi_tl(dest, 0); + tcg_gen_br(done_1); + gen_set_label(else_1); + tcg_gen_movi_tl(temp_5, 32); + tcg_gen_clz_tl(temp_4, psrc, temp_5); + tcg_gen_mov_tl(temp_3, temp_4); + tcg_gen_subfi_tl(dest, 63, temp_3); + gen_set_label(done_1); + if ((getFFlag () == true)) { + setZFlag(psrc); + setNFlag(psrc); + } + tcg_temp_free(psrc); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + tcg_temp_free(temp_3); + + return ret; +} + + + + + +/* + * FFS + * Variables: @src, @dest + * Functions: CTZ, getFFlag, setZFlag, setNFlag + * --- code --- + * { + * psrc = @src; + * if((psrc == 0)) + * { + * @dest = 31; + * } + * else + * { + * @dest = CTZ (psrc, 32); + * }; + * if((getFFlag () == true)) + * { + * setZFlag (psrc); + * setNFlag (psrc); + * }; + * } + */ + +int +arc_gen_FFS(DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv psrc = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + tcg_gen_mov_tl(psrc, src); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_1, psrc, 0); + tcg_gen_xori_tl(temp_2, temp_1, 1); + tcg_gen_andi_tl(temp_2, temp_2, 1); + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_1); + tcg_gen_movi_tl(dest, 31); + tcg_gen_br(done_1); + gen_set_label(else_1); + tcg_gen_movi_tl(temp_4, 32); + tcg_gen_ctz_tl(temp_3, psrc, temp_4); + tcg_gen_mov_tl(dest, temp_3); + gen_set_label(done_1); + if ((getFFlag () == true)) { + setZFlag(psrc); + setNFlag(psrc); + } + tcg_temp_free(psrc); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(temp_3); + + return ret; +} + + + +/* + * Long instructions + */ + + +/* ADDL + * Variables: @b, @c, @a + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag, setCFlag, CarryADD, setVFlag, OverflowADD +--- code --- +{ + cc_flag = getCCFlag (); + lb = @b; + lc = @c; + if((cc_flag == true)) + { + lb = @b; + lc = @c; + @a = (@b + @c); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag (@a); + setCFlag (CarryADD (@a, lb, lc)); + setVFlag (OverflowADD (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_ADDL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + tcg_gen_mov_tl(lb, b); + tcg_gen_mov_tl(lc, c); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(lb, b); + tcg_gen_mov_tl(lc, c); + tcg_gen_add_tl(a, b, c); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag(a); + CarryADD(temp_5, a, lb, lc); + tcg_gen_mov_tl(temp_4, temp_5); + setCFlag(temp_4); + OverflowADD(temp_7, a, lb, lc); + tcg_gen_mov_tl(temp_6, temp_7); + setVFlag(temp_6); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(lb); + tcg_temp_free(lc); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* ADD1L + * Variables: @b, @c, @a + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag, setCFlag, CarryADD, setVFlag, OverflowADD +--- code --- +{ + cc_flag = getCCFlag (); + lb = @b; + lc = @c; + if((cc_flag == true)) + { + lb = @b; + lc = @c; + @a = (@b + (@c << 1)); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag (@a); + setCFlag (CarryADD (@a, lb, lc)); + setVFlag (OverflowADD (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_ADD1L (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + tcg_gen_mov_tl(lb, b); + tcg_gen_mov_tl(lc, c); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(lb, b); + tcg_gen_mov_tl(lc, c); + tcg_gen_shli_tl(temp_4, c, 1); + tcg_gen_add_tl(a, b, temp_4); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag(a); + CarryADD(temp_6, a, lb, lc); + tcg_gen_mov_tl(temp_5, temp_6); + setCFlag(temp_5); + OverflowADD(temp_8, a, lb, lc); + tcg_gen_mov_tl(temp_7, temp_8); + setVFlag(temp_7); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(lb); + tcg_temp_free(lc); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + + return ret; +} + + + + + +/* ADD2L + * Variables: @b, @c, @a + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag, setCFlag, CarryADD, setVFlag, OverflowADD +--- code --- +{ + cc_flag = getCCFlag (); + lb = @b; + lc = @c; + if((cc_flag == true)) + { + lb = @b; + lc = @c; + @a = (@b + (@c << 2)); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag (@a); + setCFlag (CarryADD (@a, lb, lc)); + setVFlag (OverflowADD (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_ADD2L (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + tcg_gen_mov_tl(lb, b); + tcg_gen_mov_tl(lc, c); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(lb, b); + tcg_gen_mov_tl(lc, c); + tcg_gen_shli_tl(temp_4, c, 2); + tcg_gen_add_tl(a, b, temp_4); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag(a); + CarryADD(temp_6, a, lb, lc); + tcg_gen_mov_tl(temp_5, temp_6); + setCFlag(temp_5); + OverflowADD(temp_8, a, lb, lc); + tcg_gen_mov_tl(temp_7, temp_8); + setVFlag(temp_7); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(lb); + tcg_temp_free(lc); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + + return ret; +} + + + + + +/* ADD3L + * Variables: @b, @c, @a + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag, setCFlag, CarryADD, setVFlag, OverflowADD +--- code --- +{ + cc_flag = getCCFlag (); + lb = @b; + lc = @c; + if((cc_flag == true)) + { + lb = @b; + lc = @c; + @a = (@b + (@c << 3)); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag (@a); + setCFlag (CarryADD (@a, lb, lc)); + setVFlag (OverflowADD (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_ADD3L (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + tcg_gen_mov_tl(lb, b); + tcg_gen_mov_tl(lc, c); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(lb, b); + tcg_gen_mov_tl(lc, c); + tcg_gen_shli_tl(temp_4, c, 3); + tcg_gen_add_tl(a, b, temp_4); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag(a); + CarryADD(temp_6, a, lb, lc); + tcg_gen_mov_tl(temp_5, temp_6); + setCFlag(temp_5); + OverflowADD(temp_8, a, lb, lc); + tcg_gen_mov_tl(temp_7, temp_8); + setVFlag(temp_7); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(lb); + tcg_temp_free(lc); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + + return ret; +} + + + + + +/* ADCL + * Variables: @b, @c, @a + * Functions: getCCFlag, getCFlag, getFFlag, setZFlag, setNFlag, setCFlag, CarryADD, setVFlag, OverflowADD +--- code --- +{ + cc_flag = getCCFlag (); + lb = @b; + lc = @c; + if((cc_flag == true)) + { + lb = @b; + lc = @c; + @a = ((@b + @c) + getCFlag ()); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag (@a); + setCFlag (CarryADD (@a, lb, lc)); + setVFlag (OverflowADD (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_ADCL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + tcg_gen_mov_tl(lb, b); + tcg_gen_mov_tl(lc, c); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(lb, b); + tcg_gen_mov_tl(lc, c); + tcg_gen_add_tl(temp_4, b, c); + getCFlag(temp_6); + tcg_gen_mov_tl(temp_5, temp_6); + tcg_gen_add_tl(a, temp_4, temp_5); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag(a); + CarryADD(temp_8, a, lb, lc); + tcg_gen_mov_tl(temp_7, temp_8); + setCFlag(temp_7); + OverflowADD(temp_10, a, lb, lc); + tcg_gen_mov_tl(temp_9, temp_10); + setVFlag(temp_9); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(lb); + tcg_temp_free(lc); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + tcg_temp_free(temp_10); + tcg_temp_free(temp_9); + + return ret; +} + + + + + +/* SBCL + * Variables: @b, @c, @a + * Functions: getCCFlag, getCFlag, getFFlag, setZFlag, setNFlag, setCFlag, CarryADD, setVFlag, OverflowADD +--- code --- +{ + cc_flag = getCCFlag (); + lb = @b; + lc = @c; + if((cc_flag == true)) + { + lb = @b; + lc = @c; + @a = ((@b - @c) - getCFlag ()); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag (@a); + setCFlag (CarryADD (@a, lb, lc)); + setVFlag (OverflowADD (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_SBCL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + tcg_gen_mov_tl(lb, b); + tcg_gen_mov_tl(lc, c); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(lb, b); + tcg_gen_mov_tl(lc, c); + tcg_gen_sub_tl(temp_4, b, c); + getCFlag(temp_6); + tcg_gen_mov_tl(temp_5, temp_6); + tcg_gen_sub_tl(a, temp_4, temp_5); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag(a); + CarryADD(temp_8, a, lb, lc); + tcg_gen_mov_tl(temp_7, temp_8); + setCFlag(temp_7); + OverflowADD(temp_10, a, lb, lc); + tcg_gen_mov_tl(temp_9, temp_10); + setVFlag(temp_9); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(lb); + tcg_temp_free(lc); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + tcg_temp_free(temp_10); + tcg_temp_free(temp_9); + + return ret; +} + + + + + +/* SUBL + * Variables: @b, @c, @a + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag, setCFlag, CarrySUB, setVFlag, OverflowSUB +--- code --- +{ + cc_flag = getCCFlag (); + lb = @b; + if((cc_flag == true)) + { + lb = @b; + lc = @c; + @a = (@b - @c); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag (@a); + setCFlag (CarrySUB (@a, lb, lc)); + setVFlag (OverflowSUB (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_SUBL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + tcg_gen_mov_tl(lb, b); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(lb, b); + tcg_gen_mov_tl(lc, c); + tcg_gen_sub_tl(a, b, c); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag(a); + CarrySUB(temp_5, a, lb, lc); + tcg_gen_mov_tl(temp_4, temp_5); + setCFlag(temp_4); + OverflowSUB(temp_7, a, lb, lc); + tcg_gen_mov_tl(temp_6, temp_7); + setVFlag(temp_6); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(lb); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lc); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* SUB1L + * Variables: @b, @c, @a + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag, setCFlag, CarrySUB, setVFlag, OverflowSUB +--- code --- +{ + cc_flag = getCCFlag (); + lb = @b; + if((cc_flag == true)) + { + lb = @b; + lc = (@c << 1); + @a = (@b - lc); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag (@a); + setCFlag (CarrySUB (@a, lb, lc)); + setVFlag (OverflowSUB (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_SUB1L (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + tcg_gen_mov_tl(lb, b); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(lb, b); + tcg_gen_shli_tl(lc, c, 1); + tcg_gen_sub_tl(a, b, lc); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag(a); + CarrySUB(temp_5, a, lb, lc); + tcg_gen_mov_tl(temp_4, temp_5); + setCFlag(temp_4); + OverflowSUB(temp_7, a, lb, lc); + tcg_gen_mov_tl(temp_6, temp_7); + setVFlag(temp_6); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(lb); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lc); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* SUB2L + * Variables: @b, @c, @a + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag, setCFlag, CarrySUB, setVFlag, OverflowSUB +--- code --- +{ + cc_flag = getCCFlag (); + lb = @b; + if((cc_flag == true)) + { + lb = @b; + lc = (@c << 2); + @a = (@b - lc); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag (@a); + setCFlag (CarrySUB (@a, lb, lc)); + setVFlag (OverflowSUB (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_SUB2L (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + tcg_gen_mov_tl(lb, b); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(lb, b); + tcg_gen_shli_tl(lc, c, 2); + tcg_gen_sub_tl(a, b, lc); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag(a); + CarrySUB(temp_5, a, lb, lc); + tcg_gen_mov_tl(temp_4, temp_5); + setCFlag(temp_4); + OverflowSUB(temp_7, a, lb, lc); + tcg_gen_mov_tl(temp_6, temp_7); + setVFlag(temp_6); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(lb); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lc); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* SUB3L + * Variables: @b, @c, @a + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag, setCFlag, CarrySUB, setVFlag, OverflowSUB +--- code --- +{ + cc_flag = getCCFlag (); + lb = @b; + if((cc_flag == true)) + { + lb = @b; + lc = (@c << 3); + @a = (@b - lc); + if((getFFlag () == true)) + { + setZFlag (@a); + setNFlag (@a); + setCFlag (CarrySUB (@a, lb, lc)); + setVFlag (OverflowSUB (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_SUB3L (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + tcg_gen_mov_tl(lb, b); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(lb, b); + tcg_gen_shli_tl(lc, c, 3); + tcg_gen_sub_tl(a, b, lc); + if ((getFFlag () == true)) + { + setZFlag(a); + setNFlag(a); + CarrySUB(temp_5, a, lb, lc); + tcg_gen_mov_tl(temp_4, temp_5); + setCFlag(temp_4); + OverflowSUB(temp_7, a, lb, lc); + tcg_gen_mov_tl(temp_6, temp_7); + setVFlag(temp_6); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(lb); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lc); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* MAXL + * Variables: @b, @c, @a + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag, setCFlag, CarrySUB, setVFlag, OverflowSUB +--- code --- +{ + cc_flag = getCCFlag (); + lb = @b; + if((cc_flag == true)) + { + lb = @b; + lc = @c; + alu = (lb - lc); + if((lc >= lb)) + { + @a = lc; + } + else + { + @a = lb; + }; + if((getFFlag () == true)) + { + setZFlag (alu); + setNFlag (alu); + setCFlag (CarrySUB (@a, lb, lc)); + setVFlag (OverflowSUB (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_MAXL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv alu = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + tcg_gen_mov_tl(lb, b); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(lb, b); + tcg_gen_mov_tl(lc, c); + tcg_gen_sub_tl(alu, lb, lc); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_GE, temp_3, lc, lb); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_mov_tl(a, lc); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_mov_tl(a, lb); + gen_set_label(done_2); + if ((getFFlag () == true)) + { + setZFlag(alu); + setNFlag(alu); + CarrySUB(temp_7, a, lb, lc); + tcg_gen_mov_tl(temp_6, temp_7); + setCFlag(temp_6); + OverflowSUB(temp_9, a, lb, lc); + tcg_gen_mov_tl(temp_8, temp_9); + setVFlag(temp_8); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(lb); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lc); + tcg_temp_free(alu); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + + return ret; +} + + + + + +/* MINL + * Variables: @b, @c, @a + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag, setCFlag, CarrySUB, setVFlag, OverflowSUB +--- code --- +{ + cc_flag = getCCFlag (); + lb = @b; + if((cc_flag == true)) + { + lb = @b; + lc = @c; + alu = (lb - lc); + if((lc <= lb)) + { + @a = lc; + } + else + { + @a = lb; + }; + if((getFFlag () == true)) + { + setZFlag (alu); + setNFlag (alu); + setCFlag (CarrySUB (@a, lb, lc)); + setVFlag (OverflowSUB (@a, lb, lc)); + }; + }; +} + */ + +int +arc_gen_MINL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv alu = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + tcg_gen_mov_tl(lb, b); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(lb, b); + tcg_gen_mov_tl(lc, c); + tcg_gen_sub_tl(alu, lb, lc); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_LE, temp_3, lc, lb); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_mov_tl(a, lc); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_mov_tl(a, lb); + gen_set_label(done_2); + if ((getFFlag () == true)) + { + setZFlag(alu); + setNFlag(alu); + CarrySUB(temp_7, a, lb, lc); + tcg_gen_mov_tl(temp_6, temp_7); + setCFlag(temp_6); + OverflowSUB(temp_9, a, lb, lc); + tcg_gen_mov_tl(temp_8, temp_9); + setVFlag(temp_8); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(lb); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lc); + tcg_temp_free(alu); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + + return ret; +} + + + + + +/* CMPL + * Variables: @b, @c + * Functions: getCCFlag, setZFlag, setNFlag, setCFlag, CarrySUB, setVFlag, OverflowSUB +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + alu = (@b - @c); + setZFlag (alu); + setNFlag (alu); + setCFlag (CarrySUB (alu, @b, @c)); + setVFlag (OverflowSUB (alu, @b, @c)); + }; +} + */ + +int +arc_gen_CMPL (DisasCtxt *ctx, TCGv b, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv alu = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_sub_tl(alu, b, c); + setZFlag(alu); + setNFlag(alu); + CarrySUB(temp_5, alu, b, c); + tcg_gen_mov_tl(temp_4, temp_5); + setCFlag(temp_4); + OverflowSUB(temp_7, alu, b, c); + tcg_gen_mov_tl(temp_6, temp_7); + setVFlag(temp_6); + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(alu); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* ANDL + * Variables: @a, @b, @c + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @a = (@b & @c); + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag (@a); + }; + }; +} + */ + +int +arc_gen_ANDL (DisasCtxt *ctx, TCGv a, TCGv b, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_and_tl(a, b, c); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + + return ret; +} + + + + + +/* ORL + * Variables: @a, @b, @c + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @a = (@b | @c); + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag (@a); + }; + }; +} + */ + +int +arc_gen_ORL (DisasCtxt *ctx, TCGv a, TCGv b, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_or_tl(a, b, c); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + + return ret; +} + + + + + +/* XORL + * Variables: @a, @b, @c + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @a = (@b ^ @c); + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag (@a); + }; + }; +} + */ + +int +arc_gen_XORL (DisasCtxt *ctx, TCGv a, TCGv b, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_xor_tl(a, b, c); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + + return ret; +} + + + + + +/* MOVL + * Variables: @a, @b + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @a = @b; + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag (@a); + }; + }; +} + */ + +int +arc_gen_MOVL (DisasCtxt *ctx, TCGv a, TCGv b) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(a, b); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + + return ret; +} + +/* MOVHL + * Variables: @a, @b + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + tmp = @b << 32; + @a = @b + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag (@a); + }; + }; +} + */ + +int +arc_gen_MOVHL (DisasCtxt *ctx, TCGv a, TCGv b) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + + //tmp = @b << 32; + //@a = tmp; + + tcg_gen_shli_tl(temp_4, b, 32); + tcg_gen_mov_tl(a, temp_4); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* ASLL + * Variables: @b, @c, @a + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag, setCFlag, getBit +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lb = @b; + lc = (@c & 63); + @a = (lb << lc); + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag (@a); + if((lc == 0)) + { + setCFlag (0); + } + else + { + setCFlag (getBit (lb, (64 - lc))); + }; + }; + }; +} + */ + +int +arc_gen_ASLL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + int f_flag; + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(lb, b); + tcg_gen_andi_tl(lc, c, 63); + tcg_gen_shl_tl(a, lb, lc); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag(a); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_3, lc, 0); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_movi_tl(temp_6, 0); + setCFlag(temp_6); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_subfi_tl(temp_9, 64, lc); + getBit(temp_8, lb, temp_9); + tcg_gen_mov_tl(temp_7, temp_8); + setCFlag(temp_7); + gen_set_label(done_2); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lb); + tcg_temp_free(lc); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_6); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + + return ret; +} + + + + + +/* ASRL + * Variables: @b, @c, @a + * Functions: getCCFlag, arithmeticShiftRight, getFFlag, setZFlag, setNFlag, setCFlag, getBit +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lb = @b; + lc = (@c & 63); + @a = arithmeticShiftRight (lb, lc); + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag (@a); + if((lc == 0)) + { + setCFlag (0); + } + else + { + setCFlag (getBit (lb, (lc - 1))); + }; + }; + }; +} + */ + +int +arc_gen_ASRL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + int f_flag; + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(lb, b); + tcg_gen_andi_tl(lc, c, 63); + arithmeticShiftRight(temp_6, lb, lc); + tcg_gen_mov_tl(a, temp_6); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag(a); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_3, lc, 0); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_movi_tl(temp_7, 0); + setCFlag(temp_7); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_subi_tl(temp_10, lc, 1); + getBit(temp_9, lb, temp_10); + tcg_gen_mov_tl(temp_8, temp_9); + setCFlag(temp_8); + gen_set_label(done_2); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lb); + tcg_temp_free(lc); + tcg_temp_free(temp_6); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_7); + tcg_temp_free(temp_10); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + + return ret; +} + + + + + +/* LSRL + * Variables: @b, @c, @a + * Functions: getCCFlag, logicalShiftRight, getFFlag, setZFlag, setNFlag, setCFlag, getBit +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lb = @b; + lc = (@c & 63); + @a = logicalShiftRight (lb, lc); + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag (@a); + if((lc == 0)) + { + setCFlag (0); + } + else + { + setCFlag (getBit (lb, (lc - 1))); + }; + }; + }; +} + */ + +int +arc_gen_LSRL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lb = tcg_temp_local_new(); + TCGv lc = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + int f_flag; + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(lb, b); + tcg_gen_andi_tl(lc, c, 63); + logicalShiftRight(temp_6, lb, lc); + tcg_gen_mov_tl(a, temp_6); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag(a); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_3, lc, 0); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_movi_tl(temp_7, 0); + setCFlag(temp_7); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_subi_tl(temp_10, lc, 1); + getBit(temp_9, lb, temp_10); + tcg_gen_mov_tl(temp_8, temp_9); + setCFlag(temp_8); + gen_set_label(done_2); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lb); + tcg_temp_free(lc); + tcg_temp_free(temp_6); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_7); + tcg_temp_free(temp_10); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + + return ret; +} + + + + + + +/* BICL + * Variables: @a, @b, @c + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @a = (@b & ~@c); + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag (@a); + }; + }; +} + */ + +int +arc_gen_BICL (DisasCtxt *ctx, TCGv a, TCGv b, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_not_tl(temp_4, c); + tcg_gen_and_tl(a, b, temp_4); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* BCLRL + * Variables: @c, @a, @b + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + tmp = (1 << (@c & 63)); + @a = (@b & ~tmp); + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag (@a); + }; + }; +} + */ + +int +arc_gen_BCLRL (DisasCtxt *ctx, TCGv c, TCGv a, TCGv b) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv tmp = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(temp_4, c, 63); + tcg_gen_shlfi_tl(tmp, 1, temp_4); + tcg_gen_not_tl(temp_5, tmp); + tcg_gen_and_tl(a, b, temp_5); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(tmp); + tcg_temp_free(temp_5); + + return ret; +} + + + + + +/* BMSKL + * Variables: @c, @a, @b + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + tmp1 = ((@c & 63) + 1); + if((tmp1 == 64)) + { + tmp2 = 0xffffffffffffffff; + } + else + { + tmp2 = ((1 << tmp1) - 1); + }; + @a = (@b & tmp2); + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag (@a); + }; + }; +} + */ + +int +arc_gen_BMSKL (DisasCtxt *ctx, TCGv c, TCGv a, TCGv b) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv tmp1 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv tmp2 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(temp_6, c, 63); + tcg_gen_addi_tl(tmp1, temp_6, 1); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_3, tmp1, 64); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_movi_tl(tmp2, 0xffffffffffffffff); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_shlfi_tl(temp_7, 1, tmp1); + tcg_gen_subi_tl(tmp2, temp_7, 1); + gen_set_label(done_2); + tcg_gen_and_tl(a, b, tmp2); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(tmp1); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(tmp2); + tcg_temp_free(temp_7); + + return ret; +} + + + + + +/* BMSKNL + * Variables: @c, @a, @b + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + tmp1 = ((@c & 63) + 1); + if((tmp1 == 64)) + { + tmp2 = 0xffffffffffffffff; + } + else + { + tmp2 = ((1 << tmp1) - 1); + }; + @a = (@b & ~tmp2); + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag (@a); + }; + }; +} + */ + +int +arc_gen_BMSKNL (DisasCtxt *ctx, TCGv c, TCGv a, TCGv b) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv tmp1 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv tmp2 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(temp_6, c, 63); + tcg_gen_addi_tl(tmp1, temp_6, 1); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_3, tmp1, 64); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_movi_tl(tmp2, 0xffffffffffffffff); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_shlfi_tl(temp_7, 1, tmp1); + tcg_gen_subi_tl(tmp2, temp_7, 1); + gen_set_label(done_2); + tcg_gen_not_tl(temp_8, tmp2); + tcg_gen_and_tl(a, b, temp_8); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(tmp1); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(tmp2); + tcg_temp_free(temp_7); + tcg_temp_free(temp_8); + + return ret; +} + + + + + +/* BSETL + * Variables: @c, @a, @b + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + tmp = (1 << (@c & 63)); + @a = (@b | tmp); + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag (@a); + }; + }; +} + */ + +int +arc_gen_BSETL (DisasCtxt *ctx, TCGv c, TCGv a, TCGv b) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv tmp = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(temp_4, c, 63); + tcg_gen_shlfi_tl(tmp, 1, temp_4); + tcg_gen_or_tl(a, b, tmp); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(tmp); + + return ret; +} + + + + + +/* BXORL + * Variables: @c, @a, @b + * Functions: getCCFlag, getFFlag, setZFlag, setNFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + tmp = (1 << @c); + @a = (@b ^ tmp); + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@a); + setNFlag (@a); + }; + }; +} + */ + +int +arc_gen_BXORL (DisasCtxt *ctx, TCGv c, TCGv a, TCGv b) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv tmp = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_shlfi_tl(tmp, 1, c); + tcg_gen_xor_tl(a, b, tmp); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(a); + setNFlag(a); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(tmp); + + return ret; +} + + + + + +/* ROLL + * Variables: @src, @dest + * Functions: getCCFlag, rotateLeft, getFFlag, setZFlag, setNFlag, setCFlag, extractBits +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + lsrc = @src; + @dest = rotateLeft (lsrc, 1); + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag (@dest); + setCFlag (extractBits (lsrc, 63, 63)); + }; + }; +} + */ + +int +arc_gen_ROLL (DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv lsrc = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(lsrc, src); + tcg_gen_movi_tl(temp_5, 1); + rotateLeft(temp_4, lsrc, temp_5); + tcg_gen_mov_tl(dest, temp_4); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag(dest); + tcg_gen_movi_tl(temp_9, 63); + tcg_gen_movi_tl(temp_8, 63); + extractBits(temp_7, lsrc, temp_8, temp_9); + tcg_gen_mov_tl(temp_6, temp_7); + setCFlag(temp_6); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(lsrc); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + + return ret; +} + + + + + +/* SEXBL + * Variables: @dest, @src + * Functions: getCCFlag, arithmeticShiftRight, getFFlag, setZFlag, setNFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @dest = arithmeticShiftRight ((@src << 24), 24); + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag (@dest); + }; + }; +} + */ + +int +arc_gen_SEXBL (DisasCtxt *ctx, TCGv dest, TCGv src) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_movi_tl(temp_6, 56); + tcg_gen_shli_tl(temp_5, src, 56); + arithmeticShiftRight(temp_4, temp_5, temp_6); + tcg_gen_mov_tl(dest, temp_4); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag(dest); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* SEXHL + * Variables: @dest, @src + * Functions: getCCFlag, arithmeticShiftRight, getFFlag, setZFlag, setNFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @dest = arithmeticShiftRight ((@src << 16), 16); + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag (@dest); + }; + }; +} + */ + +int +arc_gen_SEXHL (DisasCtxt *ctx, TCGv dest, TCGv src) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_movi_tl(temp_6, 48); + tcg_gen_shli_tl(temp_5, src, 48); + arithmeticShiftRight(temp_4, temp_5, temp_6); + tcg_gen_mov_tl(dest, temp_4); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag(dest); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + + return ret; +} + + +/* SEXWL + * Variables: @dest, @src + * Functions: getCCFlag, arithmeticShiftRight, getFFlag, setZFlag, setNFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + @dest = arithmeticShiftRight ((@src << 32), 32); + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag (@dest); + }; + }; +} + */ + +int +arc_gen_SEXWL (DisasCtxt *ctx, TCGv dest, TCGv src) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + int f_flag; + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_movi_tl(temp_6, 32); + tcg_gen_shli_tl(temp_5, src, 32); + arithmeticShiftRight(temp_4, temp_5, temp_6); + tcg_gen_mov_tl(dest, temp_4); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag(dest); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* BTSTL + * Variables: @c, @b + * Functions: getCCFlag, setZFlag, setNFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + tmp = (1 << (@c & 63)); + alu = (@b & tmp); + setZFlag (alu); + setNFlag (alu); + }; +} + */ + +int +arc_gen_BTSTL (DisasCtxt *ctx, TCGv c, TCGv b) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv tmp = tcg_temp_local_new(); + TCGv alu = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_andi_tl(temp_4, c, 63); + tcg_gen_shlfi_tl(tmp, 1, temp_4); + tcg_gen_and_tl(alu, b, tmp); + setZFlag(alu); + setNFlag(alu); + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(tmp); + tcg_temp_free(alu); + + return ret; +} + + + + + +/* TSTL + * Variables: @b, @c + * Functions: getCCFlag, setZFlag, setNFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + alu = (@b & @c); + setZFlag (alu); + setNFlag (alu); + }; +} + */ + +int +arc_gen_TSTL (DisasCtxt *ctx, TCGv b, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv alu = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_and_tl(alu, b, c); + setZFlag(alu); + setNFlag(alu); + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(alu); + + return ret; +} + + + + + +/* XBFUL + * Variables: @src2, @src1, @dest + * Functions: getCCFlag, extractBits, getFFlag, setZFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + N = extractBits (@src2, 5, 0); + M = (extractBits (@src2, 11, 6) + 1); + tmp1 = (@src1 >> N); + tmp2 = ((1 << M) - 1); + @dest = (tmp1 & tmp2); + if((getFFlag () == true)) + { + setZFlag (@dest); + }; + }; +} + */ + +int +arc_gen_XBFUL (DisasCtxt *ctx, TCGv src2, TCGv src1, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv N = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv M = tcg_temp_local_new(); + TCGv tmp1 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + TCGv tmp2 = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_movi_tl(temp_6, 0); + tcg_gen_movi_tl(temp_5, 5); + extractBits(temp_4, src2, temp_5, temp_6); + tcg_gen_mov_tl(N, temp_4); + tcg_gen_movi_tl(temp_10, 6); + tcg_gen_movi_tl(temp_9, 11); + extractBits(temp_8, src2, temp_9, temp_10); + tcg_gen_mov_tl(temp_7, temp_8); + tcg_gen_addi_tl(M, temp_7, 1); + tcg_gen_shr_tl(tmp1, src1, N); + tcg_gen_shlfi_tl(temp_11, 1, M); + tcg_gen_subi_tl(tmp2, temp_11, 1); + tcg_gen_and_tl(dest, tmp1, tmp2); + if ((getFFlag () == true)) + { + setZFlag(dest); +; + } + else + { + ; + } + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + tcg_temp_free(N); + tcg_temp_free(temp_10); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(temp_7); + tcg_temp_free(M); + tcg_temp_free(tmp1); + tcg_temp_free(temp_11); + tcg_temp_free(tmp2); + + return ret; +} + + + + + +/* AEXL + * Variables: @src2, @b + * Functions: getCCFlag, readAuxReg, writeAuxReg +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + tmp = readAuxReg (@src2); + writeAuxReg (@src2, @b); + @b = tmp; + }; +} + */ + +int +arc_gen_AEXL (DisasCtxt *ctx, TCGv src2, TCGv b) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv tmp = tcg_temp_local_new(); + getCCFlag(temp_3); + tcg_gen_mov_tl(cc_flag, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + readAuxReg(temp_4, src2); + tcg_gen_mov_tl(tmp, temp_4); + writeAuxReg(src2, b); + tcg_gen_mov_tl(b, tmp); + gen_set_label(done_1); + tcg_temp_free(temp_3); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(tmp); + + return ret; +} + + + + + +/* LRL + * Variables: @dest, @src + * Functions: readAuxReg +--- code --- +{ + @dest = readAuxReg (@src); +} + */ + +int +arc_gen_LRL (DisasCtxt *ctx, TCGv dest, TCGv src) +{ + int ret = DISAS_NEXT; + TCGv temp_1 = tcg_temp_local_new(); + readAuxReg(temp_1, src); + tcg_gen_mov_tl(dest, temp_1); + tcg_temp_free(temp_1); + + return ret; +} + + + + + +/* DIVL + * Variables: @src2, @src1, @dest + * Functions: getCCFlag, divSigned, getFFlag, setZFlag, setNFlag, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + if(((@src2 != 0) && ((@src1 != 2147483648) || (@src2 != 4294967295)))) + { + @dest = divSigned (@src1, @src2); + if((getFFlag () == true)) + { + setZFlag (@dest); + setNFlag (@dest); + setVFlag (0); + }; + } + else + { + }; + }; +} + */ + +int +arc_gen_DIVL (DisasCtxt *ctx, TCGv src2, TCGv src1, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_9 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + getCCFlag(temp_9); + tcg_gen_mov_tl(cc_flag, temp_9); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_3, src2, 0); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_4, src1, 2147483648); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_5, src2, 4294967295); + tcg_gen_or_tl(temp_6, temp_4, temp_5); + tcg_gen_and_tl(temp_7, temp_3, temp_6); + tcg_gen_xori_tl(temp_8, temp_7, 1); tcg_gen_andi_tl(temp_8, temp_8, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_8, arc_true, else_2);; + divSigned(temp_10, src1, src2); + tcg_gen_mov_tl(dest, temp_10); + if ((getFFlag () == true)) + { + setZFlag(dest); + setNFlag(dest); + tcg_gen_movi_tl(temp_11, 0); + setVFlag(temp_11); +; + } + else + { + ; + } + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + gen_set_label(done_1); + tcg_temp_free(temp_9); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + tcg_temp_free(temp_7); + tcg_temp_free(temp_8); + tcg_temp_free(temp_10); + tcg_temp_free(temp_11); + + return ret; +} + + + + + +/* DIVUL + * Variables: @src2, @dest, @src1 + * Functions: getCCFlag, divUnsigned, getFFlag, setZFlag, setNFlag, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + if((@src2 != 0)) + { + @dest = divUnsigned (@src1, @src2); + if((getFFlag () == true)) + { + setZFlag (@dest); + setNFlag (0); + setVFlag (0); + }; + } + else + { + }; + }; +} + */ + +int +arc_gen_DIVUL (DisasCtxt *ctx, TCGv src2, TCGv dest, TCGv src1) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_3, src2, 0); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + divUnsigned(temp_6, src1, src2); + tcg_gen_mov_tl(dest, temp_6); + if ((getFFlag () == true)) + { + setZFlag(dest); + tcg_gen_movi_tl(temp_7, 0); + setNFlag(temp_7); + tcg_gen_movi_tl(temp_8, 0); + setVFlag(temp_8); +; + } + else + { + ; + } + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_6); + tcg_temp_free(temp_7); + tcg_temp_free(temp_8); + + return ret; +} + + + + + +/* REML + * Variables: @src2, @src1, @dest + * Functions: getCCFlag, divRemainingSigned, getFFlag, setZFlag, setNFlag, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + if(((@src2 != 0) && ((@src1 != 2147483648) || (@src2 != 4294967295)))) + { + @dest = divRemainingSigned (@src1, @src2); + if((getFFlag () == true)) + { + setZFlag (@dest); + setNFlag (@dest); + setVFlag (0); + }; + } + else + { + }; + }; +} + */ + +int +arc_gen_REML (DisasCtxt *ctx, TCGv src2, TCGv src1, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_9 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv temp_10 = tcg_temp_local_new(); + TCGv temp_11 = tcg_temp_local_new(); + getCCFlag(temp_9); + tcg_gen_mov_tl(cc_flag, temp_9); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_3, src2, 0); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_4, src1, 2147483648); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_5, src2, 4294967295); + tcg_gen_or_tl(temp_6, temp_4, temp_5); + tcg_gen_and_tl(temp_7, temp_3, temp_6); + tcg_gen_xori_tl(temp_8, temp_7, 1); tcg_gen_andi_tl(temp_8, temp_8, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_8, arc_true, else_2);; + divRemainingSigned(temp_10, src1, src2); + tcg_gen_mov_tl(dest, temp_10); + if ((getFFlag () == true)) + { + setZFlag(dest); + setNFlag(dest); + tcg_gen_movi_tl(temp_11, 0); + setVFlag(temp_11); +; + } + else + { + ; + } + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + gen_set_label(done_1); + tcg_temp_free(temp_9); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + tcg_temp_free(temp_6); + tcg_temp_free(temp_7); + tcg_temp_free(temp_8); + tcg_temp_free(temp_10); + tcg_temp_free(temp_11); + + return ret; +} + + + + + +/* REMUL + * Variables: @src2, @dest, @src1 + * Functions: getCCFlag, divRemainingUnsigned, getFFlag, setZFlag, setNFlag, setVFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + if((@src2 != 0)) + { + @dest = divRemainingUnsigned (@src1, @src2); + if((getFFlag () == true)) + { + setZFlag (@dest); + setNFlag (0); + setVFlag (0); + }; + } + else + { + }; + }; +} + */ + +int +arc_gen_REMUL (DisasCtxt *ctx, TCGv src2, TCGv dest, TCGv src1) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_NE, temp_3, src2, 0); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + divRemainingUnsigned(temp_6, src1, src2); + tcg_gen_mov_tl(dest, temp_6); + if ((getFFlag () == true)) + { + setZFlag(dest); + tcg_gen_movi_tl(temp_7, 0); + setNFlag(temp_7); + tcg_gen_movi_tl(temp_8, 0); + setVFlag(temp_8); +; + } + else + { + ; + } + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_6); + tcg_temp_free(temp_7); + tcg_temp_free(temp_8); + + return ret; +} + + + + + +/* ABSL + * Variables: @src, @dest + * Functions: Carry, getFFlag, setZFlag, setNFlag, setCFlag, Zero, setVFlag, getNFlag +--- code --- +{ + lsrc = @src; + alu = (0 - lsrc); + if((Carry (lsrc) == 1)) + { + @dest = alu; + } + else + { + @dest = lsrc; + }; + if((getFFlag () == true)) + { + setZFlag (@dest); + setNFlag (@dest); + setCFlag (Zero ()); + setVFlag (getNFlag ()); + }; +} + */ + +int +arc_gen_ABSL (DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv lsrc = tcg_temp_local_new(); + TCGv alu = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + tcg_gen_mov_tl(lsrc, src); + tcg_gen_subfi_tl(alu, 0, lsrc); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + Carry(temp_3, lsrc); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_1, temp_3, 1); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_1);; + tcg_gen_mov_tl(dest, alu); + tcg_gen_br(done_1); + gen_set_label(else_1); + tcg_gen_mov_tl(dest, lsrc); + gen_set_label(done_1); + if ((getFFlag () == true)) + { + setZFlag(dest); + setNFlag(dest); + tcg_gen_mov_tl(temp_4, Zero()); + setCFlag(temp_4); + tcg_gen_mov_tl(temp_5, getNFlag()); + setVFlag(temp_5); +; + } + else + { + ; + } + tcg_temp_free(lsrc); + tcg_temp_free(alu); + tcg_temp_free(temp_3); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + + return ret; +} + + + + + +/* SWAPL + * Variables: @src, @dest + * Functions: getFFlag, setZFlag, setNFlag +--- code --- +{ + tmp1 = (@src << 16); + tmp2 = ((@src >> 16) & 65535); + @dest = (tmp1 | tmp2); + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag (@dest); + }; +} + */ + +int +arc_gen_SWAPL (DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv tmp1 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv tmp2 = tcg_temp_local_new(); + int f_flag; + tcg_gen_shli_tl(tmp1, src, 16); + tcg_gen_shri_tl(temp_1, src, 16); + tcg_gen_andi_tl(tmp2, temp_1, 65535); + tcg_gen_or_tl(dest, tmp1, tmp2); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag(dest); +; + } + else + { + ; + } + tcg_temp_free(tmp1); + tcg_temp_free(temp_1); + tcg_temp_free(tmp2); + + return ret; +} + + + + + +/* SWAPEL + * Variables: @src, @dest + * Functions: getFFlag, setZFlag, setNFlag +--- code --- +{ + tmp1 = ((@src << 24) & 4278190080); + tmp2 = ((@src << 8) & 16711680); + tmp3 = ((@src >> 8) & 65280); + tmp4 = ((@src >> 24) & 255); + @dest = (((tmp1 | tmp2) | tmp3) | tmp4); + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag (@dest); + }; +} + */ + +int +arc_gen_SWAPEL (DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_1 = tcg_temp_local_new(); + TCGv tmp1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv tmp2 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv tmp3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv tmp4 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + int f_flag; + tcg_gen_shli_tl(temp_1, src, 24); + tcg_gen_andi_tl(tmp1, temp_1, 4278190080); + tcg_gen_shli_tl(temp_2, src, 8); + tcg_gen_andi_tl(tmp2, temp_2, 16711680); + tcg_gen_shri_tl(temp_3, src, 8); + tcg_gen_andi_tl(tmp3, temp_3, 65280); + tcg_gen_shri_tl(temp_4, src, 24); + tcg_gen_andi_tl(tmp4, temp_4, 255); + tcg_gen_or_tl(temp_6, tmp1, tmp2); + tcg_gen_or_tl(temp_5, temp_6, tmp3); + tcg_gen_or_tl(dest, temp_5, tmp4); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag(dest); +; + } + else + { + ; + } + tcg_temp_free(temp_1); + tcg_temp_free(tmp1); + tcg_temp_free(temp_2); + tcg_temp_free(tmp2); + tcg_temp_free(temp_3); + tcg_temp_free(tmp3); + tcg_temp_free(temp_4); + tcg_temp_free(tmp4); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + + return ret; +} + + + + + +/* NOTL + * Variables: @dest, @src + * Functions: getFFlag, setZFlag, setNFlag +--- code --- +{ + @dest = ~@src; + f_flag = getFFlag (); + if((f_flag == true)) + { + setZFlag (@dest); + setNFlag (@dest); + }; +} + */ + +int +arc_gen_NOTL (DisasCtxt *ctx, TCGv dest, TCGv src) +{ + int ret = DISAS_NEXT; + int f_flag; + tcg_gen_not_tl(dest, src); + f_flag = getFFlag (); + if ((f_flag == true)) + { + setZFlag(dest); + setNFlag(dest); +; + } + else + { + ; + } + + return ret; +} + + + + + +/* SETEQL + * Variables: @b, @c, @a + * Functions: getCCFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + p_b = @b; + p_c = @c; + if((p_b == p_c)) + { + @a = true; + } + else + { + @a = false; + }; + }; +} + */ + +int +arc_gen_SETEQL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(p_b, b); + tcg_gen_mov_tl(p_c, c); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_mov_tl(a, arc_true); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_mov_tl(a, arc_false); + gen_set_label(done_2); + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* BREQL + * Variables: @b, @c, @offset + * Functions: getPCL, shouldExecuteDelaySlot, executeDelaySlot, setPC +--- code --- +{ + p_b = @b; + p_c = @c; + take_branch = false; + if((p_b == p_c)) + { + take_branch = true; + } + else + { + }; + bta = (getPCL () + @offset); + if((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot (bta, take_branch); + }; + if((p_b == p_c)) + { + setPC (bta); + } + else + { + }; +} + */ + +int +arc_gen_BREQL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv offset) +{ + int ret = DISAS_NEXT; + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv bta = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + tcg_gen_mov_tl(p_b, b); + tcg_gen_mov_tl(p_c, c); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, p_b, p_c); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_1);; + tcg_gen_mov_tl(take_branch, arc_true); + tcg_gen_br(done_1); + gen_set_label(else_1); + gen_set_label(done_1); + getPCL(temp_6); + tcg_gen_mov_tl(temp_5, temp_6); + tcg_gen_add_tl(bta, temp_5, offset); + if ((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot(bta, take_branch); +; + } + else + { + ; + } + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + setPC(bta); + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(take_branch); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(bta); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* SETNEL + * Variables: @b, @c, @a + * Functions: getCCFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + p_b = @b; + p_c = @c; + if((p_b != p_c)) + { + @a = true; + } + else + { + @a = false; + }; + }; +} + */ + +int +arc_gen_SETNEL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(p_b, b); + tcg_gen_mov_tl(p_c, c); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_NE, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_mov_tl(a, arc_true); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_mov_tl(a, arc_false); + gen_set_label(done_2); + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* BRNEL + * Variables: @b, @c, @offset + * Functions: getPCL, shouldExecuteDelaySlot, executeDelaySlot, setPC +--- code --- +{ + p_b = @b; + p_c = @c; + take_branch = false; + if((p_b != p_c)) + { + take_branch = true; + } + else + { + }; + bta = (getPCL () + @offset); + if((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot (bta, take_branch); + }; + if((p_b != p_c)) + { + setPC (bta); + } + else + { + }; +} + */ + +int +arc_gen_BRNEL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv offset) +{ + int ret = DISAS_NEXT; + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv bta = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + tcg_gen_mov_tl(p_b, b); + tcg_gen_mov_tl(p_c, c); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_NE, temp_1, p_b, p_c); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_1);; + tcg_gen_mov_tl(take_branch, arc_true); + tcg_gen_br(done_1); + gen_set_label(else_1); + gen_set_label(done_1); + getPCL(temp_6); + tcg_gen_mov_tl(temp_5, temp_6); + tcg_gen_add_tl(bta, temp_5, offset); + if ((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot(bta, take_branch); +; + } + else + { + ; + } + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_NE, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + setPC(bta); + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(take_branch); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(bta); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* SETLTL + * Variables: @b, @c, @a + * Functions: getCCFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + p_b = @b; + p_c = @c; + if((p_b < p_c)) + { + @a = true; + } + else + { + @a = false; + }; + }; +} + */ + +int +arc_gen_SETLTL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(p_b, b); + tcg_gen_mov_tl(p_c, c); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_LT, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_mov_tl(a, arc_true); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_mov_tl(a, arc_false); + gen_set_label(done_2); + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* BRLTL + * Variables: @b, @c, @offset + * Functions: getPCL, shouldExecuteDelaySlot, executeDelaySlot, setPC +--- code --- +{ + p_b = @b; + p_c = @c; + take_branch = false; + if((p_b < p_c)) + { + take_branch = true; + } + else + { + }; + bta = (getPCL () + @offset); + if((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot (bta, take_branch); + }; + if((p_b < p_c)) + { + setPC (bta); + } + else + { + }; +} + */ + +int +arc_gen_BRLTL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv offset) +{ + int ret = DISAS_NEXT; + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv bta = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + tcg_gen_mov_tl(p_b, b); + tcg_gen_mov_tl(p_c, c); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_LT, temp_1, p_b, p_c); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_1);; + tcg_gen_mov_tl(take_branch, arc_true); + tcg_gen_br(done_1); + gen_set_label(else_1); + gen_set_label(done_1); + getPCL(temp_6); + tcg_gen_mov_tl(temp_5, temp_6); + tcg_gen_add_tl(bta, temp_5, offset); + if ((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot(bta, take_branch); +; + } + else + { + ; + } + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_LT, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + setPC(bta); + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(take_branch); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(bta); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* SETGEL + * Variables: @b, @c, @a + * Functions: getCCFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + p_b = @b; + p_c = @c; + if((p_b >= p_c)) + { + @a = true; + } + else + { + @a = false; + }; + }; +} + */ + +int +arc_gen_SETGEL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv v = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv p_b = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(p_b, b); + tcg_gen_mov_tl(p_c, c); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_GE, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_mov_tl(a, arc_true); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_mov_tl(a, arc_false); + gen_set_label(done_2); + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(v); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + tcg_temp_free(p_b); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(p_c); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* BRGEL + * Variables: @b, @c, @offset + * Functions: getPCL, shouldExecuteDelaySlot, executeDelaySlot, setPC +--- code --- +{ + p_b = @b; + p_c = @c; + take_branch = false; + if((p_b >= p_c)) + { + take_branch = true; + } + else + { + }; + bta = (getPCL () + @offset); + if((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot (bta, take_branch); + }; + if((p_b >= p_c)) + { + setPC (bta); + } + else + { + }; +} + */ + +int +arc_gen_BRGEL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv offset) +{ + int ret = DISAS_NEXT; + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv bta = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + tcg_gen_mov_tl(p_b, b); + tcg_gen_mov_tl(p_c, c); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_GE, temp_1, p_b, p_c); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_1);; + tcg_gen_mov_tl(take_branch, arc_true); + tcg_gen_br(done_1); + gen_set_label(else_1); + gen_set_label(done_1); + getPCL(temp_6); + tcg_gen_mov_tl(temp_5, temp_6); + tcg_gen_add_tl(bta, temp_5, offset); + if ((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot(bta, take_branch); +; + } + else + { + ; + } + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_GE, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + setPC(bta); + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(take_branch); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(bta); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* SETLEL + * Variables: @b, @c, @a + * Functions: getCCFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + p_b = @b; + p_c = @c; + if((p_b <= p_c)) + { + @a = true; + } + else + { + @a = false; + }; + }; +} + */ + +int +arc_gen_SETLEL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv v = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv p_b = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(p_b, b); + tcg_gen_mov_tl(p_c, c); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_LE, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_mov_tl(a, arc_true); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_mov_tl(a, arc_false); + gen_set_label(done_2); + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(v); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + tcg_temp_free(p_b); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(p_c); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* SETGTL + * Variables: @b, @c, @a + * Functions: getCCFlag +--- code --- +{ + cc_flag = getCCFlag (); + if((cc_flag == true)) + { + p_b = @b; + p_c = @c; + if((p_b > p_c)) + { + @a = true; + } + else + { + @a = false; + }; + }; +} + */ + +int +arc_gen_SETGTL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv temp_5 = tcg_temp_local_new(); + TCGv cc_flag = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv v = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv p_b = tcg_temp_local_new(); + TCGv temp_9 = tcg_temp_local_new(); + TCGv temp_8 = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + getCCFlag(temp_5); + tcg_gen_mov_tl(cc_flag, temp_5); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_EQ, temp_1, cc_flag, arc_true); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + tcg_gen_mov_tl(p_b, b); + tcg_gen_mov_tl(p_c, c); + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + tcg_gen_setcond_tl(TCG_COND_GT, temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_4, temp_3, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_4, arc_true, else_2);; + tcg_gen_mov_tl(a, arc_true); + tcg_gen_br(done_2); + gen_set_label(else_2); + tcg_gen_mov_tl(a, arc_false); + gen_set_label(done_2); + gen_set_label(done_1); + tcg_temp_free(temp_5); + tcg_temp_free(cc_flag); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(v); + tcg_temp_free(temp_7); + tcg_temp_free(temp_6); + tcg_temp_free(p_b); + tcg_temp_free(temp_9); + tcg_temp_free(temp_8); + tcg_temp_free(p_c); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* BRLOL + * Variables: @b, @c, @offset + * Functions: unsignedLT, getPCL, shouldExecuteDelaySlot, executeDelaySlot, setPC +--- code --- +{ + p_b = @b; + p_c = @c; + take_branch = false; + if(unsignedLT (p_b, p_c)) + { + take_branch = true; + } + else + { + }; + bta = (getPCL () + @offset); + if((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot (bta, take_branch); + }; + if(unsignedLT (p_b, p_c)) + { + setPC (bta); + } + else + { + }; +} + */ + +int +arc_gen_BRLOL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv offset) +{ + int ret = DISAS_NEXT; + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv bta = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + tcg_gen_mov_tl(p_b, b); + tcg_gen_mov_tl(p_c, c); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + unsignedLT(temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_1, temp_3, 1); tcg_gen_andi_tl(temp_1, temp_1, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_1, arc_true, else_1);; + tcg_gen_mov_tl(take_branch, arc_true); + tcg_gen_br(done_1); + gen_set_label(else_1); + gen_set_label(done_1); + getPCL(temp_5); + tcg_gen_mov_tl(temp_4, temp_5); + tcg_gen_add_tl(bta, temp_4, offset); + if ((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot(bta, take_branch); +; + } + else + { + ; + } + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + unsignedLT(temp_6, p_b, p_c); + tcg_gen_xori_tl(temp_2, temp_6, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_2);; + setPC(bta); + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(take_branch); + tcg_temp_free(temp_3); + tcg_temp_free(temp_1); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + tcg_temp_free(bta); + tcg_temp_free(temp_6); + tcg_temp_free(temp_2); + + return ret; +} + + + + + +/* SETLOL + * Variables: @b, @c, @a + * Functions: unsignedLT +--- code --- +{ + p_b = @b; + p_c = @c; + if(unsignedLT (p_b, p_c)) + { + @a = true; + } + else + { + @a = false; + }; +} + */ + +int +arc_gen_SETLOL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + tcg_gen_mov_tl(p_b, b); + tcg_gen_mov_tl(p_c, c); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + unsignedLT(temp_2, p_b, p_c); + tcg_gen_xori_tl(temp_1, temp_2, 1); tcg_gen_andi_tl(temp_1, temp_1, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_1, arc_true, else_1);; + tcg_gen_mov_tl(a, arc_true); + tcg_gen_br(done_1); + gen_set_label(else_1); + tcg_gen_mov_tl(a, arc_false); + gen_set_label(done_1); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(temp_2); + tcg_temp_free(temp_1); + + return ret; +} + + + + + +/* BRHSL + * Variables: @b, @c, @offset + * Functions: unsignedGE, getPCL, shouldExecuteDelaySlot, executeDelaySlot, setPC +--- code --- +{ + p_b = @b; + p_c = @c; + take_branch = false; + if(unsignedGE (p_b, p_c)) + { + take_branch = true; + } + else + { + }; + bta = (getPCL () + @offset); + if((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot (bta, take_branch); + }; + if(unsignedGE (p_b, p_c)) + { + setPC (bta); + } + else + { + }; +} + */ + +int +arc_gen_BRHSL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv offset) +{ + int ret = DISAS_NEXT; + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv take_branch = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv bta = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + tcg_gen_mov_tl(p_b, b); + tcg_gen_mov_tl(p_c, c); + tcg_gen_mov_tl(take_branch, arc_false); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + unsignedGE(temp_3, p_b, p_c); + tcg_gen_xori_tl(temp_1, temp_3, 1); tcg_gen_andi_tl(temp_1, temp_1, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_1, arc_true, else_1);; + tcg_gen_mov_tl(take_branch, arc_true); + tcg_gen_br(done_1); + gen_set_label(else_1); + gen_set_label(done_1); + getPCL(temp_5); + tcg_gen_mov_tl(temp_4, temp_5); + tcg_gen_add_tl(bta, temp_4, offset); + if ((shouldExecuteDelaySlot () == 1)) + { + executeDelaySlot(bta, take_branch); +; + } + else + { + ; + } + TCGLabel *else_2 = gen_new_label(); + TCGLabel *done_2 = gen_new_label(); + unsignedGE(temp_6, p_b, p_c); + tcg_gen_xori_tl(temp_2, temp_6, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_2);; + setPC(bta); + tcg_gen_br(done_2); + gen_set_label(else_2); + gen_set_label(done_2); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(take_branch); + tcg_temp_free(temp_3); + tcg_temp_free(temp_1); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + tcg_temp_free(bta); + tcg_temp_free(temp_6); + tcg_temp_free(temp_2); + + return ret; +} + + + + + +/* SETHSL + * Variables: @b, @c, @a + * Functions: unsignedGE +--- code --- +{ + p_b = @b; + p_c = @c; + if(unsignedGE (p_b, p_c)) + { + @a = true; + } + else + { + @a = false; + }; +} + */ + +int +arc_gen_SETHSL (DisasCtxt *ctx, TCGv b, TCGv c, TCGv a) +{ + int ret = DISAS_NEXT; + TCGv p_b = tcg_temp_local_new(); + TCGv p_c = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + tcg_gen_mov_tl(p_b, b); + tcg_gen_mov_tl(p_c, c); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + unsignedGE(temp_2, p_b, p_c); + tcg_gen_xori_tl(temp_1, temp_2, 1); tcg_gen_andi_tl(temp_1, temp_1, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_1, arc_true, else_1);; + tcg_gen_mov_tl(a, arc_true); + tcg_gen_br(done_1); + gen_set_label(else_1); + tcg_gen_mov_tl(a, arc_false); + gen_set_label(done_1); + tcg_temp_free(p_b); + tcg_temp_free(p_c); + tcg_temp_free(temp_2); + tcg_temp_free(temp_1); + + return ret; +} + + + + + +/* EXL + * Variables: @b, @c + * Functions: getMemory, setMemory +--- code --- +{ + temp = @b; + @b = getMemory (@c, LONG); + setMemory (@c, LONG, temp); +} + */ + +int +arc_gen_EXL (DisasCtxt *ctx, TCGv b, TCGv c) +{ + int ret = DISAS_NEXT; + TCGv temp = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + tcg_gen_mov_tl(temp, b); + getMemory(temp_1, c, LONG); + tcg_gen_mov_tl(b, temp_1); + setMemory(c, LONG, temp); + tcg_temp_free(temp); + tcg_temp_free(temp_1); + + return ret; +} + + + + + +/* LLOCKL + * Variables: @dest, @src + * Functions: getMemory, setLF +--- code --- +{ + @dest = getMemory (@src, LONG); + setLF (1); +} + */ + +int +arc_gen_LLOCKL (DisasCtxt *ctx, TCGv dest, TCGv src) +{ + int ret = DISAS_NEXT; + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + getMemory(temp_1, src, LONGLONG); + tcg_gen_mov_tl(dest, temp_1); + tcg_gen_movi_tl(temp_2, 1); + setLF(temp_2); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + + return ret; +} + + + + + +/* SCONDL + * Variables: @src, @dest + * Functions: getLF, setMemory, setZFlag, setLF +--- code --- +{ + lf = getLF (); + if((lf == 1)) + { + setMemory (@src, LONG, @dest); + }; + setZFlag (!lf); + setLF (0); +} + */ + +int +arc_gen_SCONDL (DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv lf = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + getLF(temp_3); + tcg_gen_mov_tl(lf, temp_3); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_1, lf, 1); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, done_1);; + setMemory(src, LONGLONG, dest); + gen_set_label(done_1); + tcg_gen_xori_tl(temp_4, lf, 1); tcg_gen_andi_tl(temp_4, temp_4, 1);; + setZFlag(temp_4); + tcg_gen_movi_tl(temp_5, 0); + setLF(temp_5); + tcg_temp_free(temp_3); + tcg_temp_free(lf); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + + return ret; +} + + + + + +/* LDL + * Variables: @src1, @src2, @dest + * Functions: getAAFlag, getZZFlag, setDebugLD, getMemory, getFlagX, SignExtend, NoFurtherLoadsPending +--- code --- +{ + AA = getAAFlag (); + ZZ = getZZFlag (); + address = 0; + if(((AA == 0) || (AA == 1))) + { + address = (@src1 + @src2); + }; + if((AA == 2)) + { + address = @src1; + }; + if(((AA == 3) && ((ZZ == 0) || (ZZ == 3)))) + { + address = (@src1 + (@src2 << 2)); + }; + if(((AA == 3) && (ZZ == 2))) + { + address = (@src1 + (@src2 << 1)); + }; + l_src1 = @src1; + l_src2 = @src2; + setDebugLD (1); + new_dest = getMemory (address, ZZ); + if(((AA == 1) || (AA == 2))) + { + @src1 = (l_src1 + l_src2); + }; + if((getFlagX () == 1)) + { + new_dest = SignExtend (new_dest, ZZ); + }; + if(NoFurtherLoadsPending ()) + { + setDebugLD (0); + }; + @dest = new_dest; +} + */ + +int +arc_gen_LDL (DisasCtxt *ctx, TCGv src1, TCGv src2, TCGv dest) +{ + int ret = DISAS_NEXT; + int AA; + int ZZ; + TCGv address = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv l_src1 = tcg_temp_local_new(); + TCGv l_src2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv new_dest = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + AA = getAAFlag (); + ZZ = getZZFlag (); + tcg_gen_movi_tl(address, 0); + if (((AA == 0) || (AA == 1))) + { + tcg_gen_add_tl(address, src1, src2); +; + } + else + { + ; + } + if ((AA == 2)) + { + tcg_gen_mov_tl(address, src1); +; + } + else + { + ; + } + if (((AA == 3) && ((ZZ == 0) || (ZZ == 3)))) + { + tcg_gen_shli_tl(temp_2, src2, 3); + tcg_gen_add_tl(address, src1, temp_2); +; + } + else + { + ; + } + if (((AA == 3) && (ZZ == 2))) + { + tcg_gen_shli_tl(temp_3, src2, 1); + tcg_gen_add_tl(address, src1, temp_3); +; + } + else + { + ; + } + tcg_gen_mov_tl(l_src1, src1); + tcg_gen_mov_tl(l_src2, src2); + tcg_gen_movi_tl(temp_4, 1); + setDebugLD(temp_4); + getMemory(temp_5, address, ZZ); + tcg_gen_mov_tl(new_dest, temp_5); + if (((AA == 1) || (AA == 2))) + { + tcg_gen_add_tl(src1, l_src1, l_src2); +; + } + else + { + ; + } + if ((getFlagX () == 1)) + { + new_dest = SignExtend (new_dest, ZZ); +; + } + else + { + ; + } + TCGLabel *done_1 = gen_new_label(); + NoFurtherLoadsPending(temp_6); + tcg_gen_xori_tl(temp_1, temp_6, 1); tcg_gen_andi_tl(temp_1, temp_1, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_1, arc_true, done_1);; + tcg_gen_movi_tl(temp_7, 0); + setDebugLD(temp_7); + gen_set_label(done_1); + tcg_gen_mov_tl(dest, new_dest); + tcg_temp_free(address); + tcg_temp_free(temp_2); + tcg_temp_free(temp_3); + tcg_temp_free(l_src1); + tcg_temp_free(l_src2); + tcg_temp_free(temp_4); + tcg_temp_free(temp_5); + tcg_temp_free(new_dest); + tcg_temp_free(temp_6); + tcg_temp_free(temp_1); + tcg_temp_free(temp_7); + + return ret; +} + + + + + +/* STL + * Variables: @src1, @src2, @dest + * Functions: getAAFlag, getZZFlag, setMemory +--- code --- +{ + AA = getAAFlag (); + ZZ = getZZFlag (); + address = 0; + if(((AA == 0) || (AA == 1))) + { + address = (@src1 + @src2); + }; + if((AA == 2)) + { + address = @src1; + }; + if(((AA == 3) && ((ZZ == 0) || (ZZ == 3)))) + { + address = (@src1 + (@src2 << 2)); + }; + if(((AA == 3) && (ZZ == 2))) + { + address = (@src1 + (@src2 << 1)); + }; + setMemory (address, ZZ, @dest); + if(((AA == 1) || (AA == 2))) + { + @src1 = (@src1 + @src2); + }; +} + */ + +int +arc_gen_STL (DisasCtxt *ctx, TCGv src1, TCGv src2, TCGv dest) +{ + int ret = DISAS_NEXT; + int AA; + int ZZ; + TCGv address = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + AA = getAAFlag (); + ZZ = getZZFlag (); + tcg_gen_movi_tl(address, 0); + if (((AA == 0) || (AA == 1))) + { + tcg_gen_add_tl(address, src1, src2); +; + } + else + { + ; + } + if ((AA == 2)) + { + tcg_gen_mov_tl(address, src1); +; + } + else + { + ; + } + if (((AA == 3) && ((ZZ == 0) || (ZZ == 3)))) + { + tcg_gen_shli_tl(temp_1, src2, 3); + tcg_gen_add_tl(address, src1, temp_1); +; + } + else + { + ; + } + if (((AA == 3) && (ZZ == 2))) + { + tcg_gen_shli_tl(temp_2, src2, 1); + tcg_gen_add_tl(address, src1, temp_2); +; + } + else + { + ; + } + setMemory(address, ZZ, dest); + if (((AA == 1) || (AA == 2))) + { + tcg_gen_add_tl(src1, src1, src2); +; + } + else + { + ; + } + tcg_temp_free(address); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + + return ret; +} + +/* STDL + * Variables: @src1, @src2, @dest + * Functions: getAAFlag, getZZFlag, setMemory, instructionHasRegisterOperandIn, nextReg, getBit +--- code --- +{ + AA = getAAFlag (); + ZZ = getZZFlag (); + address = 0; + if(((AA == 0) || (AA == 1))) + { + address = (@src1 + @src2); + }; + if((AA == 2)) + { + address = @src1; + }; + if(((AA == 3) && ((ZZ == 0) || (ZZ == 3)))) + { + address = (@src1 + (@src2 << 2)); + }; + if(((AA == 3) && (ZZ == 2))) + { + address = (@src1 + (@src2 << 1)); + }; + setMemory (address, LONG, @dest); + if(instructionHasRegisterOperandIn (0)) + { + pair = nextReg (dest); + } + else + { + if((getBit (@dest, 31) == 1)) + { + pair = 4294967295; + } + else + { + pair = 0; + }; + }; + setMemory ((address + 4), LONG, pair); + if(((AA == 1) || (AA == 2))) + { + @src1 = (@src1 + @src2); + }; +} + */ + +int +arc_gen_STDL (DisasCtxt *ctx, TCGv src1, TCGv src2, TCGv dest) +{ + int ret = DISAS_NEXT; + int AA; + int ZZ; + TCGv address = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv pair = NULL; + bool pair_initialized = FALSE; + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_7 = tcg_temp_local_new(); + AA = getAAFlag (); + ZZ = getZZFlag (); + tcg_gen_movi_tl(address, 0); + if (((AA == 0) || (AA == 1))) + { + tcg_gen_add_tl(address, src1, src2); +; + } + else + { + ; + } + if ((AA == 2)) + { + tcg_gen_mov_tl(address, src1); +; + } + else + { + ; + } + if (((AA == 3) && ((ZZ == 0) || (ZZ == 3)))) + { + tcg_gen_shli_tl(temp_3, src2, 2); + tcg_gen_add_tl(address, src1, temp_3); +; + } + else + { + ; + } + if (((AA == 3) && (ZZ == 2))) + { + tcg_gen_shli_tl(temp_4, src2, 1); + tcg_gen_add_tl(address, src1, temp_4); +; + } + else + { + ; + } + setMemory(address, LONG, dest); + if (instructionHasRegisterOperandIn (0)) + { + pair = nextReg (dest); +; + } + else + { + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_movi_tl(temp_6, 31); + getBit(temp_5, dest, temp_6); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_1, temp_5, 1); + tcg_gen_xori_tl(temp_2, temp_1, 1); tcg_gen_andi_tl(temp_2, temp_2, 1);; + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_1);; + pair = tcg_temp_local_new(); + pair_initialized = TRUE; + tcg_gen_movi_tl(pair, 4294967295); + tcg_gen_br(done_1); + gen_set_label(else_1); + tcg_gen_movi_tl(pair, 0); + gen_set_label(done_1); +; + } + tcg_gen_addi_tl(temp_7, address, 4); + setMemory(temp_7, LONG, pair); + if (((AA == 1) || (AA == 2))) + { + tcg_gen_add_tl(src1, src1, src2); +; + } + else + { + ; + } + tcg_temp_free(address); + tcg_temp_free(temp_3); + tcg_temp_free(temp_4); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_7); + if (pair_initialized) { + tcg_temp_free(pair); + } + + return ret; +} + + + + +/* POPL + * Variables: @dest + * Functions: getMemory, getRegister, setRegister +--- code --- +{ + new_dest = getMemory (getRegister (R_SP), LONG); + setRegister (R_SP, (getRegister (R_SP) + 4)); + @dest = new_dest; +} + */ + +int +arc_gen_POPL (DisasCtxt *ctx, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv new_dest = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + getRegister(temp_3, R_SP); + tcg_gen_mov_tl(temp_2, temp_3); + getMemory(temp_1, temp_2, LONGLONG); + tcg_gen_mov_tl(new_dest, temp_1); + getRegister(temp_6, R_SP); + tcg_gen_mov_tl(temp_5, temp_6); + tcg_gen_addi_tl(temp_4, temp_5, 8); + setRegister(R_SP, temp_4); + tcg_gen_mov_tl(dest, new_dest); + tcg_temp_free(temp_3); + tcg_temp_free(temp_2); + tcg_temp_free(temp_1); + tcg_temp_free(new_dest); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* PUSHL + * Variables: @src + * Functions: setMemory, getRegister, setRegister +--- code --- +{ + local_src = @src; + setMemory ((getRegister (R_SP) - 8), LONG, local_src); + setRegister (R_SP, (getRegister (R_SP) - 8)); +} + */ + +int +arc_gen_PUSHL (DisasCtxt *ctx, TCGv src) +{ + int ret = DISAS_NEXT; + TCGv local_src = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_6 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + tcg_gen_mov_tl(local_src, src); + getRegister(temp_3, R_SP); + tcg_gen_mov_tl(temp_2, temp_3); + tcg_gen_subi_tl(temp_1, temp_2, 8); + setMemory(temp_1, LONGLONG, local_src); + getRegister(temp_6, R_SP); + tcg_gen_mov_tl(temp_5, temp_6); + tcg_gen_subi_tl(temp_4, temp_5, 8); + setRegister(R_SP, temp_4); + tcg_temp_free(local_src); + tcg_temp_free(temp_3); + tcg_temp_free(temp_2); + tcg_temp_free(temp_1); + tcg_temp_free(temp_6); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + + return ret; +} + + + + + +/* NORML + * Variables: @src, @dest + * Functions: HELPER, getFFlag, setZFlag, setNFlag +--- code --- +{ + psrc = @src; + i = HELPER (norml, psrc); + @dest = (63 - i); + if((getFFlag () == true)) + { + setZFlag (psrc); + setNFlag (psrc); + }; +} + */ + +int +arc_gen_NORML (DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv psrc = tcg_temp_local_new(); + TCGv i = tcg_temp_local_new(); + tcg_gen_mov_tl(psrc, src); + ARC_HELPER(norml, i, psrc); + tcg_gen_subfi_tl(dest, 63, i); + if ((getFFlag () == true)) + { + setZFlag(psrc); + setNFlag(psrc); +; + } + else + { + ; + } + tcg_temp_free(psrc); + tcg_temp_free(i); + + return ret; +} + + + + + +/* + * FLSL + * Variables: @src, @dest + * Functions: CLZ, getFFlag, setZFlag, setNFlag + * --- code --- + * { + * psrc = @src; + * if((psrc == 0)) + * { + * @dest = 0; + * } + * else + * { + * @dest = 63 - CLZ (psrc, 64); + * }; + * if((getFFlag () == true)) + * { + * setZFlag (psrc); + * setNFlag (psrc); + * }; + * } + */ + +int +arc_gen_FLSL(DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv psrc = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_5 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + tcg_gen_mov_tl(psrc, src); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_1, psrc, 0); + tcg_gen_xori_tl(temp_2, temp_1, 1); + tcg_gen_andi_tl(temp_2, temp_2, 1); + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_1); + tcg_gen_movi_tl(dest, 0); + tcg_gen_br(done_1); + gen_set_label(else_1); + tcg_gen_movi_tl(temp_5, 64); + tcg_gen_clz_tl(temp_4, psrc, temp_5); + tcg_gen_mov_tl(temp_3, temp_4); + tcg_gen_subfi_tl(dest, 63, temp_3); + gen_set_label(done_1); + if ((getFFlag () == true)) { + setZFlag(psrc); + setNFlag(psrc); + } + tcg_temp_free(psrc); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_5); + tcg_temp_free(temp_4); + tcg_temp_free(temp_3); + + return ret; +} + + + + + +/* + * FFSL + * Variables: @src, @dest + * Functions: CTZ, getFFlag, setZFlag, setNFlag + * --- code --- + * { + * psrc = @src; + * if((psrc == 0)) + * { + * @dest = 63; + * } + * else + * { + * @dest = CTZ (psrc, 64); + * }; + * if((getFFlag () == true)) + * { + * setZFlag (psrc); + * setNFlag (psrc); + * }; + * } + */ + +int +arc_gen_FFSL(DisasCtxt *ctx, TCGv src, TCGv dest) +{ + int ret = DISAS_NEXT; + TCGv psrc = tcg_temp_local_new(); + TCGv temp_1 = tcg_temp_local_new(); + TCGv temp_2 = tcg_temp_local_new(); + TCGv temp_4 = tcg_temp_local_new(); + TCGv temp_3 = tcg_temp_local_new(); + tcg_gen_mov_tl(psrc, src); + TCGLabel *else_1 = gen_new_label(); + TCGLabel *done_1 = gen_new_label(); + tcg_gen_setcondi_tl(TCG_COND_EQ, temp_1, psrc, 0); + tcg_gen_xori_tl(temp_2, temp_1, 1); + tcg_gen_andi_tl(temp_2, temp_2, 1); + tcg_gen_brcond_tl(TCG_COND_EQ, temp_2, arc_true, else_1); + tcg_gen_movi_tl(dest, 31); + tcg_gen_br(done_1); + gen_set_label(else_1); + tcg_gen_movi_tl(temp_4, 32); + tcg_gen_ctz_tl(temp_3, psrc, temp_4); + tcg_gen_mov_tl(dest, temp_3); + gen_set_label(done_1); + if ((getFFlag () == true)) { + setZFlag(psrc); + setNFlag(psrc); + } + tcg_temp_free(psrc); + tcg_temp_free(temp_1); + tcg_temp_free(temp_2); + tcg_temp_free(temp_4); + tcg_temp_free(temp_3); + + return ret; +} + + + + + +/* DBNZL + * Variables: @a, @offset + * Functions: getPCL, setPC +--- code --- +{ + bta = getPCL() + @offset; + if (shouldExecuteDelaySlot() == 1) + { + take_branch = true; + if (@a == 1) + { + take_branch = false; + }; + executeDelaySlot (bta, take_branch); + }; + @a = @a - 1 + if(@a != 0) { + setPC(getPCL () + @offset) + } +} + */ + +int +arc_gen_DBNZL (DisasCtxt *ctx, TCGv a, TCGv offset) +{ + int ret = DISAS_NEXT; + TCGLabel *do_not_branch = gen_new_label(); + TCGLabel *keep_take_branch_1 = gen_new_label(); + TCGv bta = tcg_temp_local_new(); + + getPCL(bta); + tcg_gen_add_tl(bta, bta, offset); + + if (shouldExecuteDelaySlot() == 1) { + TCGv take_branch = tcg_const_local_tl(1); + tcg_gen_brcondi_tl(TCG_COND_NE, a, 1, keep_take_branch_1); + tcg_temp_free(take_branch); + tcg_gen_mov_tl(take_branch, tcg_const_local_tl(0)); + gen_set_label(keep_take_branch_1); + executeDelaySlot(bta, take_branch); + tcg_temp_free(take_branch); + } + + tcg_gen_subi_tl(a, a, 1); + tcg_gen_brcondi_tl(TCG_COND_EQ, a, 0, do_not_branch); + setPC(bta); + gen_set_label(do_not_branch); + tcg_temp_free(bta); + + return ret; +} diff --git a/target/arc/semfunc-v3.h b/target/arc/semfunc-v3.h new file mode 100644 index 0000000000..9403d8f1dc --- /dev/null +++ b/target/arc/semfunc-v3.h @@ -0,0 +1,55 @@ +/* + * QEMU ARC CPU + * + * Copyright (c) 2017 Cupertino Miranda + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR dest PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see + * http://www.gnu.org/licenses/lgpl-2.1.html + */ + +#ifndef __ARC_SEMFUNC_H__ +#define __ARC_SEMFUNC_H__ + +#include "translate.h" +#include "semfunc-helper.h" + +/* TODO (issue #62): these must be removed */ +#define arc_false (ctx->zero) +#define arc_true (ctx->one) + +#define LONG 0 +#define BYTE 1 +#define WORD 2 +#define LONGLONG 3 + +#define SEMANTIC_FUNCTION_PROTOTYPE_0(NAME) \ + int arc_gen_##NAME (DisasCtxt *); +#define SEMANTIC_FUNCTION_PROTOTYPE_1(NAME) \ + int arc_gen_##NAME (DisasCtxt *, TCGv); +#define SEMANTIC_FUNCTION_PROTOTYPE_2(NAME) \ + int arc_gen_##NAME (DisasCtxt *, TCGv, TCGv); +#define SEMANTIC_FUNCTION_PROTOTYPE_3(NAME) \ + int arc_gen_##NAME (DisasCtxt *, TCGv, TCGv, TCGv); +#define SEMANTIC_FUNCTION_PROTOTYPE_4(NAME) \ + int arc_gen_##NAME (DisasCtxt *, TCGv, TCGv, TCGv, TCGv); + +#define MAPPING(MNEMONIC, NAME, NOPS, ...) +#define CONSTANT(...) +#define SEMANTIC_FUNCTION(NAME, NOPS) \ + SEMANTIC_FUNCTION_PROTOTYPE_##NOPS(NAME) + +#include "semfunc_mapping.def" +#include "extra_mapping.def" + +#endif /* __ARC_SEMFUNC_H__ */