]> Git Repo - qemu.git/blame - target-i386/ops_template_mem.h
converted condition code supprot to TCG - converted shift ops to TCG
[qemu.git] / target-i386 / ops_template_mem.h
CommitLineData
2c0262af
FB
1/*
2 * i386 micro operations (included several times to generate
3 * different operand sizes)
5fafdf24 4 *
2c0262af
FB
5 * Copyright (c) 2003 Fabrice Bellard
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21#ifdef MEM_WRITE
22
943144d9
FB
23#if MEM_WRITE == 0
24
25#if DATA_BITS == 8
26#define MEM_SUFFIX b_raw
27#elif DATA_BITS == 16
28#define MEM_SUFFIX w_raw
29#elif DATA_BITS == 32
30#define MEM_SUFFIX l_raw
14ce26e7
FB
31#elif DATA_BITS == 64
32#define MEM_SUFFIX q_raw
943144d9
FB
33#endif
34
35#elif MEM_WRITE == 1
36
37#if DATA_BITS == 8
38#define MEM_SUFFIX b_kernel
39#elif DATA_BITS == 16
40#define MEM_SUFFIX w_kernel
41#elif DATA_BITS == 32
42#define MEM_SUFFIX l_kernel
14ce26e7
FB
43#elif DATA_BITS == 64
44#define MEM_SUFFIX q_kernel
943144d9
FB
45#endif
46
47#elif MEM_WRITE == 2
48
2c0262af 49#if DATA_BITS == 8
943144d9 50#define MEM_SUFFIX b_user
2c0262af 51#elif DATA_BITS == 16
943144d9 52#define MEM_SUFFIX w_user
2c0262af 53#elif DATA_BITS == 32
943144d9 54#define MEM_SUFFIX l_user
14ce26e7
FB
55#elif DATA_BITS == 64
56#define MEM_SUFFIX q_user
943144d9
FB
57#endif
58
59#else
60
61#error invalid MEM_WRITE
62
2c0262af
FB
63#endif
64
65#else
66
67#define MEM_SUFFIX SUFFIX
68
69#endif
70
2c0262af
FB
71/* carry add/sub (we only need to set CC_OP differently) */
72
73void OPPROTO glue(glue(op_adc, MEM_SUFFIX), _T0_T1_cc)(void)
74{
75 int cf;
76 cf = cc_table[CC_OP].compute_c();
77 T0 = T0 + T1 + cf;
78#ifdef MEM_WRITE
14ce26e7 79 glue(st, MEM_SUFFIX)(A0, T0);
2c0262af
FB
80#endif
81 CC_SRC = T1;
82 CC_DST = T0;
14ce26e7 83 CC_OP = CC_OP_ADDB + SHIFT + cf * 4;
2c0262af
FB
84}
85
86void OPPROTO glue(glue(op_sbb, MEM_SUFFIX), _T0_T1_cc)(void)
87{
88 int cf;
89 cf = cc_table[CC_OP].compute_c();
90 T0 = T0 - T1 - cf;
91#ifdef MEM_WRITE
14ce26e7 92 glue(st, MEM_SUFFIX)(A0, T0);
2c0262af
FB
93#endif
94 CC_SRC = T1;
95 CC_DST = T0;
14ce26e7 96 CC_OP = CC_OP_SUBB + SHIFT + cf * 4;
2c0262af
FB
97}
98
99void OPPROTO glue(glue(op_cmpxchg, MEM_SUFFIX), _T0_T1_EAX_cc)(void)
100{
14ce26e7 101 target_ulong src, dst;
2c0262af
FB
102
103 src = T0;
104 dst = EAX - T0;
105 if ((DATA_TYPE)dst == 0) {
106 T0 = T1;
1e4fe7ce 107#ifdef MEM_WRITE
14ce26e7 108 glue(st, MEM_SUFFIX)(A0, T0);
1e4fe7ce 109#endif
2c0262af
FB
110 } else {
111 EAX = (EAX & ~DATA_MASK) | (T0 & DATA_MASK);
112 }
2c0262af
FB
113 CC_SRC = src;
114 CC_DST = dst;
115 FORCE_RET();
116}
117
118#undef MEM_SUFFIX
119#undef MEM_WRITE
This page took 0.143962 seconds and 4 git commands to generate.