Mercurial > hg > truffle
comparison agent/src/share/classes/sun/jvm/hotspot/asm/x86/FloatDecoder.java @ 0:a61af66fc99e jdk7-b24
Initial load
author | duke |
---|---|
date | Sat, 01 Dec 2007 00:00:00 +0000 |
parents | |
children | c18cbe5936b8 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:a61af66fc99e |
---|---|
1 /* | |
2 * Copyright 2002-2003 Sun Microsystems, Inc. All Rights Reserved. | |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, | |
20 * CA 95054 USA or visit www.sun.com if you need additional information or | |
21 * have any questions. | |
22 * | |
23 */ | |
24 | |
25 package sun.jvm.hotspot.asm.x86; | |
26 | |
27 import sun.jvm.hotspot.asm.*; | |
28 | |
29 public class FloatDecoder extends FPInstructionDecoder { | |
30 | |
31 public FloatDecoder() { | |
32 super(null); | |
33 } | |
34 | |
35 //Please refer to IA-32 Intel Architecture Software Developer's Manual Volume 2 | |
36 //APPENDIX A - Escape opcodes | |
37 | |
38 /*When ModR/M byte is within 00h to BFh*/ | |
39 private static final FPInstructionDecoder floatMapOne[][] = { | |
40 /* d8 */ | |
41 { | |
42 new FPArithmeticDecoder("fadds", ADDR_E, v_mode, RTLOP_ADD), | |
43 new FPArithmeticDecoder("fmuls", ADDR_E, v_mode, RTLOP_SMUL), | |
44 new FPInstructionDecoder("fcoms", ADDR_E, v_mode), | |
45 new FPInstructionDecoder("fcomps", ADDR_E, v_mode), | |
46 new FPArithmeticDecoder("fsubs", ADDR_E, v_mode, RTLOP_SUB), | |
47 new FPArithmeticDecoder("fsubrs", ADDR_E, v_mode, RTLOP_SUB), | |
48 new FPArithmeticDecoder("fdivs", ADDR_E, v_mode, RTLOP_SDIV), | |
49 new FPArithmeticDecoder("fdivrs", ADDR_E, v_mode, RTLOP_SDIV) | |
50 }, | |
51 /* d9 */ | |
52 { | |
53 new FPLoadDecoder("flds", ADDR_E, v_mode), | |
54 null, | |
55 new FPStoreDecoder("fsts", ADDR_E, v_mode), | |
56 new FPStoreDecoder("fstps", ADDR_E, v_mode), | |
57 new FPStoreDecoder("fldenv", ADDR_E, v_mode), | |
58 new FPStoreDecoder("fldcw", ADDR_E, v_mode), | |
59 new FPStoreDecoder("fNstenv", ADDR_E, v_mode), | |
60 new FPStoreDecoder("fNstcw", ADDR_E, v_mode) | |
61 }, | |
62 /* da */ | |
63 { | |
64 new FPArithmeticDecoder("fiaddl", ADDR_E, v_mode, RTLOP_ADD), | |
65 new FPArithmeticDecoder("fimull", ADDR_E, v_mode, RTLOP_SMUL), | |
66 new FPInstructionDecoder("ficoml", ADDR_E, v_mode), | |
67 new FPInstructionDecoder("ficompl", ADDR_E, v_mode), | |
68 new FPArithmeticDecoder("fisubl", ADDR_E, v_mode, RTLOP_SUB), | |
69 new FPArithmeticDecoder("fisubrl", ADDR_E, v_mode, RTLOP_SUB), | |
70 new FPArithmeticDecoder("fidivl", ADDR_E, v_mode, RTLOP_SDIV), | |
71 new FPArithmeticDecoder("fidivrl", ADDR_E, v_mode, RTLOP_SDIV) | |
72 }, | |
73 /* db */ | |
74 { | |
75 new FPLoadDecoder("fildl", ADDR_E, v_mode), | |
76 null, | |
77 new FPStoreDecoder("fistl", ADDR_E, v_mode), | |
78 new FPStoreDecoder("fistpl", ADDR_E, v_mode), | |
79 null, | |
80 new FPLoadDecoder("fldt", ADDR_E, v_mode), | |
81 null, | |
82 new FPStoreDecoder("fstpt", ADDR_E, v_mode) | |
83 }, | |
84 /* dc */ | |
85 { | |
86 new FPArithmeticDecoder("faddl", ADDR_E, v_mode, RTLOP_ADD), | |
87 new FPArithmeticDecoder("fmull", ADDR_E, v_mode, RTLOP_SMUL), | |
88 new FPInstructionDecoder("fcoml", ADDR_E, v_mode), | |
89 new FPInstructionDecoder("fcompl", ADDR_E, v_mode), | |
90 new FPArithmeticDecoder("fsubl", ADDR_E, v_mode, RTLOP_SUB), | |
91 new FPArithmeticDecoder("fsubrl", ADDR_E, v_mode, RTLOP_SUB), | |
92 new FPArithmeticDecoder("fdivl", ADDR_E, v_mode, RTLOP_SDIV), | |
93 new FPArithmeticDecoder("fdivrl", ADDR_E, v_mode, RTLOP_SDIV) | |
94 }, | |
95 /* dd */ | |
96 { | |
97 new FPLoadDecoder("fldl", ADDR_E, v_mode), | |
98 null, | |
99 new FPStoreDecoder("fstl", ADDR_E, v_mode), | |
100 new FPStoreDecoder("fstpl", ADDR_E, v_mode), | |
101 new FPStoreDecoder("frstor", ADDR_E, v_mode), | |
102 null, | |
103 new FPStoreDecoder("fNsave", ADDR_E, v_mode), | |
104 new FPStoreDecoder("fNstsw", ADDR_E, v_mode) | |
105 }, | |
106 /* de */ | |
107 { | |
108 new FPArithmeticDecoder("fiadd", ADDR_E, v_mode, RTLOP_ADD), | |
109 new FPArithmeticDecoder("fimul", ADDR_E, v_mode, RTLOP_SMUL), | |
110 new FPInstructionDecoder("ficom", ADDR_E, v_mode), | |
111 new FPInstructionDecoder("ficomp", ADDR_E, v_mode), | |
112 new FPArithmeticDecoder("fisub", ADDR_E, v_mode, RTLOP_SUB), | |
113 new FPArithmeticDecoder("fisubr", ADDR_E, v_mode, RTLOP_SUB), | |
114 new FPArithmeticDecoder("fidiv", ADDR_E, v_mode, RTLOP_SDIV), | |
115 new FPArithmeticDecoder("fidivr", ADDR_E, v_mode, RTLOP_SDIV) | |
116 }, | |
117 /* df */ | |
118 { | |
119 new FPLoadDecoder("fild", ADDR_E, v_mode), | |
120 null, | |
121 new FPStoreDecoder("fist", ADDR_E, v_mode), | |
122 new FPStoreDecoder("fistp", ADDR_E, v_mode), | |
123 new FPLoadDecoder("fbld", ADDR_E, v_mode), | |
124 new FPLoadDecoder("fildll", ADDR_E, v_mode), | |
125 new FPStoreDecoder("fbstp", ADDR_E, v_mode), | |
126 new FPStoreDecoder("fistpll", ADDR_E, v_mode) | |
127 } | |
128 }; | |
129 | |
130 /*When ModR/M byte is outside 00h to BFh*/ | |
131 private static final FPInstructionDecoder floatMapTwo[][] = { | |
132 | |
133 /* d8 */ | |
134 /*parameter for ADDR_FPREG, 0 means ST(0), 1 means ST at rm value. */ | |
135 { | |
136 new FPArithmeticDecoder("fadd", ADDR_FPREG, 0, ADDR_FPREG, 1, RTLOP_ADD), | |
137 new FPArithmeticDecoder("fmul", ADDR_FPREG, 0, ADDR_FPREG, 1, RTLOP_SMUL), | |
138 new FPInstructionDecoder("fcom", ADDR_FPREG, 1), | |
139 new FPInstructionDecoder("fcomp", ADDR_FPREG, 1), | |
140 new FPArithmeticDecoder("fsub", ADDR_FPREG, 0, ADDR_FPREG, 1, RTLOP_SUB), | |
141 new FPArithmeticDecoder("fsubr", ADDR_FPREG, 0, ADDR_FPREG, 1, RTLOP_SUB), | |
142 new FPArithmeticDecoder("fdiv", ADDR_FPREG, 0, ADDR_FPREG, 1, RTLOP_SDIV), | |
143 new FPArithmeticDecoder("fdivr", ADDR_FPREG, 0, ADDR_FPREG, 1, RTLOP_SDIV) | |
144 }, | |
145 /* d9 */ | |
146 { | |
147 new FPLoadDecoder("fld", ADDR_FPREG, 1), | |
148 new FPInstructionDecoder("fxch", ADDR_FPREG, 1), | |
149 new FloatGRPDecoder(null, 0), | |
150 null, | |
151 new FloatGRPDecoder(null, 1), | |
152 new FloatGRPDecoder(null, 2), | |
153 new FloatGRPDecoder(null, 3), | |
154 new FloatGRPDecoder(null, 4) | |
155 }, | |
156 /* da */ | |
157 { | |
158 null, | |
159 null, | |
160 null, | |
161 null, | |
162 null, | |
163 new FloatGRPDecoder(null, 5), | |
164 null, | |
165 null | |
166 }, | |
167 /* db */ | |
168 { | |
169 null, | |
170 null, | |
171 null, | |
172 null, | |
173 new FloatGRPDecoder(null, 6), | |
174 null, | |
175 null, | |
176 null | |
177 }, | |
178 /* dc */ | |
179 { | |
180 new FPArithmeticDecoder("fadd", ADDR_FPREG, 1, ADDR_FPREG, 0, RTLOP_ADD), | |
181 new FPArithmeticDecoder("fmul", ADDR_FPREG, 1, ADDR_FPREG, 0, RTLOP_SMUL), | |
182 null, | |
183 null, | |
184 new FPArithmeticDecoder("fsub", ADDR_FPREG, 1, ADDR_FPREG, 0, RTLOP_SUB), | |
185 new FPArithmeticDecoder("fsubr",ADDR_FPREG, 1, ADDR_FPREG, 0, RTLOP_SUB), | |
186 new FPArithmeticDecoder("fdiv", ADDR_FPREG, 1, ADDR_FPREG, 0, RTLOP_SDIV), | |
187 new FPArithmeticDecoder("fdivr", ADDR_FPREG, 1, ADDR_FPREG, 0, RTLOP_SDIV) | |
188 }, | |
189 /* dd */ | |
190 { | |
191 new FPInstructionDecoder("ffree", ADDR_FPREG, 1), | |
192 null, | |
193 new FPStoreDecoder("fst", ADDR_FPREG, 1), | |
194 new FPStoreDecoder("fstp", ADDR_FPREG, 1), | |
195 new FPInstructionDecoder("fucom", ADDR_FPREG, 1), | |
196 new FPInstructionDecoder("fucomp", ADDR_FPREG, 1), | |
197 null, | |
198 null | |
199 }, | |
200 /* de */ | |
201 { | |
202 new FPArithmeticDecoder("faddp", ADDR_FPREG, 1, ADDR_FPREG, 0, RTLOP_ADD), | |
203 new FPArithmeticDecoder("fmulp", ADDR_FPREG, 1, ADDR_FPREG, 0, RTLOP_SMUL), | |
204 null, | |
205 new FloatGRPDecoder(null, 7), | |
206 new FPArithmeticDecoder("fsubrp", ADDR_FPREG, 1, ADDR_FPREG, 0, RTLOP_SUB), | |
207 new FPArithmeticDecoder("fsubp", ADDR_FPREG, 1, ADDR_FPREG, 0, RTLOP_SUB), | |
208 new FPArithmeticDecoder("fdivrp", ADDR_FPREG, 1, ADDR_FPREG, 0, RTLOP_SDIV), | |
209 new FPArithmeticDecoder("fdivp", ADDR_FPREG, 1, ADDR_FPREG, 0, RTLOP_SDIV) | |
210 }, | |
211 /* df */ | |
212 { | |
213 null, | |
214 null, | |
215 null, | |
216 null, | |
217 new FloatGRPDecoder(null, 7), | |
218 null, | |
219 null, | |
220 null | |
221 } | |
222 }; | |
223 | |
224 public Instruction decode(byte[] bytesArray, int index, int instrStartIndex, int segmentOverride, int prefixes, X86InstructionFactory factory) { | |
225 this.byteIndex = index; | |
226 this.instrStartIndex = instrStartIndex; | |
227 this.prefixes = prefixes; | |
228 | |
229 int ModRM = readByte(bytesArray, byteIndex); | |
230 int reg = (ModRM >> 3) & 7; | |
231 int regOrOpcode = (ModRM >> 3) & 7; | |
232 int rm = ModRM & 7; | |
233 | |
234 int floatOpcode = InstructionDecoder.readByte(bytesArray, instrStartIndex); | |
235 FPInstructionDecoder instrDecoder = null; | |
236 | |
237 if(ModRM < 0xbf) { | |
238 instrDecoder = floatMapOne[floatOpcode - 0xd8][reg]; | |
239 } | |
240 else { | |
241 instrDecoder = floatMapTwo[floatOpcode - 0xd8][reg]; | |
242 } | |
243 | |
244 Instruction instr = null; | |
245 if(instrDecoder != null) { | |
246 instr = instrDecoder.decode(bytesArray, byteIndex, instrStartIndex, segmentOverride, prefixes, factory); | |
247 byteIndex = instrDecoder.getCurrentIndex(); | |
248 } else { | |
249 instr = factory.newIllegalInstruction(); | |
250 } | |
251 return instr; | |
252 } | |
253 } |