prim_asm.h 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970
  1. /****************************************************************************
  2. *
  3. * Realmode X86 Emulator Library
  4. *
  5. * Copyright (C) 1991-2004 SciTech Software, Inc.
  6. * Copyright (C) David Mosberger-Tang
  7. * Copyright (C) 1999 Egbert Eich
  8. *
  9. * ========================================================================
  10. *
  11. * Permission to use, copy, modify, distribute, and sell this software and
  12. * its documentation for any purpose is hereby granted without fee,
  13. * provided that the above copyright notice appear in all copies and that
  14. * both that copyright notice and this permission notice appear in
  15. * supporting documentation, and that the name of the authors not be used
  16. * in advertising or publicity pertaining to distribution of the software
  17. * without specific, written prior permission. The authors makes no
  18. * representations about the suitability of this software for any purpose.
  19. * It is provided "as is" without express or implied warranty.
  20. *
  21. * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  22. * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
  23. * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  24. * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
  25. * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
  26. * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  27. * PERFORMANCE OF THIS SOFTWARE.
  28. *
  29. * ========================================================================
  30. *
  31. * Language: Watcom C++ 10.6 or later
  32. * Environment: Any
  33. * Developer: Kendall Bennett
  34. *
  35. * Description: Inline assembler versions of the primitive operand
  36. * functions for faster performance. At the moment this is
  37. * x86 inline assembler, but these functions could be replaced
  38. * with native inline assembler for each supported processor
  39. * platform.
  40. *
  41. ****************************************************************************/
  42. #ifndef __X86EMU_PRIM_ASM_H
  43. #define __X86EMU_PRIM_ASM_H
  44. #ifdef __WATCOMC__
  45. #ifndef VALIDATE
  46. #define __HAVE_INLINE_ASSEMBLER__
  47. #endif
  48. u32 get_flags_asm(void);
  49. #pragma aux get_flags_asm = \
  50. "pushf" \
  51. "pop eax" \
  52. value [eax] \
  53. modify exact [eax];
  54. u16 aaa_word_asm(u32 * flags, u16 d);
  55. #pragma aux aaa_word_asm = \
  56. "push [edi]" \
  57. "popf" \
  58. "aaa" \
  59. "pushf" \
  60. "pop [edi]" \
  61. parm [edi] [ax] \
  62. value [ax] \
  63. modify exact [ax];
  64. u16 aas_word_asm(u32 * flags, u16 d);
  65. #pragma aux aas_word_asm = \
  66. "push [edi]" \
  67. "popf" \
  68. "aas" \
  69. "pushf" \
  70. "pop [edi]" \
  71. parm [edi] [ax] \
  72. value [ax] \
  73. modify exact [ax];
  74. u16 aad_word_asm(u32 * flags, u16 d);
  75. #pragma aux aad_word_asm = \
  76. "push [edi]" \
  77. "popf" \
  78. "aad" \
  79. "pushf" \
  80. "pop [edi]" \
  81. parm [edi] [ax] \
  82. value [ax] \
  83. modify exact [ax];
  84. u16 aam_word_asm(u32 * flags, u8 d);
  85. #pragma aux aam_word_asm = \
  86. "push [edi]" \
  87. "popf" \
  88. "aam" \
  89. "pushf" \
  90. "pop [edi]" \
  91. parm [edi] [al] \
  92. value [ax] \
  93. modify exact [ax];
  94. u8 adc_byte_asm(u32 * flags, u8 d, u8 s);
  95. #pragma aux adc_byte_asm = \
  96. "push [edi]" \
  97. "popf" \
  98. "adc al,bl" \
  99. "pushf" \
  100. "pop [edi]" \
  101. parm [edi] [al] [bl] \
  102. value [al] \
  103. modify exact [al bl];
  104. u16 adc_word_asm(u32 * flags, u16 d, u16 s);
  105. #pragma aux adc_word_asm = \
  106. "push [edi]" \
  107. "popf" \
  108. "adc ax,bx" \
  109. "pushf" \
  110. "pop [edi]" \
  111. parm [edi] [ax] [bx] \
  112. value [ax] \
  113. modify exact [ax bx];
  114. u32 adc_long_asm(u32 * flags, u32 d, u32 s);
  115. #pragma aux adc_long_asm = \
  116. "push [edi]" \
  117. "popf" \
  118. "adc eax,ebx" \
  119. "pushf" \
  120. "pop [edi]" \
  121. parm [edi] [eax] [ebx] \
  122. value [eax] \
  123. modify exact [eax ebx];
  124. u8 add_byte_asm(u32 * flags, u8 d, u8 s);
  125. #pragma aux add_byte_asm = \
  126. "push [edi]" \
  127. "popf" \
  128. "add al,bl" \
  129. "pushf" \
  130. "pop [edi]" \
  131. parm [edi] [al] [bl] \
  132. value [al] \
  133. modify exact [al bl];
  134. u16 add_word_asm(u32 * flags, u16 d, u16 s);
  135. #pragma aux add_word_asm = \
  136. "push [edi]" \
  137. "popf" \
  138. "add ax,bx" \
  139. "pushf" \
  140. "pop [edi]" \
  141. parm [edi] [ax] [bx] \
  142. value [ax] \
  143. modify exact [ax bx];
  144. u32 add_long_asm(u32 * flags, u32 d, u32 s);
  145. #pragma aux add_long_asm = \
  146. "push [edi]" \
  147. "popf" \
  148. "add eax,ebx" \
  149. "pushf" \
  150. "pop [edi]" \
  151. parm [edi] [eax] [ebx] \
  152. value [eax] \
  153. modify exact [eax ebx];
  154. u8 and_byte_asm(u32 * flags, u8 d, u8 s);
  155. #pragma aux and_byte_asm = \
  156. "push [edi]" \
  157. "popf" \
  158. "and al,bl" \
  159. "pushf" \
  160. "pop [edi]" \
  161. parm [edi] [al] [bl] \
  162. value [al] \
  163. modify exact [al bl];
  164. u16 and_word_asm(u32 * flags, u16 d, u16 s);
  165. #pragma aux and_word_asm = \
  166. "push [edi]" \
  167. "popf" \
  168. "and ax,bx" \
  169. "pushf" \
  170. "pop [edi]" \
  171. parm [edi] [ax] [bx] \
  172. value [ax] \
  173. modify exact [ax bx];
  174. u32 and_long_asm(u32 * flags, u32 d, u32 s);
  175. #pragma aux and_long_asm = \
  176. "push [edi]" \
  177. "popf" \
  178. "and eax,ebx" \
  179. "pushf" \
  180. "pop [edi]" \
  181. parm [edi] [eax] [ebx] \
  182. value [eax] \
  183. modify exact [eax ebx];
  184. u8 cmp_byte_asm(u32 * flags, u8 d, u8 s);
  185. #pragma aux cmp_byte_asm = \
  186. "push [edi]" \
  187. "popf" \
  188. "cmp al,bl" \
  189. "pushf" \
  190. "pop [edi]" \
  191. parm [edi] [al] [bl] \
  192. value [al] \
  193. modify exact [al bl];
  194. u16 cmp_word_asm(u32 * flags, u16 d, u16 s);
  195. #pragma aux cmp_word_asm = \
  196. "push [edi]" \
  197. "popf" \
  198. "cmp ax,bx" \
  199. "pushf" \
  200. "pop [edi]" \
  201. parm [edi] [ax] [bx] \
  202. value [ax] \
  203. modify exact [ax bx];
  204. u32 cmp_long_asm(u32 * flags, u32 d, u32 s);
  205. #pragma aux cmp_long_asm = \
  206. "push [edi]" \
  207. "popf" \
  208. "cmp eax,ebx" \
  209. "pushf" \
  210. "pop [edi]" \
  211. parm [edi] [eax] [ebx] \
  212. value [eax] \
  213. modify exact [eax ebx];
  214. u8 daa_byte_asm(u32 * flags, u8 d);
  215. #pragma aux daa_byte_asm = \
  216. "push [edi]" \
  217. "popf" \
  218. "daa" \
  219. "pushf" \
  220. "pop [edi]" \
  221. parm [edi] [al] \
  222. value [al] \
  223. modify exact [al];
  224. u8 das_byte_asm(u32 * flags, u8 d);
  225. #pragma aux das_byte_asm = \
  226. "push [edi]" \
  227. "popf" \
  228. "das" \
  229. "pushf" \
  230. "pop [edi]" \
  231. parm [edi] [al] \
  232. value [al] \
  233. modify exact [al];
  234. u8 dec_byte_asm(u32 * flags, u8 d);
  235. #pragma aux dec_byte_asm = \
  236. "push [edi]" \
  237. "popf" \
  238. "dec al" \
  239. "pushf" \
  240. "pop [edi]" \
  241. parm [edi] [al] \
  242. value [al] \
  243. modify exact [al];
  244. u16 dec_word_asm(u32 * flags, u16 d);
  245. #pragma aux dec_word_asm = \
  246. "push [edi]" \
  247. "popf" \
  248. "dec ax" \
  249. "pushf" \
  250. "pop [edi]" \
  251. parm [edi] [ax] \
  252. value [ax] \
  253. modify exact [ax];
  254. u32 dec_long_asm(u32 * flags, u32 d);
  255. #pragma aux dec_long_asm = \
  256. "push [edi]" \
  257. "popf" \
  258. "dec eax" \
  259. "pushf" \
  260. "pop [edi]" \
  261. parm [edi] [eax] \
  262. value [eax] \
  263. modify exact [eax];
  264. u8 inc_byte_asm(u32 * flags, u8 d);
  265. #pragma aux inc_byte_asm = \
  266. "push [edi]" \
  267. "popf" \
  268. "inc al" \
  269. "pushf" \
  270. "pop [edi]" \
  271. parm [edi] [al] \
  272. value [al] \
  273. modify exact [al];
  274. u16 inc_word_asm(u32 * flags, u16 d);
  275. #pragma aux inc_word_asm = \
  276. "push [edi]" \
  277. "popf" \
  278. "inc ax" \
  279. "pushf" \
  280. "pop [edi]" \
  281. parm [edi] [ax] \
  282. value [ax] \
  283. modify exact [ax];
  284. u32 inc_long_asm(u32 * flags, u32 d);
  285. #pragma aux inc_long_asm = \
  286. "push [edi]" \
  287. "popf" \
  288. "inc eax" \
  289. "pushf" \
  290. "pop [edi]" \
  291. parm [edi] [eax] \
  292. value [eax] \
  293. modify exact [eax];
  294. u8 or_byte_asm(u32 * flags, u8 d, u8 s);
  295. #pragma aux or_byte_asm = \
  296. "push [edi]" \
  297. "popf" \
  298. "or al,bl" \
  299. "pushf" \
  300. "pop [edi]" \
  301. parm [edi] [al] [bl] \
  302. value [al] \
  303. modify exact [al bl];
  304. u16 or_word_asm(u32 * flags, u16 d, u16 s);
  305. #pragma aux or_word_asm = \
  306. "push [edi]" \
  307. "popf" \
  308. "or ax,bx" \
  309. "pushf" \
  310. "pop [edi]" \
  311. parm [edi] [ax] [bx] \
  312. value [ax] \
  313. modify exact [ax bx];
  314. u32 or_long_asm(u32 * flags, u32 d, u32 s);
  315. #pragma aux or_long_asm = \
  316. "push [edi]" \
  317. "popf" \
  318. "or eax,ebx" \
  319. "pushf" \
  320. "pop [edi]" \
  321. parm [edi] [eax] [ebx] \
  322. value [eax] \
  323. modify exact [eax ebx];
  324. u8 neg_byte_asm(u32 * flags, u8 d);
  325. #pragma aux neg_byte_asm = \
  326. "push [edi]" \
  327. "popf" \
  328. "neg al" \
  329. "pushf" \
  330. "pop [edi]" \
  331. parm [edi] [al] \
  332. value [al] \
  333. modify exact [al];
  334. u16 neg_word_asm(u32 * flags, u16 d);
  335. #pragma aux neg_word_asm = \
  336. "push [edi]" \
  337. "popf" \
  338. "neg ax" \
  339. "pushf" \
  340. "pop [edi]" \
  341. parm [edi] [ax] \
  342. value [ax] \
  343. modify exact [ax];
  344. u32 neg_long_asm(u32 * flags, u32 d);
  345. #pragma aux neg_long_asm = \
  346. "push [edi]" \
  347. "popf" \
  348. "neg eax" \
  349. "pushf" \
  350. "pop [edi]" \
  351. parm [edi] [eax] \
  352. value [eax] \
  353. modify exact [eax];
  354. u8 not_byte_asm(u32 * flags, u8 d);
  355. #pragma aux not_byte_asm = \
  356. "push [edi]" \
  357. "popf" \
  358. "not al" \
  359. "pushf" \
  360. "pop [edi]" \
  361. parm [edi] [al] \
  362. value [al] \
  363. modify exact [al];
  364. u16 not_word_asm(u32 * flags, u16 d);
  365. #pragma aux not_word_asm = \
  366. "push [edi]" \
  367. "popf" \
  368. "not ax" \
  369. "pushf" \
  370. "pop [edi]" \
  371. parm [edi] [ax] \
  372. value [ax] \
  373. modify exact [ax];
  374. u32 not_long_asm(u32 * flags, u32 d);
  375. #pragma aux not_long_asm = \
  376. "push [edi]" \
  377. "popf" \
  378. "not eax" \
  379. "pushf" \
  380. "pop [edi]" \
  381. parm [edi] [eax] \
  382. value [eax] \
  383. modify exact [eax];
  384. u8 rcl_byte_asm(u32 * flags, u8 d, u8 s);
  385. #pragma aux rcl_byte_asm = \
  386. "push [edi]" \
  387. "popf" \
  388. "rcl al,cl" \
  389. "pushf" \
  390. "pop [edi]" \
  391. parm [edi] [al] [cl] \
  392. value [al] \
  393. modify exact [al cl];
  394. u16 rcl_word_asm(u32 * flags, u16 d, u8 s);
  395. #pragma aux rcl_word_asm = \
  396. "push [edi]" \
  397. "popf" \
  398. "rcl ax,cl" \
  399. "pushf" \
  400. "pop [edi]" \
  401. parm [edi] [ax] [cl] \
  402. value [ax] \
  403. modify exact [ax cl];
  404. u32 rcl_long_asm(u32 * flags, u32 d, u8 s);
  405. #pragma aux rcl_long_asm = \
  406. "push [edi]" \
  407. "popf" \
  408. "rcl eax,cl" \
  409. "pushf" \
  410. "pop [edi]" \
  411. parm [edi] [eax] [cl] \
  412. value [eax] \
  413. modify exact [eax cl];
  414. u8 rcr_byte_asm(u32 * flags, u8 d, u8 s);
  415. #pragma aux rcr_byte_asm = \
  416. "push [edi]" \
  417. "popf" \
  418. "rcr al,cl" \
  419. "pushf" \
  420. "pop [edi]" \
  421. parm [edi] [al] [cl] \
  422. value [al] \
  423. modify exact [al cl];
  424. u16 rcr_word_asm(u32 * flags, u16 d, u8 s);
  425. #pragma aux rcr_word_asm = \
  426. "push [edi]" \
  427. "popf" \
  428. "rcr ax,cl" \
  429. "pushf" \
  430. "pop [edi]" \
  431. parm [edi] [ax] [cl] \
  432. value [ax] \
  433. modify exact [ax cl];
  434. u32 rcr_long_asm(u32 * flags, u32 d, u8 s);
  435. #pragma aux rcr_long_asm = \
  436. "push [edi]" \
  437. "popf" \
  438. "rcr eax,cl" \
  439. "pushf" \
  440. "pop [edi]" \
  441. parm [edi] [eax] [cl] \
  442. value [eax] \
  443. modify exact [eax cl];
  444. u8 rol_byte_asm(u32 * flags, u8 d, u8 s);
  445. #pragma aux rol_byte_asm = \
  446. "push [edi]" \
  447. "popf" \
  448. "rol al,cl" \
  449. "pushf" \
  450. "pop [edi]" \
  451. parm [edi] [al] [cl] \
  452. value [al] \
  453. modify exact [al cl];
  454. u16 rol_word_asm(u32 * flags, u16 d, u8 s);
  455. #pragma aux rol_word_asm = \
  456. "push [edi]" \
  457. "popf" \
  458. "rol ax,cl" \
  459. "pushf" \
  460. "pop [edi]" \
  461. parm [edi] [ax] [cl] \
  462. value [ax] \
  463. modify exact [ax cl];
  464. u32 rol_long_asm(u32 * flags, u32 d, u8 s);
  465. #pragma aux rol_long_asm = \
  466. "push [edi]" \
  467. "popf" \
  468. "rol eax,cl" \
  469. "pushf" \
  470. "pop [edi]" \
  471. parm [edi] [eax] [cl] \
  472. value [eax] \
  473. modify exact [eax cl];
  474. u8 ror_byte_asm(u32 * flags, u8 d, u8 s);
  475. #pragma aux ror_byte_asm = \
  476. "push [edi]" \
  477. "popf" \
  478. "ror al,cl" \
  479. "pushf" \
  480. "pop [edi]" \
  481. parm [edi] [al] [cl] \
  482. value [al] \
  483. modify exact [al cl];
  484. u16 ror_word_asm(u32 * flags, u16 d, u8 s);
  485. #pragma aux ror_word_asm = \
  486. "push [edi]" \
  487. "popf" \
  488. "ror ax,cl" \
  489. "pushf" \
  490. "pop [edi]" \
  491. parm [edi] [ax] [cl] \
  492. value [ax] \
  493. modify exact [ax cl];
  494. u32 ror_long_asm(u32 * flags, u32 d, u8 s);
  495. #pragma aux ror_long_asm = \
  496. "push [edi]" \
  497. "popf" \
  498. "ror eax,cl" \
  499. "pushf" \
  500. "pop [edi]" \
  501. parm [edi] [eax] [cl] \
  502. value [eax] \
  503. modify exact [eax cl];
  504. u8 shl_byte_asm(u32 * flags, u8 d, u8 s);
  505. #pragma aux shl_byte_asm = \
  506. "push [edi]" \
  507. "popf" \
  508. "shl al,cl" \
  509. "pushf" \
  510. "pop [edi]" \
  511. parm [edi] [al] [cl] \
  512. value [al] \
  513. modify exact [al cl];
  514. u16 shl_word_asm(u32 * flags, u16 d, u8 s);
  515. #pragma aux shl_word_asm = \
  516. "push [edi]" \
  517. "popf" \
  518. "shl ax,cl" \
  519. "pushf" \
  520. "pop [edi]" \
  521. parm [edi] [ax] [cl] \
  522. value [ax] \
  523. modify exact [ax cl];
  524. u32 shl_long_asm(u32 * flags, u32 d, u8 s);
  525. #pragma aux shl_long_asm = \
  526. "push [edi]" \
  527. "popf" \
  528. "shl eax,cl" \
  529. "pushf" \
  530. "pop [edi]" \
  531. parm [edi] [eax] [cl] \
  532. value [eax] \
  533. modify exact [eax cl];
  534. u8 shr_byte_asm(u32 * flags, u8 d, u8 s);
  535. #pragma aux shr_byte_asm = \
  536. "push [edi]" \
  537. "popf" \
  538. "shr al,cl" \
  539. "pushf" \
  540. "pop [edi]" \
  541. parm [edi] [al] [cl] \
  542. value [al] \
  543. modify exact [al cl];
  544. u16 shr_word_asm(u32 * flags, u16 d, u8 s);
  545. #pragma aux shr_word_asm = \
  546. "push [edi]" \
  547. "popf" \
  548. "shr ax,cl" \
  549. "pushf" \
  550. "pop [edi]" \
  551. parm [edi] [ax] [cl] \
  552. value [ax] \
  553. modify exact [ax cl];
  554. u32 shr_long_asm(u32 * flags, u32 d, u8 s);
  555. #pragma aux shr_long_asm = \
  556. "push [edi]" \
  557. "popf" \
  558. "shr eax,cl" \
  559. "pushf" \
  560. "pop [edi]" \
  561. parm [edi] [eax] [cl] \
  562. value [eax] \
  563. modify exact [eax cl];
  564. u8 sar_byte_asm(u32 * flags, u8 d, u8 s);
  565. #pragma aux sar_byte_asm = \
  566. "push [edi]" \
  567. "popf" \
  568. "sar al,cl" \
  569. "pushf" \
  570. "pop [edi]" \
  571. parm [edi] [al] [cl] \
  572. value [al] \
  573. modify exact [al cl];
  574. u16 sar_word_asm(u32 * flags, u16 d, u8 s);
  575. #pragma aux sar_word_asm = \
  576. "push [edi]" \
  577. "popf" \
  578. "sar ax,cl" \
  579. "pushf" \
  580. "pop [edi]" \
  581. parm [edi] [ax] [cl] \
  582. value [ax] \
  583. modify exact [ax cl];
  584. u32 sar_long_asm(u32 * flags, u32 d, u8 s);
  585. #pragma aux sar_long_asm = \
  586. "push [edi]" \
  587. "popf" \
  588. "sar eax,cl" \
  589. "pushf" \
  590. "pop [edi]" \
  591. parm [edi] [eax] [cl] \
  592. value [eax] \
  593. modify exact [eax cl];
  594. u16 shld_word_asm(u32 * flags, u16 d, u16 fill, u8 s);
  595. #pragma aux shld_word_asm = \
  596. "push [edi]" \
  597. "popf" \
  598. "shld ax,dx,cl" \
  599. "pushf" \
  600. "pop [edi]" \
  601. parm [edi] [ax] [dx] [cl] \
  602. value [ax] \
  603. modify exact [ax dx cl];
  604. u32 shld_long_asm(u32 * flags, u32 d, u32 fill, u8 s);
  605. #pragma aux shld_long_asm = \
  606. "push [edi]" \
  607. "popf" \
  608. "shld eax,edx,cl" \
  609. "pushf" \
  610. "pop [edi]" \
  611. parm [edi] [eax] [edx] [cl] \
  612. value [eax] \
  613. modify exact [eax edx cl];
  614. u16 shrd_word_asm(u32 * flags, u16 d, u16 fill, u8 s);
  615. #pragma aux shrd_word_asm = \
  616. "push [edi]" \
  617. "popf" \
  618. "shrd ax,dx,cl" \
  619. "pushf" \
  620. "pop [edi]" \
  621. parm [edi] [ax] [dx] [cl] \
  622. value [ax] \
  623. modify exact [ax dx cl];
  624. u32 shrd_long_asm(u32 * flags, u32 d, u32 fill, u8 s);
  625. #pragma aux shrd_long_asm = \
  626. "push [edi]" \
  627. "popf" \
  628. "shrd eax,edx,cl" \
  629. "pushf" \
  630. "pop [edi]" \
  631. parm [edi] [eax] [edx] [cl] \
  632. value [eax] \
  633. modify exact [eax edx cl];
  634. u8 sbb_byte_asm(u32 * flags, u8 d, u8 s);
  635. #pragma aux sbb_byte_asm = \
  636. "push [edi]" \
  637. "popf" \
  638. "sbb al,bl" \
  639. "pushf" \
  640. "pop [edi]" \
  641. parm [edi] [al] [bl] \
  642. value [al] \
  643. modify exact [al bl];
  644. u16 sbb_word_asm(u32 * flags, u16 d, u16 s);
  645. #pragma aux sbb_word_asm = \
  646. "push [edi]" \
  647. "popf" \
  648. "sbb ax,bx" \
  649. "pushf" \
  650. "pop [edi]" \
  651. parm [edi] [ax] [bx] \
  652. value [ax] \
  653. modify exact [ax bx];
  654. u32 sbb_long_asm(u32 * flags, u32 d, u32 s);
  655. #pragma aux sbb_long_asm = \
  656. "push [edi]" \
  657. "popf" \
  658. "sbb eax,ebx" \
  659. "pushf" \
  660. "pop [edi]" \
  661. parm [edi] [eax] [ebx] \
  662. value [eax] \
  663. modify exact [eax ebx];
  664. u8 sub_byte_asm(u32 * flags, u8 d, u8 s);
  665. #pragma aux sub_byte_asm = \
  666. "push [edi]" \
  667. "popf" \
  668. "sub al,bl" \
  669. "pushf" \
  670. "pop [edi]" \
  671. parm [edi] [al] [bl] \
  672. value [al] \
  673. modify exact [al bl];
  674. u16 sub_word_asm(u32 * flags, u16 d, u16 s);
  675. #pragma aux sub_word_asm = \
  676. "push [edi]" \
  677. "popf" \
  678. "sub ax,bx" \
  679. "pushf" \
  680. "pop [edi]" \
  681. parm [edi] [ax] [bx] \
  682. value [ax] \
  683. modify exact [ax bx];
  684. u32 sub_long_asm(u32 * flags, u32 d, u32 s);
  685. #pragma aux sub_long_asm = \
  686. "push [edi]" \
  687. "popf" \
  688. "sub eax,ebx" \
  689. "pushf" \
  690. "pop [edi]" \
  691. parm [edi] [eax] [ebx] \
  692. value [eax] \
  693. modify exact [eax ebx];
  694. void test_byte_asm(u32 * flags, u8 d, u8 s);
  695. #pragma aux test_byte_asm = \
  696. "push [edi]" \
  697. "popf" \
  698. "test al,bl" \
  699. "pushf" \
  700. "pop [edi]" \
  701. parm [edi] [al] [bl] \
  702. modify exact [al bl];
  703. void test_word_asm(u32 * flags, u16 d, u16 s);
  704. #pragma aux test_word_asm = \
  705. "push [edi]" \
  706. "popf" \
  707. "test ax,bx" \
  708. "pushf" \
  709. "pop [edi]" \
  710. parm [edi] [ax] [bx] \
  711. modify exact [ax bx];
  712. void test_long_asm(u32 * flags, u32 d, u32 s);
  713. #pragma aux test_long_asm = \
  714. "push [edi]" \
  715. "popf" \
  716. "test eax,ebx" \
  717. "pushf" \
  718. "pop [edi]" \
  719. parm [edi] [eax] [ebx] \
  720. modify exact [eax ebx];
  721. u8 xor_byte_asm(u32 * flags, u8 d, u8 s);
  722. #pragma aux xor_byte_asm = \
  723. "push [edi]" \
  724. "popf" \
  725. "xor al,bl" \
  726. "pushf" \
  727. "pop [edi]" \
  728. parm [edi] [al] [bl] \
  729. value [al] \
  730. modify exact [al bl];
  731. u16 xor_word_asm(u32 * flags, u16 d, u16 s);
  732. #pragma aux xor_word_asm = \
  733. "push [edi]" \
  734. "popf" \
  735. "xor ax,bx" \
  736. "pushf" \
  737. "pop [edi]" \
  738. parm [edi] [ax] [bx] \
  739. value [ax] \
  740. modify exact [ax bx];
  741. u32 xor_long_asm(u32 * flags, u32 d, u32 s);
  742. #pragma aux xor_long_asm = \
  743. "push [edi]" \
  744. "popf" \
  745. "xor eax,ebx" \
  746. "pushf" \
  747. "pop [edi]" \
  748. parm [edi] [eax] [ebx] \
  749. value [eax] \
  750. modify exact [eax ebx];
  751. void imul_byte_asm(u32 * flags, u16 * ax, u8 d, u8 s);
  752. #pragma aux imul_byte_asm = \
  753. "push [edi]" \
  754. "popf" \
  755. "imul bl" \
  756. "pushf" \
  757. "pop [edi]" \
  758. "mov [esi],ax" \
  759. parm [edi] [esi] [al] [bl] \
  760. modify exact [esi ax bl];
  761. void imul_word_asm(u32 * flags, u16 * ax, u16 * dx, u16 d, u16 s);
  762. #pragma aux imul_word_asm = \
  763. "push [edi]" \
  764. "popf" \
  765. "imul bx" \
  766. "pushf" \
  767. "pop [edi]" \
  768. "mov [esi],ax" \
  769. "mov [ecx],dx" \
  770. parm [edi] [esi] [ecx] [ax] [bx]\
  771. modify exact [esi edi ax bx dx];
  772. void imul_long_asm(u32 * flags, u32 * eax, u32 * edx, u32 d, u32 s);
  773. #pragma aux imul_long_asm = \
  774. "push [edi]" \
  775. "popf" \
  776. "imul ebx" \
  777. "pushf" \
  778. "pop [edi]" \
  779. "mov [esi],eax" \
  780. "mov [ecx],edx" \
  781. parm [edi] [esi] [ecx] [eax] [ebx] \
  782. modify exact [esi edi eax ebx edx];
  783. void mul_byte_asm(u32 * flags, u16 * ax, u8 d, u8 s);
  784. #pragma aux mul_byte_asm = \
  785. "push [edi]" \
  786. "popf" \
  787. "mul bl" \
  788. "pushf" \
  789. "pop [edi]" \
  790. "mov [esi],ax" \
  791. parm [edi] [esi] [al] [bl] \
  792. modify exact [esi ax bl];
  793. void mul_word_asm(u32 * flags, u16 * ax, u16 * dx, u16 d, u16 s);
  794. #pragma aux mul_word_asm = \
  795. "push [edi]" \
  796. "popf" \
  797. "mul bx" \
  798. "pushf" \
  799. "pop [edi]" \
  800. "mov [esi],ax" \
  801. "mov [ecx],dx" \
  802. parm [edi] [esi] [ecx] [ax] [bx]\
  803. modify exact [esi edi ax bx dx];
  804. void mul_long_asm(u32 * flags, u32 * eax, u32 * edx, u32 d, u32 s);
  805. #pragma aux mul_long_asm = \
  806. "push [edi]" \
  807. "popf" \
  808. "mul ebx" \
  809. "pushf" \
  810. "pop [edi]" \
  811. "mov [esi],eax" \
  812. "mov [ecx],edx" \
  813. parm [edi] [esi] [ecx] [eax] [ebx] \
  814. modify exact [esi edi eax ebx edx];
  815. void idiv_byte_asm(u32 * flags, u8 * al, u8 * ah, u16 d, u8 s);
  816. #pragma aux idiv_byte_asm = \
  817. "push [edi]" \
  818. "popf" \
  819. "idiv bl" \
  820. "pushf" \
  821. "pop [edi]" \
  822. "mov [esi],al" \
  823. "mov [ecx],ah" \
  824. parm [edi] [esi] [ecx] [ax] [bl]\
  825. modify exact [esi edi ax bl];
  826. void idiv_word_asm(u32 * flags, u16 * ax, u16 * dx, u16 dlo, u16 dhi, u16 s);
  827. #pragma aux idiv_word_asm = \
  828. "push [edi]" \
  829. "popf" \
  830. "idiv bx" \
  831. "pushf" \
  832. "pop [edi]" \
  833. "mov [esi],ax" \
  834. "mov [ecx],dx" \
  835. parm [edi] [esi] [ecx] [ax] [dx] [bx]\
  836. modify exact [esi edi ax dx bx];
  837. void idiv_long_asm(u32 * flags, u32 * eax, u32 * edx, u32 dlo, u32 dhi, u32 s);
  838. #pragma aux idiv_long_asm = \
  839. "push [edi]" \
  840. "popf" \
  841. "idiv ebx" \
  842. "pushf" \
  843. "pop [edi]" \
  844. "mov [esi],eax" \
  845. "mov [ecx],edx" \
  846. parm [edi] [esi] [ecx] [eax] [edx] [ebx]\
  847. modify exact [esi edi eax edx ebx];
  848. void div_byte_asm(u32 * flags, u8 * al, u8 * ah, u16 d, u8 s);
  849. #pragma aux div_byte_asm = \
  850. "push [edi]" \
  851. "popf" \
  852. "div bl" \
  853. "pushf" \
  854. "pop [edi]" \
  855. "mov [esi],al" \
  856. "mov [ecx],ah" \
  857. parm [edi] [esi] [ecx] [ax] [bl]\
  858. modify exact [esi edi ax bl];
  859. void div_word_asm(u32 * flags, u16 * ax, u16 * dx, u16 dlo, u16 dhi, u16 s);
  860. #pragma aux div_word_asm = \
  861. "push [edi]" \
  862. "popf" \
  863. "div bx" \
  864. "pushf" \
  865. "pop [edi]" \
  866. "mov [esi],ax" \
  867. "mov [ecx],dx" \
  868. parm [edi] [esi] [ecx] [ax] [dx] [bx]\
  869. modify exact [esi edi ax dx bx];
  870. void div_long_asm(u32 * flags, u32 * eax, u32 * edx, u32 dlo, u32 dhi, u32 s);
  871. #pragma aux div_long_asm = \
  872. "push [edi]" \
  873. "popf" \
  874. "div ebx" \
  875. "pushf" \
  876. "pop [edi]" \
  877. "mov [esi],eax" \
  878. "mov [ecx],edx" \
  879. parm [edi] [esi] [ecx] [eax] [edx] [ebx]\
  880. modify exact [esi edi eax edx ebx];
  881. #endif
  882. #endif /* __X86EMU_PRIM_ASM_H */