sljitLir.c 63 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029
  1. /*
  2. * Stack-less Just-In-Time compiler
  3. *
  4. * Copyright 2009-2012 Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without modification, are
  7. * permitted provided that the following conditions are met:
  8. *
  9. * 1. Redistributions of source code must retain the above copyright notice, this list of
  10. * conditions and the following disclaimer.
  11. *
  12. * 2. Redistributions in binary form must reproduce the above copyright notice, this list
  13. * of conditions and the following disclaimer in the documentation and/or other materials
  14. * provided with the distribution.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY
  17. * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  18. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
  19. * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  20. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
  21. * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  22. * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  23. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  24. * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25. */
  26. #include "sljitLir.h"
  27. #define CHECK_ERROR() \
  28. do { \
  29. if (SLJIT_UNLIKELY(compiler->error)) \
  30. return compiler->error; \
  31. } while (0)
  32. #define CHECK_ERROR_PTR() \
  33. do { \
  34. if (SLJIT_UNLIKELY(compiler->error)) \
  35. return NULL; \
  36. } while (0)
  37. #define FAIL_IF(expr) \
  38. do { \
  39. if (SLJIT_UNLIKELY(expr)) \
  40. return compiler->error; \
  41. } while (0)
  42. #define PTR_FAIL_IF(expr) \
  43. do { \
  44. if (SLJIT_UNLIKELY(expr)) \
  45. return NULL; \
  46. } while (0)
  47. #define FAIL_IF_NULL(ptr) \
  48. do { \
  49. if (SLJIT_UNLIKELY(!(ptr))) { \
  50. compiler->error = SLJIT_ERR_ALLOC_FAILED; \
  51. return SLJIT_ERR_ALLOC_FAILED; \
  52. } \
  53. } while (0)
  54. #define PTR_FAIL_IF_NULL(ptr) \
  55. do { \
  56. if (SLJIT_UNLIKELY(!(ptr))) { \
  57. compiler->error = SLJIT_ERR_ALLOC_FAILED; \
  58. return NULL; \
  59. } \
  60. } while (0)
  61. #define PTR_FAIL_WITH_EXEC_IF(ptr) \
  62. do { \
  63. if (SLJIT_UNLIKELY(!(ptr))) { \
  64. compiler->error = SLJIT_ERR_EX_ALLOC_FAILED; \
  65. return NULL; \
  66. } \
  67. } while (0)
  68. #if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
  69. #define GET_OPCODE(op) \
  70. ((op) & ~(SLJIT_INT_OP | SLJIT_SET_E | SLJIT_SET_U | SLJIT_SET_S | SLJIT_SET_O | SLJIT_SET_C | SLJIT_KEEP_FLAGS))
  71. #define GET_FLAGS(op) \
  72. ((op) & (SLJIT_SET_E | SLJIT_SET_U | SLJIT_SET_S | SLJIT_SET_O | SLJIT_SET_C))
  73. #define GET_ALL_FLAGS(op) \
  74. ((op) & (SLJIT_INT_OP | SLJIT_SET_E | SLJIT_SET_U | SLJIT_SET_S | SLJIT_SET_O | SLJIT_SET_C | SLJIT_KEEP_FLAGS))
  75. #define TYPE_CAST_NEEDED(op) \
  76. (((op) >= SLJIT_MOV_UB && (op) <= SLJIT_MOV_SH) || ((op) >= SLJIT_MOVU_UB && (op) <= SLJIT_MOVU_SH))
  77. #define BUF_SIZE 4096
  78. #if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE)
  79. #define ABUF_SIZE 2048
  80. #else
  81. #define ABUF_SIZE 4096
  82. #endif
  83. /* Parameter parsing. */
  84. #define REG_MASK 0x3f
  85. #define OFFS_REG(reg) (((reg) >> 8) & REG_MASK)
  86. #define OFFS_REG_MASK (REG_MASK << 8)
  87. #define TO_OFFS_REG(reg) ((reg) << 8)
  88. /* When reg cannot be unused. */
  89. #define FAST_IS_REG(reg) ((reg) <= REG_MASK)
  90. /* When reg can be unused. */
  91. #define SLOW_IS_REG(reg) ((reg) > 0 && (reg) <= REG_MASK)
  92. /* Jump flags. */
  93. #define JUMP_LABEL 0x1
  94. #define JUMP_ADDR 0x2
  95. /* SLJIT_REWRITABLE_JUMP is 0x1000. */
  96. #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
  97. # define PATCH_MB 0x4
  98. # define PATCH_MW 0x8
  99. #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
  100. # define PATCH_MD 0x10
  101. #endif
  102. #endif
  103. #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
  104. # define IS_BL 0x4
  105. # define PATCH_B 0x8
  106. #endif
  107. #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
  108. # define CPOOL_SIZE 512
  109. #endif
  110. #if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
  111. # define IS_COND 0x04
  112. # define IS_BL 0x08
  113. /* conditional + imm8 */
  114. # define PATCH_TYPE1 0x10
  115. /* conditional + imm20 */
  116. # define PATCH_TYPE2 0x20
  117. /* IT + imm24 */
  118. # define PATCH_TYPE3 0x30
  119. /* imm11 */
  120. # define PATCH_TYPE4 0x40
  121. /* imm24 */
  122. # define PATCH_TYPE5 0x50
  123. /* BL + imm24 */
  124. # define PATCH_BL 0x60
  125. /* 0xf00 cc code for branches */
  126. #endif
  127. #if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
  128. # define IS_COND 0x004
  129. # define IS_CBZ 0x008
  130. # define IS_BL 0x010
  131. # define PATCH_B 0x020
  132. # define PATCH_COND 0x040
  133. # define PATCH_ABS48 0x080
  134. # define PATCH_ABS64 0x100
  135. #endif
  136. #if (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
  137. # define IS_COND 0x004
  138. # define IS_CALL 0x008
  139. # define PATCH_B 0x010
  140. # define PATCH_ABS_B 0x020
  141. #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
  142. # define PATCH_ABS32 0x040
  143. # define PATCH_ABS48 0x080
  144. #endif
  145. # define REMOVE_COND 0x100
  146. #endif
  147. #if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
  148. # define IS_MOVABLE 0x004
  149. # define IS_JAL 0x008
  150. # define IS_CALL 0x010
  151. # define IS_BIT26_COND 0x020
  152. # define IS_BIT16_COND 0x040
  153. # define IS_COND (IS_BIT26_COND | IS_BIT16_COND)
  154. # define PATCH_B 0x080
  155. # define PATCH_J 0x100
  156. #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
  157. # define PATCH_ABS32 0x200
  158. # define PATCH_ABS48 0x400
  159. #endif
  160. /* instruction types */
  161. # define MOVABLE_INS 0
  162. /* 1 - 31 last destination register */
  163. /* no destination (i.e: store) */
  164. # define UNMOVABLE_INS 32
  165. /* FPU status register */
  166. # define FCSR_FCC 33
  167. #endif
  168. #if (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX)
  169. # define IS_JAL 0x04
  170. # define IS_COND 0x08
  171. # define PATCH_B 0x10
  172. # define PATCH_J 0x20
  173. #endif
  174. #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
  175. # define IS_MOVABLE 0x04
  176. # define IS_COND 0x08
  177. # define IS_CALL 0x10
  178. # define PATCH_B 0x20
  179. # define PATCH_CALL 0x40
  180. /* instruction types */
  181. # define MOVABLE_INS 0
  182. /* 1 - 31 last destination register */
  183. /* no destination (i.e: store) */
  184. # define UNMOVABLE_INS 32
  185. # define DST_INS_MASK 0xff
  186. /* ICC_SET is the same as SET_FLAGS. */
  187. # define ICC_IS_SET (1 << 23)
  188. # define FCC_IS_SET (1 << 24)
  189. #endif
  190. /* Stack management. */
  191. #define GET_SAVED_REGISTERS_SIZE(scratches, saveds, extra) \
  192. (((scratches < SLJIT_NUMBER_OF_SCRATCH_REGISTERS ? 0 : (scratches - SLJIT_NUMBER_OF_SCRATCH_REGISTERS)) + \
  193. (saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? saveds : SLJIT_NUMBER_OF_SAVED_REGISTERS) + \
  194. extra) * sizeof(sljit_sw))
  195. #define ADJUST_LOCAL_OFFSET(p, i) \
  196. if ((p) == (SLJIT_MEM1(SLJIT_SP))) \
  197. (i) += SLJIT_LOCALS_OFFSET;
  198. #endif /* !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) */
  199. /* Utils can still be used even if SLJIT_CONFIG_UNSUPPORTED is set. */
  200. #include "sljitUtils.c"
  201. #if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
  202. #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
  203. #include "sljitExecAllocator.c"
  204. #endif
  205. /* Argument checking features. */
  206. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  207. /* Returns with error when an invalid argument is passed. */
  208. #define CHECK_ARGUMENT(x) \
  209. do { \
  210. if (SLJIT_UNLIKELY(!(x))) \
  211. return 1; \
  212. } while (0)
  213. #define CHECK_RETURN_TYPE sljit_si
  214. #define CHECK_RETURN_OK return 0
  215. #define CHECK(x) \
  216. do { \
  217. if (SLJIT_UNLIKELY(x)) { \
  218. compiler->error = SLJIT_ERR_BAD_ARGUMENT; \
  219. return SLJIT_ERR_BAD_ARGUMENT; \
  220. } \
  221. } while (0)
  222. #define CHECK_PTR(x) \
  223. do { \
  224. if (SLJIT_UNLIKELY(x)) { \
  225. compiler->error = SLJIT_ERR_BAD_ARGUMENT; \
  226. return NULL; \
  227. } \
  228. } while (0)
  229. #define CHECK_REG_INDEX(x) \
  230. do { \
  231. if (SLJIT_UNLIKELY(x)) { \
  232. return -2; \
  233. } \
  234. } while (0)
  235. #elif (defined SLJIT_DEBUG && SLJIT_DEBUG)
  236. /* Assertion failure occures if an invalid argument is passed. */
  237. #undef SLJIT_ARGUMENT_CHECKS
  238. #define SLJIT_ARGUMENT_CHECKS 1
  239. #define CHECK_ARGUMENT(x) SLJIT_ASSERT(x)
  240. #define CHECK_RETURN_TYPE void
  241. #define CHECK_RETURN_OK return
  242. #define CHECK(x) x
  243. #define CHECK_PTR(x) x
  244. #define CHECK_REG_INDEX(x) x
  245. #elif (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  246. /* Arguments are not checked. */
  247. #define CHECK_RETURN_TYPE void
  248. #define CHECK_RETURN_OK return
  249. #define CHECK(x) x
  250. #define CHECK_PTR(x) x
  251. #define CHECK_REG_INDEX(x) x
  252. #else
  253. /* Arguments are not checked. */
  254. #define CHECK(x)
  255. #define CHECK_PTR(x)
  256. #define CHECK_REG_INDEX(x)
  257. #endif /* SLJIT_ARGUMENT_CHECKS */
  258. /* --------------------------------------------------------------------- */
  259. /* Public functions */
  260. /* --------------------------------------------------------------------- */
  261. #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
  262. #define SLJIT_NEEDS_COMPILER_INIT 1
  263. static sljit_si compiler_initialized = 0;
  264. /* A thread safe initialization. */
  265. static void init_compiler(void);
  266. #endif
  267. SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void *allocator_data)
  268. {
  269. struct sljit_compiler *compiler = (struct sljit_compiler*)SLJIT_MALLOC(sizeof(struct sljit_compiler), allocator_data);
  270. if (!compiler)
  271. return NULL;
  272. SLJIT_ZEROMEM(compiler, sizeof(struct sljit_compiler));
  273. SLJIT_COMPILE_ASSERT(
  274. sizeof(sljit_sb) == 1 && sizeof(sljit_ub) == 1
  275. && sizeof(sljit_sh) == 2 && sizeof(sljit_uh) == 2
  276. && sizeof(sljit_si) == 4 && sizeof(sljit_ui) == 4
  277. && (sizeof(sljit_p) == 4 || sizeof(sljit_p) == 8)
  278. && sizeof(sljit_p) <= sizeof(sljit_sw)
  279. && (sizeof(sljit_sw) == 4 || sizeof(sljit_sw) == 8)
  280. && (sizeof(sljit_uw) == 4 || sizeof(sljit_uw) == 8),
  281. invalid_integer_types);
  282. SLJIT_COMPILE_ASSERT(SLJIT_INT_OP == SLJIT_SINGLE_OP,
  283. int_op_and_single_op_must_be_the_same);
  284. SLJIT_COMPILE_ASSERT(SLJIT_REWRITABLE_JUMP != SLJIT_SINGLE_OP,
  285. rewritable_jump_and_single_op_must_not_be_the_same);
  286. /* Only the non-zero members must be set. */
  287. compiler->error = SLJIT_SUCCESS;
  288. compiler->allocator_data = allocator_data;
  289. compiler->buf = (struct sljit_memory_fragment*)SLJIT_MALLOC(BUF_SIZE, allocator_data);
  290. compiler->abuf = (struct sljit_memory_fragment*)SLJIT_MALLOC(ABUF_SIZE, allocator_data);
  291. if (!compiler->buf || !compiler->abuf) {
  292. if (compiler->buf)
  293. SLJIT_FREE(compiler->buf, allocator_data);
  294. if (compiler->abuf)
  295. SLJIT_FREE(compiler->abuf, allocator_data);
  296. SLJIT_FREE(compiler, allocator_data);
  297. return NULL;
  298. }
  299. compiler->buf->next = NULL;
  300. compiler->buf->used_size = 0;
  301. compiler->abuf->next = NULL;
  302. compiler->abuf->used_size = 0;
  303. compiler->scratches = -1;
  304. compiler->saveds = -1;
  305. compiler->fscratches = -1;
  306. compiler->fsaveds = -1;
  307. compiler->local_size = -1;
  308. #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
  309. compiler->args = -1;
  310. #endif
  311. #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
  312. compiler->cpool = (sljit_uw*)SLJIT_MALLOC(CPOOL_SIZE * sizeof(sljit_uw)
  313. + CPOOL_SIZE * sizeof(sljit_ub), allocator_data);
  314. if (!compiler->cpool) {
  315. SLJIT_FREE(compiler->buf, allocator_data);
  316. SLJIT_FREE(compiler->abuf, allocator_data);
  317. SLJIT_FREE(compiler, allocator_data);
  318. return NULL;
  319. }
  320. compiler->cpool_unique = (sljit_ub*)(compiler->cpool + CPOOL_SIZE);
  321. compiler->cpool_diff = 0xffffffff;
  322. #endif
  323. #if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
  324. compiler->delay_slot = UNMOVABLE_INS;
  325. #endif
  326. #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
  327. compiler->delay_slot = UNMOVABLE_INS;
  328. #endif
  329. #if (defined SLJIT_NEEDS_COMPILER_INIT && SLJIT_NEEDS_COMPILER_INIT)
  330. if (!compiler_initialized) {
  331. init_compiler();
  332. compiler_initialized = 1;
  333. }
  334. #endif
  335. return compiler;
  336. }
  337. SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler)
  338. {
  339. struct sljit_memory_fragment *buf;
  340. struct sljit_memory_fragment *curr;
  341. void *allocator_data = compiler->allocator_data;
  342. SLJIT_UNUSED_ARG(allocator_data);
  343. buf = compiler->buf;
  344. while (buf) {
  345. curr = buf;
  346. buf = buf->next;
  347. SLJIT_FREE(curr, allocator_data);
  348. }
  349. buf = compiler->abuf;
  350. while (buf) {
  351. curr = buf;
  352. buf = buf->next;
  353. SLJIT_FREE(curr, allocator_data);
  354. }
  355. #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
  356. SLJIT_FREE(compiler->cpool, allocator_data);
  357. #endif
  358. SLJIT_FREE(compiler, allocator_data);
  359. }
  360. SLJIT_API_FUNC_ATTRIBUTE void sljit_set_compiler_memory_error(struct sljit_compiler *compiler)
  361. {
  362. if (compiler->error == SLJIT_SUCCESS)
  363. compiler->error = SLJIT_ERR_ALLOC_FAILED;
  364. }
  365. #if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
  366. SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code)
  367. {
  368. /* Remove thumb mode flag. */
  369. SLJIT_FREE_EXEC((void*)((sljit_uw)code & ~0x1));
  370. }
  371. #elif (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
  372. SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code)
  373. {
  374. /* Resolve indirection. */
  375. code = (void*)(*(sljit_uw*)code);
  376. SLJIT_FREE_EXEC(code);
  377. }
  378. #else
  379. SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code)
  380. {
  381. SLJIT_FREE_EXEC(code);
  382. }
  383. #endif
  384. SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label)
  385. {
  386. if (SLJIT_LIKELY(!!jump) && SLJIT_LIKELY(!!label)) {
  387. jump->flags &= ~JUMP_ADDR;
  388. jump->flags |= JUMP_LABEL;
  389. jump->u.label = label;
  390. }
  391. }
  392. SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target)
  393. {
  394. if (SLJIT_LIKELY(!!jump)) {
  395. jump->flags &= ~JUMP_LABEL;
  396. jump->flags |= JUMP_ADDR;
  397. jump->u.target = target;
  398. }
  399. }
  400. /* --------------------------------------------------------------------- */
  401. /* Private functions */
  402. /* --------------------------------------------------------------------- */
  403. static void* ensure_buf(struct sljit_compiler *compiler, sljit_uw size)
  404. {
  405. sljit_ub *ret;
  406. struct sljit_memory_fragment *new_frag;
  407. SLJIT_ASSERT(size <= 256);
  408. if (compiler->buf->used_size + size <= (BUF_SIZE - (sljit_uw)SLJIT_OFFSETOF(struct sljit_memory_fragment, memory))) {
  409. ret = compiler->buf->memory + compiler->buf->used_size;
  410. compiler->buf->used_size += size;
  411. return ret;
  412. }
  413. new_frag = (struct sljit_memory_fragment*)SLJIT_MALLOC(BUF_SIZE, compiler->allocator_data);
  414. PTR_FAIL_IF_NULL(new_frag);
  415. new_frag->next = compiler->buf;
  416. compiler->buf = new_frag;
  417. new_frag->used_size = size;
  418. return new_frag->memory;
  419. }
  420. static void* ensure_abuf(struct sljit_compiler *compiler, sljit_uw size)
  421. {
  422. sljit_ub *ret;
  423. struct sljit_memory_fragment *new_frag;
  424. SLJIT_ASSERT(size <= 256);
  425. if (compiler->abuf->used_size + size <= (ABUF_SIZE - (sljit_uw)SLJIT_OFFSETOF(struct sljit_memory_fragment, memory))) {
  426. ret = compiler->abuf->memory + compiler->abuf->used_size;
  427. compiler->abuf->used_size += size;
  428. return ret;
  429. }
  430. new_frag = (struct sljit_memory_fragment*)SLJIT_MALLOC(ABUF_SIZE, compiler->allocator_data);
  431. PTR_FAIL_IF_NULL(new_frag);
  432. new_frag->next = compiler->abuf;
  433. compiler->abuf = new_frag;
  434. new_frag->used_size = size;
  435. return new_frag->memory;
  436. }
  437. SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, sljit_si size)
  438. {
  439. CHECK_ERROR_PTR();
  440. #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
  441. if (size <= 0 || size > 128)
  442. return NULL;
  443. size = (size + 7) & ~7;
  444. #else
  445. if (size <= 0 || size > 64)
  446. return NULL;
  447. size = (size + 3) & ~3;
  448. #endif
  449. return ensure_abuf(compiler, size);
  450. }
  451. static SLJIT_INLINE void reverse_buf(struct sljit_compiler *compiler)
  452. {
  453. struct sljit_memory_fragment *buf = compiler->buf;
  454. struct sljit_memory_fragment *prev = NULL;
  455. struct sljit_memory_fragment *tmp;
  456. do {
  457. tmp = buf->next;
  458. buf->next = prev;
  459. prev = buf;
  460. buf = tmp;
  461. } while (buf != NULL);
  462. compiler->buf = prev;
  463. }
  464. static SLJIT_INLINE void set_emit_enter(struct sljit_compiler *compiler,
  465. sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
  466. sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
  467. {
  468. SLJIT_UNUSED_ARG(args);
  469. SLJIT_UNUSED_ARG(local_size);
  470. compiler->options = options;
  471. compiler->scratches = scratches;
  472. compiler->saveds = saveds;
  473. compiler->fscratches = fscratches;
  474. compiler->fsaveds = fsaveds;
  475. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  476. compiler->logical_local_size = local_size;
  477. #endif
  478. }
  479. static SLJIT_INLINE void set_set_context(struct sljit_compiler *compiler,
  480. sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
  481. sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
  482. {
  483. SLJIT_UNUSED_ARG(args);
  484. SLJIT_UNUSED_ARG(local_size);
  485. compiler->options = options;
  486. compiler->scratches = scratches;
  487. compiler->saveds = saveds;
  488. compiler->fscratches = fscratches;
  489. compiler->fsaveds = fsaveds;
  490. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  491. compiler->logical_local_size = local_size;
  492. #endif
  493. }
  494. static SLJIT_INLINE void set_label(struct sljit_label *label, struct sljit_compiler *compiler)
  495. {
  496. label->next = NULL;
  497. label->size = compiler->size;
  498. if (compiler->last_label)
  499. compiler->last_label->next = label;
  500. else
  501. compiler->labels = label;
  502. compiler->last_label = label;
  503. }
  504. static SLJIT_INLINE void set_jump(struct sljit_jump *jump, struct sljit_compiler *compiler, sljit_si flags)
  505. {
  506. jump->next = NULL;
  507. jump->flags = flags;
  508. if (compiler->last_jump)
  509. compiler->last_jump->next = jump;
  510. else
  511. compiler->jumps = jump;
  512. compiler->last_jump = jump;
  513. }
  514. static SLJIT_INLINE void set_const(struct sljit_const *const_, struct sljit_compiler *compiler)
  515. {
  516. const_->next = NULL;
  517. const_->addr = compiler->size;
  518. if (compiler->last_const)
  519. compiler->last_const->next = const_;
  520. else
  521. compiler->consts = const_;
  522. compiler->last_const = const_;
  523. }
  524. #define ADDRESSING_DEPENDS_ON(exp, reg) \
  525. (((exp) & SLJIT_MEM) && (((exp) & REG_MASK) == reg || OFFS_REG(exp) == reg))
  526. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  527. #define FUNCTION_CHECK_OP() \
  528. CHECK_ARGUMENT(!GET_FLAGS(op) || !(op & SLJIT_KEEP_FLAGS)); \
  529. switch (GET_OPCODE(op)) { \
  530. case SLJIT_NOT: \
  531. case SLJIT_CLZ: \
  532. case SLJIT_AND: \
  533. case SLJIT_OR: \
  534. case SLJIT_XOR: \
  535. case SLJIT_SHL: \
  536. case SLJIT_LSHR: \
  537. case SLJIT_ASHR: \
  538. CHECK_ARGUMENT(!(op & (SLJIT_SET_U | SLJIT_SET_S | SLJIT_SET_O | SLJIT_SET_C))); \
  539. break; \
  540. case SLJIT_NEG: \
  541. CHECK_ARGUMENT(!(op & (SLJIT_SET_U | SLJIT_SET_S | SLJIT_SET_C))); \
  542. break; \
  543. case SLJIT_MUL: \
  544. CHECK_ARGUMENT(!(op & (SLJIT_SET_E | SLJIT_SET_U | SLJIT_SET_S | SLJIT_SET_C))); \
  545. break; \
  546. case SLJIT_ADD: \
  547. CHECK_ARGUMENT(!(op & (SLJIT_SET_U | SLJIT_SET_S))); \
  548. break; \
  549. case SLJIT_SUB: \
  550. break; \
  551. case SLJIT_ADDC: \
  552. case SLJIT_SUBC: \
  553. CHECK_ARGUMENT(!(op & (SLJIT_SET_E | SLJIT_SET_U | SLJIT_SET_S | SLJIT_SET_O))); \
  554. break; \
  555. case SLJIT_BREAKPOINT: \
  556. case SLJIT_NOP: \
  557. case SLJIT_LUMUL: \
  558. case SLJIT_LSMUL: \
  559. case SLJIT_MOV: \
  560. case SLJIT_MOV_UI: \
  561. case SLJIT_MOV_P: \
  562. case SLJIT_MOVU: \
  563. case SLJIT_MOVU_UI: \
  564. case SLJIT_MOVU_P: \
  565. /* Nothing allowed */ \
  566. CHECK_ARGUMENT(!(op & (SLJIT_INT_OP | SLJIT_SET_E | SLJIT_SET_U | SLJIT_SET_S | SLJIT_SET_O | SLJIT_SET_C | SLJIT_KEEP_FLAGS))); \
  567. break; \
  568. default: \
  569. /* Only SLJIT_INT_OP or SLJIT_SINGLE_OP is allowed. */ \
  570. CHECK_ARGUMENT(!(op & (SLJIT_SET_E | SLJIT_SET_U | SLJIT_SET_S | SLJIT_SET_O | SLJIT_SET_C | SLJIT_KEEP_FLAGS))); \
  571. break; \
  572. }
  573. #define FUNCTION_CHECK_FOP() \
  574. CHECK_ARGUMENT(!GET_FLAGS(op) || !(op & SLJIT_KEEP_FLAGS)); \
  575. switch (GET_OPCODE(op)) { \
  576. case SLJIT_DCMP: \
  577. CHECK_ARGUMENT(!(op & (SLJIT_SET_U | SLJIT_SET_O | SLJIT_SET_C | SLJIT_KEEP_FLAGS))); \
  578. CHECK_ARGUMENT((op & (SLJIT_SET_E | SLJIT_SET_S))); \
  579. break; \
  580. default: \
  581. /* Only SLJIT_INT_OP or SLJIT_SINGLE_OP is allowed. */ \
  582. CHECK_ARGUMENT(!(op & (SLJIT_SET_E | SLJIT_SET_U | SLJIT_SET_S | SLJIT_SET_O | SLJIT_SET_C | SLJIT_KEEP_FLAGS))); \
  583. break; \
  584. }
  585. #define FUNCTION_CHECK_IS_REG(r) \
  586. (((r) >= SLJIT_R0 && (r) < (SLJIT_R0 + compiler->scratches)) || \
  587. ((r) > (SLJIT_S0 - compiler->saveds) && (r) <= SLJIT_S0))
  588. #define FUNCTION_CHECK_IS_REG_OR_UNUSED(r) \
  589. ((r) == SLJIT_UNUSED || \
  590. ((r) >= SLJIT_R0 && (r) < (SLJIT_R0 + compiler->scratches)) || \
  591. ((r) > (SLJIT_S0 - compiler->saveds) && (r) <= SLJIT_S0))
  592. #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
  593. #define CHECK_NOT_VIRTUAL_REGISTER(p) \
  594. CHECK_ARGUMENT((p) < SLJIT_R3 || (p) > SLJIT_R6);
  595. #else
  596. #define CHECK_NOT_VIRTUAL_REGISTER(p)
  597. #endif
  598. #define FUNCTION_CHECK_SRC(p, i) \
  599. CHECK_ARGUMENT(compiler->scratches != -1 && compiler->saveds != -1); \
  600. if (FUNCTION_CHECK_IS_REG(p)) \
  601. CHECK_ARGUMENT((i) == 0); \
  602. else if ((p) == SLJIT_IMM) \
  603. ; \
  604. else if ((p) == (SLJIT_MEM1(SLJIT_SP))) \
  605. CHECK_ARGUMENT((i) >= 0 && (i) < compiler->logical_local_size); \
  606. else { \
  607. CHECK_ARGUMENT((p) & SLJIT_MEM); \
  608. CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG_OR_UNUSED((p) & REG_MASK)); \
  609. CHECK_NOT_VIRTUAL_REGISTER((p) & REG_MASK); \
  610. if ((p) & OFFS_REG_MASK) { \
  611. CHECK_ARGUMENT(((p) & REG_MASK) != SLJIT_UNUSED); \
  612. CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(OFFS_REG(p))); \
  613. CHECK_NOT_VIRTUAL_REGISTER(OFFS_REG(p)); \
  614. CHECK_ARGUMENT(!((i) & ~0x3)); \
  615. } \
  616. CHECK_ARGUMENT(!((p) & ~(SLJIT_MEM | SLJIT_IMM | REG_MASK | OFFS_REG_MASK))); \
  617. }
  618. #define FUNCTION_CHECK_DST(p, i) \
  619. CHECK_ARGUMENT(compiler->scratches != -1 && compiler->saveds != -1); \
  620. if (FUNCTION_CHECK_IS_REG_OR_UNUSED(p)) \
  621. CHECK_ARGUMENT((i) == 0); \
  622. else if ((p) == (SLJIT_MEM1(SLJIT_SP))) \
  623. CHECK_ARGUMENT((i) >= 0 && (i) < compiler->logical_local_size); \
  624. else { \
  625. CHECK_ARGUMENT((p) & SLJIT_MEM); \
  626. CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG_OR_UNUSED((p) & REG_MASK)); \
  627. CHECK_NOT_VIRTUAL_REGISTER((p) & REG_MASK); \
  628. if ((p) & OFFS_REG_MASK) { \
  629. CHECK_ARGUMENT(((p) & REG_MASK) != SLJIT_UNUSED); \
  630. CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(OFFS_REG(p))); \
  631. CHECK_NOT_VIRTUAL_REGISTER(OFFS_REG(p)); \
  632. CHECK_ARGUMENT(!((i) & ~0x3)); \
  633. } \
  634. CHECK_ARGUMENT(!((p) & ~(SLJIT_MEM | SLJIT_IMM | REG_MASK | OFFS_REG_MASK))); \
  635. }
  636. #define FUNCTION_FCHECK(p, i) \
  637. CHECK_ARGUMENT(compiler->fscratches != -1 && compiler->fsaveds != -1); \
  638. if (((p) >= SLJIT_FR0 && (p) < (SLJIT_FR0 + compiler->fscratches)) || \
  639. ((p) > (SLJIT_FS0 - compiler->fsaveds) && (p) <= SLJIT_FS0)) \
  640. CHECK_ARGUMENT(i == 0); \
  641. else if ((p) == (SLJIT_MEM1(SLJIT_SP))) \
  642. CHECK_ARGUMENT((i) >= 0 && (i) < compiler->logical_local_size); \
  643. else { \
  644. CHECK_ARGUMENT((p) & SLJIT_MEM); \
  645. CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG_OR_UNUSED((p) & REG_MASK)); \
  646. CHECK_NOT_VIRTUAL_REGISTER((p) & REG_MASK); \
  647. if ((p) & OFFS_REG_MASK) { \
  648. CHECK_ARGUMENT(((p) & REG_MASK) != SLJIT_UNUSED); \
  649. CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(OFFS_REG(p))); \
  650. CHECK_NOT_VIRTUAL_REGISTER(OFFS_REG(p)); \
  651. CHECK_ARGUMENT(((p) & OFFS_REG_MASK) != TO_OFFS_REG(SLJIT_SP) && !(i & ~0x3)); \
  652. } \
  653. CHECK_ARGUMENT(!((p) & ~(SLJIT_MEM | SLJIT_IMM | REG_MASK | OFFS_REG_MASK))); \
  654. }
  655. #define FUNCTION_CHECK_OP1() \
  656. if (GET_OPCODE(op) >= SLJIT_MOVU && GET_OPCODE(op) <= SLJIT_MOVU_P) { \
  657. CHECK_ARGUMENT(!(src & SLJIT_MEM) || (src & REG_MASK) != SLJIT_SP); \
  658. CHECK_ARGUMENT(!(dst & SLJIT_MEM) || (dst & REG_MASK) != SLJIT_SP); \
  659. if ((src & SLJIT_MEM) && (src & REG_MASK)) \
  660. CHECK_ARGUMENT((dst & REG_MASK) != (src & REG_MASK) && OFFS_REG(dst) != (src & REG_MASK)); \
  661. }
  662. #endif /* SLJIT_ARGUMENT_CHECKS */
  663. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  664. SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose)
  665. {
  666. compiler->verbose = verbose;
  667. }
  668. #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
  669. #ifdef _WIN64
  670. # define SLJIT_PRINT_D "I64"
  671. #else
  672. # define SLJIT_PRINT_D "l"
  673. #endif
  674. #else
  675. # define SLJIT_PRINT_D ""
  676. #endif
  677. #define sljit_verbose_reg(compiler, r) \
  678. do { \
  679. if ((r) < (SLJIT_R0 + compiler->scratches)) \
  680. fprintf(compiler->verbose, "r%d", (r) - SLJIT_R0); \
  681. else \
  682. fprintf(compiler->verbose, "s%d", SLJIT_NUMBER_OF_REGISTERS - (r)); \
  683. } while (0)
  684. #define sljit_verbose_param(compiler, p, i) \
  685. if ((p) & SLJIT_IMM) \
  686. fprintf(compiler->verbose, "#%" SLJIT_PRINT_D "d", (i)); \
  687. else if ((p) & SLJIT_MEM) { \
  688. if ((p) & REG_MASK) { \
  689. fputc('[', compiler->verbose); \
  690. sljit_verbose_reg(compiler, (p) & REG_MASK); \
  691. if ((p) & OFFS_REG_MASK) { \
  692. fprintf(compiler->verbose, " + "); \
  693. sljit_verbose_reg(compiler, OFFS_REG(p)); \
  694. if (i) \
  695. fprintf(compiler->verbose, " * %d", 1 << (i)); \
  696. } \
  697. else if (i) \
  698. fprintf(compiler->verbose, " + %" SLJIT_PRINT_D "d", (i)); \
  699. fputc(']', compiler->verbose); \
  700. } \
  701. else \
  702. fprintf(compiler->verbose, "[#%" SLJIT_PRINT_D "d]", (i)); \
  703. } else if (p) \
  704. sljit_verbose_reg(compiler, p); \
  705. else \
  706. fprintf(compiler->verbose, "unused");
  707. #define sljit_verbose_fparam(compiler, p, i) \
  708. if ((p) & SLJIT_MEM) { \
  709. if ((p) & REG_MASK) { \
  710. fputc('[', compiler->verbose); \
  711. sljit_verbose_reg(compiler, (p) & REG_MASK); \
  712. if ((p) & OFFS_REG_MASK) { \
  713. fprintf(compiler->verbose, " + "); \
  714. sljit_verbose_reg(compiler, OFFS_REG(p)); \
  715. if (i) \
  716. fprintf(compiler->verbose, "%d", 1 << (i)); \
  717. } \
  718. else if (i) \
  719. fprintf(compiler->verbose, "%" SLJIT_PRINT_D "d", (i)); \
  720. fputc(']', compiler->verbose); \
  721. } \
  722. else \
  723. fprintf(compiler->verbose, "[#%" SLJIT_PRINT_D "d]", (i)); \
  724. } \
  725. else { \
  726. if ((p) < (SLJIT_FR0 + compiler->fscratches)) \
  727. fprintf(compiler->verbose, "fr%d", (p) - SLJIT_FR0); \
  728. else \
  729. fprintf(compiler->verbose, "fs%d", SLJIT_NUMBER_OF_FLOAT_REGISTERS - (p)); \
  730. }
  731. static SLJIT_CONST char* op0_names[] = {
  732. (char*)"breakpoint", (char*)"nop", (char*)"lumul", (char*)"lsmul",
  733. (char*)"udivmod", (char*)"sdivmod", (char*)"udivi", (char*)"sdivi"
  734. };
  735. static SLJIT_CONST char* op1_names[] = {
  736. (char*)"mov", (char*)"mov_ub", (char*)"mov_sb", (char*)"mov_uh",
  737. (char*)"mov_sh", (char*)"mov_ui", (char*)"mov_si", (char*)"mov_p",
  738. (char*)"movu", (char*)"movu_ub", (char*)"movu_sb", (char*)"movu_uh",
  739. (char*)"movu_sh", (char*)"movu_ui", (char*)"movu_si", (char*)"movu_p",
  740. (char*)"not", (char*)"neg", (char*)"clz",
  741. };
  742. static SLJIT_CONST char* op2_names[] = {
  743. (char*)"add", (char*)"addc", (char*)"sub", (char*)"subc",
  744. (char*)"mul", (char*)"and", (char*)"or", (char*)"xor",
  745. (char*)"shl", (char*)"lshr", (char*)"ashr",
  746. };
  747. static SLJIT_CONST char* fop1_names[] = {
  748. (char*)"mov", (char*)"conv", (char*)"conv", (char*)"conv",
  749. (char*)"conv", (char*)"conv", (char*)"cmp", (char*)"neg",
  750. (char*)"abs",
  751. };
  752. static SLJIT_CONST char* fop2_names[] = {
  753. (char*)"add", (char*)"sub", (char*)"mul", (char*)"div"
  754. };
  755. #define JUMP_PREFIX(type) \
  756. ((type & 0xff) <= SLJIT_MUL_NOT_OVERFLOW ? ((type & SLJIT_INT_OP) ? "i_" : "") \
  757. : ((type & 0xff) <= SLJIT_D_ORDERED ? ((type & SLJIT_SINGLE_OP) ? "s_" : "d_") : ""))
  758. static char* jump_names[] = {
  759. (char*)"equal", (char*)"not_equal",
  760. (char*)"less", (char*)"greater_equal",
  761. (char*)"greater", (char*)"less_equal",
  762. (char*)"sig_less", (char*)"sig_greater_equal",
  763. (char*)"sig_greater", (char*)"sig_less_equal",
  764. (char*)"overflow", (char*)"not_overflow",
  765. (char*)"mul_overflow", (char*)"mul_not_overflow",
  766. (char*)"equal", (char*)"not_equal",
  767. (char*)"less", (char*)"greater_equal",
  768. (char*)"greater", (char*)"less_equal",
  769. (char*)"unordered", (char*)"ordered",
  770. (char*)"jump", (char*)"fast_call",
  771. (char*)"call0", (char*)"call1", (char*)"call2", (char*)"call3"
  772. };
  773. #endif /* SLJIT_VERBOSE */
  774. /* --------------------------------------------------------------------- */
  775. /* Arch dependent */
  776. /* --------------------------------------------------------------------- */
  777. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \
  778. || (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  779. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_generate_code(struct sljit_compiler *compiler)
  780. {
  781. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  782. struct sljit_jump *jump;
  783. #endif
  784. SLJIT_UNUSED_ARG(compiler);
  785. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  786. CHECK_ARGUMENT(compiler->size > 0);
  787. jump = compiler->jumps;
  788. while (jump) {
  789. /* All jumps have target. */
  790. CHECK_ARGUMENT(jump->flags & (JUMP_LABEL | JUMP_ADDR));
  791. jump = jump->next;
  792. }
  793. #endif
  794. CHECK_RETURN_OK;
  795. }
  796. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_enter(struct sljit_compiler *compiler,
  797. sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
  798. sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
  799. {
  800. SLJIT_UNUSED_ARG(compiler);
  801. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  802. CHECK_ARGUMENT(!(options & ~SLJIT_DOUBLE_ALIGNMENT));
  803. CHECK_ARGUMENT(args >= 0 && args <= 3);
  804. CHECK_ARGUMENT(scratches >= 0 && scratches <= SLJIT_NUMBER_OF_REGISTERS);
  805. CHECK_ARGUMENT(saveds >= 0 && saveds <= SLJIT_NUMBER_OF_REGISTERS);
  806. CHECK_ARGUMENT(scratches + saveds <= SLJIT_NUMBER_OF_REGISTERS);
  807. CHECK_ARGUMENT(args <= saveds);
  808. CHECK_ARGUMENT(fscratches >= 0 && fscratches <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
  809. CHECK_ARGUMENT(fsaveds >= 0 && fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
  810. CHECK_ARGUMENT(fscratches + fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
  811. CHECK_ARGUMENT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE);
  812. #endif
  813. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  814. if (SLJIT_UNLIKELY(!!compiler->verbose))
  815. fprintf(compiler->verbose, " enter options:none args:%d scratches:%d saveds:%d fscratches:%d fsaveds:%d local_size:%d\n",
  816. args, scratches, saveds, fscratches, fsaveds, local_size);
  817. #endif
  818. CHECK_RETURN_OK;
  819. }
  820. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_set_context(struct sljit_compiler *compiler,
  821. sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
  822. sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
  823. {
  824. if (SLJIT_UNLIKELY(compiler->skip_checks)) {
  825. compiler->skip_checks = 0;
  826. CHECK_RETURN_OK;
  827. }
  828. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  829. CHECK_ARGUMENT(!(options & ~SLJIT_DOUBLE_ALIGNMENT));
  830. CHECK_ARGUMENT(args >= 0 && args <= 3);
  831. CHECK_ARGUMENT(scratches >= 0 && scratches <= SLJIT_NUMBER_OF_REGISTERS);
  832. CHECK_ARGUMENT(saveds >= 0 && saveds <= SLJIT_NUMBER_OF_REGISTERS);
  833. CHECK_ARGUMENT(scratches + saveds <= SLJIT_NUMBER_OF_REGISTERS);
  834. CHECK_ARGUMENT(args <= saveds);
  835. CHECK_ARGUMENT(fscratches >= 0 && fscratches <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
  836. CHECK_ARGUMENT(fsaveds >= 0 && fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
  837. CHECK_ARGUMENT(fscratches + fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
  838. CHECK_ARGUMENT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE);
  839. #endif
  840. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  841. if (SLJIT_UNLIKELY(!!compiler->verbose))
  842. fprintf(compiler->verbose, " set_context options:none args:%d scratches:%d saveds:%d fscratches:%d fsaveds:%d local_size:%d\n",
  843. args, scratches, saveds, fscratches, fsaveds, local_size);
  844. #endif
  845. CHECK_RETURN_OK;
  846. }
  847. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw)
  848. {
  849. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  850. CHECK_ARGUMENT(compiler->scratches >= 0);
  851. if (op != SLJIT_UNUSED) {
  852. CHECK_ARGUMENT(op >= SLJIT_MOV && op <= SLJIT_MOV_P);
  853. FUNCTION_CHECK_SRC(src, srcw);
  854. }
  855. else
  856. CHECK_ARGUMENT(src == 0 && srcw == 0);
  857. #endif
  858. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  859. if (SLJIT_UNLIKELY(!!compiler->verbose)) {
  860. if (op == SLJIT_UNUSED)
  861. fprintf(compiler->verbose, " return\n");
  862. else {
  863. fprintf(compiler->verbose, " return.%s ", op1_names[op - SLJIT_OP1_BASE]);
  864. sljit_verbose_param(compiler, src, srcw);
  865. fprintf(compiler->verbose, "\n");
  866. }
  867. }
  868. #endif
  869. CHECK_RETURN_OK;
  870. }
  871. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw)
  872. {
  873. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  874. FUNCTION_CHECK_DST(dst, dstw);
  875. #endif
  876. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  877. if (SLJIT_UNLIKELY(!!compiler->verbose)) {
  878. fprintf(compiler->verbose, " fast_enter ");
  879. sljit_verbose_param(compiler, dst, dstw);
  880. fprintf(compiler->verbose, "\n");
  881. }
  882. #endif
  883. CHECK_RETURN_OK;
  884. }
  885. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw)
  886. {
  887. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  888. FUNCTION_CHECK_SRC(src, srcw);
  889. #endif
  890. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  891. if (SLJIT_UNLIKELY(!!compiler->verbose)) {
  892. fprintf(compiler->verbose, " fast_return ");
  893. sljit_verbose_param(compiler, src, srcw);
  894. fprintf(compiler->verbose, "\n");
  895. }
  896. #endif
  897. CHECK_RETURN_OK;
  898. }
  899. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op)
  900. {
  901. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  902. CHECK_ARGUMENT((op >= SLJIT_BREAKPOINT && op <= SLJIT_LSMUL)
  903. || ((op & ~SLJIT_INT_OP) >= SLJIT_UDIVMOD && (op & ~SLJIT_INT_OP) <= SLJIT_SDIVI));
  904. CHECK_ARGUMENT(op < SLJIT_LUMUL || compiler->scratches >= 2);
  905. #endif
  906. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  907. if (SLJIT_UNLIKELY(!!compiler->verbose))
  908. fprintf(compiler->verbose, " %s%s\n", !(op & SLJIT_INT_OP) ? "" : "i", op0_names[GET_OPCODE(op) - SLJIT_OP0_BASE]);
  909. #endif
  910. CHECK_RETURN_OK;
  911. }
  912. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op1(struct sljit_compiler *compiler, sljit_si op,
  913. sljit_si dst, sljit_sw dstw,
  914. sljit_si src, sljit_sw srcw)
  915. {
  916. if (SLJIT_UNLIKELY(compiler->skip_checks)) {
  917. compiler->skip_checks = 0;
  918. CHECK_RETURN_OK;
  919. }
  920. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  921. CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_CLZ);
  922. FUNCTION_CHECK_OP();
  923. FUNCTION_CHECK_SRC(src, srcw);
  924. FUNCTION_CHECK_DST(dst, dstw);
  925. FUNCTION_CHECK_OP1();
  926. #endif
  927. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  928. if (SLJIT_UNLIKELY(!!compiler->verbose)) {
  929. fprintf(compiler->verbose, " %s%s%s%s%s%s%s%s ", !(op & SLJIT_INT_OP) ? "" : "i", op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE],
  930. !(op & SLJIT_SET_E) ? "" : ".e", !(op & SLJIT_SET_U) ? "" : ".u", !(op & SLJIT_SET_S) ? "" : ".s",
  931. !(op & SLJIT_SET_O) ? "" : ".o", !(op & SLJIT_SET_C) ? "" : ".c", !(op & SLJIT_KEEP_FLAGS) ? "" : ".k");
  932. sljit_verbose_param(compiler, dst, dstw);
  933. fprintf(compiler->verbose, ", ");
  934. sljit_verbose_param(compiler, src, srcw);
  935. fprintf(compiler->verbose, "\n");
  936. }
  937. #endif
  938. CHECK_RETURN_OK;
  939. }
  940. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op2(struct sljit_compiler *compiler, sljit_si op,
  941. sljit_si dst, sljit_sw dstw,
  942. sljit_si src1, sljit_sw src1w,
  943. sljit_si src2, sljit_sw src2w)
  944. {
  945. if (SLJIT_UNLIKELY(compiler->skip_checks)) {
  946. compiler->skip_checks = 0;
  947. CHECK_RETURN_OK;
  948. }
  949. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  950. CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_ADD && GET_OPCODE(op) <= SLJIT_ASHR);
  951. FUNCTION_CHECK_OP();
  952. FUNCTION_CHECK_SRC(src1, src1w);
  953. FUNCTION_CHECK_SRC(src2, src2w);
  954. FUNCTION_CHECK_DST(dst, dstw);
  955. #endif
  956. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  957. if (SLJIT_UNLIKELY(!!compiler->verbose)) {
  958. fprintf(compiler->verbose, " %s%s%s%s%s%s%s%s ", !(op & SLJIT_INT_OP) ? "" : "i", op2_names[GET_OPCODE(op) - SLJIT_OP2_BASE],
  959. !(op & SLJIT_SET_E) ? "" : ".e", !(op & SLJIT_SET_U) ? "" : ".u", !(op & SLJIT_SET_S) ? "" : ".s",
  960. !(op & SLJIT_SET_O) ? "" : ".o", !(op & SLJIT_SET_C) ? "" : ".c", !(op & SLJIT_KEEP_FLAGS) ? "" : ".k");
  961. sljit_verbose_param(compiler, dst, dstw);
  962. fprintf(compiler->verbose, ", ");
  963. sljit_verbose_param(compiler, src1, src1w);
  964. fprintf(compiler->verbose, ", ");
  965. sljit_verbose_param(compiler, src2, src2w);
  966. fprintf(compiler->verbose, "\n");
  967. }
  968. #endif
  969. CHECK_RETURN_OK;
  970. }
  971. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_register_index(sljit_si reg)
  972. {
  973. SLJIT_UNUSED_ARG(reg);
  974. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  975. CHECK_ARGUMENT(reg > 0 && reg <= SLJIT_NUMBER_OF_REGISTERS);
  976. #endif
  977. CHECK_RETURN_OK;
  978. }
  979. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_float_register_index(sljit_si reg)
  980. {
  981. SLJIT_UNUSED_ARG(reg);
  982. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  983. CHECK_ARGUMENT(reg > 0 && reg <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);
  984. #endif
  985. CHECK_RETURN_OK;
  986. }
  987. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_custom(struct sljit_compiler *compiler,
  988. void *instruction, sljit_si size)
  989. {
  990. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  991. int i;
  992. #endif
  993. SLJIT_UNUSED_ARG(compiler);
  994. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  995. CHECK_ARGUMENT(instruction);
  996. #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
  997. CHECK_ARGUMENT(size > 0 && size < 16);
  998. #elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
  999. CHECK_ARGUMENT((size == 2 && (((sljit_sw)instruction) & 0x1) == 0)
  1000. || (size == 4 && (((sljit_sw)instruction) & 0x3) == 0));
  1001. #else
  1002. CHECK_ARGUMENT(size == 4 && (((sljit_sw)instruction) & 0x3) == 0);
  1003. #endif
  1004. #endif
  1005. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  1006. if (SLJIT_UNLIKELY(!!compiler->verbose)) {
  1007. fprintf(compiler->verbose, " op_custom");
  1008. for (i = 0; i < size; i++)
  1009. fprintf(compiler->verbose, " 0x%x", ((sljit_ub*)instruction)[i]);
  1010. fprintf(compiler->verbose, "\n");
  1011. }
  1012. #endif
  1013. CHECK_RETURN_OK;
  1014. }
  1015. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1(struct sljit_compiler *compiler, sljit_si op,
  1016. sljit_si dst, sljit_sw dstw,
  1017. sljit_si src, sljit_sw srcw)
  1018. {
  1019. if (SLJIT_UNLIKELY(compiler->skip_checks)) {
  1020. compiler->skip_checks = 0;
  1021. CHECK_RETURN_OK;
  1022. }
  1023. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  1024. CHECK_ARGUMENT(sljit_is_fpu_available());
  1025. CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_DMOV && GET_OPCODE(op) <= SLJIT_DABS);
  1026. FUNCTION_CHECK_FOP();
  1027. FUNCTION_FCHECK(src, srcw);
  1028. FUNCTION_FCHECK(dst, dstw);
  1029. #endif
  1030. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  1031. if (SLJIT_UNLIKELY(!!compiler->verbose)) {
  1032. if (GET_OPCODE(op) == SLJIT_CONVD_FROMS)
  1033. fprintf(compiler->verbose, " %s%s ", fop1_names[SLJIT_CONVD_FROMS - SLJIT_FOP1_BASE],
  1034. (op & SLJIT_SINGLE_OP) ? "s.fromd" : "d.froms");
  1035. else
  1036. fprintf(compiler->verbose, " %s%s ", (op & SLJIT_SINGLE_OP) ? "s" : "d",
  1037. fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE]);
  1038. sljit_verbose_fparam(compiler, dst, dstw);
  1039. fprintf(compiler->verbose, ", ");
  1040. sljit_verbose_fparam(compiler, src, srcw);
  1041. fprintf(compiler->verbose, "\n");
  1042. }
  1043. #endif
  1044. CHECK_RETURN_OK;
  1045. }
  1046. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_si op,
  1047. sljit_si src1, sljit_sw src1w,
  1048. sljit_si src2, sljit_sw src2w)
  1049. {
  1050. if (SLJIT_UNLIKELY(compiler->skip_checks)) {
  1051. compiler->skip_checks = 0;
  1052. CHECK_RETURN_OK;
  1053. }
  1054. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  1055. CHECK_ARGUMENT(sljit_is_fpu_available());
  1056. CHECK_ARGUMENT(GET_OPCODE(op) == SLJIT_DCMP);
  1057. FUNCTION_CHECK_FOP();
  1058. FUNCTION_FCHECK(src1, src1w);
  1059. FUNCTION_FCHECK(src2, src2w);
  1060. #endif
  1061. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  1062. if (SLJIT_UNLIKELY(!!compiler->verbose)) {
  1063. fprintf(compiler->verbose, " %s%s%s%s ", (op & SLJIT_SINGLE_OP) ? "s" : "d", fop1_names[SLJIT_DCMP - SLJIT_FOP1_BASE],
  1064. (op & SLJIT_SET_E) ? ".e" : "", (op & SLJIT_SET_S) ? ".s" : "");
  1065. sljit_verbose_fparam(compiler, src1, src1w);
  1066. fprintf(compiler->verbose, ", ");
  1067. sljit_verbose_fparam(compiler, src2, src2w);
  1068. fprintf(compiler->verbose, "\n");
  1069. }
  1070. #endif
  1071. CHECK_RETURN_OK;
  1072. }
  1073. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_convw_fromd(struct sljit_compiler *compiler, sljit_si op,
  1074. sljit_si dst, sljit_sw dstw,
  1075. sljit_si src, sljit_sw srcw)
  1076. {
  1077. if (SLJIT_UNLIKELY(compiler->skip_checks)) {
  1078. compiler->skip_checks = 0;
  1079. CHECK_RETURN_OK;
  1080. }
  1081. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  1082. CHECK_ARGUMENT(sljit_is_fpu_available());
  1083. CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_CONVW_FROMD && GET_OPCODE(op) <= SLJIT_CONVI_FROMD);
  1084. FUNCTION_CHECK_FOP();
  1085. FUNCTION_FCHECK(src, srcw);
  1086. FUNCTION_CHECK_DST(dst, dstw);
  1087. #endif
  1088. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  1089. if (SLJIT_UNLIKELY(!!compiler->verbose)) {
  1090. fprintf(compiler->verbose, " %s%s.from%s ", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE],
  1091. (GET_OPCODE(op) == SLJIT_CONVI_FROMD) ? "i" : "w",
  1092. (op & SLJIT_SINGLE_OP) ? "s" : "d");
  1093. sljit_verbose_param(compiler, dst, dstw);
  1094. fprintf(compiler->verbose, ", ");
  1095. sljit_verbose_fparam(compiler, src, srcw);
  1096. fprintf(compiler->verbose, "\n");
  1097. }
  1098. #endif
  1099. CHECK_RETURN_OK;
  1100. }
  1101. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_convd_fromw(struct sljit_compiler *compiler, sljit_si op,
  1102. sljit_si dst, sljit_sw dstw,
  1103. sljit_si src, sljit_sw srcw)
  1104. {
  1105. if (SLJIT_UNLIKELY(compiler->skip_checks)) {
  1106. compiler->skip_checks = 0;
  1107. CHECK_RETURN_OK;
  1108. }
  1109. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  1110. CHECK_ARGUMENT(sljit_is_fpu_available());
  1111. CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_CONVD_FROMW && GET_OPCODE(op) <= SLJIT_CONVD_FROMI);
  1112. FUNCTION_CHECK_FOP();
  1113. FUNCTION_CHECK_SRC(src, srcw);
  1114. FUNCTION_FCHECK(dst, dstw);
  1115. #endif
  1116. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  1117. if (SLJIT_UNLIKELY(!!compiler->verbose)) {
  1118. fprintf(compiler->verbose, " %s%s.from%s ", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE],
  1119. (op & SLJIT_SINGLE_OP) ? "s" : "d",
  1120. (GET_OPCODE(op) == SLJIT_CONVD_FROMI) ? "i" : "w");
  1121. sljit_verbose_fparam(compiler, dst, dstw);
  1122. fprintf(compiler->verbose, ", ");
  1123. sljit_verbose_param(compiler, src, srcw);
  1124. fprintf(compiler->verbose, "\n");
  1125. }
  1126. #endif
  1127. CHECK_RETURN_OK;
  1128. }
  1129. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop2(struct sljit_compiler *compiler, sljit_si op,
  1130. sljit_si dst, sljit_sw dstw,
  1131. sljit_si src1, sljit_sw src1w,
  1132. sljit_si src2, sljit_sw src2w)
  1133. {
  1134. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  1135. CHECK_ARGUMENT(sljit_is_fpu_available());
  1136. CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_DADD && GET_OPCODE(op) <= SLJIT_DDIV);
  1137. FUNCTION_CHECK_FOP();
  1138. FUNCTION_FCHECK(src1, src1w);
  1139. FUNCTION_FCHECK(src2, src2w);
  1140. FUNCTION_FCHECK(dst, dstw);
  1141. #endif
  1142. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  1143. if (SLJIT_UNLIKELY(!!compiler->verbose)) {
  1144. fprintf(compiler->verbose, " %s%s ", (op & SLJIT_SINGLE_OP) ? "s" : "d", fop2_names[GET_OPCODE(op) - SLJIT_FOP2_BASE]);
  1145. sljit_verbose_fparam(compiler, dst, dstw);
  1146. fprintf(compiler->verbose, ", ");
  1147. sljit_verbose_fparam(compiler, src1, src1w);
  1148. fprintf(compiler->verbose, ", ");
  1149. sljit_verbose_fparam(compiler, src2, src2w);
  1150. fprintf(compiler->verbose, "\n");
  1151. }
  1152. #endif
  1153. CHECK_RETURN_OK;
  1154. }
  1155. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_label(struct sljit_compiler *compiler)
  1156. {
  1157. SLJIT_UNUSED_ARG(compiler);
  1158. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  1159. if (SLJIT_UNLIKELY(!!compiler->verbose))
  1160. fprintf(compiler->verbose, "label:\n");
  1161. #endif
  1162. CHECK_RETURN_OK;
  1163. }
  1164. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_jump(struct sljit_compiler *compiler, sljit_si type)
  1165. {
  1166. if (SLJIT_UNLIKELY(compiler->skip_checks)) {
  1167. compiler->skip_checks = 0;
  1168. CHECK_RETURN_OK;
  1169. }
  1170. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  1171. CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP | SLJIT_INT_OP)));
  1172. CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= SLJIT_CALL3);
  1173. CHECK_ARGUMENT((type & 0xff) < SLJIT_JUMP || !(type & SLJIT_INT_OP));
  1174. CHECK_ARGUMENT((type & 0xff) <= SLJIT_CALL0 || ((type & 0xff) - SLJIT_CALL0) <= compiler->scratches);
  1175. #endif
  1176. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  1177. if (SLJIT_UNLIKELY(!!compiler->verbose))
  1178. fprintf(compiler->verbose, " jump%s.%s%s\n", !(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r",
  1179. JUMP_PREFIX(type), jump_names[type & 0xff]);
  1180. #endif
  1181. CHECK_RETURN_OK;
  1182. }
  1183. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_cmp(struct sljit_compiler *compiler, sljit_si type,
  1184. sljit_si src1, sljit_sw src1w,
  1185. sljit_si src2, sljit_sw src2w)
  1186. {
  1187. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  1188. CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP | SLJIT_INT_OP)));
  1189. CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= SLJIT_SIG_LESS_EQUAL);
  1190. FUNCTION_CHECK_SRC(src1, src1w);
  1191. FUNCTION_CHECK_SRC(src2, src2w);
  1192. #endif
  1193. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  1194. if (SLJIT_UNLIKELY(!!compiler->verbose)) {
  1195. fprintf(compiler->verbose, " cmp%s.%s%s ", !(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r",
  1196. (type & SLJIT_INT_OP) ? "i_" : "", jump_names[type & 0xff]);
  1197. sljit_verbose_param(compiler, src1, src1w);
  1198. fprintf(compiler->verbose, ", ");
  1199. sljit_verbose_param(compiler, src2, src2w);
  1200. fprintf(compiler->verbose, "\n");
  1201. }
  1202. #endif
  1203. CHECK_RETURN_OK;
  1204. }
  1205. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_si type,
  1206. sljit_si src1, sljit_sw src1w,
  1207. sljit_si src2, sljit_sw src2w)
  1208. {
  1209. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  1210. CHECK_ARGUMENT(sljit_is_fpu_available());
  1211. CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP | SLJIT_SINGLE_OP)));
  1212. CHECK_ARGUMENT((type & 0xff) >= SLJIT_D_EQUAL && (type & 0xff) <= SLJIT_D_ORDERED);
  1213. FUNCTION_FCHECK(src1, src1w);
  1214. FUNCTION_FCHECK(src2, src2w);
  1215. #endif
  1216. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  1217. if (SLJIT_UNLIKELY(!!compiler->verbose)) {
  1218. fprintf(compiler->verbose, " fcmp%s.%s%s ", !(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r",
  1219. (type & SLJIT_SINGLE_OP) ? "s_" : "d_", jump_names[type & 0xff]);
  1220. sljit_verbose_fparam(compiler, src1, src1w);
  1221. fprintf(compiler->verbose, ", ");
  1222. sljit_verbose_fparam(compiler, src2, src2w);
  1223. fprintf(compiler->verbose, "\n");
  1224. }
  1225. #endif
  1226. CHECK_RETURN_OK;
  1227. }
  1228. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_ijump(struct sljit_compiler *compiler, sljit_si type, sljit_si src, sljit_sw srcw)
  1229. {
  1230. if (SLJIT_UNLIKELY(compiler->skip_checks)) {
  1231. compiler->skip_checks = 0;
  1232. CHECK_RETURN_OK;
  1233. }
  1234. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  1235. CHECK_ARGUMENT(type >= SLJIT_JUMP && type <= SLJIT_CALL3);
  1236. CHECK_ARGUMENT(type <= SLJIT_CALL0 || (type - SLJIT_CALL0) <= compiler->scratches);
  1237. FUNCTION_CHECK_SRC(src, srcw);
  1238. #endif
  1239. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  1240. if (SLJIT_UNLIKELY(!!compiler->verbose)) {
  1241. fprintf(compiler->verbose, " ijump.%s ", jump_names[type]);
  1242. sljit_verbose_param(compiler, src, srcw);
  1243. fprintf(compiler->verbose, "\n");
  1244. }
  1245. #endif
  1246. CHECK_RETURN_OK;
  1247. }
  1248. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_si op,
  1249. sljit_si dst, sljit_sw dstw,
  1250. sljit_si src, sljit_sw srcw,
  1251. sljit_si type)
  1252. {
  1253. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  1254. CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_INT_OP)));
  1255. CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= SLJIT_D_ORDERED);
  1256. CHECK_ARGUMENT(op == SLJIT_MOV || GET_OPCODE(op) == SLJIT_MOV_UI || GET_OPCODE(op) == SLJIT_MOV_SI
  1257. || (GET_OPCODE(op) >= SLJIT_AND && GET_OPCODE(op) <= SLJIT_XOR));
  1258. CHECK_ARGUMENT((op & (SLJIT_SET_U | SLJIT_SET_S | SLJIT_SET_O | SLJIT_SET_C)) == 0);
  1259. CHECK_ARGUMENT((op & (SLJIT_SET_E | SLJIT_KEEP_FLAGS)) != (SLJIT_SET_E | SLJIT_KEEP_FLAGS));
  1260. if (GET_OPCODE(op) < SLJIT_ADD) {
  1261. CHECK_ARGUMENT(src == SLJIT_UNUSED && srcw == 0);
  1262. } else {
  1263. CHECK_ARGUMENT(src == dst && srcw == dstw);
  1264. }
  1265. FUNCTION_CHECK_DST(dst, dstw);
  1266. #endif
  1267. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  1268. if (SLJIT_UNLIKELY(!!compiler->verbose)) {
  1269. fprintf(compiler->verbose, " flags.%s%s%s%s ", !(op & SLJIT_INT_OP) ? "" : "i",
  1270. GET_OPCODE(op) >= SLJIT_OP2_BASE ? op2_names[GET_OPCODE(op) - SLJIT_OP2_BASE] : op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE],
  1271. !(op & SLJIT_SET_E) ? "" : ".e", !(op & SLJIT_KEEP_FLAGS) ? "" : ".k");
  1272. sljit_verbose_param(compiler, dst, dstw);
  1273. if (src != SLJIT_UNUSED) {
  1274. fprintf(compiler->verbose, ", ");
  1275. sljit_verbose_param(compiler, src, srcw);
  1276. }
  1277. fprintf(compiler->verbose, ", %s%s\n", JUMP_PREFIX(type), jump_names[type & 0xff]);
  1278. }
  1279. #endif
  1280. CHECK_RETURN_OK;
  1281. }
  1282. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_local_base(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw, sljit_sw offset)
  1283. {
  1284. SLJIT_UNUSED_ARG(offset);
  1285. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  1286. FUNCTION_CHECK_DST(dst, dstw);
  1287. #endif
  1288. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  1289. if (SLJIT_UNLIKELY(!!compiler->verbose)) {
  1290. fprintf(compiler->verbose, " local_base ");
  1291. sljit_verbose_param(compiler, dst, dstw);
  1292. fprintf(compiler->verbose, ", #%" SLJIT_PRINT_D "d\n", offset);
  1293. }
  1294. #endif
  1295. CHECK_RETURN_OK;
  1296. }
  1297. static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_const(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw, sljit_sw init_value)
  1298. {
  1299. SLJIT_UNUSED_ARG(init_value);
  1300. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  1301. FUNCTION_CHECK_DST(dst, dstw);
  1302. #endif
  1303. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  1304. if (SLJIT_UNLIKELY(!!compiler->verbose)) {
  1305. fprintf(compiler->verbose, " const ");
  1306. sljit_verbose_param(compiler, dst, dstw);
  1307. fprintf(compiler->verbose, ", #%" SLJIT_PRINT_D "d\n", init_value);
  1308. }
  1309. #endif
  1310. CHECK_RETURN_OK;
  1311. }
  1312. #endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_VERBOSE */
  1313. #define SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw) \
  1314. SLJIT_COMPILE_ASSERT(!(SLJIT_CONVW_FROMD & 0x1) && !(SLJIT_CONVD_FROMW & 0x1), \
  1315. invalid_float_opcodes); \
  1316. if (GET_OPCODE(op) >= SLJIT_CONVW_FROMD && GET_OPCODE(op) <= SLJIT_DCMP) { \
  1317. if (GET_OPCODE(op) == SLJIT_DCMP) { \
  1318. CHECK(check_sljit_emit_fop1_cmp(compiler, op, dst, dstw, src, srcw)); \
  1319. ADJUST_LOCAL_OFFSET(dst, dstw); \
  1320. ADJUST_LOCAL_OFFSET(src, srcw); \
  1321. return sljit_emit_fop1_cmp(compiler, op, dst, dstw, src, srcw); \
  1322. } \
  1323. if ((GET_OPCODE(op) | 0x1) == SLJIT_CONVI_FROMD) { \
  1324. CHECK(check_sljit_emit_fop1_convw_fromd(compiler, op, dst, dstw, src, srcw)); \
  1325. ADJUST_LOCAL_OFFSET(dst, dstw); \
  1326. ADJUST_LOCAL_OFFSET(src, srcw); \
  1327. return sljit_emit_fop1_convw_fromd(compiler, op, dst, dstw, src, srcw); \
  1328. } \
  1329. CHECK(check_sljit_emit_fop1_convd_fromw(compiler, op, dst, dstw, src, srcw)); \
  1330. ADJUST_LOCAL_OFFSET(dst, dstw); \
  1331. ADJUST_LOCAL_OFFSET(src, srcw); \
  1332. return sljit_emit_fop1_convd_fromw(compiler, op, dst, dstw, src, srcw); \
  1333. } \
  1334. CHECK(check_sljit_emit_fop1(compiler, op, dst, dstw, src, srcw)); \
  1335. ADJUST_LOCAL_OFFSET(dst, dstw); \
  1336. ADJUST_LOCAL_OFFSET(src, srcw);
  1337. static SLJIT_INLINE sljit_si emit_mov_before_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw)
  1338. {
  1339. /* Return if don't need to do anything. */
  1340. if (op == SLJIT_UNUSED)
  1341. return SLJIT_SUCCESS;
  1342. #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
  1343. /* At the moment the pointer size is always equal to sljit_sw. May be changed in the future. */
  1344. if (src == SLJIT_RETURN_REG && (op == SLJIT_MOV || op == SLJIT_MOV_P))
  1345. return SLJIT_SUCCESS;
  1346. #else
  1347. if (src == SLJIT_RETURN_REG && (op == SLJIT_MOV || op == SLJIT_MOV_UI || op == SLJIT_MOV_SI || op == SLJIT_MOV_P))
  1348. return SLJIT_SUCCESS;
  1349. #endif
  1350. #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \
  1351. || (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  1352. compiler->skip_checks = 1;
  1353. #endif
  1354. return sljit_emit_op1(compiler, op, SLJIT_RETURN_REG, 0, src, srcw);
  1355. }
  1356. /* CPU description section */
  1357. #if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE)
  1358. #define SLJIT_CPUINFO_PART1 " 32bit ("
  1359. #elif (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
  1360. #define SLJIT_CPUINFO_PART1 " 64bit ("
  1361. #else
  1362. #error "Internal error: CPU type info missing"
  1363. #endif
  1364. #if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
  1365. #define SLJIT_CPUINFO_PART2 "little endian + "
  1366. #elif (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN)
  1367. #define SLJIT_CPUINFO_PART2 "big endian + "
  1368. #else
  1369. #error "Internal error: CPU type info missing"
  1370. #endif
  1371. #if (defined SLJIT_UNALIGNED && SLJIT_UNALIGNED)
  1372. #define SLJIT_CPUINFO_PART3 "unaligned)"
  1373. #else
  1374. #define SLJIT_CPUINFO_PART3 "aligned)"
  1375. #endif
  1376. #define SLJIT_CPUINFO SLJIT_CPUINFO_PART1 SLJIT_CPUINFO_PART2 SLJIT_CPUINFO_PART3
  1377. #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
  1378. # include "sljitNativeX86_common.c"
  1379. #elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
  1380. # include "sljitNativeARM_32.c"
  1381. #elif (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
  1382. # include "sljitNativeARM_32.c"
  1383. #elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
  1384. # include "sljitNativeARM_T2_32.c"
  1385. #elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
  1386. # include "sljitNativeARM_64.c"
  1387. #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
  1388. # include "sljitNativePPC_common.c"
  1389. #elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
  1390. # include "sljitNativeMIPS_common.c"
  1391. #elif (defined SLJIT_CONFIG_SPARC && SLJIT_CONFIG_SPARC)
  1392. # include "sljitNativeSPARC_common.c"
  1393. #elif (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX)
  1394. # include "sljitNativeTILEGX_64.c"
  1395. #endif
  1396. #if !(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
  1397. SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_si type,
  1398. sljit_si src1, sljit_sw src1w,
  1399. sljit_si src2, sljit_sw src2w)
  1400. {
  1401. /* Default compare for most architectures. */
  1402. sljit_si flags, tmp_src, condition;
  1403. sljit_sw tmp_srcw;
  1404. CHECK_ERROR_PTR();
  1405. CHECK_PTR(check_sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w));
  1406. condition = type & 0xff;
  1407. #if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
  1408. if ((condition == SLJIT_EQUAL || condition == SLJIT_NOT_EQUAL)) {
  1409. if ((src1 & SLJIT_IMM) && !src1w) {
  1410. src1 = src2;
  1411. src1w = src2w;
  1412. src2 = SLJIT_IMM;
  1413. src2w = 0;
  1414. }
  1415. if ((src2 & SLJIT_IMM) && !src2w)
  1416. return emit_cmp_to0(compiler, type, src1, src1w);
  1417. }
  1418. #endif
  1419. if (SLJIT_UNLIKELY((src1 & SLJIT_IMM) && !(src2 & SLJIT_IMM))) {
  1420. /* Immediate is prefered as second argument by most architectures. */
  1421. switch (condition) {
  1422. case SLJIT_LESS:
  1423. condition = SLJIT_GREATER;
  1424. break;
  1425. case SLJIT_GREATER_EQUAL:
  1426. condition = SLJIT_LESS_EQUAL;
  1427. break;
  1428. case SLJIT_GREATER:
  1429. condition = SLJIT_LESS;
  1430. break;
  1431. case SLJIT_LESS_EQUAL:
  1432. condition = SLJIT_GREATER_EQUAL;
  1433. break;
  1434. case SLJIT_SIG_LESS:
  1435. condition = SLJIT_SIG_GREATER;
  1436. break;
  1437. case SLJIT_SIG_GREATER_EQUAL:
  1438. condition = SLJIT_SIG_LESS_EQUAL;
  1439. break;
  1440. case SLJIT_SIG_GREATER:
  1441. condition = SLJIT_SIG_LESS;
  1442. break;
  1443. case SLJIT_SIG_LESS_EQUAL:
  1444. condition = SLJIT_SIG_GREATER_EQUAL;
  1445. break;
  1446. }
  1447. type = condition | (type & (SLJIT_INT_OP | SLJIT_REWRITABLE_JUMP));
  1448. tmp_src = src1;
  1449. src1 = src2;
  1450. src2 = tmp_src;
  1451. tmp_srcw = src1w;
  1452. src1w = src2w;
  1453. src2w = tmp_srcw;
  1454. }
  1455. if (condition <= SLJIT_NOT_ZERO)
  1456. flags = SLJIT_SET_E;
  1457. else if (condition <= SLJIT_LESS_EQUAL)
  1458. flags = SLJIT_SET_U;
  1459. else
  1460. flags = SLJIT_SET_S;
  1461. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
  1462. || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  1463. compiler->skip_checks = 1;
  1464. #endif
  1465. PTR_FAIL_IF(sljit_emit_op2(compiler, SLJIT_SUB | flags | (type & SLJIT_INT_OP),
  1466. SLJIT_UNUSED, 0, src1, src1w, src2, src2w));
  1467. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
  1468. || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  1469. compiler->skip_checks = 1;
  1470. #endif
  1471. return sljit_emit_jump(compiler, condition | (type & SLJIT_REWRITABLE_JUMP));
  1472. }
  1473. SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_si type,
  1474. sljit_si src1, sljit_sw src1w,
  1475. sljit_si src2, sljit_sw src2w)
  1476. {
  1477. sljit_si flags, condition;
  1478. CHECK_ERROR_PTR();
  1479. CHECK_PTR(check_sljit_emit_fcmp(compiler, type, src1, src1w, src2, src2w));
  1480. condition = type & 0xff;
  1481. flags = (condition <= SLJIT_D_NOT_EQUAL) ? SLJIT_SET_E : SLJIT_SET_S;
  1482. if (type & SLJIT_SINGLE_OP)
  1483. flags |= SLJIT_SINGLE_OP;
  1484. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
  1485. || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  1486. compiler->skip_checks = 1;
  1487. #endif
  1488. sljit_emit_fop1(compiler, SLJIT_DCMP | flags, src1, src1w, src2, src2w);
  1489. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
  1490. || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  1491. compiler->skip_checks = 1;
  1492. #endif
  1493. return sljit_emit_jump(compiler, condition | (type & SLJIT_REWRITABLE_JUMP));
  1494. }
  1495. #endif
  1496. #if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
  1497. SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_local_base(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw, sljit_sw offset)
  1498. {
  1499. CHECK_ERROR();
  1500. CHECK(check_sljit_get_local_base(compiler, dst, dstw, offset));
  1501. ADJUST_LOCAL_OFFSET(SLJIT_MEM1(SLJIT_SP), offset);
  1502. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
  1503. || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
  1504. compiler->skip_checks = 1;
  1505. #endif
  1506. if (offset != 0)
  1507. return sljit_emit_op2(compiler, SLJIT_ADD | SLJIT_KEEP_FLAGS, dst, dstw, SLJIT_SP, 0, SLJIT_IMM, offset);
  1508. return sljit_emit_op1(compiler, SLJIT_MOV, dst, dstw, SLJIT_SP, 0);
  1509. }
  1510. #endif
  1511. #else /* SLJIT_CONFIG_UNSUPPORTED */
  1512. /* Empty function bodies for those machines, which are not (yet) supported. */
  1513. SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name(void)
  1514. {
  1515. return "unsupported";
  1516. }
  1517. SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void)
  1518. {
  1519. SLJIT_ASSERT_STOP();
  1520. return NULL;
  1521. }
  1522. SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler)
  1523. {
  1524. SLJIT_UNUSED_ARG(compiler);
  1525. SLJIT_ASSERT_STOP();
  1526. }
  1527. SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, sljit_si size)
  1528. {
  1529. SLJIT_UNUSED_ARG(compiler);
  1530. SLJIT_UNUSED_ARG(size);
  1531. SLJIT_ASSERT_STOP();
  1532. return NULL;
  1533. }
  1534. #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
  1535. SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose)
  1536. {
  1537. SLJIT_UNUSED_ARG(compiler);
  1538. SLJIT_UNUSED_ARG(verbose);
  1539. SLJIT_ASSERT_STOP();
  1540. }
  1541. #endif
  1542. SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)
  1543. {
  1544. SLJIT_UNUSED_ARG(compiler);
  1545. SLJIT_ASSERT_STOP();
  1546. return NULL;
  1547. }
  1548. SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code)
  1549. {
  1550. SLJIT_UNUSED_ARG(code);
  1551. SLJIT_ASSERT_STOP();
  1552. }
  1553. SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compiler,
  1554. sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
  1555. sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
  1556. {
  1557. SLJIT_UNUSED_ARG(compiler);
  1558. SLJIT_UNUSED_ARG(options);
  1559. SLJIT_UNUSED_ARG(args);
  1560. SLJIT_UNUSED_ARG(scratches);
  1561. SLJIT_UNUSED_ARG(saveds);
  1562. SLJIT_UNUSED_ARG(fscratches);
  1563. SLJIT_UNUSED_ARG(fsaveds);
  1564. SLJIT_UNUSED_ARG(local_size);
  1565. SLJIT_ASSERT_STOP();
  1566. return SLJIT_ERR_UNSUPPORTED;
  1567. }
  1568. SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler,
  1569. sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
  1570. sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
  1571. {
  1572. SLJIT_UNUSED_ARG(compiler);
  1573. SLJIT_UNUSED_ARG(options);
  1574. SLJIT_UNUSED_ARG(args);
  1575. SLJIT_UNUSED_ARG(scratches);
  1576. SLJIT_UNUSED_ARG(saveds);
  1577. SLJIT_UNUSED_ARG(fscratches);
  1578. SLJIT_UNUSED_ARG(fsaveds);
  1579. SLJIT_UNUSED_ARG(local_size);
  1580. SLJIT_ASSERT_STOP();
  1581. return SLJIT_ERR_UNSUPPORTED;
  1582. }
  1583. SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw)
  1584. {
  1585. SLJIT_UNUSED_ARG(compiler);
  1586. SLJIT_UNUSED_ARG(op);
  1587. SLJIT_UNUSED_ARG(src);
  1588. SLJIT_UNUSED_ARG(srcw);
  1589. SLJIT_ASSERT_STOP();
  1590. return SLJIT_ERR_UNSUPPORTED;
  1591. }
  1592. SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw)
  1593. {
  1594. SLJIT_UNUSED_ARG(compiler);
  1595. SLJIT_UNUSED_ARG(dst);
  1596. SLJIT_UNUSED_ARG(dstw);
  1597. SLJIT_ASSERT_STOP();
  1598. return SLJIT_ERR_UNSUPPORTED;
  1599. }
  1600. SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw)
  1601. {
  1602. SLJIT_UNUSED_ARG(compiler);
  1603. SLJIT_UNUSED_ARG(src);
  1604. SLJIT_UNUSED_ARG(srcw);
  1605. SLJIT_ASSERT_STOP();
  1606. return SLJIT_ERR_UNSUPPORTED;
  1607. }
  1608. SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op)
  1609. {
  1610. SLJIT_UNUSED_ARG(compiler);
  1611. SLJIT_UNUSED_ARG(op);
  1612. SLJIT_ASSERT_STOP();
  1613. return SLJIT_ERR_UNSUPPORTED;
  1614. }
  1615. SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler, sljit_si op,
  1616. sljit_si dst, sljit_sw dstw,
  1617. sljit_si src, sljit_sw srcw)
  1618. {
  1619. SLJIT_UNUSED_ARG(compiler);
  1620. SLJIT_UNUSED_ARG(op);
  1621. SLJIT_UNUSED_ARG(dst);
  1622. SLJIT_UNUSED_ARG(dstw);
  1623. SLJIT_UNUSED_ARG(src);
  1624. SLJIT_UNUSED_ARG(srcw);
  1625. SLJIT_ASSERT_STOP();
  1626. return SLJIT_ERR_UNSUPPORTED;
  1627. }
  1628. SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler, sljit_si op,
  1629. sljit_si dst, sljit_sw dstw,
  1630. sljit_si src1, sljit_sw src1w,
  1631. sljit_si src2, sljit_sw src2w)
  1632. {
  1633. SLJIT_UNUSED_ARG(compiler);
  1634. SLJIT_UNUSED_ARG(op);
  1635. SLJIT_UNUSED_ARG(dst);
  1636. SLJIT_UNUSED_ARG(dstw);
  1637. SLJIT_UNUSED_ARG(src1);
  1638. SLJIT_UNUSED_ARG(src1w);
  1639. SLJIT_UNUSED_ARG(src2);
  1640. SLJIT_UNUSED_ARG(src2w);
  1641. SLJIT_ASSERT_STOP();
  1642. return SLJIT_ERR_UNSUPPORTED;
  1643. }
  1644. SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
  1645. {
  1646. SLJIT_ASSERT_STOP();
  1647. return reg;
  1648. }
  1649. SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *compiler,
  1650. void *instruction, sljit_si size)
  1651. {
  1652. SLJIT_UNUSED_ARG(compiler);
  1653. SLJIT_UNUSED_ARG(instruction);
  1654. SLJIT_UNUSED_ARG(size);
  1655. SLJIT_ASSERT_STOP();
  1656. return SLJIT_ERR_UNSUPPORTED;
  1657. }
  1658. SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void)
  1659. {
  1660. SLJIT_ASSERT_STOP();
  1661. return 0;
  1662. }
  1663. SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compiler, sljit_si op,
  1664. sljit_si dst, sljit_sw dstw,
  1665. sljit_si src, sljit_sw srcw)
  1666. {
  1667. SLJIT_UNUSED_ARG(compiler);
  1668. SLJIT_UNUSED_ARG(op);
  1669. SLJIT_UNUSED_ARG(dst);
  1670. SLJIT_UNUSED_ARG(dstw);
  1671. SLJIT_UNUSED_ARG(src);
  1672. SLJIT_UNUSED_ARG(srcw);
  1673. SLJIT_ASSERT_STOP();
  1674. return SLJIT_ERR_UNSUPPORTED;
  1675. }
  1676. SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compiler, sljit_si op,
  1677. sljit_si dst, sljit_sw dstw,
  1678. sljit_si src1, sljit_sw src1w,
  1679. sljit_si src2, sljit_sw src2w)
  1680. {
  1681. SLJIT_UNUSED_ARG(compiler);
  1682. SLJIT_UNUSED_ARG(op);
  1683. SLJIT_UNUSED_ARG(dst);
  1684. SLJIT_UNUSED_ARG(dstw);
  1685. SLJIT_UNUSED_ARG(src1);
  1686. SLJIT_UNUSED_ARG(src1w);
  1687. SLJIT_UNUSED_ARG(src2);
  1688. SLJIT_UNUSED_ARG(src2w);
  1689. SLJIT_ASSERT_STOP();
  1690. return SLJIT_ERR_UNSUPPORTED;
  1691. }
  1692. SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler)
  1693. {
  1694. SLJIT_UNUSED_ARG(compiler);
  1695. SLJIT_ASSERT_STOP();
  1696. return NULL;
  1697. }
  1698. SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_si type)
  1699. {
  1700. SLJIT_UNUSED_ARG(compiler);
  1701. SLJIT_UNUSED_ARG(type);
  1702. SLJIT_ASSERT_STOP();
  1703. return NULL;
  1704. }
  1705. SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_si type,
  1706. sljit_si src1, sljit_sw src1w,
  1707. sljit_si src2, sljit_sw src2w)
  1708. {
  1709. SLJIT_UNUSED_ARG(compiler);
  1710. SLJIT_UNUSED_ARG(type);
  1711. SLJIT_UNUSED_ARG(src1);
  1712. SLJIT_UNUSED_ARG(src1w);
  1713. SLJIT_UNUSED_ARG(src2);
  1714. SLJIT_UNUSED_ARG(src2w);
  1715. SLJIT_ASSERT_STOP();
  1716. return NULL;
  1717. }
  1718. SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_si type,
  1719. sljit_si src1, sljit_sw src1w,
  1720. sljit_si src2, sljit_sw src2w)
  1721. {
  1722. SLJIT_UNUSED_ARG(compiler);
  1723. SLJIT_UNUSED_ARG(type);
  1724. SLJIT_UNUSED_ARG(src1);
  1725. SLJIT_UNUSED_ARG(src1w);
  1726. SLJIT_UNUSED_ARG(src2);
  1727. SLJIT_UNUSED_ARG(src2w);
  1728. SLJIT_ASSERT_STOP();
  1729. return NULL;
  1730. }
  1731. SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label)
  1732. {
  1733. SLJIT_UNUSED_ARG(jump);
  1734. SLJIT_UNUSED_ARG(label);
  1735. SLJIT_ASSERT_STOP();
  1736. }
  1737. SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target)
  1738. {
  1739. SLJIT_UNUSED_ARG(jump);
  1740. SLJIT_UNUSED_ARG(target);
  1741. SLJIT_ASSERT_STOP();
  1742. }
  1743. SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compiler, sljit_si type, sljit_si src, sljit_sw srcw)
  1744. {
  1745. SLJIT_UNUSED_ARG(compiler);
  1746. SLJIT_UNUSED_ARG(type);
  1747. SLJIT_UNUSED_ARG(src);
  1748. SLJIT_UNUSED_ARG(srcw);
  1749. SLJIT_ASSERT_STOP();
  1750. return SLJIT_ERR_UNSUPPORTED;
  1751. }
  1752. SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_si op,
  1753. sljit_si dst, sljit_sw dstw,
  1754. sljit_si src, sljit_sw srcw,
  1755. sljit_si type)
  1756. {
  1757. SLJIT_UNUSED_ARG(compiler);
  1758. SLJIT_UNUSED_ARG(op);
  1759. SLJIT_UNUSED_ARG(dst);
  1760. SLJIT_UNUSED_ARG(dstw);
  1761. SLJIT_UNUSED_ARG(src);
  1762. SLJIT_UNUSED_ARG(srcw);
  1763. SLJIT_UNUSED_ARG(type);
  1764. SLJIT_ASSERT_STOP();
  1765. return SLJIT_ERR_UNSUPPORTED;
  1766. }
  1767. SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_local_base(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw, sljit_sw offset)
  1768. {
  1769. SLJIT_UNUSED_ARG(compiler);
  1770. SLJIT_UNUSED_ARG(dst);
  1771. SLJIT_UNUSED_ARG(dstw);
  1772. SLJIT_UNUSED_ARG(offset);
  1773. SLJIT_ASSERT_STOP();
  1774. return SLJIT_ERR_UNSUPPORTED;
  1775. }
  1776. SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw, sljit_sw initval)
  1777. {
  1778. SLJIT_UNUSED_ARG(compiler);
  1779. SLJIT_UNUSED_ARG(dst);
  1780. SLJIT_UNUSED_ARG(dstw);
  1781. SLJIT_UNUSED_ARG(initval);
  1782. SLJIT_ASSERT_STOP();
  1783. return NULL;
  1784. }
  1785. SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_addr)
  1786. {
  1787. SLJIT_UNUSED_ARG(addr);
  1788. SLJIT_UNUSED_ARG(new_addr);
  1789. SLJIT_ASSERT_STOP();
  1790. }
  1791. SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant)
  1792. {
  1793. SLJIT_UNUSED_ARG(addr);
  1794. SLJIT_UNUSED_ARG(new_constant);
  1795. SLJIT_ASSERT_STOP();
  1796. }
  1797. #endif