|
|
1.1 root 1: /*
2: * db/i386/i386db3.c
3: * A debugger.
4: * i386 disassembler tables for disassembler in i386/i386db2.c.
5: * Intel operand order.
6: */
7:
8: #include "i386db.h"
9:
10: /*
11: * Legend to characters following "%" tokens in strings,
12: * taken from Intel i386 "Programmer's Reference Manual".
13: *
14: * First char after '%'; see also 2nd char, general case below:
15: * A - direct address
16: * C - reg of r/m selects control register
17: * D - reg of r/m selects debug register
18: * E - modR/M selects operand
19: * F - flags register
20: * G - reg field of modR/M selects general register
21: * H - sign-extended immediate data (same as I but sign-extended)
22: * I - immediate data
23: * J - relative offset added to IP
24: * K - as J, except find symbol, if possible
25: * M - modR/M selects memory only
26: * O - no modR/M byte; offset only
27: * R - mod field of modR/M selects register only
28: * S - reg field of modR/M selects segment register
29: * T - reg feild of modR/M selects test register
30: * X - memory addressed by DS:ESI
31: * Y - memory addressed by ES:EDI
32: * Z - assembler instruction mnemonic size qualifier
33: * 2 - prefix of two-byte opcode
34: *
35: * For the following first characters after the %, the second after the %
36: * has a special meaning associated with it:
37: * e - put in 'e' if address size attribute = 32
38: * - second char is part of reg name
39: * f - floating point
40: * - second char is esc value
41: * g - REG/OPCODE field of the modR/M byte is interpreted as
42: * additional opcode; it is used as an index to a
43: * column in the 2-d group array (grp[][])
44: * - second character yields the group number, i.e., it
45: * is used as an index to a row in grp[][]
46: * r - read next n bytes, but don't do anything with them; n is
47: * given by 2nd char and meaning conforms with general case
48: * s - size override:
49: * - second char has following meanings:
50: * "a" - address size override
51: * "o" - operand size override
52: *
53: * Second char after '%', the general case:
54: * a - two words or dwords in memory (BOUND)
55: * b - byte
56: * d - dword
57: * f - 32 bit pointer
58: * l - 48 bit pointer
59: * p - 32 or 48 bit pointer
60: * s - six byte pseudo-descriptor
61: * v - word or dword
62: * w - word
63: * z - r/m16: append 'w' to assem. mnemonic
64: * - r/m32: append 'w' to assem. mnemonic if operand size = 16,
65: * append 'l' to assem. mnemonic if operand size = 32
66: * F - use floating regs in mod/rm (unused)
67: * 1-8 - group number
68: */
69:
70: /******************************************************************************/
71:
72: char *op_map_1[] = {
73: /* 0 */
74: "add%Zb %Eb,%Gb", "add%Zv %Ev,%Gv", "add%Zb %Gb,%Eb", "add%Zv %Gv,%Ev",
75: "add%Zb al,%Ib", "add%Zv %eax,%Iv", "push es", "pop es",
76: "or%Zb %Eb,%Gb", "or%Zv %Ev,%Gv", "or%Zb %Gb,%Eb", "or%Zv %Gv,%Ev",
77: "or%Zb al,%Ib", "or%Zv %eax,%Iv", "push cs", "%2 ",
78:
79: /* 1 */
80: "adc%Zb %Eb,%Gb", "adc%Zv %Ev,%Gv", "adc%Zb %Gb,%Eb", "adc%Zv %Gv,%Ev",
81: "adc%Zb al,%Ib", "adc%Zv %eax,%Iv", "push ss", "pop ss",
82: "sbb%Zb %Eb,%Gb", "sbb%Zv %Ev,%Gv", "sbb%Zb %Gb,%Eb", "sbb%Zv %Gv,%Ev",
83: "sbb%Zb al,%Ib", "sbb%Zv %eax,%Iv", "push ds", "pop ds",
84:
85: /* 2 */
86: "and%Zb %Eb,%Gb", "and%Zv %Ev,%Gv", "and%Zb %Gb,%Eb", "and%Zv %Gv,%Ev",
87: "and%Zb al,%Ib", "and%Zv %eax,%Iv", "es:", "daa",
88: "sub%Zb %Eb,%Gb", "sub%Zv %Ev,%Gv", "sub%Zb %Gb,%Eb", "sub%Zv %Gv,%Ev",
89: "sub%Zb al,%Ib", "sub%Zv %eax,%Iv", "cs:", "das",
90:
91: /* 3 */
92: "xor%Zb %Eb,%Gb", "xor%Zv %Ev,%Gv", "xor%Zb %Gb,%Eb", "xor%Zv %Gv,%Ev",
93: "xor%Zb al,%Ib", "xor%Zv %eax,%Iv", "ss:", "aaa",
94: "cmp%Zb %Eb,%Gb", "cmp%Zv %Ev,%Gv", "cmp%Zb %Gb,%Eb", "cmp%Zv %Gv,%Ev",
95: "cmp%Zb al,%Ib", "cmp%Zv %eax,%Iv", "ds:", "aas",
96:
97: /* 4 */
98: "inc%Zv %eax", "inc%Zv %ecx", "inc%Zv %edx", "inc%Zv %ebx",
99: "inc%Zv %esp", "inc%Zv %ebp", "inc%Zv %esi", "inc%Zv %edi",
100: "dec%Zv %eax", "dec%Zv %ecx", "dec%Zv %edx", "dec%Zv %ebx",
101: "dec%Zv %esp", "dec%Zv %ebp", "dec%Zv %esi", "dec%Zv %edi",
102:
103: /* 5 */
104: "push%Zv %eax", "push%Zv %ecx", "push%Zv %edx", "push%Zv %ebx",
105: "push%Zv %esp", "push%Zv %ebp", "push%Zv %esi", "push%Zv %edi",
106: "pop%Zv %eax", "pop%Zv %ecx", "pop%Zv %edx", "pop%Zv %ebx",
107: "pop%Zv %esp", "pop%Zv %ebp", "pop%Zv %esi", "pop%Zv %edi",
108:
109: /* 6 */
110: "pusha%Zv", "popa%Zv", "bound%Zv %Gv,%Ma", "arpl %Ew,%Gw",
111: "fs:", "gs:", "%so", "%sa",
112: "push%Zv %Iv", "imul%Zv %Gv,%Ev,%Iv", "push%Zb %Ib", "imul%Zv %Gv,%Ev,%Hb",
113: "ins%Zb %Yb", "ins%Zv %Yv", "outs%Zb %Xb", "outs%Zv %Xv",
114:
115: /* 7 */
116: "jo %Jb", "jno %Jb", "jb %Jb", "jae %Jb",
117: "je %Jb", "jne %Jb", "jbe %Jb", "ja %Jb",
118: "js %Jb", "jns %Jb", "jp %Jb", "jnp %Jb",
119: "jl %Jb", "jge %Jb", "jle %Jb", "jg %Jb",
120:
121: /* 8 */
122: "%g1%Zb %Eb,%Ib", "%g1%Zv %Ev,%Iv", "mov%Zb al,%Ib", "%g1%Zv %Ev,%Hb",
123: "test%Zb %Eb,%Gb", "test%Zv %Ev,%Gv", "xchg%Zb %Eb,%Gb", "xchg%Zv %Ev,%Gv",
124: "mov%Zb %Eb,%Gb", "mov%Zv %Ev,%Gv", "mov%Zb %Gb,%Eb", "mov%Zv %Gv,%Ev",
125: "mov%Zw %Ew,%Sw", "lea%Zv %Gv,%M ", "mov%Zw %Sw,%Ew", "pop%Zv %Ev",
126:
127: /* 9 */
128: "nop", "xchg%Zv %eax,%ecx", "xchg%Zv %eax,%edx", "xchg%Zv %eax,%ebx",
129: "xchg%Zv %eax,%esp", "xchg%Zv %eax,%ebp", "xchg%Zv %eax,%esi", "xchg%Zv %eax,%edi",
130: "cbw", "cwd", "lcall %Ap", "fwait",
131: "pushf%Zv", "popf%Zv", "sahf", "lahf",
132:
133: /* A */
134: "mov%Zb al,%Ob", "mov%Zv %eax,%Ov", "mov%Zb %Ob,al", "mov%Zv %Ov,%eax",
135: "movs%Zb %Xb%Yb", "movs%Zz %Xv%Yv", "cmps%Zb %Xb%Yb", "cmps%Zz %Xv%Yv",
136: "test%Zb al,%Ib", "test%Zv %eax,%Iv", "stos%Zb %Yb", "stos%Zz %Yv",
137: "lods%Zb %Xb", "lods%Zz %Xv", "scas%Zb %Xb", "scas%Zv %Xv",
138:
139: /* B */
140: "mov%Zb al,%Ib", "mov%Zb cl,%Ib", "mov%Zb dl,%Ib", "mov%Zb bl,%Ib",
141: "mov%Zb ah,%Ib", "mov%Zb ch,%Ib", "mov%Zb dh,%Ib", "mov%Zb bh,%Ib",
142: "mov%Zv %eax,%Iv", "mov%Zv %ecx,%Iv", "mov%Zv %edx,%Iv", "mov%Zv %ebx,%Iv",
143: "mov%Zv %esp,%Iv", "mov%Zv %ebp,%Iv", "mov%Zv %esi,%Iv", "mov%Zv %edi,%Iv",
144:
145: /* C */
146: "%g2%Zb %Eb,%Ib", "%g2%Zv %Ev,%Ib", "ret %Iw", "ret",
147: "les%Zv %Gv,%Mp", "lds%Zv %Gv,%Mp", "mov%Zb %Eb,%Ib", "mov%Zv %Ev,%Iv",
148: "enter %Iw,%Ib", "leave", "lret %Iw", "lret",
149: "int 3", "int %Ib", "into", "iret",
150:
151: /* D */
152: "%g2%Zb %Eb,$1", "%g2%Zv %Ev,$1", "%g2%Zb %Eb,cl", "%g2%Zv %Ev,cl",
153: "aam %rb", "aad %rb", NULL, "xlat",
154: "%f0", "%f1", "%f2", "%f3",
155: "%f4", "%f5", "%f6", "%f7",
156:
157: /* E */
158: "loopne %Jb", "loope %Jb", "loop %Jb", "jcxz %Jb",
159: "in%Zb %Ib", "in%Zv %Ib", "out%Zb %Ib,al", "out%Zv %Ib,%eax",
160: "call %Kv", "jmp %Jv", "ljmp %Ap", "jmp %Jb",
161: "in%Zb ", "in%Zv ", "out%Zb dx,al", "out%Zv dx,%eax",
162:
163: /* F */
164: "lock", NULL, "repne", "rep",
165: "hlt", "cmc", "%g3", "%g0",
166: "clc", "stc", "cli", "sti",
167: "cld", "std", "%g4", "%g5"
168: };
169:
170: /******************************************************************************/
171:
172: char *op_map_2[] = {
173: /* 0 */
174: "%g6", "%g7", "lar%Zv %Gv,%Ew", "lsl%Zv %Gv,%Ew",
175: NULL, NULL, "clts", NULL,
176: "invd", "wbinvd", NULL, NULL,
177: NULL, NULL, NULL, NULL,
178:
179: /* 1 */
180: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
181: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
182:
183: /* 2 */
184: "mov%Zd %Rd,%Cd", "mov%Zd %Rd,%Dd", "mov%Zd %Cd,%Rd", "mov%Zd %Dd,%Rd",
185: "mov%Zd %Rd,%Td", NULL, "mov%Zd %Td,%Rd", NULL,
186: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
187:
188: /* 3 */
189: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
190: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
191:
192: /* 4 */
193: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
194: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
195:
196: /* 5 */
197: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
198: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
199:
200: /* 6 */
201: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
202: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
203:
204: /* 7 */
205: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
206: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
207:
208: /* 8 */
209: "jo %Jv", "jno %Jv", "jb %Jv", "jae %Jv",
210: "je %Jv", "jne %Jv", "jbe %Jv", "ja %Jv",
211: "js %Jv", "jns %Jv", "jp %Jv", "jnp %Jv",
212: "jl %Jv", "jge %Jv", "jle %Jv", "jg %Jv",
213:
214: /* 9 */
215: "seto %Eb", "setno %Eb", "setb %Eb", "setae %Eb",
216: "sete %Eb", "setne %Eb", "setbe %Eb", "seta %Eb",
217: "sets %Eb", "setns %Eb", "setp %Eb", "setnp %Eb",
218: "setl %Eb", "setge %Eb", "setle %Eb", "setg %Eb",
219:
220: /* A */
221: "push fs", "pop fs", NULL, "bt%Zv %Ev,%Gv",
222: "shld%Zv %Ev,%Gv,%Ib", "shld%Zv %Ev,%Gv,cl",
223: "cmpxchg%Zb %Eb,%Gb", "cmpxchg%Zb %Ev,%Gv",
224: "push gs", "pop gs", NULL, "bts%Zv %Ev,%Gv",
225: "shrd%Zv %Ev,%Gv,%Ib", "shrd%Zv %Ev,%Gv,cl",
226: NULL, "imul%Zv %Gv,%Ev",
227:
228: /* B */
229: NULL, NULL, "lss%Zv %Mp", "btr%Zv %Ev,%Gv",
230: "lfs%Zv %Mp", "lgs%Zv %Mp", "movzx%Zb %Gv,%Eb", "movzx%Zw %Gv,%Ew",
231: NULL, NULL, "%g8%Zv %Ev,%Ib", "btc%Zv %Ev,%Gv",
232: "bsf%Zv %Gv,%Ev", "bsr%Zv %Gv,%Ev", "movsx%Zb %Gv,%Eb", "movsx%Zw %Gv,%Ew",
233:
234: /* C */
235: "xadd%Zb %Eb,%Gb", "xadd%Zb %Ev,%Gv", NULL, NULL,
236: NULL, NULL, NULL, NULL,
237: "bswap%Zb %Eb,%Gb", "bswap%Zb %Ev,%Gv", NULL, NULL,
238: NULL, NULL, NULL, NULL,
239:
240: /* D */
241: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
242: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
243:
244: /* E */
245: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
246: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
247:
248: /* F */
249: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
250: NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
251: };
252:
253: /******************************************************************************/
254:
255: /*
256: * Intel groups 1 to 8.
257: */
258: char *grp_map[9][8] = {
259: /* grpStrMap[0][] is the %Ev case for grpStrMap[3][]. */
260: "test%Zv %Ev,%Iv", "test%Zv %Ev,%Iv,", "not%Zv %Ev", "neg%Zv %Ev",
261: "mul%Zv %eax,%Ev", "imul%Zv %eax,%Ev", "div%Zv %eax,%Ev", "idiv%Zv %eax,%Ev",
262:
263: /* grp[1][] */
264: "add", "or", "adc", "sbb", "and", "sub", "xor", "cmp",
265:
266: /* grp[2][] */
267: "rol", "ror", "rcl", "rcr", "shl", "shr", "shl", "sar",
268:
269: /* grp[3][] */
270: "test%Zb %Eb,%Ib", "test%Zb %Eb,%Ib,", "not%Zb %Eb", "neg%Zb %Eb",
271: "mul%Zb al,%Eb", "imul%Zb al,%Eb", "div%Zb al,%Eb", "idiv%Zb al,%Eb",
272:
273: /* grp[4][] */
274: "inc%Zb %Eb", "dec%Zb %Eb", NULL, NULL,
275: NULL, NULL, NULL, NULL,
276:
277: /* grp[5][] */
278: "inc%Zv %Ev", "dec%Zv %Ev", "icall %Ev", "ilcall %Ep",
279: "ijmp %Ev", "iljmp %Ep", "push%Zv %Ev", NULL,
280:
281: /* grp[6][] */
282: "sldt %Ew", "str %Ew", "lldt %Ew", "ltr %Ew",
283: "verr %Ew", "verw %Ew", NULL, NULL,
284:
285: /* grp[7][] */
286: "sgdt %Ms", "sidt %Ms", "lgdt%Zv %Ms", "lidt%Zv %Ms",
287: "smsw %Ew", NULL, "lmsw %Ew", "invlpg %Ms",
288:
289: /* grp[8][] */
290: NULL, NULL, NULL, NULL, "bt", "bts", "btr", "btc"
291: };
292:
293: /******************************************************************************/
294:
295: /*
296: * NDP opcode tables.
297: * Each opcode is preceded by an implicit 'f'.
298: */
299:
300: /* NDPtab[] is used with memory operand when mod!=3. */
301: char *NDP_op[8][8] = {
302: /* /0 /1 /2 /3 /4 /5 /6 /7 */
303: /* 0xD8 */ "adds", "muls", "coms", "comps", "subs", "subrs", "divs", "divrs",
304: /* 0xD9 */ "lds", NULL, "sts", "stps", "ldenv", "ldcw","nstenv", "nstcw",
305: /* 0xDA */ "iaddl", "imull", "icoml", "icompl", "isubl", "isubrl", "idivl", "idivrl",
306: /* 0xDB */ "ildl", NULL, "istl", "istpl", NULL, "ldt", NULL, "stpt",
307: /* 0xDC */ "addl", "mull", "coml", "compl", "subl", "subrl", "divl", "divrl",
308: /* 0xDD */ "ldl", NULL, "stl", "stpl", "rstor", NULL, "nsave", "stsw",
309: /* 0xDE */ "iadds", "imuls", "icoms", "icomps", "isubs", "isubrs", "idivs", "idivrs",
310: /* 0xDF */ "ilds", NULL, "ists", "istps", "bld", "ildll", "bstp", "istpll"
311: };
312:
313: /*
314: * NDPtab3[] is used when mod==3.
315: * The opcode always takes an NDP register from the r/m field as operand.
316: * The first character indicates NDP register operand format:
317: * 1 op takes one fpreg operand "%st(n)"
318: * 2 op takes operands "%st(0), %st(n)"
319: * 3 op takes operands "%st(n), %st(0)"
320: */
321: char *NDP_op_3[8][8] = {
322: /* 0xC0 0xC8 0xD0 0xD8 0xE0 0xE8 0xF0 0xF8 */
323: /* 0xD8 */ "2add", "2mul", "2com","1comp", "2sub", "2subr","2div", "2divr",
324: /* 0xD9 */ "1ld", "2xch", NULL, NULL, NULL, NULL, NULL, NULL,
325: /* 0xDA */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
326: /* 0xDB */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
327: /* 0xDC */ "3add", "3mul", NULL, NULL, "3sub", "3subr","3div", "3divr",
328: /* 0xDD */ "1free",NULL, "1st", "1stp", "3ucom","3ucomp", NULL, NULL,
329: /* 0xDE */ "3addp","3mulp",NULL, NULL, "3subp","3subrp","3divp","3divrp",
330: /* 0xDF */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
331: };
332:
333: /*
334: * NDP_misc_op[] is used when mod==3 and the NDP_op_3[][] contains NULL.
335: * This 0-terminated sorted list is searched linearly for the remaining opcodes;
336: * they are too sparse for efficient table lookup.
337: */
338: NDPMTAB NDP_misc_op[] = {
339: { 0xD9D0, "nop" },
340: { 0xD9E0, "chs" },
341: { 0xD9E1, "abs" },
342: { 0xD9E4, "tst" },
343: { 0xD9E5, "xam" },
344: { 0xD9E8, "ld1" },
345: { 0xD9E9, "ldl2t" },
346: { 0xD9EA, "ldl2e" },
347: { 0xD9EB, "ldpi" },
348: { 0xD9EC, "ldlg2" },
349: { 0xD9ED, "ldln2" },
350: { 0xD9EE, "ldz" },
351: { 0xD9F0, "2xm1" },
352: { 0xD9F1, "yl2x" },
353: { 0xD9F2, "ptan" },
354: { 0xD9F3, "patan" },
355: { 0xD9F4, "xtract" },
356: { 0xD9F5, "prem1" },
357: { 0xD9F6, "decstp" },
358: { 0xD9F7, "incstp" },
359: { 0xD9F8, "prem" },
360: { 0xD9F9, "yl2xp1" },
361: { 0xD9FA, "sqrt" },
362: { 0xD9FB, "sincos" },
363: { 0xD9FC, "rndint" },
364: { 0xD9FD, "scale" },
365: { 0xD9FE, "sin" },
366: { 0xD9FF, "cos" },
367: { 0xDAE9, "ucompp" },
368: { 0xDBE2, "nclex" },
369: { 0xDBE3, "ninit" },
370: { 0xDBE4, "setpm" },
371: { 0xDBF4, "rstpm" },
372: { 0xDED9, "compp" },
373: { 0xDFE0, "nstsw\t%ax" },
374: { 0, NULL }
375: };
376:
377: /******************************************************************************/
378:
379: /*
380: * i80386 registers.
381: */
382:
383: /* Segment registers. */
384: char *segReg[] = {"es", "cs", "ss", "ds", "fs", "gs" };
385:
386: /* General registers. */
387: char *genReg[3][8] = {
388: /* 0 1 2 3 4 5 6 7 */
389: /* [0] 8-bit */ "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
390: /* [1] 16-bit */ "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
391: /* [2] 32-bit */ "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi"
392: };
393:
394: /* Control registers. */
395: char *ctrlReg[] = {
396: "%cr0", "%cr1", "%cr2", "%cr3"
397: };
398:
399: /* Debug registers. */
400: char *dbgReg[] = {
401: "%dr0", "%dr1", "%dr2", "%dr3", "%dr4", "%dr5", "%dr6", "%dr7"
402: };
403:
404: /* Test registers. */
405: char *tstReg[] = {
406: NULL, NULL, NULL, NULL, NULL, NULL, "%tr6", "%tr7"
407: };
408:
409: /* NDP registers. */
410: char *NDPReg[] = {
411: "%st", "%st(1)", "%st(2)", "%st(3)", "%st(4)", "%st(5)", "%st(6)", "%st(7)"
412: };
413:
414: /******************************************************************************/
415:
416: /*
417: * Indirect addressing mode tables.
418: */
419:
420: /* 16 and 32 bit indirect addressing with the mod r/m byte. */
421: char *modRMtab[2][8] = {
422:
423: /* [0] 16 bit indirect addressing. */
424: "(%bx)(%si)", "(%bx)(%di)", "(%bp)(%si)", "(%bp)(%di)",
425: "(%si)", "(%di)", "(%bp)", "(%bx)",
426:
427: /* [1] 32 bit indirect addressing. */
428: "(%eax)", "(%ecx)", "(%edx)", "(%ebx)",
429: "(%esp)", "(%ebp)", "(%esi)", "(%edi)"
430: };
431:
432: /* 32 bit indirect indexed addressing forms with the SIB byte. */
433: char *sibtab[4][8] = {
434:
435: /* [0] scale by 1 */
436: "(%eax)", "(%ecx)", "(%edx)", "(%ebx)",
437: NULL, "(%ebp)", "(%esi)", "(%edi)",
438:
439: /* [1] scale by 2 */
440: "(%eax*2)", "(%ecx*2)", "(%edx*2)", "(%ebx*2)",
441: NULL, "(%ebp*2)", "(%esi*2)", "(%edi*2)",
442:
443: /* [2] scale by 4 */
444: "(%eax*4)", "(%ecx*4)", "(%edx*4)", "(%ebx*4)",
445: NULL, "(%ebp*4)", "(%esi*4)", "(%edi*4)",
446:
447: /* [3] scale by 8 */
448: "(%eax*8)", "(%ecx*8)", "(%edx*8)", "(%ebx*8)",
449: NULL, "(%ebp*8)", "(%esi*8)", "(%edi*8)"
450: };
451:
452: /******************************************************************************/
453:
454: /* end of db/i386/i386db3.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.