translate.c revision 4c37c32b924cb13b821f9d2e01f42cabbd3d9cf9
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * i386 translation
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * Copyright (c) 2003 Fabrice Bellard
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * This library is free software; you can redistribute it and/or
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * modify it under the terms of the GNU Lesser General Public
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * License as published by the Free Software Foundation; either
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * version 2 of the License, or (at your option) any later version.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * This library is distributed in the hope that it will be useful,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * but WITHOUT ANY WARRANTY; without even the implied warranty of
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * Lesser General Public License for more details.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * You should have received a copy of the GNU Lesser General Public
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * License along with this library; if not, see <http://www.gnu.org/licenses/>.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * Oracle LGPL Disclaimer: For the avoidance of doubt, except that if any license choice
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * other than GPL or LGPL is available it will apply instead, Oracle elects to use only
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * the Lesser General Public License version 2.1 (LGPLv2) at this time for any software where
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * a choice of LGPL license versions is made available with the language indicating
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China * that LGPLv2 or any later version may be used, or where a choice of which version
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * of the LGPL is applied is otherwise unspecified.
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <stdarg.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <stdlib.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <stdio.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <string.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <inttypes.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include <signal.h>
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#endif /* !VBOX */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include "cpu.h"
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include "exec-all.h"
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include "disas.h"
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include "tcg-op.h"
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include "helper.h"
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define GEN_HELPER 1
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include "helper.h"
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define PREFIX_REPZ 0x01
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define PREFIX_REPNZ 0x02
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define PREFIX_LOCK 0x04
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define PREFIX_DATA 0x08
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define PREFIX_ADR 0x10
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define X86_64_ONLY(x) x
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define X86_64_DEF(...) __VA_ARGS__
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define CODE64(s) ((s)->code64)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define REX_X(s) ((s)->rex_x)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define REX_B(s) ((s)->rex_b)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* XXX: gcc generates push/pop in some opcodes, so we cannot use them */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define BUGGY_64(x) NULL
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define X86_64_ONLY(x) NULL
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define X86_64_DEF(...)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define CODE64(s) 0
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define REX_X(s) 0
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define REX_B(s) 0
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China//#define MACRO_TEST 1
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* global register indexes */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic TCGv_ptr cpu_env;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic TCGv cpu_A0, cpu_cc_src, cpu_cc_dst, cpu_cc_tmp;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic TCGv_i32 cpu_cc_op;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* local temps */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic TCGv cpu_T[2], cpu_T3;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* local register indexes (only used inside old micro ops) */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic TCGv cpu_tmp0, cpu_tmp4;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic TCGv_ptr cpu_ptr0, cpu_ptr1;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic TCGv_i32 cpu_tmp2_i32, cpu_tmp3_i32;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic TCGv_i64 cpu_tmp1_i64;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic TCGv cpu_tmp5, cpu_tmp6;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#include "gen-icount.h"
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int x86_64_hregs;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* Special/override code readers to hide patched code. */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinauint8_t ldub_code_raw(target_ulong pc)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (!remR3GetOpcode(cpu_single_env, pc, &b))
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China b = ldub_code(pc);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define ldub_code(a) ldub_code_raw(a)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinauint16_t lduw_code_raw(target_ulong pc)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (ldub_code(pc+1) << 8) | ldub_code(pc);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define lduw_code(a) lduw_code_raw(a)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinauint32_t ldl_code_raw(target_ulong pc)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return (ldub_code(pc+3) << 24) | (ldub_code(pc+2) << 16) | (ldub_code(pc+1) << 8) | ldub_code(pc);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define ldl_code(a) ldl_code_raw(a)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#endif /* VBOX */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinatypedef struct DisasContext {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* current insn context */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int override; /* -1 if no override */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int aflag, dflag;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China target_ulong pc; /* pc = eip + cs_base */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int is_jmp; /* 1 = means jump (stop translation), 2 means CPU
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China static state change (stop translation) */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* current block context */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China target_ulong cs_base; /* base of CS segment */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int pe; /* protected mode */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int code32; /* 32 bit code segment */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int lma; /* long mode active */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int code64; /* 64 bit code segment */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int rex_x, rex_b;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int ss32; /* 32 bit stack segment */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int cc_op; /* current CC operation */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int addseg; /* non zero if either DS/ES/SS have a non zero base */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int f_st; /* currently unused */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int vm86; /* vm86 mode */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int vme; /* CR4.VME */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int pvi; /* CR4.PVI */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int record_call; /* record calls for CSAM or not? */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int tf; /* TF cpu flag */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int singlestep_enabled; /* "hardware" single step enabled */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int jmp_opt; /* use direct block chaining for direct jumps */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int mem_index; /* select memory access functions */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China uint64_t flags; /* all execution flags */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China struct TranslationBlock *tb;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int popl_esp_hack; /* for correct popl with esp base handling */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int rip_offset; /* only used in x86_64, but left for simplicity */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int cpuid_features;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int cpuid_ext_features;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int cpuid_ext2_features;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int cpuid_ext3_features;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_eob(DisasContext *s);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_jmp(DisasContext *s, target_ulong eip);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_jmp_tb(DisasContext *s, target_ulong eip, int tb_num);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_check_external_event(void);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* i386 arith/logic operations */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* i386 shift ops */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China OP_SHL1, /* undocumented */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* operand size */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* I386 int registers */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China OR_EAX, /* MUST be even numbered */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China OR_TMP0 = 16, /* temporary operand register */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China OR_A0, /* temporary register used when doing address evaluation */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_movl_T0_0(void)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_tl(cpu_T[0], 0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_movl_T0_im(int32_t val)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_tl(cpu_T[0], val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_movl_T0_imu(uint32_t val)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_tl(cpu_T[0], val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_movl_T1_im(int32_t val)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_tl(cpu_T[1], val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_movl_T1_imu(uint32_t val)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_tl(cpu_T[1], val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_movl_A0_im(uint32_t val)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_tl(cpu_A0, val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_movq_A0_im(int64_t val)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_tl(cpu_A0, val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_movtl_T0_im(target_ulong val)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_tl(cpu_T[0], val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_movtl_T1_im(target_ulong val)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_tl(cpu_T[1], val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_andl_T0_ffff(void)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 0xffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_andl_T0_im(uint32_t val)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_T[0], cpu_T[0], val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_movl_T0_T1(void)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_T[0], cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_andl_A0_ffff(void)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_A0, cpu_A0, 0xffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define NB_OP_SIZES 4
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#else /* !TARGET_X86_64 */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define NB_OP_SIZES 3
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#endif /* !TARGET_X86_64 */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#if defined(WORDS_BIGENDIAN)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define REG_B_OFFSET (sizeof(target_ulong) - 1)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define REG_H_OFFSET (sizeof(target_ulong) - 2)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define REG_W_OFFSET (sizeof(target_ulong) - 2)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define REG_L_OFFSET (sizeof(target_ulong) - 4)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define REG_LH_OFFSET (sizeof(target_ulong) - 8)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define REG_B_OFFSET 0
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define REG_H_OFFSET 1
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define REG_W_OFFSET 0
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define REG_L_OFFSET 0
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define REG_LH_OFFSET 4
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_mov_reg_v(int ot, int reg, TCGv t0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (reg < 4 X86_64_DEF( || reg >= 8 || x86_64_hregs)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st8_tl(t0, cpu_env, offsetof(CPUState, regs[reg]) + REG_B_OFFSET);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st8_tl(t0, cpu_env, offsetof(CPUState, regs[reg - 4]) + REG_H_OFFSET);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st16_tl(t0, cpu_env, offsetof(CPUState, regs[reg]) + REG_W_OFFSET);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st32_tl(t0, cpu_env, offsetof(CPUState, regs[reg]) + REG_L_OFFSET);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* high part of register set to zero */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_tl(cpu_tmp0, 0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st32_tl(cpu_tmp0, cpu_env, offsetof(CPUState, regs[reg]) + REG_LH_OFFSET);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st_tl(t0, cpu_env, offsetof(CPUState, regs[reg]));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st32_tl(t0, cpu_env, offsetof(CPUState, regs[reg]) + REG_L_OFFSET);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_mov_reg_T0(int ot, int reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_v(ot, reg, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_mov_reg_T1(int ot, int reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_v(ot, reg, cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_mov_reg_A0(int size, int reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st16_tl(cpu_A0, cpu_env, offsetof(CPUState, regs[reg]) + REG_W_OFFSET);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st32_tl(cpu_A0, cpu_env, offsetof(CPUState, regs[reg]) + REG_L_OFFSET);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* high part of register set to zero */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_tl(cpu_tmp0, 0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st32_tl(cpu_tmp0, cpu_env, offsetof(CPUState, regs[reg]) + REG_LH_OFFSET);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st_tl(cpu_A0, cpu_env, offsetof(CPUState, regs[reg]));
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN tcg_gen_st32_tl(cpu_A0, cpu_env, offsetof(CPUState, regs[reg]) + REG_L_OFFSET);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_mov_v_reg(int ot, TCGv t0, int reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (reg < 4 X86_64_DEF( || reg >= 8 || x86_64_hregs)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld8u_tl(t0, cpu_env, offsetof(CPUState, regs[reg]) + REG_B_OFFSET);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld8u_tl(t0, cpu_env, offsetof(CPUState, regs[reg - 4]) + REG_H_OFFSET);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUState, regs[reg]));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_mov_TN_reg(int ot, int t_index, int reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_v_reg(ot, cpu_T[t_index], reg);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_movl_A0_reg(int reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld32u_tl(cpu_A0, cpu_env, offsetof(CPUState, regs[reg]) + REG_L_OFFSET);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_addl_A0_im(int32_t val)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_addi_tl(cpu_A0, cpu_A0, val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_A0, cpu_A0, 0xffffffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_addq_A0_im(int64_t val)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_addi_tl(cpu_A0, cpu_A0, val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_add_A0_im(DisasContext *s, int val)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addq_A0_im(val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addl_A0_im(val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_addl_T0_T1(void)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_jmp_T0(void)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st_tl(cpu_T[0], cpu_env, offsetof(CPUState, eip));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_add_reg_im(int size, int reg, int32_t val)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUState, regs[reg]));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_addi_tl(cpu_tmp0, cpu_tmp0, val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st16_tl(cpu_tmp0, cpu_env, offsetof(CPUState, regs[reg]) + REG_W_OFFSET);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUState, regs[reg]));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_addi_tl(cpu_tmp0, cpu_tmp0, val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, 0xffffffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st_tl(cpu_tmp0, cpu_env, offsetof(CPUState, regs[reg]));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUState, regs[reg]));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_addi_tl(cpu_tmp0, cpu_tmp0, val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st_tl(cpu_tmp0, cpu_env, offsetof(CPUState, regs[reg]));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_add_reg_T0(int size, int reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUState, regs[reg]));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_add_tl(cpu_tmp0, cpu_tmp0, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st16_tl(cpu_tmp0, cpu_env, offsetof(CPUState, regs[reg]) + REG_W_OFFSET);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUState, regs[reg]));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_add_tl(cpu_tmp0, cpu_tmp0, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, 0xffffffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st_tl(cpu_tmp0, cpu_env, offsetof(CPUState, regs[reg]));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUState, regs[reg]));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_add_tl(cpu_tmp0, cpu_tmp0, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st_tl(cpu_tmp0, cpu_env, offsetof(CPUState, regs[reg]));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_set_cc_op(int32_t val)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_i32(cpu_cc_op, val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_addl_A0_reg_sN(int shift, int reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUState, regs[reg]));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (shift != 0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shli_tl(cpu_tmp0, cpu_tmp0, shift);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_add_tl(cpu_A0, cpu_A0, cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_A0, cpu_A0, 0xffffffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing ChinaDECLINLINE(void) gen_op_seg_check(int reg, bool keepA0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* It seems segments doesn't get out of sync - if they do in fact - enable below code. */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China# ifdef FORCE_SEGMENT_SYNC
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* Considering poor quality of TCG optimizer - better call directly */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China t0 = tcg_temp_local_new(TCG_TYPE_TL);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_tl(t0, reg);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_helper_0_1(helper_sync_seg, t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_temp_free(t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* Our segments could be outdated, thus check for newselector field to see if update really needed */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int skip_label;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* For other segments this check is waste of time, and also TCG is unable to cope with this code,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China for data/stack segments, as expects alive cpu_T[0] */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (reg != R_GS)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* we need to store old cpu_A0 */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China a0 = tcg_temp_local_new(TCG_TYPE_TL);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(a0, cpu_A0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China skip_label = gen_new_label();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China t0 = tcg_temp_local_new(TCG_TYPE_TL);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld32u_tl(t0, cpu_env, offsetof(CPUState, segs[reg].newselector) + REG_L_OFFSET);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcondi_i32(TCG_COND_EQ, t0, 0, skip_label);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld32u_tl(t0, cpu_env, offsetof(CPUState, eflags) + REG_L_OFFSET);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(t0, t0, VM_MASK);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcondi_i32(TCG_COND_NE, t0, 0, skip_label);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_tl(t0, reg);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_helper_0_1(helper_sync_seg, t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_temp_free(t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_set_label(skip_label);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_A0, a0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_temp_free(a0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China# endif /* FORCE_SEGMENT_SYNC */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#endif /* VBOX */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_movl_A0_seg(int reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_seg_check(reg, false);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld32u_tl(cpu_A0, cpu_env, offsetof(CPUState, segs[reg].base) + REG_L_OFFSET);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_addl_A0_seg(int reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_seg_check(reg, true);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUState, segs[reg].base));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_add_tl(cpu_A0, cpu_A0, cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_A0, cpu_A0, 0xffffffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_movq_A0_seg(int reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_seg_check(reg, false);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld_tl(cpu_A0, cpu_env, offsetof(CPUState, segs[reg].base));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_addq_A0_seg(int reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_seg_check(reg, true);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUState, segs[reg].base));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_add_tl(cpu_A0, cpu_A0, cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_movq_A0_reg(int reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld_tl(cpu_A0, cpu_env, offsetof(CPUState, regs[reg]));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_addq_A0_reg_sN(int shift, int reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUState, regs[reg]));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (shift != 0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shli_tl(cpu_tmp0, cpu_tmp0, shift);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_add_tl(cpu_A0, cpu_A0, cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_lds_T0_A0(int idx)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int mem_index = (idx >> 2) - 1;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China switch(idx & 3) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_qemu_ld8s(cpu_T[0], cpu_A0, mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_qemu_ld16s(cpu_T[0], cpu_A0, mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_qemu_ld32s(cpu_T[0], cpu_A0, mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_ld_v(int idx, TCGv t0, TCGv a0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int mem_index = (idx >> 2) - 1;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China switch(idx & 3) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_qemu_ld8u(t0, a0, mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_qemu_ld16u(t0, a0, mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_qemu_ld32u(t0, a0, mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* Should never happen on 32-bit targets. */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_qemu_ld64(t0, a0, mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* XXX: always use ldu or lds */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_ld_T0_A0(int idx)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_ld_v(idx, cpu_T[0], cpu_A0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_ldu_T0_A0(int idx)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_ld_v(idx, cpu_T[0], cpu_A0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_ld_T1_A0(int idx)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_ld_v(idx, cpu_T[1], cpu_A0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_st_v(int idx, TCGv t0, TCGv a0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int mem_index = (idx >> 2) - 1;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China switch(idx & 3) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_qemu_st8(t0, a0, mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_qemu_st16(t0, a0, mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_qemu_st32(t0, a0, mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* Should never happen on 32-bit targets. */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_qemu_st64(t0, a0, mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_st_T0_A0(int idx)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_v(idx, cpu_T[0], cpu_A0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_st_T1_A0(int idx)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_v(idx, cpu_T[1], cpu_A0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_check_external_event(void)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /** @todo: once TCG codegen improves, we may want to use version
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China from else version */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_helper_check_external_event();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int skip_label;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China skip_label = gen_new_label();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China t0 = tcg_temp_local_new(TCG_TYPE_TL);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* t0 = cpu_tmp0; */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld32u_tl(t0, cpu_env, offsetof(CPUState, interrupt_request));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* Keep in sync with helper_check_external_event() */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(t0, t0,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China CPU_INTERRUPT_EXTERNAL_EXIT
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China | CPU_INTERRUPT_EXTERNAL_TIMER
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China | CPU_INTERRUPT_EXTERNAL_DMA
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China | CPU_INTERRUPT_EXTERNAL_HARD);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /** @todo: predict branch as taken */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcondi_i32(TCG_COND_EQ, t0, 0, skip_label);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_temp_free(t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_helper_check_external_event();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_set_label(skip_label);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China# if 0 /* unused code? */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_check_external_event2()
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_helper_check_external_event();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#endif /* VBOX */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_jmp_im(target_ulong pc)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_tl(cpu_tmp0, pc);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st_tl(cpu_tmp0, cpu_env, offsetof(CPUState, eip));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing ChinaDECLINLINE(void) gen_update_eip(target_ulong pc)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_jmp_im(pc);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China# ifdef VBOX_DUMP_STATE
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_helper_dump_state();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#endif /* VBOX */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_string_movl_A0_ESI(DisasContext *s)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China override = s->override;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->aflag == 2) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (override >= 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movq_A0_seg(override);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addq_A0_reg_sN(0, R_ESI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movq_A0_reg(R_ESI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->aflag) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* 32 bit address */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->addseg && override < 0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China override = R_DS;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (override >= 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_A0_seg(override);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addl_A0_reg_sN(0, R_ESI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_A0_reg(R_ESI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* 16 address, always override */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (override < 0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China override = R_DS;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_A0_reg(R_ESI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_andl_A0_ffff();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addl_A0_seg(override);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_string_movl_A0_EDI(DisasContext *s)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->aflag == 2) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movq_A0_reg(R_EDI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->aflag) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->addseg) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_A0_seg(R_ES);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addl_A0_reg_sN(0, R_EDI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_A0_reg(R_EDI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_A0_reg(R_EDI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_andl_A0_ffff();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addl_A0_seg(R_ES);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_movl_T0_Dshift(int ot)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld32s_tl(cpu_T[0], cpu_env, offsetof(CPUState, df));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shli_tl(cpu_T[0], cpu_T[0], ot);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_extu(int ot, TCGv reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ext8u_tl(reg, reg);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ext16u_tl(reg, reg);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ext32u_tl(reg, reg);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_exts(int ot, TCGv reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ext8s_tl(reg, reg);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ext16s_tl(reg, reg);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ext32s_tl(reg, reg);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_jnz_ecx(int size, int label1)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUState, regs[R_ECX]));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_extu(size + 1, cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcondi_tl(TCG_COND_NE, cpu_tmp0, 0, label1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_jz_ecx(int size, int label1)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUState, regs[R_ECX]));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_extu(size + 1, cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_tmp0, 0, label1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_helper_in_func(int ot, TCGv v, TCGv_i32 n)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 0: gen_helper_inb(v, n); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 1: gen_helper_inw(v, n); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 2: gen_helper_inl(v, n); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_helper_out_func(int ot, TCGv_i32 v, TCGv_i32 n)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 0: gen_helper_outb(v, n); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 1: gen_helper_outw(v, n); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 2: gen_helper_outl(v, n); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_check_io(DisasContext *s, int ot, target_ulong cur_eip,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China uint32_t svm_flags)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int state_saved;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China target_ulong next_eip;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China state_saved = 0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->pe && (s->cpl > s->iopl || s->vm86)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->cc_op != CC_OP_DYNAMIC)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_set_cc_op(s->cc_op);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_jmp_im(cur_eip);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China state_saved = 1;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 0: gen_helper_check_iob(cpu_tmp2_i32); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 1: gen_helper_check_iow(cpu_tmp2_i32); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 2: gen_helper_check_iol(cpu_tmp2_i32); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if(s->flags & HF_SVMI_MASK) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (!state_saved) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->cc_op != CC_OP_DYNAMIC)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_set_cc_op(s->cc_op);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_jmp_im(cur_eip);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China state_saved = 1;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China svm_flags |= (1 << (4 + ot));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China next_eip = s->pc - s->cs_base;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_helper_svm_check_io(cpu_tmp2_i32, tcg_const_i32(svm_flags),
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_const_i32(next_eip - cur_eip));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_movs(DisasContext *s, int ot)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_string_movl_A0_ESI(s);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_ld_T0_A0(ot + s->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_string_movl_A0_EDI(s);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_T0_A0(ot + s->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_T0_Dshift(ot);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_add_reg_T0(s->aflag, R_ESI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_add_reg_T0(s->aflag, R_EDI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_update_cc_op(DisasContext *s)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->cc_op != CC_OP_DYNAMIC) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_set_cc_op(s->cc_op);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s->cc_op = CC_OP_DYNAMIC;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_op_update1_cc(void)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_discard_tl(cpu_cc_src);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_cc_dst, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_op_update2_cc(void)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_cc_src, cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_cc_dst, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_cmpl_T0_T1_cc(void)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_cc_src, cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_sub_tl(cpu_cc_dst, cpu_T[0], cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_testl_T0_T1_cc(void)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_discard_tl(cpu_cc_src);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_and_tl(cpu_cc_dst, cpu_T[0], cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_op_update_neg_cc(void)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_neg_tl(cpu_cc_src, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_cc_dst, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* compute eflags.C to reg */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_compute_eflags_c(TCGv reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_helper_cc_compute_c(cpu_tmp2_i32, cpu_cc_op);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_extu_i32_tl(reg, cpu_tmp2_i32);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* compute all eflags to cc_src */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_compute_eflags(TCGv reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_helper_cc_compute_all(cpu_tmp2_i32, cpu_cc_op);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_extu_i32_tl(reg, cpu_tmp2_i32);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_setcc_slow_T0(DisasContext *s, int jcc_op)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->cc_op != CC_OP_DYNAMIC)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_set_cc_op(s->cc_op);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China switch(jcc_op) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_compute_eflags(cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shri_tl(cpu_T[0], cpu_T[0], 11);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_compute_eflags_c(cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_compute_eflags(cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shri_tl(cpu_T[0], cpu_T[0], 6);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_compute_eflags(cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shri_tl(cpu_T[0], cpu_tmp0, 6);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_or_tl(cpu_T[0], cpu_T[0], cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_compute_eflags(cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shri_tl(cpu_T[0], cpu_T[0], 7);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_compute_eflags(cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shri_tl(cpu_T[0], cpu_T[0], 2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_compute_eflags(cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shri_tl(cpu_T[0], cpu_tmp0, 11); /* CC_O */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shri_tl(cpu_tmp0, cpu_tmp0, 7); /* CC_S */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_compute_eflags(cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shri_tl(cpu_T[0], cpu_tmp0, 11); /* CC_O */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shri_tl(cpu_tmp4, cpu_tmp0, 7); /* CC_S */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shri_tl(cpu_tmp0, cpu_tmp0, 6); /* CC_Z */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_tmp4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_or_tl(cpu_T[0], cpu_T[0], cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* return true if setcc_slow is not needed (WARNING: must be kept in
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China sync with gen_jcc1) */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int is_fast_jcc_case(DisasContext *s, int b)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China jcc_op = (b >> 1) & 7;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China switch(s->cc_op) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* we optimize the cmp/jcc case */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SUBB:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SUBW:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SUBL:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SUBQ:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (jcc_op == JCC_O || jcc_op == JCC_P)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* some jumps are easy to compute */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_ADDB:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_ADDW:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_ADDL:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_ADDQ:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_LOGICB:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_LOGICW:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_LOGICL:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_LOGICQ:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_INCB:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_INCW:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_INCL:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_INCQ:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_DECB:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_DECW:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_DECL:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_DECQ:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SHLB:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SHLW:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SHLL:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SHLQ:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (jcc_op != JCC_Z && jcc_op != JCC_S)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* generate a conditional jump to label 'l1' according to jump opcode
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China value 'b'. In the fast case, T0 is guaranted not to be used. */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_jcc1(DisasContext *s, int cc_op, int b, int l1)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int inv, jcc_op, size, cond;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China jcc_op = (b >> 1) & 7;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China switch(cc_op) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* we optimize the cmp/jcc case */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SUBB:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SUBW:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SUBL:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SUBQ:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China size = cc_op - CC_OP_SUBB;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China switch(jcc_op) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_tmp0, cpu_cc_dst, 0xff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_tmp0, cpu_cc_dst, 0xffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_tmp0, cpu_cc_dst, 0xffffffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China t0 = cpu_cc_dst;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcondi_tl(inv ? TCG_COND_NE : TCG_COND_EQ, t0, 0, l1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_tmp0, cpu_cc_dst, 0x80);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcondi_tl(inv ? TCG_COND_EQ : TCG_COND_NE, cpu_tmp0,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_tmp0, cpu_cc_dst, 0x8000);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcondi_tl(inv ? TCG_COND_EQ : TCG_COND_NE, cpu_tmp0,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_tmp0, cpu_cc_dst, 0x80000000);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcondi_tl(inv ? TCG_COND_EQ : TCG_COND_NE, cpu_tmp0,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcondi_tl(inv ? TCG_COND_GE : TCG_COND_LT, cpu_cc_dst,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cond = inv ? TCG_COND_GEU : TCG_COND_LTU;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto fast_jcc_b;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cond = inv ? TCG_COND_GTU : TCG_COND_LEU;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_add_tl(cpu_tmp4, cpu_cc_dst, cpu_cc_src);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_tmp4, cpu_tmp4, 0xff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(t0, cpu_cc_src, 0xff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_tmp4, cpu_tmp4, 0xffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(t0, cpu_cc_src, 0xffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_tmp4, cpu_tmp4, 0xffffffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(t0, cpu_cc_src, 0xffffffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China t0 = cpu_cc_src;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcond_tl(cond, cpu_tmp4, t0, l1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cond = inv ? TCG_COND_GE : TCG_COND_LT;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto fast_jcc_l;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cond = inv ? TCG_COND_GT : TCG_COND_LE;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_add_tl(cpu_tmp4, cpu_cc_dst, cpu_cc_src);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ext8s_tl(cpu_tmp4, cpu_tmp4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ext8s_tl(t0, cpu_cc_src);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ext16s_tl(cpu_tmp4, cpu_tmp4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ext16s_tl(t0, cpu_cc_src);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ext32s_tl(cpu_tmp4, cpu_tmp4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ext32s_tl(t0, cpu_cc_src);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China t0 = cpu_cc_src;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcond_tl(cond, cpu_tmp4, t0, l1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* some jumps are easy to compute */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_ADDB:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_ADDW:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_ADDL:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_ADDQ:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_ADCB:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_ADCW:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_ADCL:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_ADCQ:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SBBB:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SBBW:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SBBL:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SBBQ:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_LOGICB:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_LOGICW:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_LOGICL:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_LOGICQ:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_INCB:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_INCW:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_INCL:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_INCQ:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_DECB:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_DECW:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_DECL:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_DECQ:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SHLB:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SHLW:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SHLL:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SHLQ:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SARB:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SARW:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SARL:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case CC_OP_SARQ:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China switch(jcc_op) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China size = (cc_op - CC_OP_ADDB) & 3;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto fast_jcc_z;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China size = (cc_op - CC_OP_ADDB) & 3;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China goto fast_jcc_s;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_setcc_slow_T0(s, jcc_op);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcondi_tl(inv ? TCG_COND_EQ : TCG_COND_NE,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cpu_T[0], 0, l1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* XXX: does not work with gdbstub "ice" single step - not a
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer serious problem */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic int gen_jz_ecx_string(DisasContext *s, target_ulong next_eip)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China l1 = gen_new_label();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China l2 = gen_new_label();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_jnz_ecx(s->aflag, l1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_set_label(l2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_jmp_tb(s, next_eip, 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_set_label(l1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_stos(DisasContext *s, int ot)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_TN_reg(OT_LONG, 0, R_EAX);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_string_movl_A0_EDI(s);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_T0_A0(ot + s->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_T0_Dshift(ot);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_add_reg_T0(s->aflag, R_EDI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_lods(DisasContext *s, int ot)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_string_movl_A0_ESI(s);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_ld_T0_A0(ot + s->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_T0(ot, R_EAX);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_T0_Dshift(ot);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_add_reg_T0(s->aflag, R_ESI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_scas(DisasContext *s, int ot)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_TN_reg(OT_LONG, 0, R_EAX);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_string_movl_A0_EDI(s);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_ld_T1_A0(ot + s->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_cmpl_T0_T1_cc();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_T0_Dshift(ot);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_add_reg_T0(s->aflag, R_EDI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_cmps(DisasContext *s, int ot)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_string_movl_A0_ESI(s);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_ld_T0_A0(ot + s->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_string_movl_A0_EDI(s);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_ld_T1_A0(ot + s->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_cmpl_T0_T1_cc();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_T0_Dshift(ot);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_add_reg_T0(s->aflag, R_ESI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_add_reg_T0(s->aflag, R_EDI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_ins(DisasContext *s, int ot)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (use_icount)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_io_start();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_string_movl_A0_EDI(s);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* Note: we must do this dummy write first to be restartable in
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case of page fault. */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_T0_0();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_T0_A0(ot + s->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_TN_reg(OT_WORD, 1, R_EDX);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_i32(cpu_tmp2_i32, cpu_tmp2_i32, 0xffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_helper_in_func(ot, cpu_T[0], cpu_tmp2_i32);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_T0_A0(ot + s->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_T0_Dshift(ot);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_add_reg_T0(s->aflag, R_EDI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (use_icount)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_outs(DisasContext *s, int ot)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (use_icount)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_io_start();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_string_movl_A0_ESI(s);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_ld_T0_A0(ot + s->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_TN_reg(OT_WORD, 1, R_EDX);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_i32(cpu_tmp2_i32, cpu_tmp2_i32, 0xffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_trunc_tl_i32(cpu_tmp3_i32, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_helper_out_func(ot, cpu_tmp2_i32, cpu_tmp3_i32);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_T0_Dshift(ot);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_add_reg_T0(s->aflag, R_ESI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (use_icount)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* same method as Valgrind : we generate jumps to current or next
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define GEN_REPZ(op) \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_repz_ ## op(DisasContext *s, int ot, \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China target_ulong cur_eip, target_ulong next_eip) \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_update_cc_op(s); \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China l2 = gen_jz_ecx_string(s, next_eip); \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_ ## op(s, ot); \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_add_reg_im(s->aflag, R_ECX, -1); \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* a loop would cause two single step exceptions if ECX = 1 \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China before rep string_insn */ \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (!s->jmp_opt) \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_jz_ecx(s->aflag, l2); \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_jmp(s, cur_eip); \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#define GEN_REPZ2(op) \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_repz_ ## op(DisasContext *s, int ot, \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China target_ulong cur_eip, \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China target_ulong next_eip, \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_update_cc_op(s); \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China l2 = gen_jz_ecx_string(s, next_eip); \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_ ## op(s, ot); \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_add_reg_im(s->aflag, R_ECX, -1); \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_set_cc_op(CC_OP_SUBB + ot); \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_jcc1(s, CC_OP_SUBB + ot, (JCC_Z << 1) | (nz ^ 1), l2); \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (!s->jmp_opt) \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_jz_ecx(s->aflag, l2); \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_jmp(s, cur_eip); \
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_helper_fp_arith_ST0_FT0(int op)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 0: gen_helper_fadd_ST0_FT0(); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 1: gen_helper_fmul_ST0_FT0(); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 2: gen_helper_fcom_ST0_FT0(); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 3: gen_helper_fcom_ST0_FT0(); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 4: gen_helper_fsub_ST0_FT0(); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 5: gen_helper_fsubr_ST0_FT0(); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 6: gen_helper_fdiv_ST0_FT0(); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 7: gen_helper_fdivr_ST0_FT0(); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* NOTE the exception in "r" op ordering */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_helper_fp_arith_STN_ST0(int op, int opreg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China TCGv_i32 tmp = tcg_const_i32(opreg);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 0: gen_helper_fadd_STN_ST0(tmp); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 1: gen_helper_fmul_STN_ST0(tmp); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 4: gen_helper_fsubr_STN_ST0(tmp); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 5: gen_helper_fsub_STN_ST0(tmp); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 6: gen_helper_fdivr_STN_ST0(tmp); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 7: gen_helper_fdiv_STN_ST0(tmp); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* if d == OR_TMP0, it means memory operand (address in A0) */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_op(DisasContext *s1, int op, int ot, int d)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (d != OR_TMP0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_TN_reg(ot, 0, d);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_ld_T0_A0(ot + s1->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s1->cc_op != CC_OP_DYNAMIC)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_set_cc_op(s1->cc_op);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_compute_eflags_c(cpu_tmp4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_tmp4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (d != OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_T0(ot, d);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_T0_A0(ot + s1->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_cc_src, cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_cc_dst, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_tmp4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shli_i32(cpu_tmp2_i32, cpu_tmp2_i32, 2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_addi_i32(cpu_cc_op, cpu_tmp2_i32, CC_OP_ADDB + ot);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s1->cc_op = CC_OP_DYNAMIC;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s1->cc_op != CC_OP_DYNAMIC)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_set_cc_op(s1->cc_op);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_compute_eflags_c(cpu_tmp4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_tmp4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (d != OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_T0(ot, d);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_T0_A0(ot + s1->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_cc_src, cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_cc_dst, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_tmp4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shli_i32(cpu_tmp2_i32, cpu_tmp2_i32, 2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_addi_i32(cpu_cc_op, cpu_tmp2_i32, CC_OP_SUBB + ot);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s1->cc_op = CC_OP_DYNAMIC;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addl_T0_T1();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (d != OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_T0(ot, d);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_T0_A0(ot + s1->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_update2_cc();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s1->cc_op = CC_OP_ADDB + ot;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (d != OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_T0(ot, d);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_T0_A0(ot + s1->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_update2_cc();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s1->cc_op = CC_OP_SUBB + ot;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_and_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (d != OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_T0(ot, d);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_T0_A0(ot + s1->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_update1_cc();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s1->cc_op = CC_OP_LOGICB + ot;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_or_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (d != OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_T0(ot, d);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_T0_A0(ot + s1->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_update1_cc();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s1->cc_op = CC_OP_LOGICB + ot;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (d != OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_T0(ot, d);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_T0_A0(ot + s1->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_update1_cc();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s1->cc_op = CC_OP_LOGICB + ot;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_cmpl_T0_T1_cc();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s1->cc_op = CC_OP_SUBB + ot;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* if d == OR_TMP0, it means memory operand (address in A0) */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_inc(DisasContext *s1, int ot, int d, int c)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (d != OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_TN_reg(ot, 0, d);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_ld_T0_A0(ot + s1->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s1->cc_op != CC_OP_DYNAMIC)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_set_cc_op(s1->cc_op);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_addi_tl(cpu_T[0], cpu_T[0], 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s1->cc_op = CC_OP_INCB + ot;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_addi_tl(cpu_T[0], cpu_T[0], -1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s1->cc_op = CC_OP_DECB + ot;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (d != OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_T0(ot, d);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_T0_A0(ot + s1->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_compute_eflags_c(cpu_cc_src);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_cc_dst, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_shift_rm_T1(DisasContext *s, int ot, int op1,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int is_right, int is_arith)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China target_ulong mask;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int shift_label;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ot == OT_QUAD)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (op1 == OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_ld_T0_A0(ot + s->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_TN_reg(ot, 0, op1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_T[1], cpu_T[1], mask);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_addi_tl(cpu_tmp5, cpu_T[1], -1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (is_right) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (is_arith) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_exts(ot, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_sar_tl(cpu_T3, cpu_T[0], cpu_tmp5);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_sar_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_extu(ot, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shr_tl(cpu_T3, cpu_T[0], cpu_tmp5);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shr_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shl_tl(cpu_T3, cpu_T[0], cpu_tmp5);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shl_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (op1 == OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_T0_A0(ot + s->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_T0(ot, op1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* update eflags if non zero shift */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->cc_op != CC_OP_DYNAMIC)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_set_cc_op(s->cc_op);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* XXX: inefficient */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China t0 = tcg_temp_local_new();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China t1 = tcg_temp_local_new();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(t0, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(t1, cpu_T3);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China shift_label = gen_new_label();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_T[1], 0, shift_label);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_cc_src, t1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_cc_dst, t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_i32(cpu_cc_op, CC_OP_SARB + ot);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_i32(cpu_cc_op, CC_OP_SHLB + ot);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_set_label(shift_label);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s->cc_op = CC_OP_DYNAMIC; /* cannot predict flags after */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_temp_free(t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_temp_free(t1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_shift_rm_im(DisasContext *s, int ot, int op1, int op2,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int is_right, int is_arith)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ot == OT_QUAD)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (op1 == OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_ld_T0_A0(ot + s->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_TN_reg(ot, 0, op1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (op2 != 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (is_right) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (is_arith) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_exts(ot, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_sari_tl(cpu_tmp4, cpu_T[0], op2 - 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_sari_tl(cpu_T[0], cpu_T[0], op2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_extu(ot, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shri_tl(cpu_tmp4, cpu_T[0], op2 - 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shri_tl(cpu_T[0], cpu_T[0], op2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shli_tl(cpu_tmp4, cpu_T[0], op2 - 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shli_tl(cpu_T[0], cpu_T[0], op2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (op1 == OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_T0_A0(ot + s->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_T0(ot, op1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* update eflags if non zero shift */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (op2 != 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_cc_src, cpu_tmp4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_cc_dst, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s->cc_op = CC_OP_SARB + ot;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s->cc_op = CC_OP_SHLB + ot;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void tcg_gen_lshift(TCGv ret, TCGv arg1, target_long arg2)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shli_tl(ret, arg1, arg2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shri_tl(ret, arg1, -arg2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_rot_rm_T1(DisasContext *s, int ot, int op1,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China target_ulong mask;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int label1, label2, data_bits;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China TCGv t0, t1, t2, a0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* XXX: inefficient, but we must use local temps */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China t0 = tcg_temp_local_new();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China t1 = tcg_temp_local_new();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China t2 = tcg_temp_local_new();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China a0 = tcg_temp_local_new();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ot == OT_QUAD)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (op1 == OR_TMP0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(a0, cpu_A0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_ld_v(ot + s->mem_index, t0, a0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_v_reg(ot, t0, op1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(t1, cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(t1, t1, mask);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* Must test zero case to avoid using undefined behaviour in TCG
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China label1 = gen_new_label();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, label1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ot <= OT_WORD)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_tmp0, t1, (1 << (3 + ot)) - 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_tmp0, t1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_extu(ot, t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(t2, t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China data_bits = 8 << ot;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* XXX: rely on behaviour of shifts when operand 2 overflows (XXX:
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China fix TCG definition) */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (is_right) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shr_tl(cpu_tmp4, t0, cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_sub_tl(cpu_tmp0, tcg_const_tl(data_bits), cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shl_tl(t0, t0, cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shl_tl(cpu_tmp4, t0, cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_sub_tl(cpu_tmp0, tcg_const_tl(data_bits), cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shr_tl(t0, t0, cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_or_tl(t0, t0, cpu_tmp4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_set_label(label1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (op1 == OR_TMP0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_v(ot + s->mem_index, t0, a0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_v(ot, op1, t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* update eflags */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->cc_op != CC_OP_DYNAMIC)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_set_cc_op(s->cc_op);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China label2 = gen_new_label();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, label2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_compute_eflags(cpu_cc_src);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_cc_src, cpu_cc_src, ~(CC_O | CC_C));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_xor_tl(cpu_tmp0, t2, t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_lshift(cpu_tmp0, cpu_tmp0, 11 - (data_bits - 1));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, CC_O);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_or_tl(cpu_cc_src, cpu_cc_src, cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (is_right) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shri_tl(t0, t0, data_bits - 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(t0, t0, CC_C);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_or_tl(cpu_cc_src, cpu_cc_src, t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_discard_tl(cpu_cc_dst);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_i32(cpu_cc_op, CC_OP_EFLAGS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_set_label(label2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s->cc_op = CC_OP_DYNAMIC; /* cannot predict flags after */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_temp_free(t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_temp_free(t1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_temp_free(t2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_temp_free(a0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_rot_rm_im(DisasContext *s, int ot, int op1, int op2,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China TCGv t0, t1, a0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* XXX: inefficient, but we must use local temps */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China t0 = tcg_temp_local_new();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China t1 = tcg_temp_local_new();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China a0 = tcg_temp_local_new();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ot == OT_QUAD)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (op1 == OR_TMP0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(a0, cpu_A0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_ld_v(ot + s->mem_index, t0, a0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_v_reg(ot, t0, op1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_extu(ot, t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(t1, t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China data_bits = 8 << ot;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (op2 != 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int shift = op2 & ((1 << (3 + ot)) - 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (is_right) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shri_tl(cpu_tmp4, t0, shift);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shli_tl(t0, t0, data_bits - shift);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shli_tl(cpu_tmp4, t0, shift);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shri_tl(t0, t0, data_bits - shift);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_or_tl(t0, t0, cpu_tmp4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (op1 == OR_TMP0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_v(ot + s->mem_index, t0, a0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_v(ot, op1, t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (op2 != 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* update eflags */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->cc_op != CC_OP_DYNAMIC)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_set_cc_op(s->cc_op);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_compute_eflags(cpu_cc_src);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_cc_src, cpu_cc_src, ~(CC_O | CC_C));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_xor_tl(cpu_tmp0, t1, t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_lshift(cpu_tmp0, cpu_tmp0, 11 - (data_bits - 1));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, CC_O);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_or_tl(cpu_cc_src, cpu_cc_src, cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (is_right) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shri_tl(t0, t0, data_bits - 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(t0, t0, CC_C);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_or_tl(cpu_cc_src, cpu_cc_src, t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_discard_tl(cpu_cc_dst);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_i32(cpu_cc_op, CC_OP_EFLAGS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s->cc_op = CC_OP_EFLAGS;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_temp_free(t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_temp_free(t1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_temp_free(a0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* XXX: add faster immediate = 1 case */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_rotc_rm_T1(DisasContext *s, int ot, int op1,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->cc_op != CC_OP_DYNAMIC)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_set_cc_op(s->cc_op);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (op1 == OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_ld_T0_A0(ot + s->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_TN_reg(ot, 0, op1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (is_right) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 0: gen_helper_rcrb(cpu_T[0], cpu_T[0], cpu_T[1]); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 1: gen_helper_rcrw(cpu_T[0], cpu_T[0], cpu_T[1]); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 2: gen_helper_rcrl(cpu_T[0], cpu_T[0], cpu_T[1]); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 3: gen_helper_rcrq(cpu_T[0], cpu_T[0], cpu_T[1]); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 0: gen_helper_rclb(cpu_T[0], cpu_T[0], cpu_T[1]); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 1: gen_helper_rclw(cpu_T[0], cpu_T[0], cpu_T[1]); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 2: gen_helper_rcll(cpu_T[0], cpu_T[0], cpu_T[1]); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China case 3: gen_helper_rclq(cpu_T[0], cpu_T[0], cpu_T[1]); break;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (op1 == OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_T0_A0(ot + s->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_T0(ot, op1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* update eflags */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China label1 = gen_new_label();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_cc_tmp, -1, label1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_cc_src, cpu_cc_tmp);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_discard_tl(cpu_cc_dst);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_i32(cpu_cc_op, CC_OP_EFLAGS);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_set_label(label1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s->cc_op = CC_OP_DYNAMIC; /* cannot predict flags after */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* XXX: add faster immediate case */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_shiftd_rm_T1_T3(DisasContext *s, int ot, int op1,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int label1, label2, data_bits;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China target_ulong mask;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China TCGv t0, t1, t2, a0;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China t0 = tcg_temp_local_new();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China t1 = tcg_temp_local_new();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China t2 = tcg_temp_local_new();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China a0 = tcg_temp_local_new();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ot == OT_QUAD)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (op1 == OR_TMP0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(a0, cpu_A0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_ld_v(ot + s->mem_index, t0, a0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_v_reg(ot, t0, op1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_T3, cpu_T3, mask);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(t1, cpu_T[1]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(t2, cpu_T3);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* Must test zero case to avoid using undefined behaviour in TCG
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China label1 = gen_new_label();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcondi_tl(TCG_COND_EQ, t2, 0, label1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_addi_tl(cpu_tmp5, t2, -1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ot == OT_WORD) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* Note: we implement the Intel behaviour for shift count > 16 */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (is_right) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(t0, t0, 0xffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shli_tl(cpu_tmp0, t1, 16);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_or_tl(t0, t0, cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ext32u_tl(t0, t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shr_tl(cpu_tmp4, t0, cpu_tmp5);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* only needed if count > 16, but a test would complicate */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_sub_tl(cpu_tmp5, tcg_const_tl(32), t2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shl_tl(cpu_tmp0, t0, cpu_tmp5);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* XXX: not optimal */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(t0, t0, 0xffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shli_tl(t1, t1, 16);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_or_tl(t1, t1, t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ext32u_tl(t1, t1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shl_tl(cpu_tmp4, t0, cpu_tmp5);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_sub_tl(cpu_tmp0, tcg_const_tl(32), cpu_tmp5);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shr_tl(cpu_tmp6, t1, cpu_tmp0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_or_tl(cpu_tmp4, cpu_tmp4, cpu_tmp6);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shl_tl(t0, t0, t2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_sub_tl(cpu_tmp5, tcg_const_tl(32), t2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shr_tl(t1, t1, cpu_tmp5);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_or_tl(t0, t0, t1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China data_bits = 8 << ot;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (is_right) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ot == OT_LONG)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ext32u_tl(t0, t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shr_tl(cpu_tmp4, t0, cpu_tmp5);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shr_tl(t0, t0, t2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_sub_tl(cpu_tmp5, tcg_const_tl(data_bits), t2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shl_tl(t1, t1, cpu_tmp5);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_or_tl(t0, t0, t1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ot == OT_LONG)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ext32u_tl(t1, t1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shl_tl(cpu_tmp4, t0, cpu_tmp5);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shl_tl(t0, t0, t2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_sub_tl(cpu_tmp5, tcg_const_tl(data_bits), t2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shr_tl(t1, t1, cpu_tmp5);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_or_tl(t0, t0, t1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(t1, cpu_tmp4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_set_label(label1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (op1 == OR_TMP0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_v(ot + s->mem_index, t0, a0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_v(ot, op1, t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* update eflags */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->cc_op != CC_OP_DYNAMIC)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_set_cc_op(s->cc_op);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China label2 = gen_new_label();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_brcondi_tl(TCG_COND_EQ, t2, 0, label2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_cc_src, t1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_mov_tl(cpu_cc_dst, t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (is_right) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_i32(cpu_cc_op, CC_OP_SARB + ot);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_i32(cpu_cc_op, CC_OP_SHLB + ot);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_set_label(label2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s->cc_op = CC_OP_DYNAMIC; /* cannot predict flags after */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_temp_free(t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_temp_free(t1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_temp_free(t2);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_temp_free(a0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_shift(DisasContext *s1, int op, int ot, int d, int s)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s != OR_TMP1)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_TN_reg(ot, 1, s);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_rot_rm_T1(s1, ot, d, 0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_rot_rm_T1(s1, ot, d, 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_shift_rm_T1(s1, ot, d, 0, 0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_shift_rm_T1(s1, ot, d, 1, 0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_shift_rm_T1(s1, ot, d, 1, 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_rotc_rm_T1(s1, ot, d, 0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_rotc_rm_T1(s1, ot, d, 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_shifti(DisasContext *s1, int op, int ot, int d, int c)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_rot_rm_im(s1, ot, d, c, 0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_rot_rm_im(s1, ot, d, c, 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_shift_rm_im(s1, ot, d, c, 0, 0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_shift_rm_im(s1, ot, d, c, 1, 0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_shift_rm_im(s1, ot, d, c, 1, 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* currently not optimized */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_T1_im(c);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_shift(s1, op, ot, d, OR_TMP1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_lea_modrm(DisasContext *s, int modrm, int *reg_ptr, int *offset_ptr)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China target_long disp;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int mod, rm, code, override, must_add_seg;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China override = s->override;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China must_add_seg = s->addseg;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (override >= 0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China must_add_seg = 1;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mod = (modrm >> 6) & 3;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rm = modrm & 7;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->aflag) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (base == 4) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China code = ldub_code(s->pc++);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China scale = (code >> 6) & 3;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China index = ((code >> 3) & 7) | REX_X(s);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China base = (code & 7);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China base |= REX_B(s);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if ((base & 7) == 5) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China disp = (int32_t)ldl_code(s->pc);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (CODE64(s) && !havesib) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China disp += s->pc + s->rip_offset;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China disp = (int8_t)ldub_code(s->pc++);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China disp = (int32_t)ldl_code(s->pc);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China disp = ldl_code(s->pc);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (base >= 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* for correct popl handling with esp */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (base == 4 && s->popl_esp_hack)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China disp += s->popl_esp_hack;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->aflag == 2) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movq_A0_reg(base);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (disp != 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addq_A0_im(disp);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addl_A0_im(disp);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->aflag == 2) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movq_A0_im(disp);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_A0_im(disp);
dda0720a40a5b9892e9c96b39ff67c6f504656afjing xiong ERI-SUN /* XXX: index == 4 is always invalid */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (havesib && (index != 4 || scale != 0)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->aflag == 2) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addq_A0_reg_sN(scale, index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addl_A0_reg_sN(scale, index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (must_add_seg) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (override < 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (base == R_EBP || base == R_ESP)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China override = R_SS;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China override = R_DS;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->aflag == 2) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addq_A0_seg(override);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addl_A0_seg(override);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China disp = lduw_code(s->pc);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_A0_im(disp);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rm = 0; /* avoid SS override */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China disp = (int8_t)ldub_code(s->pc++);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China disp = lduw_code(s->pc);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_A0_reg(R_EBX);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addl_A0_reg_sN(0, R_ESI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_A0_reg(R_EBX);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addl_A0_reg_sN(0, R_EDI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_A0_reg(R_EBP);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addl_A0_reg_sN(0, R_ESI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_A0_reg(R_EBP);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addl_A0_reg_sN(0, R_EDI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_A0_reg(R_ESI);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addl_A0_im(disp);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_andl_A0_ffff();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (must_add_seg) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (override < 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (rm == 2 || rm == 3 || rm == 6)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China override = R_SS;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China override = R_DS;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addl_A0_seg(override);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China *reg_ptr = opreg;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China *offset_ptr = disp;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_nop_modrm(DisasContext *s, int modrm)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int mod, rm, base, code;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mod = (modrm >> 6) & 3;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rm = modrm & 7;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->aflag) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (base == 4) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China code = ldub_code(s->pc++);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China base = (code & 7);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (base == 5) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* used for LEA and MOV AX, mem */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_add_A0_ds_seg(DisasContext *s)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int override, must_add_seg;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China must_add_seg = s->addseg;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China override = R_DS;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->override >= 0) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China override = s->override;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China must_add_seg = 1;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China override = R_DS;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (must_add_seg) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#ifdef TARGET_X86_64
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (CODE64(s)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addq_A0_seg(override);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_addl_A0_seg(override);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* generate modrm memory load or store of 'reg'. TMP0 is used if reg ==
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_ldst_modrm(DisasContext *s, int modrm, int ot, int reg, int is_store)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int mod, rm, opreg, disp;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China mod = (modrm >> 6) & 3;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China rm = (modrm & 7) | REX_B(s);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (mod == 3) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (is_store) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (reg != OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_TN_reg(ot, 0, reg);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_T0(ot, rm);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_TN_reg(ot, 0, rm);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (reg != OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_T0(ot, reg);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_lea_modrm(s, modrm, &opreg, &disp);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (is_store) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (reg != OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_TN_reg(ot, 0, reg);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_st_T0_A0(ot + s->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_ld_T0_A0(ot + s->mem_index);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (reg != OR_TMP0)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_mov_reg_T0(ot, reg);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline uint32_t insn_get(DisasContext *s, int ot)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = ldub_code(s->pc);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = lduw_code(s->pc);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China ret = ldl_code(s->pc);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline int insn_const_size(unsigned int ot)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (ot <= OT_LONG)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China return 1 << ot;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_goto_tb(DisasContext *s, int tb_num, target_ulong eip)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China TranslationBlock *tb;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China target_ulong pc;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China pc = s->cs_base + eip;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* NOTE: we handle the case where the TB spans two pages here */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if ((pc & TARGET_PAGE_MASK) == (tb->pc & TARGET_PAGE_MASK) ||
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China (pc & TARGET_PAGE_MASK) == ((s->pc - 1) & TARGET_PAGE_MASK)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_check_external_event();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China#endif /* VBOX */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* jump to same page: we can use a direct jump */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_goto_tb(tb_num);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_jmp_im(eip);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_exit_tb((long)tb + tb_num);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* jump to another page: currently not optimized */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_jmp_im(eip);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_jcc(DisasContext *s, int b,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China target_ulong val, target_ulong next_eip)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int l1, l2, cc_op;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China cc_op = s->cc_op;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->cc_op != CC_OP_DYNAMIC) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_set_cc_op(s->cc_op);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China s->cc_op = CC_OP_DYNAMIC;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->jmp_opt) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China l1 = gen_new_label();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_jcc1(s, cc_op, b, l1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_goto_tb(s, 0, next_eip);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_set_label(l1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_goto_tb(s, 1, val);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China l1 = gen_new_label();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China l2 = gen_new_label();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_setcc(DisasContext *s, int b)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int inv, jcc_op, l1;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (is_fast_jcc_case(s, b)) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* nominal case: we use a jump */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* XXX: make it faster by adding new instructions in TCG */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China t0 = tcg_temp_local_new();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_tl(t0, 0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China l1 = gen_new_label();
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_jcc1(s, s->cc_op, b ^ 1, l1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_movi_tl(t0, 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_set_label(l1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_temp_free(t0);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* slow case: it is more efficient not to generate a jump,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China although it is questionnable whether this optimization is
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China jcc_op = (b >> 1) & 7;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_setcc_slow_T0(s, jcc_op);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_xori_tl(cpu_T[0], cpu_T[0], 1);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_movl_T0_seg(int seg_reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_ld32u_tl(cpu_T[0], cpu_env,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China offsetof(CPUX86State,segs[seg_reg].selector));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic inline void gen_op_movl_seg_T0_vm(int seg_reg)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 0xffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st32_tl(cpu_T[0], cpu_env,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China offsetof(CPUX86State,segs[seg_reg].selector));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_shli_tl(cpu_T[0], cpu_T[0], 4);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st_tl(cpu_T[0], cpu_env,
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China offsetof(CPUX86State,segs[seg_reg].base));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China int flags = DESC_P_MASK | DESC_S_MASK | DESC_W_MASK;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (seg_reg == R_CS)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China flags |= DESC_CS_MASK;
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_T0_im(flags);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st32_tl(cpu_T[0], cpu_env, offsetof(CPUX86State,segs[seg_reg].flags));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* Set the limit to 0xffff. */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_T0_im(0xffff);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_st32_tl(cpu_T[0], cpu_env, offsetof(CPUX86State,segs[seg_reg].limit));
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China/* move T0 to seg_reg and compute if the CPU state may change. Never
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China call this function with seg_reg == R_CS */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing Chinastatic void gen_movl_seg_T0(DisasContext *s, int seg_reg, target_ulong cur_eip)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->pe && !s->vm86) {
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* XXX: optimize by finding processor state dynamically */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (s->cc_op != CC_OP_DYNAMIC)
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_set_cc_op(s->cc_op);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_jmp_im(cur_eip);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_helper_load_seg(tcg_const_i32(seg_reg), cpu_tmp2_i32);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China /* abort translation because the addseg value may change or
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China because ss32 may change. For R_SS, translation must always
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China stop as a special handling must be done to disable hardware
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China interrupts for the next instruction */
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (seg_reg == R_SS || (s->code32 && seg_reg < R_FS))
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China gen_op_movl_seg_T0_vm(seg_reg);
9a5557fdd04be37785607871e8d4189e39490129lucy wang - Sun Microsystems - Beijing China if (seg_reg == R_SS)
#ifdef TARGET_X86_64
if (CODE64(s)) {
if (s->ss32) {
#ifdef TARGET_X86_64
if (CODE64(s)) {
if (s->dflag) {
if (!s->dflag)
if (s->ss32) {
if (s->addseg) {
#ifdef TARGET_X86_64
if (CODE64(s)) {
if (s->dflag) {
if (!s->dflag)
if (s->ss32) {
if (s->addseg) {
#ifdef TARGET_X86_64
if (CODE64(s)) {
if (s->ss32) {
if (s->addseg)
#ifdef TARGET_X86_64
if (!s->ss32)
if (s->addseg)
if (!s->ss32)
if (s->addseg)
if (!s->ss32)
if (s->addseg)
#ifdef TARGET_X86_64
if (CODE64(s)) {
if (level) {
if (!s->ss32)
if (s->addseg)
if (level) {
if ( s->singlestep_enabled
#ifdef VBOX
} else if (s->tf) {
tcg_gen_exit_tb(0);
if (s->jmp_opt) {
gen_eob(s);
[0x12] = { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movlps, movlpd, movsldup, movddup */
[0x2a] = { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* cvtpi2ps, cvtpi2pd, cvtsi2ss, cvtsi2sd */
[0x2c] = { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* cvttps2pi, cvttpd2pi, cvttsd2si, cvttss2si */
[0x2d] = { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* cvtps2pi, cvtpd2pi, cvtsd2si, cvtss2si */
struct sse_op_helper_s {
void *sse_op2;
b1 = 0;
if (!sse_op2)
goto illegal_op;
if (b1 == 0) {
is_xmm = 0;
goto illegal_op;
goto illegal_op;
if (!is_xmm) {
if (is_xmm)
goto illegal_op;
goto illegal_op;
#ifdef TARGET_X86_64
#ifdef TARGET_X86_64
#ifdef TARGET_X86_64
#ifdef TARGET_X86_64
goto illegal_op;
goto illegal_op;
if (is_xmm) {
if (!sse_op2)
goto illegal_op;
if (is_xmm) {
if (b1) {
goto illegal_op;
if (b1) {
goto illegal_op;
if (b1) {
goto crc32;
b = modrm;
if (!sse_op2)
goto illegal_op;
goto illegal_op;
if (b1) {
goto illegal_op;
b = modrm;
goto illegal_op;
goto illegal_op;
b = modrm;
if (!sse_op2)
goto illegal_op;
goto illegal_op;
#ifdef TARGET_X86_64
goto illegal_op;
#ifdef TARGET_X86_64
goto illegal_op;
if (b1) {
goto illegal_op;
if (is_xmm) {
goto illegal_op;
if (!sse_op2)
goto illegal_op;
goto illegal_op;
goto illegal_op;
#ifdef TARGET_X86_64
if (s->aflag == 0)
#ifdef VBOX
prefixes = 0;
rex_r = 0;
#ifdef TARGET_X86_64
s->rex_x = 0;
s->rex_b = 0;
x86_64_hregs = 0;
#ifdef VBOX
/* Always update EIP. Otherwise one must be very careful with generated code that can raise exceptions. */
s->pc++;
#ifdef TARGET_X86_64
if (CODE64(s)) {
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
goto next_byte;
#ifndef VBOX
return s->pc;
goto reswitch;
goto xor_zero;
if (CODE64(s))
goto illegal_op;
int val;
if (op == 0)
switch(op) {
switch(ot) {
case OT_BYTE:
case OT_WORD:
case OT_LONG:
#ifdef TARGET_X86_64
#ifdef TARGET_X86_64
case OT_QUAD:
switch(ot) {
case OT_BYTE:
case OT_WORD:
case OT_LONG:
#ifdef TARGET_X86_64
#ifdef TARGET_X86_64
case OT_QUAD:
switch(ot) {
case OT_BYTE:
case OT_WORD:
case OT_LONG:
#ifdef TARGET_X86_64
case OT_QUAD:
switch(ot) {
case OT_BYTE:
case OT_WORD:
case OT_LONG:
#ifdef TARGET_X86_64
case OT_QUAD:
goto illegal_op;
goto illegal_op;
if (CODE64(s)) {
switch(op) {
#ifdef VBOX_WITH_CALL_RECORD
if (s->record_call)
if (s->dflag == 0)
gen_push_T1(s);
gen_eob(s);
gen_eob(s);
if (s->dflag == 0)
gen_eob(s);
gen_eob(s);
gen_push_T0(s);
goto illegal_op;
#ifdef TARGET_X86_64
#ifdef TARGET_X86_64
#ifdef TARGET_X86_64
#ifdef TARGET_X86_64
goto illegal_op;
#ifdef TARGET_X86_64
goto illegal_op;
goto illegal_op;
gen_push_T0(s);
if (CODE64(s)) {
gen_pop_T0(s);
gen_pop_update(s);
if (CODE64(s))
goto illegal_op;
gen_pusha(s);
if (CODE64(s))
goto illegal_op;
gen_popa(s);
if (CODE64(s)) {
gen_push_T0(s);
if (CODE64(s)) {
gen_pop_T0(s);
gen_pop_update(s);
s->popl_esp_hack = 0;
gen_pop_update(s);
int level;
if (CODE64(s)) {
} else if (s->ss32) {
gen_pop_T0(s);
if (CODE64(s)) {
gen_pop_update(s);
if (CODE64(s))
goto illegal_op;
gen_push_T0(s);
gen_push_T0(s);
if (CODE64(s))
goto illegal_op;
gen_pop_T0(s);
gen_pop_update(s);
/* if reg == SS, inhibit interrupts/trace. */
s->tf = 0;
if (s->is_jmp) {
gen_eob(s);
gen_pop_T0(s);
gen_pop_update(s);
if (s->is_jmp) {
gen_eob(s);
goto illegal_op;
goto illegal_op;
/* if reg == SS, inhibit interrupts/trace */
s->tf = 0;
if (s->is_jmp) {
gen_eob(s);
goto illegal_op;
int d_ot;
case OT_BYTE:
case OT_WORD:
goto illegal_op;
s->addseg = 0;
#ifdef TARGET_X86_64
if (s->aflag) {
#ifdef TARGET_X86_64
if (s->aflag == 0)
#ifdef TARGET_X86_64
goto do_xchg_reg;
if (CODE64(s))
goto illegal_op;
goto do_lxx;
if (CODE64(s))
goto illegal_op;
goto do_lxx;
goto do_lxx;
goto do_lxx;
goto illegal_op;
if (s->is_jmp) {
gen_eob(s);
grp2:
if (shift == 0) {
goto grp2;
shift = 0;
goto grp2;
op = 0;
goto do_shiftd;
op = 0;
shift = 0;
goto do_shiftd;
goto do_shiftd;
shift = 0;
if (shift) {
switch(op) {
int op1;
goto illegal_op;
switch(op) {
switch(rm) {
goto illegal_op;
switch(rm) {
goto illegal_op;
switch(rm) {
goto illegal_op;
switch(rm) {
switch(rm) {
int op1;
switch(rm) {
goto illegal_op;
switch(rm) {
goto illegal_op;
switch(rm) {
goto illegal_op;
switch(rm) {
goto illegal_op;
goto illegal_op;
if (use_icount) {
if (use_icount) {
if (use_icount)
gen_io_start();
if (use_icount) {
gen_io_end();
#ifdef VBOX /* bird: linux is writing to this port for delaying I/O. */ /** @todo YYY: this breaks AIX, remove. */
if (use_icount)
gen_io_start();
if (use_icount) {
gen_io_end();
if (use_icount)
gen_io_start();
if (use_icount) {
gen_io_end();
if (use_icount)
gen_io_start();
if (use_icount) {
gen_io_end();
gen_pop_T0(s);
if (s->dflag == 0)
gen_eob(s);
gen_pop_T0(s);
gen_pop_update(s);
if (s->dflag == 0)
gen_eob(s);
gen_stack_A0(s);
if (s->dflag == 0)
gen_eob(s);
val = 0;
goto do_lret;
if (!s->pe) {
} else if (s->vm86) {
#ifdef VBOX
gen_eob(s);
if (dflag)
if (s->dflag == 0)
else if (!CODE64(s))
gen_push_T0(s);
if (CODE64(s))
goto illegal_op;
goto do_lcall;
if (dflag)
if (s->dflag == 0)
else if(!CODE64(s))
if (CODE64(s))
goto illegal_op;
goto do_ljmp;
if (s->dflag == 0)
goto do_jcc;
if (dflag) {
if (s->dflag == 0)
gen_setcc(s, b);
int l1;
#ifdef TARGET_X86_64
#ifdef VBOX
#ifdef VBOX
gen_push_T0(s);
#ifdef VBOX
gen_pop_T0(s);
if (s->cpl == 0) {
if (s->dflag) {
if (s->dflag) {
if (s->dflag) {
#ifdef VBOX
gen_pop_update(s);
gen_eob(s);
goto illegal_op;
goto illegal_op;
goto illegal_op;
goto bt_op;
op = 0;
goto do_btx;
goto do_btx;
goto do_btx;
switch(op) {
if (op != 0) {
int label1;
if (CODE64(s))
goto illegal_op;
if (CODE64(s))
goto illegal_op;
if (CODE64(s))
goto illegal_op;
if (CODE64(s))
goto illegal_op;
if (CODE64(s))
goto illegal_op;
if (val == 0) {
if (CODE64(s))
goto illegal_op;
goto illegal_op;
#ifdef VBOX
#ifdef VBOX
if (CODE64(s))
goto illegal_op;
#ifdef WANT_ICEBP
if (!s->vm86) {
#ifdef VBOX
if (!s->vm86) {
gen_eob(s);
goto gen_sti;
#ifdef VBOX
gen_eob(s);
if (CODE64(s))
goto illegal_op;
goto illegal_op;
#ifdef TARGET_X86_64
if (CODE64(s))
goto illegal_op;
if (s->dflag == 0)
gen_eob(s);
if (s->cpl != 0) {
if (use_icount)
gen_io_start();
if (use_icount) {
gen_io_end();
#ifndef VBOX
if (CODE64(s))
goto illegal_op;
if (!s->pe) {
gen_eob(s);
#ifndef VBOX
if (CODE64(s))
goto illegal_op;
if (!s->pe) {
gen_eob(s);
#ifdef TARGET_X86_64
gen_eob(s);
if (!s->pe) {
if (s->lma)
gen_eob(s);
if (s->cpl != 0) {
switch(op) {
goto illegal_op;
goto illegal_op;
if (s->cpl != 0) {
goto illegal_op;
goto illegal_op;
if (s->cpl != 0) {
goto illegal_op;
goto illegal_op;
#ifdef VBOX
goto illegal_op;
switch(op) {
goto illegal_op;
if (!s->dflag)
switch (rm) {
s->cpl != 0)
goto illegal_op;
#ifdef TARGET_X86_64
if (s->aflag == 0)
s->cpl != 0)
goto illegal_op;
gen_eob(s);
goto illegal_op;
if (!s->dflag)
switch(rm) {
goto illegal_op;
if (s->cpl != 0) {
tcg_gen_exit_tb(0);
goto illegal_op;
goto illegal_op;
if (s->cpl != 0) {
goto illegal_op;
if (s->cpl != 0) {
!s->pe)
goto illegal_op;
if (s->cpl != 0) {
goto illegal_op;
if (s->cpl != 0) {
!s->pe)
goto illegal_op;
goto illegal_op;
if (s->cpl != 0) {
goto illegal_op;
} else if (s->cpl != 0) {
if (!s->dflag)
if (s->cpl != 0) {
gen_eob(s);
if (s->cpl != 0) {
#ifdef TARGET_X86_64
goto illegal_op;
gen_eob(s);
goto illegal_op;
if (s->cpl != 0) {
#ifdef TARGET_X86_64
if (CODE64(s)) {
int d_ot;
int label1;
#ifdef VBOX
goto illegal_op;
#ifdef VBOX
#ifdef VBOX
#ifdef VBOX
#ifdef VBOX
int label1;
goto illegal_op;
switch(op) {
goto illegal_op;
if (s->cpl != 0) {
#ifndef VBOX /* mod bits are always understood to be 11 (0xc0) regardless of actual content; see AMD manuals */
goto illegal_op;
if (CODE64(s))
switch(reg) {
gen_eob(s);
goto illegal_op;
if (s->cpl != 0) {
#ifndef VBOX /* mod bits are always understood to be 11 (0xc0) regardless of actual content; see AMD manuals */
goto illegal_op;
if (CODE64(s))
goto illegal_op;
gen_eob(s);
if (s->cpl != 0) {
gen_eob(s);
goto illegal_op;
goto illegal_op;
switch(op) {
goto illegal_op;
goto illegal_op;
goto illegal_op;
goto illegal_op;
goto illegal_op;
goto illegal_op;
goto illegal_op;
goto illegal_op;
goto illegal_op;
gen_eob(s);
goto illegal_op;
goto illegal_op;
goto illegal_op;
return s->pc;
return s->pc;
void optimize_flags_init(void)
#include "helper.h"
int search_pc)
int num_insns;
int max_insns;
#ifdef VBOX
#ifdef VBOX
# ifdef VBOX_WITH_CALL_RECORD
#ifdef TARGET_X86_64
#ifndef CONFIG_SOFTMMU
num_insns = 0;
if (max_insns == 0)
if (search_pc) {
if (lj < j) {
lj++;
while (lj < j)
gen_io_start();
num_insns++;
#ifdef VBOX
# ifdef DEBUG
if(cpu_check_code_raw(env, pc_ptr, env->hflags | (env->eflags & (IOPL_MASK | TF_MASK | VM_MASK))) == ERROR_SUCCESS)
if (singlestep) {
gen_io_end();
if (search_pc) {
lj++;
while (lj <= j)
#ifdef DEBUG_DISAS
int disas_flags;
#ifdef TARGET_X86_64
if (!search_pc) {
int cc_op;
#ifdef DEBUG_DISAS
for(i = 0;i <= pc_pos; i++) {
if (gen_opc_instr_start[i]) {