annotate c67-gen.c @ 557:9efc5fedd108

Make c67 compile again. (If anybody knows what C67 _is_, I'm a bit curious...)
author Rob Landley <rob@landley.net>
date Thu, 06 Mar 2008 21:41:25 -0600
parents 3f683703c8db
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1 /*
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2 * TMS320C67xx code generator for TCC
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
3 *
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
4 * Copyright (c) 2001, 2002 Fabrice Bellard
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
5 *
499
2b451d2e68ea Exercise LGPL clause 3 and convert more notices from LGPL to GPLv2. (If you
Rob Landley <rob@landley.net>
parents: 339
diff changeset
6 * Licensed under GPLv2, see file LICENSE in this tarball.
308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
7 */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
8
309
5447291470b8 [project @ 2004-10-05 22:33:55 by bellard]
bellard
parents: 308
diff changeset
9 //#define ASSEMBLY_LISTING_C67
308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
10
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
11 /* number of available registers */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
12 #define NB_REGS 24
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
13
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
14 /* a register can belong to several classes. The classes must be
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
15 sorted from more general to more precise (see gv2() code which does
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
16 assumptions on it). */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
17 #define RC_INT 0x0001 /* generic integer register */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
18 #define RC_FLOAT 0x0002 /* generic float register */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
19 #define RC_EAX 0x0004
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
20 #define RC_ST0 0x0008
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
21 #define RC_ECX 0x0010
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
22 #define RC_EDX 0x0020
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
23 #define RC_INT_BSIDE 0x00000040 /* generic integer register on b side */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
24 #define RC_C67_A4 0x00000100
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
25 #define RC_C67_A5 0x00000200
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
26 #define RC_C67_B4 0x00000400
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
27 #define RC_C67_B5 0x00000800
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
28 #define RC_C67_A6 0x00001000
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
29 #define RC_C67_A7 0x00002000
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
30 #define RC_C67_B6 0x00004000
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
31 #define RC_C67_B7 0x00008000
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
32 #define RC_C67_A8 0x00010000
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
33 #define RC_C67_A9 0x00020000
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
34 #define RC_C67_B8 0x00040000
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
35 #define RC_C67_B9 0x00080000
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
36 #define RC_C67_A10 0x00100000
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
37 #define RC_C67_A11 0x00200000
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
38 #define RC_C67_B10 0x00400000
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
39 #define RC_C67_B11 0x00800000
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
40 #define RC_C67_A12 0x01000000
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
41 #define RC_C67_A13 0x02000000
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
42 #define RC_C67_B12 0x04000000
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
43 #define RC_C67_B13 0x08000000
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
44 #define RC_IRET RC_C67_A4 /* function return: integer register */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
45 #define RC_LRET RC_C67_A5 /* function return: second integer register */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
46 #define RC_FRET RC_C67_A4 /* function return: float register */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
47
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
48 /* pretty names for the registers */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
49 enum {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
50 TREG_EAX = 0, // really A2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
51 TREG_ECX, // really A3
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
52 TREG_EDX, // really B0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
53 TREG_ST0, // really B1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
54 TREG_C67_A4,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
55 TREG_C67_A5,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
56 TREG_C67_B4,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
57 TREG_C67_B5,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
58 TREG_C67_A6,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
59 TREG_C67_A7,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
60 TREG_C67_B6,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
61 TREG_C67_B7,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
62 TREG_C67_A8,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
63 TREG_C67_A9,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
64 TREG_C67_B8,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
65 TREG_C67_B9,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
66 TREG_C67_A10,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
67 TREG_C67_A11,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
68 TREG_C67_B10,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
69 TREG_C67_B11,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
70 TREG_C67_A12,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
71 TREG_C67_A13,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
72 TREG_C67_B12,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
73 TREG_C67_B13,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
74 };
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
75
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
76 int reg_classes[NB_REGS] = {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
77 /* eax */ RC_INT | RC_FLOAT | RC_EAX,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
78 // only allow even regs for floats (allow for doubles)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
79 /* ecx */ RC_INT | RC_ECX,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
80 /* edx */ RC_INT | RC_INT_BSIDE | RC_FLOAT | RC_EDX,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
81 // only allow even regs for floats (allow for doubles)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
82 /* st0 */ RC_INT | RC_INT_BSIDE | RC_ST0,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
83 /* A4 */ RC_C67_A4,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
84 /* A5 */ RC_C67_A5,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
85 /* B4 */ RC_C67_B4,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
86 /* B5 */ RC_C67_B5,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
87 /* A6 */ RC_C67_A6,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
88 /* A7 */ RC_C67_A7,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
89 /* B6 */ RC_C67_B6,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
90 /* B7 */ RC_C67_B7,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
91 /* A8 */ RC_C67_A8,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
92 /* A9 */ RC_C67_A9,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
93 /* B8 */ RC_C67_B8,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
94 /* B9 */ RC_C67_B9,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
95 /* A10 */ RC_C67_A10,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
96 /* A11 */ RC_C67_A11,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
97 /* B10 */ RC_C67_B10,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
98 /* B11 */ RC_C67_B11,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
99 /* A12 */ RC_C67_A10,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
100 /* A13 */ RC_C67_A11,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
101 /* B12 */ RC_C67_B10,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
102 /* B13 */ RC_C67_B11
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
103 };
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
104
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
105 /* return registers for function */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
106 #define REG_IRET TREG_C67_A4 /* single word int return register */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
107 #define REG_LRET TREG_C67_A5 /* second word return register (for long long) */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
108 #define REG_FRET TREG_C67_A4 /* float return register */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
109
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
110
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
111 #define ALWAYS_ASSERT(x) \
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
112 do {\
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
113 if (!(x))\
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
114 error("internal compiler error file at %s:%d", __FILE__, __LINE__);\
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
115 } while (0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
116
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
117 // although tcc thinks it is passing parameters on the stack,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
118 // the C67 really passes up to the first 10 params in special
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
119 // regs or regs pairs (for 64 bit params). So keep track of
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
120 // the stack offsets so we can translate to the appropriate
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
121 // reg (pair)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
122
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
123
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
124 #define NoCallArgsPassedOnStack 10
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
125 int NoOfCurFuncArgs;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
126 int TranslateStackToReg[NoCallArgsPassedOnStack];
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
127 int ParamLocOnStack[NoCallArgsPassedOnStack];
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
128 int TotalBytesPushedOnStack;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
129
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
130 /* defined if function parameters must be evaluated in reverse order */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
131
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
132 //#define INVERT_FUNC_PARAMS
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
133
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
134 /* defined if structures are passed as pointers. Otherwise structures
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
135 are directly pushed on stack. */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
136 //#define FUNC_STRUCT_PARAM_AS_PTR
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
137
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
138 /* pointer size, in bytes */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
139 #define PTR_SIZE 4
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
140
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
141 /* long double size and alignment, in bytes */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
142 #define LDOUBLE_SIZE 12
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
143 #define LDOUBLE_ALIGN 4
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
144 /* maximum alignment (for aligned attribute support) */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
145 #define MAX_ALIGN 8
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
146
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
147 /******************************************************/
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
148 /* ELF defines */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
149
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
150 #define EM_TCC_TARGET EM_C60
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
151
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
152 /* relocation type for 32 bit data relocation */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
153 #define R_DATA_32 R_C60_32
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
154 #define R_JMP_SLOT R_C60_JMP_SLOT
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
155 #define R_COPY R_C60_COPY
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
156
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
157 #define ELF_START_ADDR 0x00000400
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
158 #define ELF_PAGE_SIZE 0x1000
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
159
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
160 /******************************************************/
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
161
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
162 static unsigned long func_sub_sp_offset;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
163 static int func_ret_sub;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
164
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
165
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
166 static BOOL C67_invert_test;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
167 static int C67_compare_reg;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
168
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
169 #ifdef ASSEMBLY_LISTING_C67
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
170 FILE *f = NULL;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
171 #endif
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
172
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
173
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
174 void C67_g(int c)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
175 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
176 int ind1;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
177
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
178 #ifdef ASSEMBLY_LISTING_C67
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
179 fprintf(f, " %08X", c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
180 #endif
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
181 ind1 = ind + 4;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
182 if (ind1 > (int) cur_text_section->data_allocated)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
183 section_realloc(cur_text_section, ind1);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
184 cur_text_section->data[ind] = c & 0xff;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
185 cur_text_section->data[ind + 1] = (c >> 8) & 0xff;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
186 cur_text_section->data[ind + 2] = (c >> 16) & 0xff;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
187 cur_text_section->data[ind + 3] = (c >> 24) & 0xff;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
188 ind = ind1;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
189 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
190
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
191
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
192 /* output a symbol and patch all calls to it */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
193 void gsym_addr(int t, int a)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
194 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
195 int n, *ptr;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
196 while (t) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
197 ptr = (int *) (cur_text_section->data + t);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
198 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
199 Sym *sym;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
200
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
201 // extract 32 bit address from MVKH/MVKL
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
202 n = ((*ptr >> 7) & 0xffff);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
203 n |= ((*(ptr + 1) >> 7) & 0xffff) << 16;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
204
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
205 // define a label that will be relocated
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
206
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
207 sym = get_sym_ref(&char_pointer_type, cur_text_section, a, 0);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
208 greloc(cur_text_section, sym, t, R_C60LO16);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
209 greloc(cur_text_section, sym, t + 4, R_C60HI16);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
210
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
211 // clear out where the pointer was
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
212
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
213 *ptr &= ~(0xffff << 7);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
214 *(ptr + 1) &= ~(0xffff << 7);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
215 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
216 t = n;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
217 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
218 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
219
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
220 void gsym(int t)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
221 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
222 gsym_addr(t, ind);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
223 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
224
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
225 // these are regs that tcc doesn't really know about,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
226 // but asign them unique values so the mapping routines
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
227 // can distinquish them
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
228
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
229 #define C67_A0 105
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
230 #define C67_SP 106
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
231 #define C67_B3 107
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
232 #define C67_FP 108
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
233 #define C67_B2 109
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
234 #define C67_CREG_ZERO -1 // Special code for no condition reg test
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
235
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
236
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
237 int ConvertRegToRegClass(int r)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
238 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
239 // only works for A4-B13
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
240
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
241 return RC_C67_A4 << (r - TREG_C67_A4);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
242 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
243
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
244
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
245 // map TCC reg to C67 reg number
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
246
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
247 int C67_map_regn(int r)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
248 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
249 if (r == 0) // normal tcc regs
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
250 return 0x2; // A2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
251 else if (r == 1) // normal tcc regs
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
252 return 3; // A3
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
253 else if (r == 2) // normal tcc regs
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
254 return 0; // B0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
255 else if (r == 3) // normal tcc regs
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
256 return 1; // B1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
257 else if (r >= TREG_C67_A4 && r <= TREG_C67_B13) // these form a pattern of alt pairs
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
258 return (((r & 0xfffffffc) >> 1) | (r & 1)) + 2;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
259 else if (r == C67_A0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
260 return 0; // set to A0 (offset reg)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
261 else if (r == C67_B2)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
262 return 2; // set to B2 (offset reg)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
263 else if (r == C67_B3)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
264 return 3; // set to B3 (return address reg)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
265 else if (r == C67_SP)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
266 return 15; // set to SP (B15) (offset reg)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
267 else if (r == C67_FP)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
268 return 15; // set to FP (A15) (offset reg)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
269 else if (r == C67_CREG_ZERO)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
270 return 0; // Special code for no condition reg test
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
271 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
272 ALWAYS_ASSERT(FALSE);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
273
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
274 return 0;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
275 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
276
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
277 // mapping from tcc reg number to
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
278 // C67 register to condition code field
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
279 //
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
280 // valid condition code regs are:
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
281 //
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
282 // tcc reg 2 ->B0 -> 1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
283 // tcc reg 3 ->B1 -> 2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
284 // tcc reg 0 -> A2 -> 5
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
285 // tcc reg 1 -> A3 -> X
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
286 // tcc reg B2 -> 3
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
287
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
288 int C67_map_regc(int r)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
289 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
290 if (r == 0) // normal tcc regs
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
291 return 0x5;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
292 else if (r == 2) // normal tcc regs
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
293 return 0x1;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
294 else if (r == 3) // normal tcc regs
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
295 return 0x2;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
296 else if (r == C67_B2) // normal tcc regs
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
297 return 0x3;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
298 else if (r == C67_CREG_ZERO)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
299 return 0; // Special code for no condition reg test
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
300 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
301 ALWAYS_ASSERT(FALSE);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
302
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
303 return 0;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
304 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
305
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
306
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
307 // map TCC reg to C67 reg side A or B
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
309 int C67_map_regs(int r)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
310 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
311 if (r == 0) // normal tcc regs
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
312 return 0x0;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
313 else if (r == 1) // normal tcc regs
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
314 return 0x0;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
315 else if (r == 2) // normal tcc regs
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
316 return 0x1;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
317 else if (r == 3) // normal tcc regs
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
318 return 0x1;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
319 else if (r >= TREG_C67_A4 && r <= TREG_C67_B13) // these form a pattern of alt pairs
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
320 return (r & 2) >> 1;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
321 else if (r == C67_A0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
322 return 0; // set to A side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
323 else if (r == C67_B2)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
324 return 1; // set to B side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
325 else if (r == C67_B3)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
326 return 1; // set to B side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
327 else if (r == C67_SP)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
328 return 0x1; // set to SP (B15) B side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
329 else if (r == C67_FP)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
330 return 0x0; // set to FP (A15) A side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
331 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
332 ALWAYS_ASSERT(FALSE);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
333
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
334 return 0;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
335 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
336
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
337 int C67_map_S12(char *s)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
338 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
339 if (strstr(s, ".S1") != NULL)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
340 return 0;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
341 else if (strcmp(s, ".S2"))
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
342 return 1;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
343 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
344 ALWAYS_ASSERT(FALSE);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
345
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
346 return 0;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
347 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
348
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
349 int C67_map_D12(char *s)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
350 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
351 if (strstr(s, ".D1") != NULL)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
352 return 0;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
353 else if (strcmp(s, ".D2"))
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
354 return 1;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
355 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
356 ALWAYS_ASSERT(FALSE);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
357
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
358 return 0;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
359 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
360
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
361
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
362
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
363 void C67_asm(char *s, int a, int b, int c)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
364 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
365 BOOL xpath;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
366
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
367 #ifdef ASSEMBLY_LISTING_C67
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
368 if (!f) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
369 f = fopen("TCC67_out.txt", "wt");
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
370 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
371 fprintf(f, "%04X ", ind);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
372 #endif
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
373
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
374 if (strstr(s, "MVKL") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
375 C67_g((C67_map_regn(b) << 23) |
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
376 ((a & 0xffff) << 7) | (0x0a << 2) | (C67_map_regs(b) << 1));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
377 } else if (strstr(s, "MVKH") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
378 C67_g((C67_map_regn(b) << 23) |
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
379 (((a >> 16) & 0xffff) << 7) |
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
380 (0x1a << 2) | (C67_map_regs(b) << 1));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
381 } else if (strstr(s, "STW.D SP POST DEC") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
382 C67_g((C67_map_regn(a) << 23) | //src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
383 (15 << 18) | //SP B15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
384 (2 << 13) | //ucst5 (must keep 8 byte boundary !!)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
385 (0xa << 9) | //mode a = post dec ucst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
386 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
387 (1 << 7) | //y D1/D2 use B side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
388 (7 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
389 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
390 (C67_map_regs(a) << 1) | //side of src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
391 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
392 } else if (strstr(s, "STB.D *+SP[A0]") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
393 C67_g((C67_map_regn(a) << 23) | //src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
394 (15 << 18) | //base reg A15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
395 (0 << 13) | //offset reg A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
396 (5 << 9) | //mode 5 = pos offset, base reg + off reg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
397 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
398 (0 << 7) | //y D1/D2 A side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
399 (3 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
400 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
401 (C67_map_regs(a) << 1) | //side of src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
402 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
403 } else if (strstr(s, "STH.D *+SP[A0]") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
404 C67_g((C67_map_regn(a) << 23) | //src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
405 (15 << 18) | //base reg A15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
406 (0 << 13) | //offset reg A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
407 (5 << 9) | //mode 5 = pos offset, base reg + off reg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
408 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
409 (0 << 7) | //y D1/D2 A side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
410 (5 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
411 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
412 (C67_map_regs(a) << 1) | //side of src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
413 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
414 } else if (strstr(s, "STB.D *+SP[A0]") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
415 C67_g((C67_map_regn(a) << 23) | //src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
416 (15 << 18) | //base reg A15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
417 (0 << 13) | //offset reg A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
418 (5 << 9) | //mode 5 = pos offset, base reg + off reg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
419 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
420 (0 << 7) | //y D1/D2 A side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
421 (3 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
422 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
423 (C67_map_regs(a) << 1) | //side of src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
424 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
425 } else if (strstr(s, "STH.D *+SP[A0]") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
426 C67_g((C67_map_regn(a) << 23) | //src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
427 (15 << 18) | //base reg A15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
428 (0 << 13) | //offset reg A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
429 (5 << 9) | //mode 5 = pos offset, base reg + off reg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
430 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
431 (0 << 7) | //y D1/D2 A side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
432 (5 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
433 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
434 (C67_map_regs(a) << 1) | //side of src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
435 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
436 } else if (strstr(s, "STW.D *+SP[A0]") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
437 C67_g((C67_map_regn(a) << 23) | //src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
438 (15 << 18) | //base reg A15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
439 (0 << 13) | //offset reg A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
440 (5 << 9) | //mode 5 = pos offset, base reg + off reg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
441 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
442 (0 << 7) | //y D1/D2 A side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
443 (7 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
444 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
445 (C67_map_regs(a) << 1) | //side of src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
446 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
447 } else if (strstr(s, "STW.D *") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
448 C67_g((C67_map_regn(a) << 23) | //src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
449 (C67_map_regn(b) << 18) | //base reg A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
450 (0 << 13) | //cst5
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
451 (1 << 9) | //mode 1 = pos cst offset
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
452 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
453 (C67_map_regs(b) << 7) | //y D1/D2 base reg side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
454 (7 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
455 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
456 (C67_map_regs(a) << 1) | //side of src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
457 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
458 } else if (strstr(s, "STH.D *") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
459 C67_g((C67_map_regn(a) << 23) | //src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
460 (C67_map_regn(b) << 18) | //base reg A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
461 (0 << 13) | //cst5
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
462 (1 << 9) | //mode 1 = pos cst offset
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
463 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
464 (C67_map_regs(b) << 7) | //y D1/D2 base reg side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
465 (5 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
466 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
467 (C67_map_regs(a) << 1) | //side of src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
468 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
469 } else if (strstr(s, "STB.D *") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
470 C67_g((C67_map_regn(a) << 23) | //src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
471 (C67_map_regn(b) << 18) | //base reg A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
472 (0 << 13) | //cst5
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
473 (1 << 9) | //mode 1 = pos cst offset
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
474 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
475 (C67_map_regs(b) << 7) | //y D1/D2 base reg side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
476 (3 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
477 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
478 (C67_map_regs(a) << 1) | //side of src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
479 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
480 } else if (strstr(s, "STW.D +*") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
481 ALWAYS_ASSERT(c < 32);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
482 C67_g((C67_map_regn(a) << 23) | //src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
483 (C67_map_regn(b) << 18) | //base reg A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
484 (c << 13) | //cst5
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
485 (1 << 9) | //mode 1 = pos cst offset
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
486 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
487 (C67_map_regs(b) << 7) | //y D1/D2 base reg side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
488 (7 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
489 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
490 (C67_map_regs(a) << 1) | //side of src
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
491 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
492 } else if (strstr(s, "LDW.D SP PRE INC") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
493 C67_g((C67_map_regn(a) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
494 (15 << 18) | //base reg B15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
495 (2 << 13) | //ucst5 (must keep 8 byte boundary)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
496 (9 << 9) | //mode 9 = pre inc ucst5
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
497 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
498 (1 << 7) | //y D1/D2 B side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
499 (6 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
500 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
501 (C67_map_regs(a) << 1) | //side of dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
502 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
503 } else if (strstr(s, "LDDW.D SP PRE INC") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
504 C67_g((C67_map_regn(a) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
505 (15 << 18) | //base reg B15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
506 (1 << 13) | //ucst5 (must keep 8 byte boundary)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
507 (9 << 9) | //mode 9 = pre inc ucst5
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
508 (1 << 8) | //r (LDDW bit 1)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
509 (1 << 7) | //y D1/D2 B side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
510 (6 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
511 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
512 (C67_map_regs(a) << 1) | //side of dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
513 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
514 } else if (strstr(s, "LDW.D *+SP[A0]") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
515 C67_g((C67_map_regn(a) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
516 (15 << 18) | //base reg A15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
517 (0 << 13) | //offset reg A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
518 (5 << 9) | //mode 5 = pos offset, base reg + off reg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
519 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
520 (0 << 7) | //y D1/D2 A side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
521 (6 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
522 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
523 (C67_map_regs(a) << 1) | //side of dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
524 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
525 } else if (strstr(s, "LDDW.D *+SP[A0]") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
526 C67_g((C67_map_regn(a) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
527 (15 << 18) | //base reg A15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
528 (0 << 13) | //offset reg A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
529 (5 << 9) | //mode 5 = pos offset, base reg + off reg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
530 (1 << 8) | //r (LDDW bit 1)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
531 (0 << 7) | //y D1/D2 A side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
532 (6 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
533 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
534 (C67_map_regs(a) << 1) | //side of dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
535 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
536 } else if (strstr(s, "LDH.D *+SP[A0]") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
537 C67_g((C67_map_regn(a) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
538 (15 << 18) | //base reg A15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
539 (0 << 13) | //offset reg A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
540 (5 << 9) | //mode 5 = pos offset, base reg + off reg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
541 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
542 (0 << 7) | //y D1/D2 A side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
543 (4 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
544 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
545 (C67_map_regs(a) << 1) | //side of dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
546 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
547 } else if (strstr(s, "LDB.D *+SP[A0]") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
548 C67_g((C67_map_regn(a) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
549 (15 << 18) | //base reg A15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
550 (0 << 13) | //offset reg A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
551 (5 << 9) | //mode 5 = pos offset, base reg + off reg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
552 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
553 (0 << 7) | //y D1/D2 A side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
554 (2 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
555 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
556 (C67_map_regs(a) << 1) | //side of dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
557 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
558 } else if (strstr(s, "LDHU.D *+SP[A0]") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
559 C67_g((C67_map_regn(a) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
560 (15 << 18) | //base reg A15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
561 (0 << 13) | //offset reg A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
562 (5 << 9) | //mode 5 = pos offset, base reg + off reg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
563 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
564 (0 << 7) | //y D1/D2 A side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
565 (0 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
566 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
567 (C67_map_regs(a) << 1) | //side of dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
568 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
569 } else if (strstr(s, "LDBU.D *+SP[A0]") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
570 C67_g((C67_map_regn(a) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
571 (15 << 18) | //base reg A15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
572 (0 << 13) | //offset reg A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
573 (5 << 9) | //mode 5 = pos offset, base reg + off reg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
574 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
575 (0 << 7) | //y D1/D2 A side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
576 (1 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
577 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
578 (C67_map_regs(a) << 1) | //side of dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
579 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
580 } else if (strstr(s, "LDW.D *") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
581 C67_g((C67_map_regn(b) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
582 (C67_map_regn(a) << 18) | //base reg A15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
583 (0 << 13) | //cst5
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
584 (1 << 9) | //mode 1 = pos cst offset
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
585 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
586 (C67_map_regs(a) << 7) | //y D1/D2 src side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
587 (6 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
588 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
589 (C67_map_regs(b) << 1) | //side of dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
590 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
591 } else if (strstr(s, "LDDW.D *") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
592 C67_g((C67_map_regn(b) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
593 (C67_map_regn(a) << 18) | //base reg A15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
594 (0 << 13) | //cst5
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
595 (1 << 9) | //mode 1 = pos cst offset
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
596 (1 << 8) | //r (LDDW bit 1)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
597 (C67_map_regs(a) << 7) | //y D1/D2 src side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
598 (6 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
599 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
600 (C67_map_regs(b) << 1) | //side of dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
601 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
602 } else if (strstr(s, "LDH.D *") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
603 C67_g((C67_map_regn(b) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
604 (C67_map_regn(a) << 18) | //base reg A15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
605 (0 << 13) | //cst5
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
606 (1 << 9) | //mode 1 = pos cst offset
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
607 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
608 (C67_map_regs(a) << 7) | //y D1/D2 src side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
609 (4 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
610 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
611 (C67_map_regs(b) << 1) | //side of dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
612 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
613 } else if (strstr(s, "LDB.D *") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
614 C67_g((C67_map_regn(b) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
615 (C67_map_regn(a) << 18) | //base reg A15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
616 (0 << 13) | //cst5
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
617 (1 << 9) | //mode 1 = pos cst offset
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
618 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
619 (C67_map_regs(a) << 7) | //y D1/D2 src side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
620 (2 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
621 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
622 (C67_map_regs(b) << 1) | //side of dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
623 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
624 } else if (strstr(s, "LDHU.D *") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
625 C67_g((C67_map_regn(b) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
626 (C67_map_regn(a) << 18) | //base reg A15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
627 (0 << 13) | //cst5
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
628 (1 << 9) | //mode 1 = pos cst offset
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
629 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
630 (C67_map_regs(a) << 7) | //y D1/D2 src side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
631 (0 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
632 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
633 (C67_map_regs(b) << 1) | //side of dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
634 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
635 } else if (strstr(s, "LDBU.D *") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
636 C67_g((C67_map_regn(b) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
637 (C67_map_regn(a) << 18) | //base reg A15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
638 (0 << 13) | //cst5
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
639 (1 << 9) | //mode 1 = pos cst offset
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
640 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
641 (C67_map_regs(a) << 7) | //y D1/D2 src side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
642 (1 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
643 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
644 (C67_map_regs(b) << 1) | //side of dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
645 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
646 } else if (strstr(s, "LDW.D +*") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
647 C67_g((C67_map_regn(b) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
648 (C67_map_regn(a) << 18) | //base reg A15
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
649 (1 << 13) | //cst5
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
650 (1 << 9) | //mode 1 = pos cst offset
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
651 (0 << 8) | //r (LDDW bit 0)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
652 (C67_map_regs(a) << 7) | //y D1/D2 src side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
653 (6 << 4) | //ldst 3=STB, 5=STH 5, 7=STW, 6=LDW 4=LDH 2=LDB 0=LDHU 1=LDBU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
654 (1 << 2) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
655 (C67_map_regs(b) << 1) | //side of dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
656 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
657 } else if (strstr(s, "CMPLTSP") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
658 xpath = C67_map_regs(a) ^ C67_map_regs(b);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
659 ALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
660
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
661 C67_g((C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
662 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
663 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
664 (xpath << 12) | //x use cross path for src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
665 (0x3a << 6) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
666 (0x8 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
667 (C67_map_regs(c) << 1) | //side for reg c
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
668 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
669 } else if (strstr(s, "CMPGTSP") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
670 xpath = C67_map_regs(a) ^ C67_map_regs(b);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
671 ALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
672
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
673 C67_g((C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
674 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
675 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
676 (xpath << 12) | //x use cross path for src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
677 (0x39 << 6) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
678 (0x8 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
679 (C67_map_regs(c) << 1) | //side for reg c
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
680 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
681 } else if (strstr(s, "CMPEQSP") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
682 xpath = C67_map_regs(a) ^ C67_map_regs(b);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
683 ALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
684
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
685 C67_g((C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
686 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
687 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
688 (xpath << 12) | //x use cross path for src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
689 (0x38 << 6) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
690 (0x8 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
691 (C67_map_regs(c) << 1) | //side for reg c
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
692 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
693 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
694
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
695 else if (strstr(s, "CMPLTDP") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
696 xpath = C67_map_regs(a) ^ C67_map_regs(b);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
697 ALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
698
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
699 C67_g((C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
700 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
701 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
702 (xpath << 12) | //x use cross path for src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
703 (0x2a << 6) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
704 (0x8 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
705 (C67_map_regs(c) << 1) | //side for reg c
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
706 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
707 } else if (strstr(s, "CMPGTDP") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
708 xpath = C67_map_regs(a) ^ C67_map_regs(b);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
709 ALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
710
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
711 C67_g((C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
712 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
713 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
714 (xpath << 12) | //x use cross path for src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
715 (0x29 << 6) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
716 (0x8 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
717 (C67_map_regs(c) << 1) | //side for reg c
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
718 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
719 } else if (strstr(s, "CMPEQDP") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
720 xpath = C67_map_regs(a) ^ C67_map_regs(b);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
721 ALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
722
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
723 C67_g((C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
724 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
725 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
726 (xpath << 12) | //x use cross path for src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
727 (0x28 << 6) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
728 (0x8 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
729 (C67_map_regs(c) << 1) | //side for reg c
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
730 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
731 } else if (strstr(s, "CMPLT") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
732 xpath = C67_map_regs(a) ^ C67_map_regs(b);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
733 ALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
734
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
735 C67_g((C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
736 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
737 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
738 (xpath << 12) | //x use cross path for src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
739 (0x57 << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
740 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
741 (C67_map_regs(c) << 1) | //side for reg c
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
742 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
743 } else if (strstr(s, "CMPGT") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
744 xpath = C67_map_regs(a) ^ C67_map_regs(b);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
745 ALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
746
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
747 C67_g((C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
748 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
749 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
750 (xpath << 12) | //x use cross path for src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
751 (0x47 << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
752 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
753 (C67_map_regs(c) << 1) | //side for reg c
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
754 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
755 } else if (strstr(s, "CMPEQ") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
756 xpath = C67_map_regs(a) ^ C67_map_regs(b);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
757 ALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
758
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
759 C67_g((C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
760 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
761 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
762 (xpath << 12) | //x use cross path for src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
763 (0x53 << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
764 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
765 (C67_map_regs(c) << 1) | //side for reg c
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
766 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
767 } else if (strstr(s, "CMPLTU") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
768 xpath = C67_map_regs(a) ^ C67_map_regs(b);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
769 ALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
770
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
771 C67_g((C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
772 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
773 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
774 (xpath << 12) | //x use cross path for src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
775 (0x5f << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
776 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
777 (C67_map_regs(c) << 1) | //side for reg c
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
778 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
779 } else if (strstr(s, "CMPGTU") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
780 xpath = C67_map_regs(a) ^ C67_map_regs(b);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
781 ALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
782
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
783 C67_g((C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
784 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
785 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
786 (xpath << 12) | //x use cross path for src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
787 (0x4f << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
788 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
789 (C67_map_regs(c) << 1) | //side for reg c
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
790 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
791 } else if (strstr(s, "B DISP") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
792 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
793 (0 << 28) | //z
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
794 (a << 7) | //cnst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
795 (0x4 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
796 (0 << 1) | //S0/S1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
797 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
798 } else if (strstr(s, "B.") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
799 xpath = C67_map_regs(c) ^ 1;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
800
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
801 C67_g((C67_map_regc(b) << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
802 (a << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
803 (0 << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
804 (C67_map_regn(c) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
805 (0 << 13) | //
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
806 (xpath << 12) | //x cross path if !B side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
807 (0xd << 6) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
808 (0x8 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
809 (1 << 1) | //must be S2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
810 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
811 } else if (strstr(s, "MV.L") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
812 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
813
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
814 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
815 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
816 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
817 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
818 (0 << 13) | //src1 (cst5)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
819 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
820 (0x2 << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
821 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
822 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
823 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
824 } else if (strstr(s, "SPTRUNC.L") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
825 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
826
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
827 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
828 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
829 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
830 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
831 (0 << 13) | //src1 NA
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
832 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
833 (0xb << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
834 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
835 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
836 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
837 } else if (strstr(s, "DPTRUNC.L") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
838 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
839
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
840 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
841 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
842 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
843 ((C67_map_regn(b) + 1) << 18) | //src2 WEIRD CPU must specify odd reg for some reason
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
844 (0 << 13) | //src1 NA
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
845 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
846 (0x1 << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
847 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
848 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
849 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
850 } else if (strstr(s, "INTSP.L") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
851 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
852
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
853 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
854 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
855 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
856 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
857 (0 << 13) | //src1 NA
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
858 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
859 (0x4a << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
860 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
861 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
862 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
863 } else if (strstr(s, "INTSPU.L") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
864 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
865
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
866 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
867 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
868 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
869 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
870 (0 << 13) | //src1 NA
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
871 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
872 (0x49 << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
873 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
874 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
875 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
876 } else if (strstr(s, "INTDP.L") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
877 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
878
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
879 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
880 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
881 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
882 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
883 (0 << 13) | //src1 NA
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
884 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
885 (0x39 << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
886 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
887 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
888 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
889 } else if (strstr(s, "INTDPU.L") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
890 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
891
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
892 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
893 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
894 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
895 ((C67_map_regn(b) + 1) << 18) | //src2 WEIRD CPU must specify odd reg for some reason
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
896 (0 << 13) | //src1 NA
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
897 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
898 (0x3b << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
899 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
900 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
901 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
902 } else if (strstr(s, "SPDP.L") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
903 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
904
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
905 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
906 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
907 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
908 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
909 (0 << 13) | //src1 NA
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
910 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
911 (0x2 << 6) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
912 (0x8 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
913 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
914 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
915 } else if (strstr(s, "DPSP.L") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
916 ALWAYS_ASSERT(C67_map_regs(b) == C67_map_regs(c));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
917
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
918 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
919 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
920 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
921 ((C67_map_regn(b) + 1) << 18) | //src2 WEIRD CPU must specify odd reg for some reason
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
922 (0 << 13) | //src1 NA
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
923 (0 << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
924 (0x9 << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
925 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
926 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
927 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
928 } else if (strstr(s, "ADD.L") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
929 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
930
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
931 ALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
932
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
933 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
934 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
935 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
936 (C67_map_regn(b) << 18) | //src2 (possible x path)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
937 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
938 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
939 (0x3 << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
940 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
941 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
942 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
943 } else if (strstr(s, "SUB.L") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
944 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
945
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
946 ALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
947
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
948 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
949 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
950 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
951 (C67_map_regn(b) << 18) | //src2 (possible x path)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
952 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
953 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
954 (0x7 << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
955 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
956 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
957 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
958 } else if (strstr(s, "OR.L") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
959 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
960
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
961 ALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
962
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
963 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
964 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
965 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
966 (C67_map_regn(b) << 18) | //src2 (possible x path)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
967 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
968 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
969 (0x7f << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
970 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
971 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
972 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
973 } else if (strstr(s, "AND.L") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
974 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
975
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
976 ALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
977
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
978 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
979 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
980 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
981 (C67_map_regn(b) << 18) | //src2 (possible x path)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
982 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
983 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
984 (0x7b << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
985 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
986 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
987 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
988 } else if (strstr(s, "XOR.L") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
989 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
990
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
991 ALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
992
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
993 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
994 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
995 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
996 (C67_map_regn(b) << 18) | //src2 (possible x path)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
997 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
998 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
999 (0x6f << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1000 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1001 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1002 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1003 } else if (strstr(s, "ADDSP.L") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1004 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1005
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1006 ALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1007
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1008 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1009 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1010 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1011 (C67_map_regn(b) << 18) | //src2 (possible x path)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1012 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1013 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1014 (0x10 << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1015 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1016 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1017 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1018 } else if (strstr(s, "ADDDP.L") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1019 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1020
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1021 ALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1022
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1023 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1024 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1025 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1026 (C67_map_regn(b) << 18) | //src2 (possible x path)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1027 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1028 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1029 (0x18 << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1030 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1031 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1032 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1033 } else if (strstr(s, "SUBSP.L") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1034 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1035
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1036 ALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1037
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1038 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1039 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1040 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1041 (C67_map_regn(b) << 18) | //src2 (possible x path)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1042 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1043 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1044 (0x11 << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1045 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1046 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1047 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1048 } else if (strstr(s, "SUBDP.L") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1049 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1050
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1051 ALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1052
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1053 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1054 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1055 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1056 (C67_map_regn(b) << 18) | //src2 (possible x path)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1057 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1058 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1059 (0x19 << 5) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1060 (0x6 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1061 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1062 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1063 } else if (strstr(s, "MPYSP.M") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1064 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1065
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1066 ALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1067
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1068 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1069 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1070 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1071 (C67_map_regn(b) << 18) | //src2 (possible x path)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1072 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1073 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1074 (0x1c << 7) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1075 (0x0 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1076 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1077 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1078 } else if (strstr(s, "MPYDP.M") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1079 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1080
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1081 ALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1082
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1083 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1084 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1085 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1086 (C67_map_regn(b) << 18) | //src2 (possible x path)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1087 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1088 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1089 (0x0e << 7) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1090 (0x0 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1091 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1092 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1093 } else if (strstr(s, "MPYI.M") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1094 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1095
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1096 ALWAYS_ASSERT(C67_map_regs(a) == C67_map_regs(c));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1097
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1098 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1099 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1100 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1101 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1102 (C67_map_regn(a) << 13) | //src1 (cst5)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1103 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1104 (0x4 << 7) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1105 (0x0 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1106 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1107 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1108 } else if (strstr(s, "SHR.S") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1109 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1110
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1111 ALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1112
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1113 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1114 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1115 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1116 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1117 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1118 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1119 (0x37 << 6) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1120 (0x8 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1121 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1122 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1123 } else if (strstr(s, "SHRU.S") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1124 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1125
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1126 ALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1127
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1128 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1129 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1130 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1131 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1132 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1133 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1134 (0x27 << 6) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1135 (0x8 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1136 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1137 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1138 } else if (strstr(s, "SHL.S") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1139 xpath = C67_map_regs(b) ^ C67_map_regs(c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1140
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1141 ALWAYS_ASSERT(C67_map_regs(c) == C67_map_regs(a));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1142
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1143 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1144 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1145 (C67_map_regn(c) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1146 (C67_map_regn(b) << 18) | //src2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1147 (C67_map_regn(a) << 13) | //src1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1148 (xpath << 12) | //x cross path if opposite sides
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1149 (0x33 << 6) | //opcode
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1150 (0x8 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1151 (C67_map_regs(c) << 1) | //side of dest
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1152 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1153 } else if (strstr(s, "||ADDK") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1154 xpath = 0; // no xpath required just use the side of the src/dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1155
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1156 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1157 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1158 (C67_map_regn(b) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1159 (a << 07) | //scst16
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1160 (0x14 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1161 (C67_map_regs(b) << 1) | //side of dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1162 (1 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1163 } else if (strstr(s, "ADDK") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1164 xpath = 0; // no xpath required just use the side of the src/dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1165
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1166 C67_g((0 << 29) | //creg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1167 (0 << 28) | //inv
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1168 (C67_map_regn(b) << 23) | //dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1169 (a << 07) | //scst16
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1170 (0x14 << 2) | //opcode fixed
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1171 (C67_map_regs(b) << 1) | //side of dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1172 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1173 } else if (strstr(s, "NOP") == s) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1174 C67_g(((a - 1) << 13) | //no of cycles
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1175 (0 << 0)); //parallel
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1176 } else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1177 ALWAYS_ASSERT(FALSE);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1178
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1179 #ifdef ASSEMBLY_LISTING_C67
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1180 fprintf(f, " %s %d %d %d\n", s, a, b, c);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1181 #endif
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1182
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1183 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1184
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1185 //r=reg to load, fr=from reg, symbol for relocation, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1186
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1187 void C67_MVKL(int r, int fc)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1188 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1189 C67_asm("MVKL.", fc, r, 0);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1190 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1191
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1192 void C67_MVKH(int r, int fc)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1193 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1194 C67_asm("MVKH.", fc, r, 0);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1195 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1196
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1197 void C67_STB_SP_A0(int r)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1198 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1199 C67_asm("STB.D *+SP[A0]", r, 0, 0); // STB r,*+SP[A0]
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1200 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1201
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1202 void C67_STH_SP_A0(int r)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1203 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1204 C67_asm("STH.D *+SP[A0]", r, 0, 0); // STH r,*+SP[A0]
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1205 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1206
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1207 void C67_STW_SP_A0(int r)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1208 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1209 C67_asm("STW.D *+SP[A0]", r, 0, 0); // STW r,*+SP[A0]
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1210 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1211
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1212 void C67_STB_PTR(int r, int r2)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1213 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1214 C67_asm("STB.D *", r, r2, 0); // STB r, *r2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1215 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1216
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1217 void C67_STH_PTR(int r, int r2)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1218 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1219 C67_asm("STH.D *", r, r2, 0); // STH r, *r2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1220 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1221
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1222 void C67_STW_PTR(int r, int r2)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1223 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1224 C67_asm("STW.D *", r, r2, 0); // STW r, *r2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1225 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1226
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1227 void C67_STW_PTR_PRE_INC(int r, int r2, int n)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1228 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1229 C67_asm("STW.D +*", r, r2, n); // STW r, *+r2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1230 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1231
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1232 void C67_PUSH(int r)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1233 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1234 C67_asm("STW.D SP POST DEC", r, 0, 0); // STW r,*SP--
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1235 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1236
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1237 void C67_LDW_SP_A0(int r)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1238 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1239 C67_asm("LDW.D *+SP[A0]", r, 0, 0); // LDW *+SP[A0],r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1240 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1241
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1242 void C67_LDDW_SP_A0(int r)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1243 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1244 C67_asm("LDDW.D *+SP[A0]", r, 0, 0); // LDDW *+SP[A0],r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1245 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1246
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1247 void C67_LDH_SP_A0(int r)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1248 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1249 C67_asm("LDH.D *+SP[A0]", r, 0, 0); // LDH *+SP[A0],r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1250 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1251
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1252 void C67_LDB_SP_A0(int r)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1253 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1254 C67_asm("LDB.D *+SP[A0]", r, 0, 0); // LDB *+SP[A0],r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1255 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1256
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1257 void C67_LDHU_SP_A0(int r)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1258 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1259 C67_asm("LDHU.D *+SP[A0]", r, 0, 0); // LDHU *+SP[A0],r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1260 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1261
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1262 void C67_LDBU_SP_A0(int r)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1263 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1264 C67_asm("LDBU.D *+SP[A0]", r, 0, 0); // LDBU *+SP[A0],r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1265 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1266
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1267 void C67_LDW_PTR(int r, int r2)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1268 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1269 C67_asm("LDW.D *", r, r2, 0); // LDW *r,r2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1270 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1271
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1272 void C67_LDDW_PTR(int r, int r2)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1273 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1274 C67_asm("LDDW.D *", r, r2, 0); // LDDW *r,r2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1275 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1276
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1277 void C67_LDH_PTR(int r, int r2)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1278 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1279 C67_asm("LDH.D *", r, r2, 0); // LDH *r,r2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1280 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1281
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1282 void C67_LDB_PTR(int r, int r2)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1283 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1284 C67_asm("LDB.D *", r, r2, 0); // LDB *r,r2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1285 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1286
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1287 void C67_LDHU_PTR(int r, int r2)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1288 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1289 C67_asm("LDHU.D *", r, r2, 0); // LDHU *r,r2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1290 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1291
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1292 void C67_LDBU_PTR(int r, int r2)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1293 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1294 C67_asm("LDBU.D *", r, r2, 0); // LDBU *r,r2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1295 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1296
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1297 void C67_LDW_PTR_PRE_INC(int r, int r2)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1298 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1299 C67_asm("LDW.D +*", r, r2, 0); // LDW *+r,r2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1300 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1301
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1302 void C67_POP(int r)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1303 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1304 C67_asm("LDW.D SP PRE INC", r, 0, 0); // LDW *++SP,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1305 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1306
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1307 void C67_POP_DW(int r)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1308 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1309 C67_asm("LDDW.D SP PRE INC", r, 0, 0); // LDDW *++SP,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1310 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1311
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1312 void C67_CMPLT(int s1, int s2, int dst)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1313 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1314 C67_asm("CMPLT.L1", s1, s2, dst);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1315 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1316
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1317 void C67_CMPGT(int s1, int s2, int dst)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1318 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1319 C67_asm("CMPGT.L1", s1, s2, dst);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1320 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1321
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1322 void C67_CMPEQ(int s1, int s2, int dst)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1323 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1324 C67_asm("CMPEQ.L1", s1, s2, dst);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1325 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1326
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1327 void C67_CMPLTU(int s1, int s2, int dst)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1328 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1329 C67_asm("CMPLTU.L1", s1, s2, dst);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1330 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1331
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1332 void C67_CMPGTU(int s1, int s2, int dst)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1333 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1334 C67_asm("CMPGTU.L1", s1, s2, dst);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1335 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1336
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1337
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1338 void C67_CMPLTSP(int s1, int s2, int dst)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1339 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1340 C67_asm("CMPLTSP.S1", s1, s2, dst);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1341 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1342
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1343 void C67_CMPGTSP(int s1, int s2, int dst)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1344 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1345 C67_asm("CMPGTSP.S1", s1, s2, dst);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1346 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1347
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1348 void C67_CMPEQSP(int s1, int s2, int dst)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1349 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1350 C67_asm("CMPEQSP.S1", s1, s2, dst);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1351 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1352
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1353 void C67_CMPLTDP(int s1, int s2, int dst)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1354 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1355 C67_asm("CMPLTDP.S1", s1, s2, dst);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1356 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1357
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1358 void C67_CMPGTDP(int s1, int s2, int dst)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1359 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1360 C67_asm("CMPGTDP.S1", s1, s2, dst);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1361 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1362
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1363 void C67_CMPEQDP(int s1, int s2, int dst)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1364 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1365 C67_asm("CMPEQDP.S1", s1, s2, dst);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1366 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1367
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1368
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1369 void C67_IREG_B_REG(int inv, int r1, int r2) // [!R] B r2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1370 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1371 C67_asm("B.S2", inv, r1, r2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1372 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1373
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1374
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1375 // call with how many 32 bit words to skip
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1376 // (0 would branch to the branch instruction)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1377
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1378 void C67_B_DISP(int disp) // B +2 Branch with constant displacement
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1379 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1380 // Branch point is relative to the 8 word fetch packet
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1381 //
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1382 // we will assume the text section always starts on an 8 word (32 byte boundary)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1383 //
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1384 // so add in how many words into the fetch packet the branch is
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1385
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1386
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1387 C67_asm("B DISP", disp + ((ind & 31) >> 2), 0, 0);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1388 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1389
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1390 void C67_NOP(int n)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1391 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1392 C67_asm("NOP", n, 0, 0);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1393 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1394
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1395 void C67_ADDK(int n, int r)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1396 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1397 ALWAYS_ASSERT(abs(n) < 32767);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1398
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1399 C67_asm("ADDK", n, r, 0);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1400 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1401
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1402 void C67_ADDK_PARALLEL(int n, int r)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1403 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1404 ALWAYS_ASSERT(abs(n) < 32767);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1405
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1406 C67_asm("||ADDK", n, r, 0);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1407 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1408
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1409 void C67_Adjust_ADDK(int *inst, int n)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1410 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1411 ALWAYS_ASSERT(abs(n) < 32767);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1412
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1413 *inst = (*inst & (~(0xffff << 7))) | ((n & 0xffff) << 7);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1414 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1415
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1416 void C67_MV(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1417 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1418 C67_asm("MV.L", 0, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1419 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1420
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1421
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1422 void C67_DPTRUNC(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1423 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1424 C67_asm("DPTRUNC.L", 0, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1425 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1426
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1427 void C67_SPTRUNC(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1428 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1429 C67_asm("SPTRUNC.L", 0, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1430 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1431
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1432 void C67_INTSP(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1433 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1434 C67_asm("INTSP.L", 0, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1435 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1436
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1437 void C67_INTDP(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1438 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1439 C67_asm("INTDP.L", 0, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1440 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1441
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1442 void C67_INTSPU(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1443 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1444 C67_asm("INTSPU.L", 0, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1445 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1446
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1447 void C67_INTDPU(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1448 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1449 C67_asm("INTDPU.L", 0, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1450 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1451
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1452 void C67_SPDP(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1453 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1454 C67_asm("SPDP.L", 0, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1455 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1456
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1457 void C67_DPSP(int r, int v) // note regs must be on the same side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1458 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1459 C67_asm("DPSP.L", 0, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1460 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1461
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1462 void C67_ADD(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1463 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1464 C67_asm("ADD.L", v, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1465 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1466
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1467 void C67_SUB(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1468 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1469 C67_asm("SUB.L", v, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1470 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1471
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1472 void C67_AND(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1473 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1474 C67_asm("AND.L", v, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1475 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1476
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1477 void C67_OR(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1478 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1479 C67_asm("OR.L", v, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1480 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1481
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1482 void C67_XOR(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1483 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1484 C67_asm("XOR.L", v, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1485 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1486
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1487 void C67_ADDSP(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1488 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1489 C67_asm("ADDSP.L", v, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1490 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1491
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1492 void C67_SUBSP(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1493 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1494 C67_asm("SUBSP.L", v, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1495 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1496
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1497 void C67_MPYSP(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1498 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1499 C67_asm("MPYSP.M", v, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1500 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1501
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1502 void C67_ADDDP(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1503 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1504 C67_asm("ADDDP.L", v, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1505 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1506
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1507 void C67_SUBDP(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1508 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1509 C67_asm("SUBDP.L", v, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1510 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1511
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1512 void C67_MPYDP(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1513 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1514 C67_asm("MPYDP.M", v, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1515 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1516
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1517 void C67_MPYI(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1518 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1519 C67_asm("MPYI.M", v, r, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1520 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1521
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1522 void C67_SHL(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1523 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1524 C67_asm("SHL.S", r, v, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1525 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1526
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1527 void C67_SHRU(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1528 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1529 C67_asm("SHRU.S", r, v, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1530 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1531
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1532 void C67_SHR(int r, int v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1533 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1534 C67_asm("SHR.S", r, v, v);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1535 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1536
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1537
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1538
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1539 /* load 'r' from value 'sv' */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1540 void load(int r, SValue * sv)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1541 {
339
04d8a922bf07 [project @ 2004-11-07 15:43:48 by bellard]
bellard
parents: 309
diff changeset
1542 int v, t, ft, fc, fr, size = 0, element;
308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1543 BOOL Unsigned = false;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1544 SValue v1;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1545
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1546 fr = sv->r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1547 ft = sv->type.t;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1548 fc = sv->c.ul;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1549
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1550 v = fr & VT_VALMASK;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1551 if (fr & VT_LVAL) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1552 if (v == VT_LLOCAL) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1553 v1.type.t = VT_INT;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1554 v1.r = VT_LOCAL | VT_LVAL;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1555 v1.c.ul = fc;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1556 load(r, &v1);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1557 fr = r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1558 } else if ((ft & VT_BTYPE) == VT_LDOUBLE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1559 error("long double not supported");
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1560 } else if ((ft & VT_TYPE) == VT_BYTE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1561 size = 1;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1562 } else if ((ft & VT_TYPE) == (VT_BYTE | VT_UNSIGNED)) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1563 size = 1;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1564 Unsigned = TRUE;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1565 } else if ((ft & VT_TYPE) == VT_SHORT) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1566 size = 2;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1567 } else if ((ft & VT_TYPE) == (VT_SHORT | VT_UNSIGNED)) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1568 size = 2;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1569 Unsigned = TRUE;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1570 } else if ((ft & VT_BTYPE) == VT_DOUBLE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1571 size = 8;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1572 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1573 size = 4;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1574 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1575
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1576 // check if fc is a positive reference on the stack,
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1577 // if it is tcc is referencing what it thinks is a parameter
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1578 // on the stack, so check if it is really in a register.
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1579
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1580
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1581 if (v == VT_LOCAL && fc > 0) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1582 int stack_pos = 8;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1583
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1584 for (t = 0; t < NoCallArgsPassedOnStack; t++) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1585 if (fc == stack_pos)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1586 break;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1587
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1588 stack_pos += TranslateStackToReg[t];
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1589 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1590
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1591 // param has been pushed on stack, get it like a local var
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1592
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1593 fc = ParamLocOnStack[t] - 8;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1594 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1595
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1596 if ((fr & VT_VALMASK) < VT_CONST) // check for pure indirect
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1597 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1598 if (size == 1) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1599 if (Unsigned)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1600 C67_LDBU_PTR(v, r); // LDBU *v,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1601 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1602 C67_LDB_PTR(v, r); // LDB *v,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1603 } else if (size == 2) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1604 if (Unsigned)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1605 C67_LDHU_PTR(v, r); // LDHU *v,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1606 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1607 C67_LDH_PTR(v, r); // LDH *v,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1608 } else if (size == 4) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1609 C67_LDW_PTR(v, r); // LDW *v,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1610 } else if (size == 8) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1611 C67_LDDW_PTR(v, r); // LDDW *v,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1612 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1613
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1614 C67_NOP(4); // NOP 4
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1615 return;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1616 } else if (fr & VT_SYM) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1617 greloc(cur_text_section, sv->sym, ind, R_C60LO16); // rem the inst need to be patched
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1618 greloc(cur_text_section, sv->sym, ind + 4, R_C60HI16);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1619
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1620
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1621 C67_MVKL(C67_A0, fc); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1622 C67_MVKH(C67_A0, fc); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1623
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1624
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1625 if (size == 1) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1626 if (Unsigned)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1627 C67_LDBU_PTR(C67_A0, r); // LDBU *A0,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1628 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1629 C67_LDB_PTR(C67_A0, r); // LDB *A0,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1630 } else if (size == 2) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1631 if (Unsigned)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1632 C67_LDHU_PTR(C67_A0, r); // LDHU *A0,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1633 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1634 C67_LDH_PTR(C67_A0, r); // LDH *A0,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1635 } else if (size == 4) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1636 C67_LDW_PTR(C67_A0, r); // LDW *A0,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1637 } else if (size == 8) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1638 C67_LDDW_PTR(C67_A0, r); // LDDW *A0,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1639 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1640
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1641 C67_NOP(4); // NOP 4
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1642 return;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1643 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1644 element = size;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1645
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1646 // divide offset in bytes to create element index
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1647 C67_MVKL(C67_A0, (fc / element) + 8 / element); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1648 C67_MVKH(C67_A0, (fc / element) + 8 / element); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1649
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1650 if (size == 1) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1651 if (Unsigned)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1652 C67_LDBU_SP_A0(r); // LDBU r, SP[A0]
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1653 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1654 C67_LDB_SP_A0(r); // LDB r, SP[A0]
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1655 } else if (size == 2) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1656 if (Unsigned)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1657 C67_LDHU_SP_A0(r); // LDHU r, SP[A0]
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1658 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1659 C67_LDH_SP_A0(r); // LDH r, SP[A0]
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1660 } else if (size == 4) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1661 C67_LDW_SP_A0(r); // LDW r, SP[A0]
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1662 } else if (size == 8) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1663 C67_LDDW_SP_A0(r); // LDDW r, SP[A0]
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1664 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1665
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1666
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1667 C67_NOP(4); // NOP 4
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1668 return;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1669 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1670 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1671 if (v == VT_CONST) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1672 if (fr & VT_SYM) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1673 greloc(cur_text_section, sv->sym, ind, R_C60LO16); // rem the inst need to be patched
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1674 greloc(cur_text_section, sv->sym, ind + 4, R_C60HI16);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1675 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1676 C67_MVKL(r, fc); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1677 C67_MVKH(r, fc); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1678 } else if (v == VT_LOCAL) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1679 C67_MVKL(r, fc + 8); //r=reg to load, constant C67 stack points to next free
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1680 C67_MVKH(r, fc + 8); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1681 C67_ADD(C67_FP, r); // MV v,r v -> r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1682 } else if (v == VT_CMP) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1683 C67_MV(C67_compare_reg, r); // MV v,r v -> r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1684 } else if (v == VT_JMP || v == VT_JMPI) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1685 t = v & 1;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1686 C67_B_DISP(4); // Branch with constant displacement, skip over this branch, load, nop, load
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1687 C67_MVKL(r, t); // r=reg to load, 0 or 1 (do this while branching)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1688 C67_NOP(4); // NOP 4
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1689 gsym(fc); // modifies other branches to branch here
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1690 C67_MVKL(r, t ^ 1); // r=reg to load, 0 or 1
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1691 } else if (v != r) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1692 C67_MV(v, r); // MV v,r v -> r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1693
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1694 if ((ft & VT_BTYPE) == VT_DOUBLE)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1695 C67_MV(v + 1, r + 1); // MV v,r v -> r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1696 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1697 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1698 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1699
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1700
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1701 /* store register 'r' in lvalue 'v' */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1702 void store(int r, SValue * v)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1703 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1704 int fr, bt, ft, fc, size, t, element;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1705
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1706 ft = v->type.t;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1707 fc = v->c.ul;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1708 fr = v->r & VT_VALMASK;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1709 bt = ft & VT_BTYPE;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1710 /* XXX: incorrect if float reg to reg */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1711
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1712 if (bt == VT_LDOUBLE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1713 error("long double not supported");
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1714 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1715 if (bt == VT_SHORT)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1716 size = 2;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1717 else if (bt == VT_BYTE)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1718 size = 1;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1719 else if (bt == VT_DOUBLE)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1720 size = 8;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1721 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1722 size = 4;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1723
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1724 if ((v->r & VT_VALMASK) == VT_CONST) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1725 /* constant memory reference */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1726
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1727 if (v->r & VT_SYM) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1728 greloc(cur_text_section, v->sym, ind, R_C60LO16); // rem the inst need to be patched
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1729 greloc(cur_text_section, v->sym, ind + 4, R_C60HI16);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1730 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1731 C67_MVKL(C67_A0, fc); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1732 C67_MVKH(C67_A0, fc); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1733
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1734 if (size == 1)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1735 C67_STB_PTR(r, C67_A0); // STB r, *A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1736 else if (size == 2)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1737 C67_STH_PTR(r, C67_A0); // STH r, *A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1738 else if (size == 4 || size == 8)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1739 C67_STW_PTR(r, C67_A0); // STW r, *A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1740
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1741 if (size == 8)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1742 C67_STW_PTR_PRE_INC(r + 1, C67_A0, 1); // STW r, *+A0[1]
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1743 } else if ((v->r & VT_VALMASK) == VT_LOCAL) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1744 // check case of storing to passed argument that
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1745 // tcc thinks is on the stack but for C67 is
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1746 // passed as a reg. However it may have been
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1747 // saved to the stack, if that reg was required
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1748 // for a call to a child function
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1749
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1750 if (fc > 0) // argument ??
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1751 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1752 // walk through sizes and figure which param
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1753
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1754 int stack_pos = 8;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1755
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1756 for (t = 0; t < NoCallArgsPassedOnStack; t++) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1757 if (fc == stack_pos)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1758 break;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1759
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1760 stack_pos += TranslateStackToReg[t];
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1761 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1762
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1763 // param has been pushed on stack, get it like a local var
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1764 fc = ParamLocOnStack[t] - 8;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1765 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1766
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1767 if (size == 8)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1768 element = 4;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1769 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1770 element = size;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1771
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1772 // divide offset in bytes to create word index
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1773 C67_MVKL(C67_A0, (fc / element) + 8 / element); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1774 C67_MVKH(C67_A0, (fc / element) + 8 / element); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1775
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1776
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1777
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1778 if (size == 1)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1779 C67_STB_SP_A0(r); // STB r, SP[A0]
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1780 else if (size == 2)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1781 C67_STH_SP_A0(r); // STH r, SP[A0]
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1782 else if (size == 4 || size == 8)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1783 C67_STW_SP_A0(r); // STW r, SP[A0]
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1784
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1785 if (size == 8) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1786 C67_ADDK(1, C67_A0); // ADDK 1,A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1787 C67_STW_SP_A0(r + 1); // STW r, SP[A0]
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1788 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1789 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1790 if (size == 1)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1791 C67_STB_PTR(r, fr); // STB r, *fr
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1792 else if (size == 2)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1793 C67_STH_PTR(r, fr); // STH r, *fr
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1794 else if (size == 4 || size == 8)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1795 C67_STW_PTR(r, fr); // STW r, *fr
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1796
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1797 if (size == 8) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1798 C67_STW_PTR_PRE_INC(r + 1, fr, 1); // STW r, *+fr[1]
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1799 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1800 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1801 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1802 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1803
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1804 /* 'is_jmp' is '1' if it is a jump */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1805 static void gcall_or_jmp(int is_jmp)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1806 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1807 int r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1808 Sym *sym;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1809
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1810 if ((vtop->r & (VT_VALMASK | VT_LVAL)) == VT_CONST) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1811 /* constant case */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1812 if (vtop->r & VT_SYM) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1813 /* relocation case */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1814
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1815 // get add into A0, then start the jump B3
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1816
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1817 greloc(cur_text_section, vtop->sym, ind, R_C60LO16); // rem the inst need to be patched
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1818 greloc(cur_text_section, vtop->sym, ind + 4, R_C60HI16);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1819
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1820 C67_MVKL(C67_A0, 0); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1821 C67_MVKH(C67_A0, 0); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1822 C67_IREG_B_REG(0, C67_CREG_ZERO, C67_A0); // B.S2x A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1823
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1824 if (is_jmp) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1825 C67_NOP(5); // simple jump, just put NOP
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1826 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1827 // Call, must load return address into B3 during delay slots
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1828
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1829 sym = get_sym_ref(&char_pointer_type, cur_text_section, ind + 12, 0); // symbol for return address
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1830 greloc(cur_text_section, sym, ind, R_C60LO16); // rem the inst need to be patched
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1831 greloc(cur_text_section, sym, ind + 4, R_C60HI16);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1832 C67_MVKL(C67_B3, 0); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1833 C67_MVKH(C67_B3, 0); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1834 C67_NOP(3); // put remaining NOPs
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1835 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1836 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1837 /* put an empty PC32 relocation */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1838 ALWAYS_ASSERT(FALSE);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1839 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1840 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1841 /* otherwise, indirect call */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1842 r = gv(RC_INT);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1843 C67_IREG_B_REG(0, C67_CREG_ZERO, r); // B.S2x r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1844
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1845 if (is_jmp) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1846 C67_NOP(5); // simple jump, just put NOP
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1847 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1848 // Call, must load return address into B3 during delay slots
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1849
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1850 sym = get_sym_ref(&char_pointer_type, cur_text_section, ind + 12, 0); // symbol for return address
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1851 greloc(cur_text_section, sym, ind, R_C60LO16); // rem the inst need to be patched
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1852 greloc(cur_text_section, sym, ind + 4, R_C60HI16);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1853 C67_MVKL(C67_B3, 0); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1854 C67_MVKH(C67_B3, 0); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1855 C67_NOP(3); // put remaining NOPs
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1856 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1857 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1858 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1859
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1860 /* generate function call with address in (vtop->t, vtop->c) and free function
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1861 context. Stack entry is popped */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1862 void gfunc_call(int nb_args)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1863 {
339
04d8a922bf07 [project @ 2004-11-07 15:43:48 by bellard]
bellard
parents: 309
diff changeset
1864 int i, r, size = 0;
308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1865 int args_sizes[NoCallArgsPassedOnStack];
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1866
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1867 if (nb_args > NoCallArgsPassedOnStack) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1868 error("more than 10 function params not currently supported");
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1869 // handle more than 10, put some on the stack
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1870 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1871
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1872 for (i = 0; i < nb_args; i++) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1873 if ((vtop->type.t & VT_BTYPE) == VT_STRUCT) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1874 ALWAYS_ASSERT(FALSE);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1875 } else if ((vtop->type.t & VT_BTYPE) == VT_STRUCT) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1876 ALWAYS_ASSERT(FALSE);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1877 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1878 /* simple type (currently always same size) */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1879 /* XXX: implicit cast ? */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1880
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1881
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1882 if ((vtop->type.t & VT_BTYPE) == VT_LLONG) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1883 error("long long not supported");
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1884 } else if ((vtop->type.t & VT_BTYPE) == VT_LDOUBLE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1885 error("long double not supported");
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1886 } else if ((vtop->type.t & VT_BTYPE) == VT_DOUBLE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1887 size = 8;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1888 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1889 size = 4;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1890 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1891
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1892 // put the parameter into the corresponding reg (pair)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1893
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1894 r = gv(RC_C67_A4 << (2 * i));
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1895
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1896 // must put on stack because with 1 pass compiler , no way to tell
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1897 // if an up coming nested call might overwrite these regs
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1898
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1899 C67_PUSH(r);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1900
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1901 if (size == 8) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1902 C67_STW_PTR_PRE_INC(r + 1, C67_SP, 3); // STW r, *+SP[3] (go back and put the other)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1903 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1904 args_sizes[i] = size;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1905 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1906 vtop--;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1907 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1908 // POP all the params on the stack into registers for the
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1909 // immediate call (in reverse order)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1910
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1911 for (i = nb_args - 1; i >= 0; i--) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1912
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1913 if (args_sizes[i] == 8)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1914 C67_POP_DW(TREG_C67_A4 + i * 2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1915 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1916 C67_POP(TREG_C67_A4 + i * 2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1917 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1918 gcall_or_jmp(0);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1919 vtop--;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1920 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1921
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1922
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1923 // to be compatible with Code Composer for the C67
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1924 // the first 10 parameters must be passed in registers
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1925 // (pairs for 64 bits) starting wit; A4:A5, then B4:B5 and
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1926 // ending with B12:B13.
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1927 //
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1928 // When a call is made, if the caller has its parameters
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1929 // in regs A4-B13 these must be saved before/as the call
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1930 // parameters are loaded and restored upon return (or if/when needed).
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1931
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1932 /* generate function prolog of type 't' */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1933 void gfunc_prolog(CType * func_type)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1934 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1935 int addr, align, size, func_call, i;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1936 Sym *sym;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1937 CType *type;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1938
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1939 sym = func_type->ref;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1940 func_call = sym->r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1941 addr = 8;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1942 /* if the function returns a structure, then add an
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1943 implicit pointer parameter */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1944 func_vt = sym->type;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1945 if ((func_vt.t & VT_BTYPE) == VT_STRUCT) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1946 func_vc = addr;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1947 addr += 4;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1948 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1949
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1950 NoOfCurFuncArgs = 0;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1951
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1952 /* define parameters */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1953 while ((sym = sym->next) != NULL) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1954 type = &sym->type;
557
9efc5fedd108 Make c67 compile again. (If anybody knows what C67 _is_, I'm a bit curious...)
Rob Landley <rob@landley.net>
parents: 546
diff changeset
1955 sym_push(sym->token & ~SYM_FIELD, type, VT_LOCAL | VT_LVAL, addr);
308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1956 size = type_size(type, &align);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1957 size = (size + 3) & ~3;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1958
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1959 // keep track of size of arguments so
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1960 // we can translate where tcc thinks they
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1961 // are on the stack into the appropriate reg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1962
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1963 TranslateStackToReg[NoOfCurFuncArgs] = size;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1964 NoOfCurFuncArgs++;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1965
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1966 #ifdef FUNC_STRUCT_PARAM_AS_PTR
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1967 /* structs are passed as pointer */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1968 if ((type->t & VT_BTYPE) == VT_STRUCT) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1969 size = 4;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1970 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1971 #endif
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1972 addr += size;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1973 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1974 func_ret_sub = 0;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1975 /* pascal type call ? */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1976 if (func_call == FUNC_STDCALL)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1977 func_ret_sub = addr - 8;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1978
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1979 C67_MV(C67_FP, C67_A0); // move FP -> A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1980 C67_MV(C67_SP, C67_FP); // move SP -> FP
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1981
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1982 // place all the args passed in regs onto the stack
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1983
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1984 loc = 0;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1985 for (i = 0; i < NoOfCurFuncArgs; i++) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1986
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1987 ParamLocOnStack[i] = loc; // remember where the param is
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1988 loc += -8;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1989
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1990 C67_PUSH(TREG_C67_A4 + i * 2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1991
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1992 if (TranslateStackToReg[i] == 8) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1993 C67_STW_PTR_PRE_INC(TREG_C67_A4 + i * 2 + 1, C67_SP, 3); // STW r, *+SP[1] (go back and put the other)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1994 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1995 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1996
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1997 TotalBytesPushedOnStack = -loc;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1998
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
1999 func_sub_sp_offset = ind; // remember where we put the stack instruction
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2000 C67_ADDK(0, C67_SP); // ADDK.L2 loc,SP (just put zero temporarily)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2001
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2002 C67_PUSH(C67_A0);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2003 C67_PUSH(C67_B3);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2004 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2005
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2006 /* generate function epilog */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2007 void gfunc_epilog(void)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2008 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2009 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2010 int local = (-loc + 7) & -8; // stack must stay aligned to 8 bytes for LDDW instr
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2011 C67_POP(C67_B3);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2012 C67_NOP(4); // NOP wait for load
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2013 C67_IREG_B_REG(0, C67_CREG_ZERO, C67_B3); // B.S2 B3
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2014 C67_POP(C67_FP);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2015 C67_ADDK(local, C67_SP); // ADDK.L2 loc,SP
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2016 C67_Adjust_ADDK((int *) (cur_text_section->data +
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2017 func_sub_sp_offset),
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2018 -local + TotalBytesPushedOnStack);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2019 C67_NOP(3); // NOP
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2020 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2021 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2022
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2023 /* generate a jump to a label */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2024 int gjmp(int t)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2025 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2026 int ind1 = ind;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2027
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2028 C67_MVKL(C67_A0, t); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2029 C67_MVKH(C67_A0, t); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2030 C67_IREG_B_REG(0, C67_CREG_ZERO, C67_A0); // [!R] B.S2x A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2031 C67_NOP(5);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2032 return ind1;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2033 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2034
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2035 /* generate a jump to a fixed address */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2036 void gjmp_addr(int a)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2037 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2038 Sym *sym;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2039 // I guess this routine is used for relative short
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2040 // local jumps, for now just handle it as the general
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2041 // case
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2042
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2043 // define a label that will be relocated
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2044
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2045 sym = get_sym_ref(&char_pointer_type, cur_text_section, a, 0);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2046 greloc(cur_text_section, sym, ind, R_C60LO16);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2047 greloc(cur_text_section, sym, ind + 4, R_C60HI16);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2048
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2049 gjmp(0); // place a zero there later the symbol will be added to it
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2050 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2051
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2052 /* generate a test. set 'inv' to invert test. Stack entry is popped */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2053 int gtst(int inv, int t)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2054 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2055 int ind1, n;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2056 int v, *p;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2057
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2058 v = vtop->r & VT_VALMASK;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2059 if (v == VT_CMP) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2060 /* fast case : can jump directly since flags are set */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2061 // C67 uses B2 sort of as flags register
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2062 ind1 = ind;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2063 C67_MVKL(C67_A0, t); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2064 C67_MVKH(C67_A0, t); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2065
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2066 if (C67_compare_reg != TREG_EAX && // check if not already in a conditional test reg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2067 C67_compare_reg != TREG_EDX &&
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2068 C67_compare_reg != TREG_ST0 && C67_compare_reg != C67_B2) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2069 C67_MV(C67_compare_reg, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2070 C67_compare_reg = C67_B2;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2071 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2072
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2073 C67_IREG_B_REG(C67_invert_test ^ inv, C67_compare_reg, C67_A0); // [!R] B.S2x A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2074 C67_NOP(5);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2075 t = ind1; //return where we need to patch
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2076
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2077 } else if (v == VT_JMP || v == VT_JMPI) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2078 /* && or || optimization */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2079 if ((v & 1) == inv) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2080 /* insert vtop->c jump list in t */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2081 p = &vtop->c.i;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2082
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2083 // I guess the idea is to traverse to the
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2084 // null at the end of the list and store t
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2085 // there
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2086
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2087 n = *p;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2088 while (n != 0) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2089 p = (int *) (cur_text_section->data + n);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2090
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2091 // extract 32 bit address from MVKH/MVKL
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2092 n = ((*p >> 7) & 0xffff);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2093 n |= ((*(p + 1) >> 7) & 0xffff) << 16;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2094 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2095 *p |= (t & 0xffff) << 7;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2096 *(p + 1) |= ((t >> 16) & 0xffff) << 7;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2097 t = vtop->c.i;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2098
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2099 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2100 t = gjmp(t);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2101 gsym(vtop->c.i);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2102 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2103 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2104 if (is_float(vtop->type.t)) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2105 vpushi(0);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2106 gen_op(TOK_NE);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2107 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2108 if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2109 /* constant jmp optimization */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2110 if ((vtop->c.i != 0) != inv)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2111 t = gjmp(t);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2112 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2113 // I think we need to get the value on the stack
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2114 // into a register, test it, and generate a branch
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2115 // return the address of the branch, so it can be
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2116 // later patched
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2117
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2118 v = gv(RC_INT); // get value into a reg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2119 ind1 = ind;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2120 C67_MVKL(C67_A0, t); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2121 C67_MVKH(C67_A0, t); //r=reg to load, constant
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2122
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2123 if (v != TREG_EAX && // check if not already in a conditional test reg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2124 v != TREG_EDX && v != TREG_ST0 && v != C67_B2) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2125 C67_MV(v, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2126 v = C67_B2;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2127 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2128
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2129 C67_IREG_B_REG(inv, v, C67_A0); // [!R] B.S2x A0
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2130 C67_NOP(5);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2131 t = ind1; //return where we need to patch
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2132 ind1 = ind;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2133 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2134 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2135 vtop--;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2136 return t;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2137 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2138
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2139 /* generate an integer binary operation */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2140 void gen_opi(int op)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2141 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2142 int r, fr, opc, t;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2143
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2144 switch (op) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2145 case '+':
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2146 case TOK_ADDC1: /* add with carry generation */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2147 opc = 0;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2148 gen_op8:
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2149
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2150
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2151 // C67 can't do const compares, must load into a reg
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2152 // so just go to gv2 directly - tktk
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2153
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2154
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2155
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2156 if (op >= TOK_ULT && op <= TOK_GT)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2157 gv2(RC_INT_BSIDE, RC_INT); // make sure r (src1) is on the B Side of CPU
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2158 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2159 gv2(RC_INT, RC_INT);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2160
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2161 r = vtop[-1].r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2162 fr = vtop[0].r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2163
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2164 C67_compare_reg = C67_B2;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2165
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2166
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2167 if (op == TOK_LT) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2168 C67_CMPLT(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2169 C67_invert_test = false;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2170 } else if (op == TOK_GE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2171 C67_CMPLT(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2172 C67_invert_test = true;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2173 } else if (op == TOK_GT) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2174 C67_CMPGT(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2175 C67_invert_test = false;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2176 } else if (op == TOK_LE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2177 C67_CMPGT(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2178 C67_invert_test = true;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2179 } else if (op == TOK_EQ) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2180 C67_CMPEQ(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2181 C67_invert_test = false;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2182 } else if (op == TOK_NE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2183 C67_CMPEQ(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2184 C67_invert_test = true;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2185 } else if (op == TOK_ULT) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2186 C67_CMPLTU(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2187 C67_invert_test = false;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2188 } else if (op == TOK_UGE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2189 C67_CMPLTU(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2190 C67_invert_test = true;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2191 } else if (op == TOK_UGT) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2192 C67_CMPGTU(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2193 C67_invert_test = false;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2194 } else if (op == TOK_ULE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2195 C67_CMPGTU(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2196 C67_invert_test = true;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2197 } else if (op == '+')
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2198 C67_ADD(fr, r); // ADD r,fr,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2199 else if (op == '-')
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2200 C67_SUB(fr, r); // SUB r,fr,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2201 else if (op == '&')
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2202 C67_AND(fr, r); // AND r,fr,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2203 else if (op == '|')
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2204 C67_OR(fr, r); // OR r,fr,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2205 else if (op == '^')
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2206 C67_XOR(fr, r); // XOR r,fr,r
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2207 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2208 ALWAYS_ASSERT(FALSE);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2209
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2210 vtop--;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2211 if (op >= TOK_ULT && op <= TOK_GT) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2212 vtop->r = VT_CMP;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2213 vtop->c.i = op;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2214 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2215 break;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2216 case '-':
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2217 case TOK_SUBC1: /* sub with carry generation */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2218 opc = 5;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2219 goto gen_op8;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2220 case TOK_ADDC2: /* add with carry use */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2221 opc = 2;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2222 goto gen_op8;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2223 case TOK_SUBC2: /* sub with carry use */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2224 opc = 3;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2225 goto gen_op8;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2226 case '&':
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2227 opc = 4;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2228 goto gen_op8;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2229 case '^':
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2230 opc = 6;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2231 goto gen_op8;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2232 case '|':
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2233 opc = 1;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2234 goto gen_op8;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2235 case '*':
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2236 case TOK_UMULL:
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2237 gv2(RC_INT, RC_INT);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2238 r = vtop[-1].r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2239 fr = vtop[0].r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2240 vtop--;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2241 C67_MPYI(fr, r); // 32 bit bultiply fr,r,fr
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2242 C67_NOP(8); // NOP 8 for worst case
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2243 break;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2244 case TOK_SHL:
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2245 gv2(RC_INT_BSIDE, RC_INT_BSIDE); // shift amount must be on same side as dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2246 r = vtop[-1].r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2247 fr = vtop[0].r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2248 vtop--;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2249 C67_SHL(fr, r); // arithmetic/logical shift
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2250 break;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2251
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2252 case TOK_SHR:
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2253 gv2(RC_INT_BSIDE, RC_INT_BSIDE); // shift amount must be on same side as dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2254 r = vtop[-1].r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2255 fr = vtop[0].r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2256 vtop--;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2257 C67_SHRU(fr, r); // logical shift
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2258 break;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2259
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2260 case TOK_SAR:
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2261 gv2(RC_INT_BSIDE, RC_INT_BSIDE); // shift amount must be on same side as dst
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2262 r = vtop[-1].r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2263 fr = vtop[0].r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2264 vtop--;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2265 C67_SHR(fr, r); // arithmetic shift
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2266 break;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2267
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2268 case '/':
309
5447291470b8 [project @ 2004-10-05 22:33:55 by bellard]
bellard
parents: 308
diff changeset
2269 t = TOK__divi;
308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2270 call_func:
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2271 vswap();
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2272 /* call generic idiv function */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2273 vpush_global_sym(&func_old_type, t);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2274 vrott(3);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2275 gfunc_call(2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2276 vpushi(0);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2277 vtop->r = REG_IRET;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2278 vtop->r2 = VT_CONST;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2279 break;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2280 case TOK_UDIV:
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2281 case TOK_PDIV:
309
5447291470b8 [project @ 2004-10-05 22:33:55 by bellard]
bellard
parents: 308
diff changeset
2282 t = TOK__divu;
308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2283 goto call_func;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2284 case '%':
309
5447291470b8 [project @ 2004-10-05 22:33:55 by bellard]
bellard
parents: 308
diff changeset
2285 t = TOK__remi;
308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2286 goto call_func;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2287 case TOK_UMOD:
309
5447291470b8 [project @ 2004-10-05 22:33:55 by bellard]
bellard
parents: 308
diff changeset
2288 t = TOK__remu;
308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2289 goto call_func;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2290
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2291 default:
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2292 opc = 7;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2293 goto gen_op8;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2294 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2295 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2296
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2297 /* generate a floating point operation 'v = t1 op t2' instruction. The
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2298 two operands are guaranted to have the same floating point type */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2299 /* XXX: need to use ST1 too */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2300 void gen_opf(int op)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2301 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2302 int ft, fc, fr, r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2303
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2304 if (op >= TOK_ULT && op <= TOK_GT)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2305 gv2(RC_EDX, RC_EAX); // make sure src2 is on b side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2306 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2307 gv2(RC_FLOAT, RC_FLOAT); // make sure src2 is on b side
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2309 ft = vtop->type.t;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2310 fc = vtop->c.ul;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2311 r = vtop->r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2312 fr = vtop[-1].r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2313
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2314
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2315 if ((ft & VT_BTYPE) == VT_LDOUBLE)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2316 error("long doubles not supported");
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2317
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2318 if (op >= TOK_ULT && op <= TOK_GT) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2319
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2320 r = vtop[-1].r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2321 fr = vtop[0].r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2322
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2323 C67_compare_reg = C67_B2;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2324
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2325 if (op == TOK_LT) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2326 if ((ft & VT_BTYPE) == VT_DOUBLE)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2327 C67_CMPLTDP(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2328 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2329 C67_CMPLTSP(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2330
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2331 C67_invert_test = false;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2332 } else if (op == TOK_GE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2333 if ((ft & VT_BTYPE) == VT_DOUBLE)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2334 C67_CMPLTDP(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2335 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2336 C67_CMPLTSP(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2337
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2338 C67_invert_test = true;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2339 } else if (op == TOK_GT) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2340 if ((ft & VT_BTYPE) == VT_DOUBLE)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2341 C67_CMPGTDP(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2342 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2343 C67_CMPGTSP(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2344
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2345 C67_invert_test = false;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2346 } else if (op == TOK_LE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2347 if ((ft & VT_BTYPE) == VT_DOUBLE)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2348 C67_CMPGTDP(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2349 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2350 C67_CMPGTSP(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2351
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2352 C67_invert_test = true;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2353 } else if (op == TOK_EQ) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2354 if ((ft & VT_BTYPE) == VT_DOUBLE)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2355 C67_CMPEQDP(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2356 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2357 C67_CMPEQSP(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2358
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2359 C67_invert_test = false;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2360 } else if (op == TOK_NE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2361 if ((ft & VT_BTYPE) == VT_DOUBLE)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2362 C67_CMPEQDP(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2363 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2364 C67_CMPEQSP(r, fr, C67_B2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2365
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2366 C67_invert_test = true;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2367 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2368 ALWAYS_ASSERT(FALSE);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2369 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2370 vtop->r = VT_CMP; // tell TCC that result is in "flags" actually B2
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2371 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2372 if (op == '+') {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2373 if ((ft & VT_BTYPE) == VT_DOUBLE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2374 C67_ADDDP(r, fr); // ADD fr,r,fr
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2375 C67_NOP(6);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2376 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2377 C67_ADDSP(r, fr); // ADD fr,r,fr
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2378 C67_NOP(3);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2379 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2380 vtop--;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2381 } else if (op == '-') {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2382 if ((ft & VT_BTYPE) == VT_DOUBLE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2383 C67_SUBDP(r, fr); // SUB fr,r,fr
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2384 C67_NOP(6);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2385 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2386 C67_SUBSP(r, fr); // SUB fr,r,fr
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2387 C67_NOP(3);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2388 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2389 vtop--;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2390 } else if (op == '*') {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2391 if ((ft & VT_BTYPE) == VT_DOUBLE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2392 C67_MPYDP(r, fr); // MPY fr,r,fr
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2393 C67_NOP(9);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2394 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2395 C67_MPYSP(r, fr); // MPY fr,r,fr
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2396 C67_NOP(3);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2397 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2398 vtop--;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2399 } else if (op == '/') {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2400 if ((ft & VT_BTYPE) == VT_DOUBLE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2401 // must call intrinsic DP floating point divide
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2402 vswap();
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2403 /* call generic idiv function */
309
5447291470b8 [project @ 2004-10-05 22:33:55 by bellard]
bellard
parents: 308
diff changeset
2404 vpush_global_sym(&func_old_type, TOK__divd);
308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2405 vrott(3);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2406 gfunc_call(2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2407 vpushi(0);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2408 vtop->r = REG_FRET;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2409 vtop->r2 = REG_LRET;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2410
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2411 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2412 // must call intrinsic SP floating point divide
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2413 vswap();
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2414 /* call generic idiv function */
309
5447291470b8 [project @ 2004-10-05 22:33:55 by bellard]
bellard
parents: 308
diff changeset
2415 vpush_global_sym(&func_old_type, TOK__divf);
308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2416 vrott(3);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2417 gfunc_call(2);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2418 vpushi(0);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2419 vtop->r = REG_FRET;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2420 vtop->r2 = VT_CONST;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2421 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2422 } else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2423 ALWAYS_ASSERT(FALSE);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2424
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2425
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2426 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2427 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2428
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2429
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2430 /* convert integers to fp 't' type. Must handle 'int', 'unsigned int'
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2431 and 'long long' cases. */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2432 void gen_cvt_itof(int t)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2433 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2434 int r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2435
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2436 gv(RC_INT);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2437 r = vtop->r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2438
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2439 if ((t & VT_BTYPE) == VT_DOUBLE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2440 if (t & VT_UNSIGNED)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2441 C67_INTDPU(r, r);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2442 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2443 C67_INTDP(r, r);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2444
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2445 C67_NOP(4);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2446 vtop->type.t = VT_DOUBLE;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2447 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2448 if (t & VT_UNSIGNED)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2449 C67_INTSPU(r, r);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2450 else
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2451 C67_INTSP(r, r);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2452 C67_NOP(3);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2453 vtop->type.t = VT_FLOAT;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2454 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2455
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2456 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2457
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2458 /* convert fp to int 't' type */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2459 /* XXX: handle long long case */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2460 void gen_cvt_ftoi(int t)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2461 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2462 int r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2463
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2464 gv(RC_FLOAT);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2465 r = vtop->r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2466
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2467 if (t != VT_INT)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2468 error("long long not supported");
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2469 else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2470 if ((vtop->type.t & VT_BTYPE) == VT_DOUBLE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2471 C67_DPTRUNC(r, r);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2472 C67_NOP(3);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2473 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2474 C67_SPTRUNC(r, r);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2475 C67_NOP(3);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2476 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2477
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2478 vtop->type.t = VT_INT;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2479
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2480 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2481 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2482
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2483 /* convert from one floating point type to another */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2484 void gen_cvt_ftof(int t)
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2485 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2486 int r, r2;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2487
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2488 if ((vtop->type.t & VT_BTYPE) == VT_DOUBLE &&
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2489 (t & VT_BTYPE) == VT_FLOAT) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2490 // convert double to float
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2491
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2492 gv(RC_FLOAT); // get it in a register pair
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2493
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2494 r = vtop->r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2495
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2496 C67_DPSP(r, r); // convert it to SP same register
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2497 C67_NOP(3);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2498
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2499 vtop->type.t = VT_FLOAT;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2500 vtop->r2 = VT_CONST; // set this as unused
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2501 } else if ((vtop->type.t & VT_BTYPE) == VT_FLOAT &&
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2502 (t & VT_BTYPE) == VT_DOUBLE) {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2503 // convert float to double
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2504
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2505 gv(RC_FLOAT); // get it in a register
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2506
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2507 r = vtop->r;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2508
339
04d8a922bf07 [project @ 2004-11-07 15:43:48 by bellard]
bellard
parents: 309
diff changeset
2509 if (r == TREG_EAX) { // make sure the paired reg is avail
308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2510 r2 = get_reg(RC_ECX);
339
04d8a922bf07 [project @ 2004-11-07 15:43:48 by bellard]
bellard
parents: 309
diff changeset
2511 } else if (r == TREG_EDX) {
308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2512 r2 = get_reg(RC_ST0);
339
04d8a922bf07 [project @ 2004-11-07 15:43:48 by bellard]
bellard
parents: 309
diff changeset
2513 } else {
308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2514 ALWAYS_ASSERT(FALSE);
339
04d8a922bf07 [project @ 2004-11-07 15:43:48 by bellard]
bellard
parents: 309
diff changeset
2515 r2 = 0; /* avoid warning */
04d8a922bf07 [project @ 2004-11-07 15:43:48 by bellard]
bellard
parents: 309
diff changeset
2516 }
308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2517
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2518 C67_SPDP(r, r); // convert it to DP same register
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2519 C67_NOP(1);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2520
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2521 vtop->type.t = VT_DOUBLE;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2522 vtop->r2 = r2; // set this as unused
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2523 } else {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2524 ALWAYS_ASSERT(FALSE);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2525 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2526 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2527
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2528 /* computed goto support */
546
3f683703c8db Rename ggoto() to gen_goto().
Rob Landley <rob@landley.net>
parents: 499
diff changeset
2529 void gen_goto(void)
308
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2530 {
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2531 gcall_or_jmp(1);
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2532 vtop--;
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2533 }
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2534
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2535 /* end of X86 code generator */
f5a858f94650 [project @ 2004-10-05 17:55:18 by bellard]
bellard
parents:
diff changeset
2536 /*************************************************************/