1
0

asm-nseel-x86-msvc.c 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463
  1. // THIS FILE AUTOGENERATED FROM asm-nseel-x86-gcc.c by a2i.php
  2. #if EEL_F_SIZE == 8
  3. #define EEL_ASM_TYPE qword ptr
  4. #else
  5. #define EEL_ASM_TYPE dword ptr
  6. #endif
  7. #if defined(__APPLE__)
  8. #define SAVE_STACK "pushl %ebp\nmovl %esp, %ebp\nandl $-16, %esp\n"
  9. #define RESTORE_STACK "leave\n"
  10. #else
  11. #define SAVE_STACK
  12. #define RESTORE_STACK
  13. #endif
  14. /* note: only EEL_F_SIZE=8 is now supported (no float EEL_F's) */
  15. __declspec(naked) void nseel_asm_1pdd(void)
  16. {
  17. __asm {
  18. SAVE_STACK
  19. #ifdef TARGET_X64
  20. movq xmm0, [eax];
  21. sub rsp, 128;
  22. mov edi, 0xffffffff;
  23. #ifdef AMD64ABI
  24. mov r15, rsi;
  25. call edi;
  26. mov rsi, r15;
  27. movq [r15], xmm0;
  28. #else
  29. call edi;
  30. movq [esi], xmm0;
  31. #endif
  32. add rsp, 128;
  33. #else
  34. sub esp, 8; /* keep stack aligned */
  35. push dword ptr [eax+4]; /* push parameter */
  36. push dword ptr [eax]; /* push the rest of the parameter */
  37. mov edi, 0xffffffff;
  38. call edi;
  39. fstp qword ptr [esi]; /* store result */
  40. add esp, 16;
  41. #endif
  42. mov eax, esi; /* set return value */
  43. add esi, 8; /* advance worktab ptr */
  44. RESTORE_STACK
  45. _emit 0x89;
  46. _emit 0x90;
  47. _emit 0x90;
  48. _emit 0x90;
  49. _emit 0x90;
  50. _emit 0x90;
  51. _emit 0x90;
  52. _emit 0x90;
  53. _emit 0x90;
  54. _emit 0x90;
  55. _emit 0x90;
  56. _emit 0x90;
  57. }
  58. }
  59. __declspec(naked) void nseel_asm_1pdd_end(void){}
  60. __declspec(naked) void nseel_asm_2pdd(void)
  61. {
  62. __asm {
  63. SAVE_STACK
  64. #ifdef TARGET_X64
  65. movq xmm1, [eax];
  66. movq xmm0, [edi];
  67. sub rsp, 128;
  68. mov edi, 0xffffffff;
  69. #ifdef AMD64ABI
  70. mov r15, rsi;
  71. call edi;
  72. mov rsi, r15;
  73. movq [r15], xmm0;
  74. #else
  75. call edi;
  76. movq [esi], xmm0;
  77. #endif
  78. add rsp, 128;
  79. #else
  80. push dword ptr [eax+4]; /* push parameter */
  81. push dword ptr [eax]; /* push the rest of the parameter */
  82. push dword ptr [edi+4]; /* push parameter */
  83. push dword ptr [edi]; /* push the rest of the parameter */
  84. mov edi, 0xffffffff;
  85. call edi;
  86. fstp qword ptr [esi]; /* store result */
  87. add esp, 16;
  88. #endif
  89. mov eax, esi; /* set return value */
  90. add esi, 8; /* advance worktab ptr */
  91. RESTORE_STACK
  92. _emit 0x89;
  93. _emit 0x90;
  94. _emit 0x90;
  95. _emit 0x90;
  96. _emit 0x90;
  97. _emit 0x90;
  98. _emit 0x90;
  99. _emit 0x90;
  100. _emit 0x90;
  101. _emit 0x90;
  102. _emit 0x90;
  103. _emit 0x90;
  104. }
  105. }
  106. __declspec(naked) void nseel_asm_2pdd_end(void){}
  107. __declspec(naked) void nseel_asm_2pdds(void)
  108. {
  109. __asm {
  110. SAVE_STACK
  111. #ifdef TARGET_X64
  112. movq xmm1, [eax];
  113. movq xmm0, [edi];
  114. sub rsp, 128;
  115. mov eax, 0xffffffff;
  116. #ifdef AMD64ABI
  117. mov r15, rsi;
  118. mov r14, rdi;
  119. call eax;
  120. mov rsi, r15;
  121. movq [r14], xmm0;
  122. mov rax, r14; /* set return value */
  123. #else
  124. call eax;
  125. movq [edi], xmm0;
  126. mov eax, edi; /* set return value */
  127. #endif
  128. sub rsp, 128;
  129. #else
  130. push dword ptr [eax+4]; /* push parameter */
  131. push dword ptr [eax]; /* push the rest of the parameter */
  132. push dword ptr [edi+4]; /* push parameter */
  133. push dword ptr [edi]; /* push the rest of the parameter */
  134. mov eax, 0xffffffff;
  135. call eax;
  136. fstp qword ptr [edi]; /* store result */
  137. add esp, 16;
  138. mov eax, edi; /* set return value */
  139. #endif
  140. RESTORE_STACK
  141. _emit 0x89;
  142. _emit 0x90;
  143. _emit 0x90;
  144. _emit 0x90;
  145. _emit 0x90;
  146. _emit 0x90;
  147. _emit 0x90;
  148. _emit 0x90;
  149. _emit 0x90;
  150. _emit 0x90;
  151. _emit 0x90;
  152. _emit 0x90;
  153. }
  154. }
  155. __declspec(naked) void nseel_asm_2pdds_end(void){}
  156. __declspec(naked) void nseel_asm_2pp(void)
  157. {
  158. __asm {
  159. SAVE_STACK
  160. #ifdef TARGET_X64
  161. #ifdef AMD64ABI
  162. mov r15, rsi;
  163. /* rdi is first parameter */
  164. mov rsi, rax;
  165. sub rsp, 128;
  166. mov eax, 0xffffffff;
  167. call eax;
  168. mov rsi, r15;
  169. movq [r15], xmm0;
  170. #else
  171. mov ecx, edi;
  172. mov edx, eax;
  173. sub rsp, 128;
  174. mov edi, 0xffffffff;
  175. call edi;
  176. movq [esi], xmm0;
  177. #endif
  178. add rsp, 128;
  179. #else
  180. sub esp, 8; /* keep stack aligned */
  181. push eax; /* push parameter */
  182. push edi; /* push second parameter */
  183. mov edi, 0xffffffff;
  184. call edi;
  185. fstp EEL_ASM_TYPE [esi]; /* store result */
  186. add esp, 16;
  187. #endif
  188. mov eax, esi; /* set return value */
  189. add esi, EEL_F_SIZE; /* advance worktab ptr */
  190. RESTORE_STACK
  191. _emit 0x89;
  192. _emit 0x90;
  193. _emit 0x90;
  194. _emit 0x90;
  195. _emit 0x90;
  196. _emit 0x90;
  197. _emit 0x90;
  198. _emit 0x90;
  199. _emit 0x90;
  200. _emit 0x90;
  201. _emit 0x90;
  202. _emit 0x90;
  203. }
  204. }
  205. __declspec(naked) void nseel_asm_2pp_end(void) {}
  206. __declspec(naked) void nseel_asm_1pp(void)
  207. {
  208. __asm {
  209. SAVE_STACK
  210. #ifdef TARGET_X64
  211. #ifdef AMD64ABI
  212. mov r15, rsi;
  213. mov edi, eax;
  214. sub rsp, 128;
  215. mov rax, 0xffffffff;
  216. call rax;
  217. mov rsi, r15;
  218. movq [r15], xmm0;
  219. #else
  220. mov ecx, eax;
  221. sub rsp, 128;
  222. mov edi, 0xffffffff;
  223. call edi;
  224. movq [esi], xmm0;
  225. #endif
  226. add rsp, 128;
  227. #else
  228. sub esp, 12; /* keep stack aligned */
  229. push eax; /* push parameter */
  230. mov edi, 0xffffffff;
  231. call edi;
  232. fstp EEL_ASM_TYPE [esi]; /* store result */
  233. add esp, 16;
  234. #endif
  235. mov eax, esi; /* set return value */
  236. add esi, EEL_F_SIZE; /* advance worktab ptr */
  237. RESTORE_STACK
  238. _emit 0x89;
  239. _emit 0x90;
  240. _emit 0x90;
  241. _emit 0x90;
  242. _emit 0x90;
  243. _emit 0x90;
  244. _emit 0x90;
  245. _emit 0x90;
  246. _emit 0x90;
  247. _emit 0x90;
  248. _emit 0x90;
  249. _emit 0x90;
  250. }
  251. }
  252. __declspec(naked) void nseel_asm_1pp_end(void){}
  253. //---------------------------------------------------------------------------------------------------------------
  254. // do nothing, eh
  255. __declspec(naked) void nseel_asm_exec2(void)
  256. {
  257. __asm {
  258. _emit 0x89;
  259. _emit 0x90;
  260. _emit 0x90;
  261. _emit 0x90;
  262. _emit 0x90;
  263. _emit 0x90;
  264. _emit 0x90;
  265. _emit 0x90;
  266. _emit 0x90;
  267. _emit 0x90;
  268. _emit 0x90;
  269. _emit 0x90;
  270. }
  271. }
  272. __declspec(naked) void nseel_asm_exec2_end(void) { }
  273. __declspec(naked) void nseel_asm_invsqrt(void)
  274. {
  275. __asm {
  276. fld EEL_ASM_TYPE [eax];
  277. mov edx, 0x5f3759df;
  278. fst dword ptr [esi];
  279. #ifdef TARGET_X64
  280. mov rax, 0xffffffff;
  281. sub ecx, ecx;
  282. fmul EEL_ASM_TYPE [rax];
  283. #else
  284. #if EEL_F_SIZE == 8
  285. _emit 0xDC; // fmul qword ptr [0xffffffff]
  286. _emit 0x0D;
  287. _emit 0xFF;
  288. _emit 0xFF;
  289. _emit 0xFF;
  290. _emit 0xFF;
  291. #else
  292. _emit 0xD8; // fmul dword ptr [0xffffffff]
  293. _emit 0x0D;
  294. _emit 0xFF;
  295. _emit 0xFF;
  296. _emit 0xFF;
  297. _emit 0xFF;
  298. #endif
  299. #endif
  300. mov ecx, dword ptr [esi];
  301. sar ecx, 1;
  302. sub edx, ecx;
  303. mov dword ptr [esi], edx;
  304. fmul dword ptr [esi];
  305. fmul dword ptr [esi];
  306. #ifdef TARGET_X64
  307. mov rax, 0xffffffff;
  308. fadd EEL_ASM_TYPE [rax];
  309. #else
  310. #if EEL_F_SIZE == 8
  311. _emit 0xDC; // fadd qword ptr [0xffffffff]
  312. _emit 0x05;
  313. _emit 0xFF;
  314. _emit 0xFF;
  315. _emit 0xFF;
  316. _emit 0xFF;
  317. #else
  318. _emit 0xD8; // fadd dword ptr [0xffffffff]
  319. _emit 0x05;
  320. _emit 0xFF;
  321. _emit 0xFF;
  322. _emit 0xFF;
  323. _emit 0xFF;
  324. #endif
  325. #endif
  326. fmul dword ptr [esi];
  327. mov eax, esi;
  328. fstp EEL_ASM_TYPE [esi];
  329. add esi, EEL_F_SIZE;
  330. _emit 0x89;
  331. _emit 0x90;
  332. _emit 0x90;
  333. _emit 0x90;
  334. _emit 0x90;
  335. _emit 0x90;
  336. _emit 0x90;
  337. _emit 0x90;
  338. _emit 0x90;
  339. _emit 0x90;
  340. _emit 0x90;
  341. _emit 0x90;
  342. }
  343. }
  344. __declspec(naked) void nseel_asm_invsqrt_end(void) {}
  345. //---------------------------------------------------------------------------------------------------------------
  346. __declspec(naked) void nseel_asm_sin(void)
  347. {
  348. __asm {
  349. fld EEL_ASM_TYPE [eax];
  350. fsin;
  351. mov eax, esi;
  352. fstp EEL_ASM_TYPE [esi];
  353. add esi, EEL_F_SIZE;
  354. _emit 0x89;
  355. _emit 0x90;
  356. _emit 0x90;
  357. _emit 0x90;
  358. _emit 0x90;
  359. _emit 0x90;
  360. _emit 0x90;
  361. _emit 0x90;
  362. _emit 0x90;
  363. _emit 0x90;
  364. _emit 0x90;
  365. _emit 0x90;
  366. }
  367. }
  368. __declspec(naked) void nseel_asm_sin_end(void) {}
  369. //---------------------------------------------------------------------------------------------------------------
  370. __declspec(naked) void nseel_asm_cos(void)
  371. {
  372. __asm {
  373. fld EEL_ASM_TYPE [eax];
  374. fcos;
  375. mov eax, esi;
  376. fstp EEL_ASM_TYPE [esi];
  377. add esi, EEL_F_SIZE;
  378. _emit 0x89;
  379. _emit 0x90;
  380. _emit 0x90;
  381. _emit 0x90;
  382. _emit 0x90;
  383. _emit 0x90;
  384. _emit 0x90;
  385. _emit 0x90;
  386. _emit 0x90;
  387. _emit 0x90;
  388. _emit 0x90;
  389. _emit 0x90;
  390. }
  391. }
  392. __declspec(naked) void nseel_asm_cos_end(void) {}
  393. //---------------------------------------------------------------------------------------------------------------
  394. __declspec(naked) void nseel_asm_tan(void)
  395. {
  396. __asm {
  397. fld EEL_ASM_TYPE [eax];
  398. fptan;
  399. mov eax, esi;
  400. fstp st(0);
  401. fstp EEL_ASM_TYPE [esi];
  402. add esi, EEL_F_SIZE;
  403. _emit 0x89;
  404. _emit 0x90;
  405. _emit 0x90;
  406. _emit 0x90;
  407. _emit 0x90;
  408. _emit 0x90;
  409. _emit 0x90;
  410. _emit 0x90;
  411. _emit 0x90;
  412. _emit 0x90;
  413. _emit 0x90;
  414. _emit 0x90;
  415. }
  416. }
  417. __declspec(naked) void nseel_asm_tan_end(void) {}
  418. //---------------------------------------------------------------------------------------------------------------
  419. __declspec(naked) void nseel_asm_sqr(void)
  420. {
  421. __asm {
  422. fld EEL_ASM_TYPE [eax];
  423. fmul st(0), st(0);
  424. mov eax, esi;
  425. fstp EEL_ASM_TYPE [esi];
  426. add esi, EEL_F_SIZE;
  427. _emit 0x89;
  428. _emit 0x90;
  429. _emit 0x90;
  430. _emit 0x90;
  431. _emit 0x90;
  432. _emit 0x90;
  433. _emit 0x90;
  434. _emit 0x90;
  435. _emit 0x90;
  436. _emit 0x90;
  437. _emit 0x90;
  438. _emit 0x90;
  439. }
  440. }
  441. __declspec(naked) void nseel_asm_sqr_end(void) {}
  442. //---------------------------------------------------------------------------------------------------------------
  443. __declspec(naked) void nseel_asm_sqrt(void)
  444. {
  445. __asm {
  446. fld EEL_ASM_TYPE [eax];
  447. fabs;
  448. fsqrt;
  449. mov eax, esi;
  450. fstp EEL_ASM_TYPE [esi];
  451. add esi, EEL_F_SIZE;
  452. _emit 0x89;
  453. _emit 0x90;
  454. _emit 0x90;
  455. _emit 0x90;
  456. _emit 0x90;
  457. _emit 0x90;
  458. _emit 0x90;
  459. _emit 0x90;
  460. _emit 0x90;
  461. _emit 0x90;
  462. _emit 0x90;
  463. _emit 0x90;
  464. }
  465. }
  466. __declspec(naked) void nseel_asm_sqrt_end(void) {}
  467. //---------------------------------------------------------------------------------------------------------------
  468. __declspec(naked) void nseel_asm_log(void)
  469. {
  470. __asm {
  471. fldln2;
  472. fld EEL_ASM_TYPE [eax];
  473. mov eax, esi;
  474. fyl2x;
  475. fstp EEL_ASM_TYPE [esi];
  476. add esi, EEL_F_SIZE;
  477. _emit 0x89;
  478. _emit 0x90;
  479. _emit 0x90;
  480. _emit 0x90;
  481. _emit 0x90;
  482. _emit 0x90;
  483. _emit 0x90;
  484. _emit 0x90;
  485. _emit 0x90;
  486. _emit 0x90;
  487. _emit 0x90;
  488. _emit 0x90;
  489. }
  490. }
  491. __declspec(naked) void nseel_asm_log_end(void) {}
  492. //---------------------------------------------------------------------------------------------------------------
  493. __declspec(naked) void nseel_asm_log10(void)
  494. {
  495. __asm {
  496. fldlg2;
  497. fld EEL_ASM_TYPE [eax];
  498. mov eax, esi;
  499. fyl2x;
  500. fstp EEL_ASM_TYPE [esi];
  501. add esi, EEL_F_SIZE;
  502. _emit 0x89;
  503. _emit 0x90;
  504. _emit 0x90;
  505. _emit 0x90;
  506. _emit 0x90;
  507. _emit 0x90;
  508. _emit 0x90;
  509. _emit 0x90;
  510. _emit 0x90;
  511. _emit 0x90;
  512. _emit 0x90;
  513. _emit 0x90;
  514. }
  515. }
  516. __declspec(naked) void nseel_asm_log10_end(void) {}
  517. //---------------------------------------------------------------------------------------------------------------
  518. __declspec(naked) void nseel_asm_abs(void)
  519. {
  520. __asm {
  521. fld EEL_ASM_TYPE [eax];
  522. fabs;
  523. mov eax, esi;
  524. fstp EEL_ASM_TYPE [esi];
  525. add esi, EEL_F_SIZE;
  526. _emit 0x89;
  527. _emit 0x90;
  528. _emit 0x90;
  529. _emit 0x90;
  530. _emit 0x90;
  531. _emit 0x90;
  532. _emit 0x90;
  533. _emit 0x90;
  534. _emit 0x90;
  535. _emit 0x90;
  536. _emit 0x90;
  537. _emit 0x90;
  538. }
  539. }
  540. __declspec(naked) void nseel_asm_abs_end(void) {}
  541. //---------------------------------------------------------------------------------------------------------------
  542. __declspec(naked) void nseel_asm_assign(void)
  543. {
  544. #ifdef TARGET_X64
  545. __asm {
  546. mov rdx, qword ptr [rax];
  547. mov rcx, rdx;
  548. shr rdx, 32;
  549. and edx, 0x7FF00000;
  550. jz label_0;
  551. cmp edx, 0x7FF00000;
  552. je label_0;
  553. jmp label_1;
  554. label_0:
  555. sub rcx, rcx;
  556. label_1:
  557. mov qword ptr [edi], rcx;
  558. _emit 0x89;
  559. _emit 0x90;
  560. _emit 0x90;
  561. _emit 0x90;
  562. _emit 0x90;
  563. _emit 0x90;
  564. _emit 0x90;
  565. _emit 0x90;
  566. _emit 0x90;
  567. _emit 0x90;
  568. _emit 0x90;
  569. _emit 0x90;
  570. }
  571. #else
  572. #if EEL_F_SIZE == 8
  573. __asm {
  574. mov edx, dword ptr [eax+4];
  575. mov ecx, dword ptr [eax];
  576. and edx, 0x7ff00000;
  577. jz label_2; // if exponent=zero, zero
  578. cmp edx, 0x7ff00000;
  579. je label_2; // if exponent=all 1s, zero
  580. mov edx, dword ptr [eax+4]; // reread
  581. jmp label_3;
  582. label_2:
  583. sub ecx, ecx;
  584. sub edx, edx;
  585. label_3:
  586. mov dword ptr [edi], ecx;
  587. mov dword ptr [edi+4], edx;
  588. _emit 0x89;
  589. _emit 0x90;
  590. _emit 0x90;
  591. _emit 0x90;
  592. _emit 0x90;
  593. _emit 0x90;
  594. _emit 0x90;
  595. _emit 0x90;
  596. _emit 0x90;
  597. _emit 0x90;
  598. _emit 0x90;
  599. _emit 0x90;
  600. }
  601. #else
  602. __asm {
  603. mov ecx, dword ptr [eax];
  604. mov dword ptr [edi], ecx;
  605. _emit 0x89;
  606. _emit 0x90;
  607. _emit 0x90;
  608. _emit 0x90;
  609. _emit 0x90;
  610. _emit 0x90;
  611. _emit 0x90;
  612. _emit 0x90;
  613. _emit 0x90;
  614. _emit 0x90;
  615. _emit 0x90;
  616. _emit 0x90;
  617. }
  618. #endif
  619. #endif
  620. }
  621. __declspec(naked) void nseel_asm_assign_end(void) {}
  622. //---------------------------------------------------------------------------------------------------------------
  623. __declspec(naked) void nseel_asm_add(void)
  624. {
  625. __asm {
  626. fld EEL_ASM_TYPE [eax];
  627. fadd EEL_ASM_TYPE [edi];
  628. mov eax, esi;
  629. fstp EEL_ASM_TYPE [esi];
  630. add esi, EEL_F_SIZE;
  631. _emit 0x89;
  632. _emit 0x90;
  633. _emit 0x90;
  634. _emit 0x90;
  635. _emit 0x90;
  636. _emit 0x90;
  637. _emit 0x90;
  638. _emit 0x90;
  639. _emit 0x90;
  640. _emit 0x90;
  641. _emit 0x90;
  642. _emit 0x90;
  643. }
  644. }
  645. __declspec(naked) void nseel_asm_add_end(void) {}
  646. __declspec(naked) void nseel_asm_add_op(void)
  647. {
  648. __asm {
  649. fld EEL_ASM_TYPE [eax];
  650. fadd EEL_ASM_TYPE [edi];
  651. mov eax, edi;
  652. fstp EEL_ASM_TYPE [edi];
  653. _emit 0x89;
  654. _emit 0x90;
  655. _emit 0x90;
  656. _emit 0x90;
  657. _emit 0x90;
  658. _emit 0x90;
  659. _emit 0x90;
  660. _emit 0x90;
  661. _emit 0x90;
  662. _emit 0x90;
  663. _emit 0x90;
  664. _emit 0x90;
  665. }
  666. }
  667. __declspec(naked) void nseel_asm_add_op_end(void) {}
  668. //---------------------------------------------------------------------------------------------------------------
  669. __declspec(naked) void nseel_asm_sub(void)
  670. {
  671. __asm {
  672. fld EEL_ASM_TYPE [edi];
  673. fsub EEL_ASM_TYPE [eax];
  674. mov eax, esi;
  675. fstp EEL_ASM_TYPE [esi];
  676. add esi, EEL_F_SIZE;
  677. _emit 0x89;
  678. _emit 0x90;
  679. _emit 0x90;
  680. _emit 0x90;
  681. _emit 0x90;
  682. _emit 0x90;
  683. _emit 0x90;
  684. _emit 0x90;
  685. _emit 0x90;
  686. _emit 0x90;
  687. _emit 0x90;
  688. _emit 0x90;
  689. }
  690. }
  691. __declspec(naked) void nseel_asm_sub_end(void) {}
  692. __declspec(naked) void nseel_asm_sub_op(void)
  693. {
  694. __asm {
  695. fld EEL_ASM_TYPE [edi];
  696. fsub EEL_ASM_TYPE [eax];
  697. mov eax, edi;
  698. fstp EEL_ASM_TYPE [edi];
  699. _emit 0x89;
  700. _emit 0x90;
  701. _emit 0x90;
  702. _emit 0x90;
  703. _emit 0x90;
  704. _emit 0x90;
  705. _emit 0x90;
  706. _emit 0x90;
  707. _emit 0x90;
  708. _emit 0x90;
  709. _emit 0x90;
  710. _emit 0x90;
  711. }
  712. }
  713. __declspec(naked) void nseel_asm_sub_op_end(void) {}
  714. //---------------------------------------------------------------------------------------------------------------
  715. __declspec(naked) void nseel_asm_mul(void)
  716. {
  717. __asm {
  718. fld EEL_ASM_TYPE [edi];
  719. fmul EEL_ASM_TYPE [eax];
  720. mov eax, esi;
  721. fstp EEL_ASM_TYPE [esi];
  722. add esi, EEL_F_SIZE;
  723. _emit 0x89;
  724. _emit 0x90;
  725. _emit 0x90;
  726. _emit 0x90;
  727. _emit 0x90;
  728. _emit 0x90;
  729. _emit 0x90;
  730. _emit 0x90;
  731. _emit 0x90;
  732. _emit 0x90;
  733. _emit 0x90;
  734. _emit 0x90;
  735. }
  736. }
  737. __declspec(naked) void nseel_asm_mul_end(void) {}
  738. __declspec(naked) void nseel_asm_mul_op(void)
  739. {
  740. __asm {
  741. fld EEL_ASM_TYPE [eax];
  742. fmul EEL_ASM_TYPE [edi];
  743. mov eax, edi;
  744. fstp EEL_ASM_TYPE [edi];
  745. _emit 0x89;
  746. _emit 0x90;
  747. _emit 0x90;
  748. _emit 0x90;
  749. _emit 0x90;
  750. _emit 0x90;
  751. _emit 0x90;
  752. _emit 0x90;
  753. _emit 0x90;
  754. _emit 0x90;
  755. _emit 0x90;
  756. _emit 0x90;
  757. }
  758. }
  759. __declspec(naked) void nseel_asm_mul_op_end(void) {}
  760. //---------------------------------------------------------------------------------------------------------------
  761. __declspec(naked) void nseel_asm_div(void)
  762. {
  763. __asm {
  764. fld EEL_ASM_TYPE [edi];
  765. fdiv EEL_ASM_TYPE [eax];
  766. mov eax, esi;
  767. fstp EEL_ASM_TYPE [esi];
  768. add esi, EEL_F_SIZE;
  769. _emit 0x89;
  770. _emit 0x90;
  771. _emit 0x90;
  772. _emit 0x90;
  773. _emit 0x90;
  774. _emit 0x90;
  775. _emit 0x90;
  776. _emit 0x90;
  777. _emit 0x90;
  778. _emit 0x90;
  779. _emit 0x90;
  780. _emit 0x90;
  781. }
  782. }
  783. __declspec(naked) void nseel_asm_div_end(void) {}
  784. __declspec(naked) void nseel_asm_div_op(void)
  785. {
  786. __asm {
  787. fld EEL_ASM_TYPE [edi];
  788. fdiv EEL_ASM_TYPE [eax];
  789. mov eax, edi;
  790. fstp EEL_ASM_TYPE [edi];
  791. _emit 0x89;
  792. _emit 0x90;
  793. _emit 0x90;
  794. _emit 0x90;
  795. _emit 0x90;
  796. _emit 0x90;
  797. _emit 0x90;
  798. _emit 0x90;
  799. _emit 0x90;
  800. _emit 0x90;
  801. _emit 0x90;
  802. _emit 0x90;
  803. }
  804. }
  805. __declspec(naked) void nseel_asm_div_op_end(void) {}
  806. //---------------------------------------------------------------------------------------------------------------
  807. __declspec(naked) void nseel_asm_mod(void)
  808. {
  809. __asm {
  810. fld EEL_ASM_TYPE [edi];
  811. fld EEL_ASM_TYPE [eax];
  812. fabs;
  813. fistp dword ptr [esi];
  814. fabs;
  815. fistp dword ptr [esi+4];
  816. xor edx, edx;
  817. #ifdef TARGET_X64
  818. sub eax, eax;
  819. #endif
  820. cmp dword ptr [esi], 0;
  821. je label_4; // skip devide, set return to 0
  822. mov eax, dword ptr [esi+4];
  823. div dword ptr [esi];
  824. label_4:
  825. mov dword ptr [esi], edx;
  826. fild dword ptr [esi];
  827. mov eax, esi;
  828. fstp EEL_ASM_TYPE [esi];
  829. add esi, EEL_F_SIZE;
  830. _emit 0x89;
  831. _emit 0x90;
  832. _emit 0x90;
  833. _emit 0x90;
  834. _emit 0x90;
  835. _emit 0x90;
  836. _emit 0x90;
  837. _emit 0x90;
  838. _emit 0x90;
  839. _emit 0x90;
  840. _emit 0x90;
  841. _emit 0x90;
  842. }
  843. }
  844. __declspec(naked) void nseel_asm_mod_end(void) {}
  845. __declspec(naked) void nseel_asm_mod_op(void)
  846. {
  847. __asm {
  848. fld EEL_ASM_TYPE [edi];
  849. fld EEL_ASM_TYPE [eax];
  850. fabs;
  851. fistp dword ptr [edi];
  852. fabs;
  853. fistp dword ptr [esi];
  854. #ifdef TARGET_X64
  855. sub eax, eax;
  856. #endif
  857. xor edx, edx;
  858. cmp dword ptr [edi], 0;
  859. je label_5; // skip devide, set return to 0
  860. mov eax, dword ptr [esi];
  861. div dword ptr [edi];
  862. label_5:
  863. mov dword ptr [edi], edx;
  864. fild dword ptr [edi];
  865. mov eax, edi;
  866. fstp EEL_ASM_TYPE [edi];
  867. _emit 0x89;
  868. _emit 0x90;
  869. _emit 0x90;
  870. _emit 0x90;
  871. _emit 0x90;
  872. _emit 0x90;
  873. _emit 0x90;
  874. _emit 0x90;
  875. _emit 0x90;
  876. _emit 0x90;
  877. _emit 0x90;
  878. _emit 0x90;
  879. }
  880. }
  881. __declspec(naked) void nseel_asm_mod_op_end(void) {}
  882. //---------------------------------------------------------------------------------------------------------------
  883. __declspec(naked) void nseel_asm_or(void)
  884. {
  885. __asm {
  886. fld EEL_ASM_TYPE [edi];
  887. fld EEL_ASM_TYPE [eax];
  888. mov eax, esi;
  889. fistp qword ptr [esi];
  890. fistp qword ptr [esi+8];
  891. #ifdef TARGET_X64
  892. mov rdi, qword ptr [rsi+8];
  893. or qword ptr [rsi], rdi;
  894. #else
  895. mov edi, dword ptr [esi+8];
  896. mov ecx, dword ptr [esi+12];
  897. or dword ptr [esi], edi;
  898. or dword ptr [esi+4], ecx;
  899. #endif
  900. fild qword ptr [esi];
  901. fstp EEL_ASM_TYPE [esi];
  902. add esi, EEL_F_SIZE;
  903. _emit 0x89;
  904. _emit 0x90;
  905. _emit 0x90;
  906. _emit 0x90;
  907. _emit 0x90;
  908. _emit 0x90;
  909. _emit 0x90;
  910. _emit 0x90;
  911. _emit 0x90;
  912. _emit 0x90;
  913. _emit 0x90;
  914. _emit 0x90;
  915. }
  916. }
  917. __declspec(naked) void nseel_asm_or_end(void) {}
  918. __declspec(naked) void nseel_asm_or_op(void)
  919. {
  920. __asm {
  921. fld EEL_ASM_TYPE [edi];
  922. fld EEL_ASM_TYPE [eax];
  923. fistp qword ptr [edi];
  924. fistp qword ptr [esi];
  925. #ifdef TARGET_X64
  926. mov rax, qword ptr [rsi];
  927. or qword ptr [rdi], rax;
  928. #else
  929. mov eax, dword ptr [esi];
  930. mov ecx, dword ptr [esi+4];
  931. or dword ptr [edi], eax;
  932. or dword ptr [edi+4], ecx;
  933. #endif
  934. fild qword ptr [edi];
  935. mov eax, edi;
  936. fstp EEL_ASM_TYPE [edi];
  937. _emit 0x89;
  938. _emit 0x90;
  939. _emit 0x90;
  940. _emit 0x90;
  941. _emit 0x90;
  942. _emit 0x90;
  943. _emit 0x90;
  944. _emit 0x90;
  945. _emit 0x90;
  946. _emit 0x90;
  947. _emit 0x90;
  948. _emit 0x90;
  949. }
  950. }
  951. __declspec(naked) void nseel_asm_or_op_end(void) {}
  952. //---------------------------------------------------------------------------------------------------------------
  953. __declspec(naked) void nseel_asm_and(void)
  954. {
  955. __asm {
  956. fld EEL_ASM_TYPE [edi];
  957. fld EEL_ASM_TYPE [eax];
  958. mov eax, esi;
  959. fistp qword ptr [esi];
  960. fistp qword ptr [esi+8];
  961. #ifdef TARGET_X64
  962. mov rdi, qword ptr [rsi+8];
  963. and qword ptr [rsi], rdi;
  964. #else
  965. mov edi, dword ptr [esi+8];
  966. mov ecx, dword ptr [esi+12];
  967. and dword ptr [esi], edi;
  968. and dword ptr [esi+4], ecx;
  969. #endif
  970. fild qword ptr [esi];
  971. fstp EEL_ASM_TYPE [esi];
  972. add esi, EEL_F_SIZE;
  973. _emit 0x89;
  974. _emit 0x90;
  975. _emit 0x90;
  976. _emit 0x90;
  977. _emit 0x90;
  978. _emit 0x90;
  979. _emit 0x90;
  980. _emit 0x90;
  981. _emit 0x90;
  982. _emit 0x90;
  983. _emit 0x90;
  984. _emit 0x90;
  985. }
  986. }
  987. __declspec(naked) void nseel_asm_and_end(void) {}
  988. __declspec(naked) void nseel_asm_and_op(void)
  989. {
  990. __asm {
  991. fld EEL_ASM_TYPE [edi];
  992. fld EEL_ASM_TYPE [eax];
  993. fistp qword ptr [edi];
  994. fistp qword ptr [esi];
  995. #ifdef TARGET_X64
  996. mov rax, qword ptr [rsi];
  997. and qword ptr [rdi], rax;
  998. #else
  999. mov eax, dword ptr [esi];
  1000. mov ecx, dword ptr [esi+4];
  1001. and dword ptr [edi], eax;
  1002. and dword ptr [edi+4], ecx;
  1003. #endif
  1004. fild qword ptr [edi];
  1005. mov eax, edi;
  1006. fstp EEL_ASM_TYPE [edi];
  1007. _emit 0x89;
  1008. _emit 0x90;
  1009. _emit 0x90;
  1010. _emit 0x90;
  1011. _emit 0x90;
  1012. _emit 0x90;
  1013. _emit 0x90;
  1014. _emit 0x90;
  1015. _emit 0x90;
  1016. _emit 0x90;
  1017. _emit 0x90;
  1018. _emit 0x90;
  1019. }
  1020. }
  1021. __declspec(naked) void nseel_asm_and_op_end(void) {}
  1022. //---------------------------------------------------------------------------------------------------------------
  1023. __declspec(naked) void nseel_asm_uplus(void) // this is the same as doing nothing, it seems
  1024. {
  1025. __asm {
  1026. _emit 0x89;
  1027. _emit 0x90;
  1028. _emit 0x90;
  1029. _emit 0x90;
  1030. _emit 0x90;
  1031. _emit 0x90;
  1032. _emit 0x90;
  1033. _emit 0x90;
  1034. _emit 0x90;
  1035. _emit 0x90;
  1036. _emit 0x90;
  1037. _emit 0x90;
  1038. }
  1039. }
  1040. __declspec(naked) void nseel_asm_uplus_end(void) {}
  1041. //---------------------------------------------------------------------------------------------------------------
  1042. __declspec(naked) void nseel_asm_uminus(void)
  1043. {
  1044. __asm {
  1045. #if EEL_F_SIZE == 8
  1046. mov ecx, dword ptr [eax];
  1047. mov edi, dword ptr [eax+4];
  1048. mov dword ptr [esi], ecx;
  1049. xor edi, 0x80000000;
  1050. mov eax, esi;
  1051. mov dword ptr [esi+4], edi;
  1052. add esi, 8;
  1053. #else
  1054. mov ecx, dword ptr [eax];
  1055. xor ecx, 0x80000000;
  1056. mov eax, esi;
  1057. mov dword ptr [esi], ecx;
  1058. add esi, 4;
  1059. #endif
  1060. _emit 0x89;
  1061. _emit 0x90;
  1062. _emit 0x90;
  1063. _emit 0x90;
  1064. _emit 0x90;
  1065. _emit 0x90;
  1066. _emit 0x90;
  1067. _emit 0x90;
  1068. _emit 0x90;
  1069. _emit 0x90;
  1070. _emit 0x90;
  1071. _emit 0x90;
  1072. }
  1073. }
  1074. __declspec(naked) void nseel_asm_uminus_end(void) {}
  1075. //---------------------------------------------------------------------------------------------------------------
  1076. __declspec(naked) void nseel_asm_sign(void)
  1077. {
  1078. __asm {
  1079. #ifdef TARGET_X64
  1080. mov rdi, 0xFFFFFFFF;
  1081. mov rcx, qword ptr [rax];
  1082. mov rdx, 0x7FFFFFFFFFFFFFFF;
  1083. test rcx, rdx;
  1084. jz label_6;
  1085. shr rcx, 60;
  1086. and rcx, 8;
  1087. add rcx, rdi;
  1088. mov rax, rsi;
  1089. add rsi, 8;
  1090. mov rdi, qword ptr [rcx];
  1091. mov qword ptr [rax], rdi;
  1092. label_6:
  1093. #else
  1094. mov edi, 0xFFFFFFFF;
  1095. #if EEL_F_SIZE == 8
  1096. mov ecx, dword ptr [eax+4];
  1097. mov edx, dword ptr [eax];
  1098. test edx, 0xFFFFFFFF;
  1099. jnz label_7;
  1100. #else
  1101. mov ecx, dword ptr [eax];
  1102. #endif
  1103. // high dword (minus sign bit) is zero
  1104. test ecx, 0x7FFFFFFF;
  1105. jz label_8; // zero zero, return the value passed directly
  1106. label_7:
  1107. #if EEL_F_SIZE == 8
  1108. shr ecx, 28;
  1109. #else
  1110. shr ecx, 29;
  1111. #endif
  1112. and ecx, EEL_F_SIZE;
  1113. add ecx, edi;
  1114. mov eax, esi;
  1115. add esi, EEL_F_SIZE;
  1116. mov edi, dword ptr [ecx];
  1117. #if EEL_F_SIZE == 8
  1118. mov edx, dword ptr [ecx+4];
  1119. #endif
  1120. mov dword ptr [eax], edi;
  1121. #if EEL_F_SIZE == 8
  1122. mov dword ptr [eax+4], edx;
  1123. #endif
  1124. label_8:
  1125. #endif
  1126. _emit 0x89;
  1127. _emit 0x90;
  1128. _emit 0x90;
  1129. _emit 0x90;
  1130. _emit 0x90;
  1131. _emit 0x90;
  1132. _emit 0x90;
  1133. _emit 0x90;
  1134. _emit 0x90;
  1135. _emit 0x90;
  1136. _emit 0x90;
  1137. _emit 0x90;
  1138. }
  1139. }
  1140. __declspec(naked) void nseel_asm_sign_end(void) {}
  1141. //---------------------------------------------------------------------------------------------------------------
  1142. __declspec(naked) void nseel_asm_bnot(void)
  1143. {
  1144. __asm {
  1145. fld EEL_ASM_TYPE [eax];
  1146. fabs;
  1147. #ifdef TARGET_X64
  1148. mov rax, 0xFFFFFFFF;
  1149. fcomp EEL_ASM_TYPE [rax]; //[g_closefact]
  1150. #else
  1151. #if EEL_F_SIZE == 8
  1152. _emit 0xDC; // fcomp qword ptr [0xffffffff]
  1153. _emit 0x1D;
  1154. _emit 0xFF;
  1155. _emit 0xFF;
  1156. _emit 0xFF;
  1157. _emit 0xFF;
  1158. #else
  1159. _emit 0xD8; // fcomp dword ptr [0xffffffff]
  1160. _emit 0x1D;
  1161. _emit 0xFF;
  1162. _emit 0xFF;
  1163. _emit 0xFF;
  1164. _emit 0xFF;
  1165. #endif
  1166. #endif
  1167. fstsw ax;
  1168. test eax, 256;
  1169. mov eax, esi;
  1170. jz label_9;
  1171. fld1;
  1172. jmp label_10;
  1173. label_9:
  1174. fldz;
  1175. label_10:
  1176. fstp EEL_ASM_TYPE [esi];
  1177. add esi, EEL_F_SIZE;
  1178. _emit 0x89;
  1179. _emit 0x90;
  1180. _emit 0x90;
  1181. _emit 0x90;
  1182. _emit 0x90;
  1183. _emit 0x90;
  1184. _emit 0x90;
  1185. _emit 0x90;
  1186. _emit 0x90;
  1187. _emit 0x90;
  1188. _emit 0x90;
  1189. _emit 0x90;
  1190. }
  1191. }
  1192. __declspec(naked) void nseel_asm_bnot_end(void) {}
  1193. //---------------------------------------------------------------------------------------------------------------
  1194. __declspec(naked) void nseel_asm_if(void)
  1195. {
  1196. __asm {
  1197. fld EEL_ASM_TYPE [eax];
  1198. fabs;
  1199. #ifdef TARGET_X64
  1200. mov rax, 0xFFFFFFFF;
  1201. fcomp EEL_ASM_TYPE [rax]; //[g_closefact]
  1202. mov rax, 0xFFFFFFFF;
  1203. mov qword ptr [esi], rax; // conversion script will extend these out to full len
  1204. mov rax, 0xFFFFFFFF;
  1205. mov qword ptr [esi+8], rax;
  1206. fstsw ax;
  1207. shr rax, 5;
  1208. and rax, 8;
  1209. mov rax, qword ptr [rax+rsi];
  1210. sub rsp, 8;
  1211. #else
  1212. #if EEL_F_SIZE == 8
  1213. _emit 0xDC; // fcomp qword ptr [0xffffffff]
  1214. _emit 0x1D;
  1215. _emit 0xFF;
  1216. _emit 0xFF;
  1217. _emit 0xFF;
  1218. _emit 0xFF;
  1219. #else
  1220. _emit 0xD8; // fcomp dword ptr [0xffffffff]
  1221. _emit 0x1D;
  1222. _emit 0xFF;
  1223. _emit 0xFF;
  1224. _emit 0xFF;
  1225. _emit 0xFF;
  1226. #endif
  1227. mov dword ptr [esi], 0xFFFFFFFF;
  1228. mov dword ptr [esi+4], 0xFFFFFFFF;
  1229. fstsw ax;
  1230. shr eax, 6;
  1231. and eax, 4;
  1232. mov eax, dword ptr [eax+esi];
  1233. #endif
  1234. call eax;
  1235. #ifdef TARGET_X64
  1236. add rsp, 8;
  1237. #endif
  1238. _emit 0x89;
  1239. _emit 0x90;
  1240. _emit 0x90;
  1241. _emit 0x90;
  1242. _emit 0x90;
  1243. _emit 0x90;
  1244. _emit 0x90;
  1245. _emit 0x90;
  1246. _emit 0x90;
  1247. _emit 0x90;
  1248. _emit 0x90;
  1249. _emit 0x90;
  1250. }
  1251. }
  1252. __declspec(naked) void nseel_asm_if_end(void) {}
  1253. //---------------------------------------------------------------------------------------------------------------
  1254. __declspec(naked) void nseel_asm_repeat(void)
  1255. {
  1256. __asm {
  1257. fld EEL_ASM_TYPE [eax];
  1258. fistp dword ptr [esi];
  1259. #ifdef TARGET_X64 // safe not sure if movl ecx will zero the high word
  1260. xor ecx, ecx;
  1261. #endif
  1262. mov ecx, dword ptr [esi];
  1263. cmp ecx, 1;
  1264. jl label_11;
  1265. cmp ecx, NSEEL_LOOPFUNC_SUPPORT_MAXLEN;
  1266. jl label_12;
  1267. mov ecx, NSEEL_LOOPFUNC_SUPPORT_MAXLEN;
  1268. label_12:
  1269. mov edx, 0xFFFFFFFF;
  1270. sub esp, 8; /* keep stack aligned -- note this is required on x64 too!*/
  1271. push esi; // revert back to last temp workspace
  1272. push ecx;
  1273. call edx;
  1274. pop ecx;
  1275. pop esi;
  1276. add esp, 8; /* keep stack aligned -- also required on x64*/
  1277. dec ecx;
  1278. jnz label_12;
  1279. label_11:
  1280. _emit 0x89;
  1281. _emit 0x90;
  1282. _emit 0x90;
  1283. _emit 0x90;
  1284. _emit 0x90;
  1285. _emit 0x90;
  1286. _emit 0x90;
  1287. _emit 0x90;
  1288. _emit 0x90;
  1289. _emit 0x90;
  1290. _emit 0x90;
  1291. _emit 0x90;
  1292. }
  1293. }
  1294. __declspec(naked) void nseel_asm_repeat_end(void) {}
  1295. __declspec(naked) void nseel_asm_repeatwhile(void)
  1296. {
  1297. __asm {
  1298. mov ecx, NSEEL_LOOPFUNC_SUPPORT_MAXLEN;
  1299. label_13:
  1300. mov edx, 0xFFFFFFFF;
  1301. sub esp, 8; /* keep stack aligned -- required on x86 and x64*/
  1302. push esi; // revert back to last temp workspace
  1303. push ecx;
  1304. call edx;
  1305. pop ecx;
  1306. pop esi;
  1307. add esp, 8; /* keep stack aligned -- required on x86 and x64 */
  1308. fld EEL_ASM_TYPE [eax];
  1309. fabs;
  1310. #ifdef TARGET_X64
  1311. mov rax, 0xFFFFFFFF;
  1312. fcomp EEL_ASM_TYPE [rax]; //[g_closefact]
  1313. #else
  1314. #if EEL_F_SIZE == 8
  1315. _emit 0xDC; // fcomp qword ptr [0xffffffff]
  1316. _emit 0x1D;
  1317. _emit 0xFF;
  1318. _emit 0xFF;
  1319. _emit 0xFF;
  1320. _emit 0xFF;
  1321. #else
  1322. _emit 0xD8; // fcomp dword ptr [0xffffffff]
  1323. _emit 0x1D;
  1324. _emit 0xFF;
  1325. _emit 0xFF;
  1326. _emit 0xFF;
  1327. _emit 0xFF;
  1328. #endif
  1329. #endif
  1330. fstsw ax;
  1331. test eax, 256;
  1332. jnz label_14;
  1333. dec ecx;
  1334. jnz label_13;
  1335. label_14:
  1336. mov eax, esi;
  1337. _emit 0x89;
  1338. _emit 0x90;
  1339. _emit 0x90;
  1340. _emit 0x90;
  1341. _emit 0x90;
  1342. _emit 0x90;
  1343. _emit 0x90;
  1344. _emit 0x90;
  1345. _emit 0x90;
  1346. _emit 0x90;
  1347. _emit 0x90;
  1348. _emit 0x90;
  1349. }
  1350. }
  1351. __declspec(naked) void nseel_asm_repeatwhile_end(void) {}
  1352. __declspec(naked) void nseel_asm_band(void)
  1353. {
  1354. __asm {
  1355. fld EEL_ASM_TYPE [eax];
  1356. fabs;
  1357. #ifdef TARGET_X64
  1358. mov rax, 0xFFFFFFFF;
  1359. fcomp EEL_ASM_TYPE [rax]; //[g_closefact]
  1360. #else
  1361. #if EEL_F_SIZE == 8
  1362. _emit 0xDC; // fcomp qword ptr [0xffffffff]
  1363. _emit 0x1D;
  1364. _emit 0xFF;
  1365. _emit 0xFF;
  1366. _emit 0xFF;
  1367. _emit 0xFF;
  1368. #else
  1369. _emit 0xD8; // fcomp dword ptr [0xffffffff]
  1370. _emit 0x1D;
  1371. _emit 0xFF;
  1372. _emit 0xFF;
  1373. _emit 0xFF;
  1374. _emit 0xFF;
  1375. #endif
  1376. #endif
  1377. fstsw ax;
  1378. test eax, 256;
  1379. jnz label_15; // if Z, then we are nonzero
  1380. mov ecx, 0xFFFFFFFF;
  1381. #ifdef TARGET_X64
  1382. sub rsp, 8;
  1383. #endif
  1384. call ecx;
  1385. #ifdef TARGET_X64
  1386. add rsp, 8;
  1387. #endif
  1388. fld EEL_ASM_TYPE [eax];
  1389. fabs;
  1390. #ifdef TARGET_X64
  1391. mov rax, 0xFFFFFFFF;
  1392. fcomp EEL_ASM_TYPE [rax]; //[g_closefact]
  1393. #else
  1394. #if EEL_F_SIZE == 8
  1395. _emit 0xDC; // fcomp qword ptr [0xffffffff]
  1396. _emit 0x1D;
  1397. _emit 0xFF;
  1398. _emit 0xFF;
  1399. _emit 0xFF;
  1400. _emit 0xFF;
  1401. #else
  1402. _emit 0xD8; // fcomp dword ptr [0xffffffff]
  1403. _emit 0x1D;
  1404. _emit 0xFF;
  1405. _emit 0xFF;
  1406. _emit 0xFF;
  1407. _emit 0xFF;
  1408. #endif
  1409. #endif
  1410. fstsw ax;
  1411. test eax, 256;
  1412. jnz label_15;
  1413. fld1;
  1414. jmp label_16;
  1415. label_15:
  1416. fldz;
  1417. label_16:
  1418. mov eax, esi;
  1419. fstp EEL_ASM_TYPE [esi];
  1420. add esi, EEL_F_SIZE;
  1421. _emit 0x89;
  1422. _emit 0x90;
  1423. _emit 0x90;
  1424. _emit 0x90;
  1425. _emit 0x90;
  1426. _emit 0x90;
  1427. _emit 0x90;
  1428. _emit 0x90;
  1429. _emit 0x90;
  1430. _emit 0x90;
  1431. _emit 0x90;
  1432. _emit 0x90;
  1433. }
  1434. }
  1435. __declspec(naked) void nseel_asm_band_end(void) {}
  1436. __declspec(naked) void nseel_asm_bor(void)
  1437. {
  1438. __asm {
  1439. fld EEL_ASM_TYPE [eax];
  1440. fabs;
  1441. #ifdef TARGET_X64
  1442. mov rax, 0xFFFFFFFF;
  1443. fcomp EEL_ASM_TYPE [rax]; //[g_closefact]
  1444. #else
  1445. #if EEL_F_SIZE == 8
  1446. _emit 0xDC; // fcomp qword ptr [0xffffffff]
  1447. _emit 0x1D;
  1448. _emit 0xFF;
  1449. _emit 0xFF;
  1450. _emit 0xFF;
  1451. _emit 0xFF;
  1452. #else
  1453. _emit 0xD8; // fcomp dword ptr [0xffffffff]
  1454. _emit 0x1D;
  1455. _emit 0xFF;
  1456. _emit 0xFF;
  1457. _emit 0xFF;
  1458. _emit 0xFF;
  1459. #endif
  1460. #endif
  1461. fstsw ax;
  1462. test eax, 256;
  1463. jz label_17; // if Z, then we are nonzero
  1464. mov ecx, 0xFFFFFFFF;
  1465. #ifdef TARGET_X64
  1466. sub rsp, 8;
  1467. #endif
  1468. call ecx;
  1469. #ifdef TARGET_X64
  1470. add rsp, 8;
  1471. #endif
  1472. fld EEL_ASM_TYPE [eax];
  1473. fabs;
  1474. #ifdef TARGET_X64
  1475. mov rax, 0xFFFFFFFF;
  1476. fcomp EEL_ASM_TYPE [rax]; //[g_closefact]
  1477. #else
  1478. #if EEL_F_SIZE == 8
  1479. _emit 0xDC; // fcomp qword ptr [0xffffffff]
  1480. _emit 0x1D;
  1481. _emit 0xFF;
  1482. _emit 0xFF;
  1483. _emit 0xFF;
  1484. _emit 0xFF;
  1485. #else
  1486. _emit 0xD8; // fcomp dword ptr [0xffffffff]
  1487. _emit 0x1D;
  1488. _emit 0xFF;
  1489. _emit 0xFF;
  1490. _emit 0xFF;
  1491. _emit 0xFF;
  1492. #endif
  1493. #endif
  1494. fstsw ax;
  1495. test eax, 256;
  1496. jz label_17;
  1497. fldz;
  1498. jmp label_18;
  1499. label_17:
  1500. fld1;
  1501. label_18:
  1502. mov eax, esi;
  1503. fstp EEL_ASM_TYPE [esi];
  1504. add esi, EEL_F_SIZE;
  1505. _emit 0x89;
  1506. _emit 0x90;
  1507. _emit 0x90;
  1508. _emit 0x90;
  1509. _emit 0x90;
  1510. _emit 0x90;
  1511. _emit 0x90;
  1512. _emit 0x90;
  1513. _emit 0x90;
  1514. _emit 0x90;
  1515. _emit 0x90;
  1516. _emit 0x90;
  1517. }
  1518. }
  1519. __declspec(naked) void nseel_asm_bor_end(void) {}
  1520. //---------------------------------------------------------------------------------------------------------------
  1521. __declspec(naked) void nseel_asm_equal(void)
  1522. {
  1523. __asm {
  1524. fld EEL_ASM_TYPE [eax];
  1525. fsub EEL_ASM_TYPE [edi];
  1526. fabs;
  1527. #ifdef TARGET_X64
  1528. mov rax, 0xFFFFFFFF;
  1529. fcomp EEL_ASM_TYPE [rax]; //[g_closefact]
  1530. #else
  1531. #if EEL_F_SIZE == 8
  1532. _emit 0xDC; // fcomp qword ptr [0xffffffff]
  1533. _emit 0x1D;
  1534. _emit 0xFF;
  1535. _emit 0xFF;
  1536. _emit 0xFF;
  1537. _emit 0xFF;
  1538. #else
  1539. _emit 0xD8; // fcomp dword ptr [0xffffffff]
  1540. _emit 0x1D;
  1541. _emit 0xFF;
  1542. _emit 0xFF;
  1543. _emit 0xFF;
  1544. _emit 0xFF;
  1545. #endif
  1546. #endif
  1547. fstsw ax;
  1548. test eax, 256;
  1549. mov eax, esi;
  1550. jz label_19;
  1551. fld1;
  1552. jmp label_20;
  1553. label_19:
  1554. fldz;
  1555. label_20:
  1556. fstp EEL_ASM_TYPE [esi];
  1557. add esi, EEL_F_SIZE;
  1558. _emit 0x89;
  1559. _emit 0x90;
  1560. _emit 0x90;
  1561. _emit 0x90;
  1562. _emit 0x90;
  1563. _emit 0x90;
  1564. _emit 0x90;
  1565. _emit 0x90;
  1566. _emit 0x90;
  1567. _emit 0x90;
  1568. _emit 0x90;
  1569. _emit 0x90;
  1570. }
  1571. }
  1572. __declspec(naked) void nseel_asm_equal_end(void) {}
  1573. //
  1574. //---------------------------------------------------------------------------------------------------------------
  1575. __declspec(naked) void nseel_asm_notequal(void)
  1576. {
  1577. __asm {
  1578. fld EEL_ASM_TYPE [eax];
  1579. fsub EEL_ASM_TYPE [edi];
  1580. fabs;
  1581. #ifdef TARGET_X64
  1582. mov rax, 0xFFFFFFFF;
  1583. fcomp EEL_ASM_TYPE [rax]; //[g_closefact]
  1584. #else
  1585. #if EEL_F_SIZE == 8
  1586. _emit 0xDC; // fcomp qword ptr [0xffffffff]
  1587. _emit 0x1D;
  1588. _emit 0xFF;
  1589. _emit 0xFF;
  1590. _emit 0xFF;
  1591. _emit 0xFF;
  1592. #else
  1593. _emit 0xD8; // fcomp dword ptr [0xffffffff]
  1594. _emit 0x1D;
  1595. _emit 0xFF;
  1596. _emit 0xFF;
  1597. _emit 0xFF;
  1598. _emit 0xFF;
  1599. #endif
  1600. #endif
  1601. fstsw ax;
  1602. test eax, 256;
  1603. mov eax, esi;
  1604. jnz label_21;
  1605. fld1;
  1606. jmp label_22;
  1607. label_21:
  1608. fldz;
  1609. label_22:
  1610. fstp EEL_ASM_TYPE [esi];
  1611. add esi, EEL_F_SIZE;
  1612. _emit 0x89;
  1613. _emit 0x90;
  1614. _emit 0x90;
  1615. _emit 0x90;
  1616. _emit 0x90;
  1617. _emit 0x90;
  1618. _emit 0x90;
  1619. _emit 0x90;
  1620. _emit 0x90;
  1621. _emit 0x90;
  1622. _emit 0x90;
  1623. _emit 0x90;
  1624. }
  1625. }
  1626. __declspec(naked) void nseel_asm_notequal_end(void) {}
  1627. //---------------------------------------------------------------------------------------------------------------
  1628. __declspec(naked) void nseel_asm_below(void)
  1629. {
  1630. __asm {
  1631. fld EEL_ASM_TYPE [edi];
  1632. fcomp EEL_ASM_TYPE [eax];
  1633. fstsw ax;
  1634. test eax, 256;
  1635. mov eax, esi;
  1636. jz label_23;
  1637. fld1;
  1638. jmp label_24;
  1639. label_23:
  1640. fldz;
  1641. label_24:
  1642. fstp EEL_ASM_TYPE [esi];
  1643. add esi, EEL_F_SIZE;
  1644. _emit 0x89;
  1645. _emit 0x90;
  1646. _emit 0x90;
  1647. _emit 0x90;
  1648. _emit 0x90;
  1649. _emit 0x90;
  1650. _emit 0x90;
  1651. _emit 0x90;
  1652. _emit 0x90;
  1653. _emit 0x90;
  1654. _emit 0x90;
  1655. _emit 0x90;
  1656. }
  1657. }
  1658. __declspec(naked) void nseel_asm_below_end(void) {}
  1659. //---------------------------------------------------------------------------------------------------------------
  1660. __declspec(naked) void nseel_asm_beloweq(void)
  1661. {
  1662. __asm {
  1663. fld EEL_ASM_TYPE [eax];
  1664. fcomp EEL_ASM_TYPE [edi];
  1665. fstsw ax;
  1666. test eax, 256;
  1667. mov eax, esi;
  1668. jnz label_25;
  1669. fld1;
  1670. jmp label_26;
  1671. label_25:
  1672. fldz;
  1673. label_26:
  1674. fstp EEL_ASM_TYPE [esi];
  1675. add esi, EEL_F_SIZE;
  1676. _emit 0x89;
  1677. _emit 0x90;
  1678. _emit 0x90;
  1679. _emit 0x90;
  1680. _emit 0x90;
  1681. _emit 0x90;
  1682. _emit 0x90;
  1683. _emit 0x90;
  1684. _emit 0x90;
  1685. _emit 0x90;
  1686. _emit 0x90;
  1687. _emit 0x90;
  1688. }
  1689. }
  1690. __declspec(naked) void nseel_asm_beloweq_end(void) {}
  1691. //---------------------------------------------------------------------------------------------------------------
  1692. __declspec(naked) void nseel_asm_above(void)
  1693. {
  1694. __asm {
  1695. fld EEL_ASM_TYPE [eax];
  1696. fcomp EEL_ASM_TYPE [edi];
  1697. fstsw ax;
  1698. test eax, 256;
  1699. mov eax, esi;
  1700. jz label_27;
  1701. fld1;
  1702. jmp label_28;
  1703. label_27:
  1704. fldz;
  1705. label_28:
  1706. fstp EEL_ASM_TYPE [esi];
  1707. add esi, EEL_F_SIZE;
  1708. _emit 0x89;
  1709. _emit 0x90;
  1710. _emit 0x90;
  1711. _emit 0x90;
  1712. _emit 0x90;
  1713. _emit 0x90;
  1714. _emit 0x90;
  1715. _emit 0x90;
  1716. _emit 0x90;
  1717. _emit 0x90;
  1718. _emit 0x90;
  1719. _emit 0x90;
  1720. }
  1721. }
  1722. __declspec(naked) void nseel_asm_above_end(void) {}
  1723. __declspec(naked) void nseel_asm_aboveeq(void)
  1724. {
  1725. __asm {
  1726. fld EEL_ASM_TYPE [edi];
  1727. fcomp EEL_ASM_TYPE [eax];
  1728. fstsw ax;
  1729. test eax, 256;
  1730. mov eax, esi;
  1731. jnz label_29;
  1732. fld1;
  1733. jmp label_30;
  1734. label_29:
  1735. fldz;
  1736. label_30:
  1737. fstp EEL_ASM_TYPE [esi];
  1738. add esi, EEL_F_SIZE;
  1739. _emit 0x89;
  1740. _emit 0x90;
  1741. _emit 0x90;
  1742. _emit 0x90;
  1743. _emit 0x90;
  1744. _emit 0x90;
  1745. _emit 0x90;
  1746. _emit 0x90;
  1747. _emit 0x90;
  1748. _emit 0x90;
  1749. _emit 0x90;
  1750. _emit 0x90;
  1751. }
  1752. }
  1753. __declspec(naked) void nseel_asm_aboveeq_end(void) {}
  1754. __declspec(naked) void nseel_asm_min(void)
  1755. {
  1756. __asm {
  1757. fld EEL_ASM_TYPE [edi];
  1758. fcomp EEL_ASM_TYPE [eax];
  1759. push eax;
  1760. fstsw ax;
  1761. test eax, 256;
  1762. pop eax;
  1763. jz label_31;
  1764. mov eax, edi;
  1765. label_31:
  1766. _emit 0x89;
  1767. _emit 0x90;
  1768. _emit 0x90;
  1769. _emit 0x90;
  1770. _emit 0x90;
  1771. _emit 0x90;
  1772. _emit 0x90;
  1773. _emit 0x90;
  1774. _emit 0x90;
  1775. _emit 0x90;
  1776. _emit 0x90;
  1777. _emit 0x90;
  1778. }
  1779. }
  1780. __declspec(naked) void nseel_asm_min_end(void) {}
  1781. __declspec(naked) void nseel_asm_max(void)
  1782. {
  1783. __asm {
  1784. fld EEL_ASM_TYPE [edi];
  1785. fcomp EEL_ASM_TYPE [eax];
  1786. push eax;
  1787. fstsw ax;
  1788. test eax, 256;
  1789. pop eax;
  1790. jnz label_32;
  1791. mov eax, edi;
  1792. label_32:
  1793. _emit 0x89;
  1794. _emit 0x90;
  1795. _emit 0x90;
  1796. _emit 0x90;
  1797. _emit 0x90;
  1798. _emit 0x90;
  1799. _emit 0x90;
  1800. _emit 0x90;
  1801. _emit 0x90;
  1802. _emit 0x90;
  1803. _emit 0x90;
  1804. _emit 0x90;
  1805. }
  1806. }
  1807. __declspec(naked) void nseel_asm_max_end(void) {}
  1808. // just generic functions left, yay
  1809. __declspec(naked) void _asm_generic3parm(void)
  1810. {
  1811. __asm {
  1812. #ifdef TARGET_X64
  1813. #ifdef AMD64ABI
  1814. mov r15, rsi;
  1815. mov rdx, rdi; // third parameter = parm
  1816. mov rdi, 0xFFFFFFFF; // first parameter= context
  1817. mov rsi, ecx; // second parameter = parm
  1818. mov rcx, rax; // fourth parameter = parm
  1819. mov rax, 0xffffffff; // call function
  1820. sub rsp, 128;
  1821. call rax;
  1822. mov rsi, r15;
  1823. add rsp, 128;
  1824. #else
  1825. mov edx, ecx; // second parameter = parm
  1826. mov ecx, 0xFFFFFFFF; // first parameter= context
  1827. mov r8, rdi; // third parameter = parm
  1828. mov r9, rax; // fourth parameter = parm
  1829. mov edi, 0xffffffff; // call function
  1830. sub rsp, 128;
  1831. call edi;
  1832. add rsp, 128;
  1833. #endif
  1834. #else
  1835. SAVE_STACK
  1836. mov edx, 0xFFFFFFFF;
  1837. push eax; // push parameter
  1838. push edi; // push parameter
  1839. push ecx; // push parameter
  1840. push edx; // push context pointer
  1841. mov edi, 0xffffffff;
  1842. call edi;
  1843. add esp, 16;
  1844. RESTORE_STACK
  1845. #endif
  1846. _emit 0x89;
  1847. _emit 0x90;
  1848. _emit 0x90;
  1849. _emit 0x90;
  1850. _emit 0x90;
  1851. _emit 0x90;
  1852. _emit 0x90;
  1853. _emit 0x90;
  1854. _emit 0x90;
  1855. _emit 0x90;
  1856. _emit 0x90;
  1857. _emit 0x90;
  1858. }
  1859. }
  1860. __declspec(naked) void _asm_generic3parm_end(void) {}
  1861. __declspec(naked) void _asm_generic3parm_retd(void)
  1862. {
  1863. __asm {
  1864. #ifdef TARGET_X64
  1865. #ifdef AMD64ABI
  1866. mov r15, rsi;
  1867. mov rdx, rdi; // third parameter = parm
  1868. mov rdi, 0xFFFFFFFF; // first parameter= context
  1869. mov rsi, ecx; // second parameter = parm
  1870. mov rcx, rax; // fourth parameter = parm
  1871. mov rax, 0xffffffff; // call function
  1872. sub rsp, 128;
  1873. call rax;
  1874. add rsp, 128;
  1875. mov rsi, r15;
  1876. mov rax, r15;
  1877. movq [r15], xmm0;
  1878. add rsi, 8;
  1879. #else
  1880. mov edx, ecx; // second parameter = parm
  1881. mov ecx, 0xFFFFFFFF; // first parameter= context
  1882. mov r8, rdi; // third parameter = parm
  1883. mov r9, rax; // fourth parameter = parm
  1884. mov edi, 0xffffffff; // call function
  1885. sub rsp, 128;
  1886. call edi;
  1887. add rsp, 128;
  1888. movq [rsi], xmm0;
  1889. mov rax, rsi;
  1890. add rsi, 8;
  1891. #endif
  1892. #else
  1893. SAVE_STACK
  1894. mov edx, 0xFFFFFFFF;
  1895. push eax; // push parameter
  1896. push edi; // push parameter
  1897. push ecx; // push parameter
  1898. push edx; // push context pointer
  1899. mov edi, 0xffffffff;
  1900. call edi;
  1901. mov eax, esi;
  1902. fstp EEL_ASM_TYPE [esi];
  1903. add esi, EEL_F_SIZE;
  1904. add esp, 16;
  1905. RESTORE_STACK
  1906. #endif
  1907. _emit 0x89;
  1908. _emit 0x90;
  1909. _emit 0x90;
  1910. _emit 0x90;
  1911. _emit 0x90;
  1912. _emit 0x90;
  1913. _emit 0x90;
  1914. _emit 0x90;
  1915. _emit 0x90;
  1916. _emit 0x90;
  1917. _emit 0x90;
  1918. _emit 0x90;
  1919. }
  1920. }
  1921. __declspec(naked) void _asm_generic3parm_retd_end(void) {}
  1922. __declspec(naked) void _asm_generic2parm(void) // this prob neds to be fixed for ppc
  1923. {
  1924. __asm {
  1925. #ifdef TARGET_X64
  1926. #ifdef AMD64ABI
  1927. mov r15, rsi;
  1928. mov esi, edi; // second parameter = parm
  1929. mov edi, 0xFFFFFFFF; // first parameter= context
  1930. mov rdx, rax; // third parameter = parm
  1931. mov rcx, 0xffffffff; // call function
  1932. sub rsp, 128;
  1933. call rcx;
  1934. mov rsi, r15;
  1935. add rsp, 128;
  1936. #else
  1937. mov ecx, 0xFFFFFFFF; // first parameter= context
  1938. mov edx, edi; // second parameter = parm
  1939. mov r8, rax; // third parameter = parm
  1940. mov edi, 0xffffffff; // call function
  1941. sub rsp, 128;
  1942. call edi;
  1943. add rsp, 128;
  1944. #endif
  1945. #else
  1946. SAVE_STACK
  1947. mov edx, 0xFFFFFFFF;
  1948. sub esp, 4; // keep stack aligned
  1949. push eax; // push parameter
  1950. push edi; // push parameter
  1951. push edx; // push context pointer
  1952. mov edi, 0xffffffff;
  1953. call edi;
  1954. add esp, 16;
  1955. RESTORE_STACK
  1956. #endif
  1957. _emit 0x89;
  1958. _emit 0x90;
  1959. _emit 0x90;
  1960. _emit 0x90;
  1961. _emit 0x90;
  1962. _emit 0x90;
  1963. _emit 0x90;
  1964. _emit 0x90;
  1965. _emit 0x90;
  1966. _emit 0x90;
  1967. _emit 0x90;
  1968. _emit 0x90;
  1969. }
  1970. }
  1971. __declspec(naked) void _asm_generic2parm_end(void) {}
  1972. __declspec(naked) void _asm_generic2parm_retd(void)
  1973. {
  1974. __asm {
  1975. #ifdef TARGET_X64
  1976. #ifdef AMD64ABI
  1977. mov r15, rsi;
  1978. mov rsi, rdi; // second parameter = parm
  1979. mov rdi, 0xFFFFFFFF; // first parameter= context
  1980. mov rdx, rax; // third parameter = parm
  1981. mov rcx, 0xffffffff; // call function
  1982. sub rsp, 128;
  1983. call rcx;
  1984. mov rsi, r15;
  1985. add rsp, 128;
  1986. movq [r15], xmm0;
  1987. mov rax, r15;
  1988. add rsi, 8;
  1989. #else
  1990. mov ecx, 0xFFFFFFFF; // first parameter= context
  1991. mov edx, edi; // second parameter = parm
  1992. mov r8, rax; // third parameter = parm
  1993. mov edi, 0xffffffff; // call function
  1994. sub rsp, 128;
  1995. call edi;
  1996. add rsp, 128;
  1997. movq [rsi], xmm0;
  1998. mov rax, rsi;
  1999. add rsi, 8;
  2000. #endif
  2001. #else
  2002. SAVE_STACK
  2003. mov edx, 0xFFFFFFFF;
  2004. push eax; // push parameter
  2005. push edi; // push parameter
  2006. push ecx; // push parameter
  2007. push edx; // push context pointer
  2008. mov edi, 0xffffffff;
  2009. call edi;
  2010. mov eax, esi;
  2011. fstp EEL_ASM_TYPE [esi];
  2012. add esi, EEL_F_SIZE;
  2013. add esp, 16;
  2014. RESTORE_STACK
  2015. #endif
  2016. _emit 0x89;
  2017. _emit 0x90;
  2018. _emit 0x90;
  2019. _emit 0x90;
  2020. _emit 0x90;
  2021. _emit 0x90;
  2022. _emit 0x90;
  2023. _emit 0x90;
  2024. _emit 0x90;
  2025. _emit 0x90;
  2026. _emit 0x90;
  2027. _emit 0x90;
  2028. }
  2029. }
  2030. __declspec(naked) void _asm_generic2parm_retd_end(void) {}
  2031. __declspec(naked) void _asm_generic1parm(void) // this prob neds to be fixed for ppc
  2032. {
  2033. __asm {
  2034. #ifdef TARGET_X64
  2035. #ifdef AMD64ABI
  2036. mov rdi, 0xFFFFFFFF; // first parameter= context
  2037. mov r15, rsi;
  2038. mov rsi, eax; // second parameter = parm
  2039. sub rsp, 128;
  2040. mov rcx, 0xffffffff; // call function
  2041. call rcx;
  2042. mov rsi, r15;
  2043. add rsp, 128;
  2044. #else
  2045. mov ecx, 0xFFFFFFFF; // first parameter= context
  2046. mov edx, eax; // second parameter = parm
  2047. mov edi, 0xffffffff; // call function
  2048. sub rsp, 128;
  2049. call edi;
  2050. add rsp, 128;
  2051. #endif
  2052. #else
  2053. SAVE_STACK
  2054. mov edx, 0xFFFFFFFF;
  2055. sub esp, 8; // keep stack aligned
  2056. push eax; // push parameter
  2057. push edx; // push context pointer
  2058. mov edi, 0xffffffff;
  2059. call edi;
  2060. add esp, 16;
  2061. RESTORE_STACK
  2062. #endif
  2063. _emit 0x89;
  2064. _emit 0x90;
  2065. _emit 0x90;
  2066. _emit 0x90;
  2067. _emit 0x90;
  2068. _emit 0x90;
  2069. _emit 0x90;
  2070. _emit 0x90;
  2071. _emit 0x90;
  2072. _emit 0x90;
  2073. _emit 0x90;
  2074. _emit 0x90;
  2075. }
  2076. }
  2077. __declspec(naked) void _asm_generic1parm_end(void) {}
  2078. __declspec(naked) void _asm_generic1parm_retd(void) // 1 parameter returning double
  2079. {
  2080. __asm {
  2081. #ifdef TARGET_X64
  2082. #ifdef AMD64ABI
  2083. mov r15, rsi;
  2084. mov rdi, 0xFFFFFFFF; // first parameter= context
  2085. mov rsi, rax; // second parameter = parm
  2086. mov rcx, 0xffffffff; // call function
  2087. sub rsp, 128;
  2088. call rcx;
  2089. mov rsi, r15;
  2090. add rsp, 128;
  2091. movq [r15], xmm0;
  2092. mov rax, r15;
  2093. add rsi, 8;
  2094. #else
  2095. mov ecx, 0xFFFFFFFF; // first parameter= context
  2096. mov edx, eax; // second parameter = parm
  2097. mov edi, 0xffffffff; // call function
  2098. sub rsp, 128;
  2099. call edi;
  2100. add rsp, 128;
  2101. movq [rsi], xmm0;
  2102. mov rax, rsi;
  2103. add rsi, 8;
  2104. #endif
  2105. #else
  2106. SAVE_STACK
  2107. mov edx, 0xFFFFFFFF;
  2108. sub esp, 8; // keep stack aligned
  2109. push eax; // push parameter
  2110. push edx; // push context pointer
  2111. mov edi, 0xffffffff;
  2112. call edi;
  2113. mov eax, esi;
  2114. fstp EEL_ASM_TYPE [esi];
  2115. add esi, EEL_F_SIZE;
  2116. add esp, 16;
  2117. RESTORE_STACK
  2118. #endif
  2119. _emit 0x89;
  2120. _emit 0x90;
  2121. _emit 0x90;
  2122. _emit 0x90;
  2123. _emit 0x90;
  2124. _emit 0x90;
  2125. _emit 0x90;
  2126. _emit 0x90;
  2127. _emit 0x90;
  2128. _emit 0x90;
  2129. _emit 0x90;
  2130. _emit 0x90;
  2131. }
  2132. }
  2133. __declspec(naked) void _asm_generic1parm_retd_end(void) {}
  2134. // this gets its own stub because it's pretty crucial for performance :/
  2135. __declspec(naked) void _asm_megabuf(void)
  2136. {
  2137. __asm {
  2138. SAVE_STACK
  2139. #ifdef TARGET_X64
  2140. #ifdef AMD64ABI
  2141. mov r15, rsi;
  2142. mov rdi, 0xFFFFFFFF; // first parameter = context pointer
  2143. fld EEL_ASM_TYPE [eax];
  2144. mov rdx, 0xFFFFFFFF;
  2145. fadd EEL_ASM_TYPE [rdx];
  2146. fistp dword ptr [r15];
  2147. xor rsi, rsi;
  2148. mov esi, dword ptr [r15]; // r15 = esi (from above)
  2149. mov edx, 0xffffffff;
  2150. sub rsp, 128;
  2151. call edx;
  2152. mov rsi, r15;
  2153. add rsp, 128;
  2154. and rax, rax;
  2155. jnz label_33;
  2156. mov rax, r15;
  2157. mov qword ptr [esi], 0;
  2158. add rsi, EEL_F_SIZE;
  2159. label_33:
  2160. #else
  2161. mov ecx, 0xFFFFFFFF; // first parameter = context pointer
  2162. fld EEL_ASM_TYPE [eax];
  2163. mov edx, 0xFFFFFFFF;
  2164. fadd EEL_ASM_TYPE [rdx];
  2165. fistp dword ptr [esi];
  2166. xor rdx, rdx;
  2167. mov edx, dword ptr [esi];
  2168. mov edi, 0xffffffff;
  2169. sub rsp, 128;
  2170. call edi;
  2171. add rsp, 128;
  2172. and rax, rax;
  2173. jnz label_34;
  2174. mov rax, rsi;
  2175. mov qword ptr [esi], 0;
  2176. add esi, EEL_F_SIZE;
  2177. label_34:
  2178. #endif
  2179. #else
  2180. mov edx, 0xFFFFFFFF;
  2181. fld EEL_ASM_TYPE [eax];
  2182. #if EEL_F_SIZE == 8
  2183. _emit 0xDC; // fadd qword ptr [0xffffffff]
  2184. _emit 0x05;
  2185. _emit 0xFF;
  2186. _emit 0xFF;
  2187. _emit 0xFF;
  2188. _emit 0xFF;
  2189. #else
  2190. _emit 0xD8; // fadd dword ptr [0xffffffff]
  2191. _emit 0x05;
  2192. _emit 0xFF;
  2193. _emit 0xFF;
  2194. _emit 0xFF;
  2195. _emit 0xFF;
  2196. #endif
  2197. fistp dword ptr [esi];
  2198. sub esp, 8; // keep stack aligned
  2199. push dword ptr [esi]; // parameter
  2200. push edx; // push context pointer
  2201. mov edi, 0xffffffff;
  2202. call edi;
  2203. add esp, 16;
  2204. and eax, eax;
  2205. jnz label_35;
  2206. mov eax, esi;
  2207. mov dword ptr [esi], 0;
  2208. #if EEL_F_SIZE == 8
  2209. mov dword ptr [esi+4], 0;
  2210. #endif
  2211. add esi, EEL_F_SIZE;
  2212. label_35:
  2213. #endif
  2214. RESTORE_STACK
  2215. _emit 0x89;
  2216. _emit 0x90;
  2217. _emit 0x90;
  2218. _emit 0x90;
  2219. _emit 0x90;
  2220. _emit 0x90;
  2221. _emit 0x90;
  2222. _emit 0x90;
  2223. _emit 0x90;
  2224. _emit 0x90;
  2225. _emit 0x90;
  2226. _emit 0x90;
  2227. }
  2228. }
  2229. __declspec(naked) void _asm_megabuf_end(void) {}
  2230. #ifdef TARGET_X64
  2231. __declspec(naked) void win64_callcode()
  2232. {
  2233. __asm {
  2234. #ifdef AMD64ABI
  2235. mov eax, edi;
  2236. #else
  2237. mov eax, ecx;
  2238. #endif
  2239. push rbx;
  2240. push rbp;
  2241. #ifndef AMD64ABI
  2242. push rdi;
  2243. push rsi;
  2244. push r12;
  2245. push r13;
  2246. #endif
  2247. push r14; // on AMD64ABI, we'll use r14/r15 to save edi/esi
  2248. push r15;
  2249. call eax;
  2250. pop r15;
  2251. pop r14;
  2252. #ifndef AMD64ABI
  2253. pop r13;
  2254. pop r12;
  2255. pop rsi;
  2256. pop rdi;
  2257. fclex;
  2258. #endif
  2259. pop rbp;
  2260. pop rbx;
  2261. ret;
  2262. _emit 0x89;
  2263. _emit 0x90;
  2264. _emit 0x90;
  2265. _emit 0x90;
  2266. _emit 0x90;
  2267. _emit 0x90;
  2268. _emit 0x90;
  2269. _emit 0x90;
  2270. _emit 0x90;
  2271. _emit 0x90;
  2272. _emit 0x90;
  2273. _emit 0x90;
  2274. }
  2275. }
  2276. #endif