aot_test.cc 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #include <limits.h>
  6. #include "gtest/gtest.h"
  7. #include "wasm_export.h"
  8. #include "bh_platform.h"
  9. #include "aot_llvm.h"
  10. #include "aot_intrinsic.h"
  11. #include "aot.h"
  12. #define G_INTRINSIC_COUNT (50u)
  13. #define CONS(num) ("f##num##.const")
  14. const char *llvm_intrinsic_tmp[G_INTRINSIC_COUNT] = {
  15. "llvm.experimental.constrained.fadd.f32",
  16. "llvm.experimental.constrained.fadd.f64",
  17. "llvm.experimental.constrained.fsub.f32",
  18. "llvm.experimental.constrained.fsub.f64",
  19. "llvm.experimental.constrained.fmul.f32",
  20. "llvm.experimental.constrained.fmul.f64",
  21. "llvm.experimental.constrained.fdiv.f32",
  22. "llvm.experimental.constrained.fdiv.f64",
  23. "llvm.fabs.f32",
  24. "llvm.fabs.f64",
  25. "llvm.ceil.f32",
  26. "llvm.ceil.f64",
  27. "llvm.floor.f32",
  28. "llvm.floor.f64",
  29. "llvm.trunc.f32",
  30. "llvm.trunc.f64",
  31. "llvm.rint.f32",
  32. "llvm.rint.f64",
  33. "llvm.sqrt.f32",
  34. "llvm.sqrt.f64",
  35. "llvm.copysign.f32",
  36. "llvm.copysign.f64",
  37. "llvm.minnum.f32",
  38. "llvm.minnum.f64",
  39. "llvm.maxnum.f32",
  40. "llvm.maxnum.f64",
  41. "llvm.ctlz.i32",
  42. "llvm.ctlz.i64",
  43. "llvm.cttz.i32",
  44. "llvm.cttz.i64",
  45. "llvm.ctpop.i32",
  46. "llvm.ctpop.i64",
  47. "f64_convert_i32_s",
  48. "f64_convert_i32_u",
  49. "f32_convert_i32_s",
  50. "f32_convert_i32_u",
  51. "f64_convert_i64_s",
  52. "f64_convert_i64_u",
  53. "f32_convert_i64_s",
  54. "f32_convert_i64_u",
  55. "i32_trunc_f32_u",
  56. "i32_trunc_f32_s",
  57. "i32_trunc_f64_u",
  58. "i32_trunc_f64_s",
  59. "f32_demote_f64",
  60. "f64_promote_f32",
  61. "f32_cmp",
  62. "f64_cmp",
  63. "f32.const",
  64. "f64.const",
  65. };
  66. uint64 g_intrinsic_flag[G_INTRINSIC_COUNT] = {
  67. AOT_INTRINSIC_FLAG_F32_FADD, AOT_INTRINSIC_FLAG_F64_FADD,
  68. AOT_INTRINSIC_FLAG_F32_FSUB, AOT_INTRINSIC_FLAG_F64_FSUB,
  69. AOT_INTRINSIC_FLAG_F32_FMUL, AOT_INTRINSIC_FLAG_F64_FMUL,
  70. AOT_INTRINSIC_FLAG_F32_FDIV, AOT_INTRINSIC_FLAG_F64_FDIV,
  71. AOT_INTRINSIC_FLAG_F32_FABS, AOT_INTRINSIC_FLAG_F64_FABS,
  72. AOT_INTRINSIC_FLAG_F32_CEIL, AOT_INTRINSIC_FLAG_F64_CEIL,
  73. AOT_INTRINSIC_FLAG_F32_FLOOR, AOT_INTRINSIC_FLAG_F64_FLOOR,
  74. AOT_INTRINSIC_FLAG_F32_TRUNC, AOT_INTRINSIC_FLAG_F64_TRUNC,
  75. AOT_INTRINSIC_FLAG_F32_RINT, AOT_INTRINSIC_FLAG_F64_RINT,
  76. AOT_INTRINSIC_FLAG_F32_SQRT, AOT_INTRINSIC_FLAG_F64_SQRT,
  77. AOT_INTRINSIC_FLAG_F32_COPYSIGN, AOT_INTRINSIC_FLAG_F64_COPYSIGN,
  78. AOT_INTRINSIC_FLAG_F32_MIN, AOT_INTRINSIC_FLAG_F64_MIN,
  79. AOT_INTRINSIC_FLAG_F32_MAX, AOT_INTRINSIC_FLAG_F64_MAX,
  80. AOT_INTRINSIC_FLAG_I32_CLZ, AOT_INTRINSIC_FLAG_I64_CLZ,
  81. AOT_INTRINSIC_FLAG_I32_CTZ, AOT_INTRINSIC_FLAG_I64_CTZ,
  82. AOT_INTRINSIC_FLAG_I32_POPCNT, AOT_INTRINSIC_FLAG_I64_POPCNT,
  83. AOT_INTRINSIC_FLAG_I32_TO_F64, AOT_INTRINSIC_FLAG_U32_TO_F64,
  84. AOT_INTRINSIC_FLAG_I32_TO_F32, AOT_INTRINSIC_FLAG_U32_TO_F32,
  85. AOT_INTRINSIC_FLAG_I32_TO_F64, AOT_INTRINSIC_FLAG_U64_TO_F64,
  86. AOT_INTRINSIC_FLAG_I64_TO_F32, AOT_INTRINSIC_FLAG_U64_TO_F32,
  87. AOT_INTRINSIC_FLAG_F32_TO_U32, AOT_INTRINSIC_FLAG_F32_TO_I32,
  88. AOT_INTRINSIC_FLAG_F64_TO_U32, AOT_INTRINSIC_FLAG_F64_TO_I32,
  89. AOT_INTRINSIC_FLAG_F64_TO_F32, AOT_INTRINSIC_FLAG_F32_TO_F64,
  90. AOT_INTRINSIC_FLAG_F32_CMP, AOT_INTRINSIC_FLAG_F64_CMP,
  91. AOT_INTRINSIC_FLAG_F32_CONST, AOT_INTRINSIC_FLAG_F64_CONST,
  92. };
  93. // To use a test fixture, derive a class from testing::Test.
  94. class AOTTest : public testing::Test
  95. {
  96. protected:
  97. // You should make the members protected s.t. they can be
  98. // accessed from sub-classes.
  99. // virtual void SetUp() will be called before each test is run. You
  100. // should define it if you need to initialize the variables.
  101. // Otherwise, this can be skipped.
  102. virtual void SetUp()
  103. {
  104. memset(&init_args, 0, sizeof(RuntimeInitArgs));
  105. init_args.mem_alloc_type = Alloc_With_Pool;
  106. init_args.mem_alloc_option.pool.heap_buf = global_heap_buf;
  107. init_args.mem_alloc_option.pool.heap_size = sizeof(global_heap_buf);
  108. ASSERT_EQ(wasm_runtime_full_init(&init_args), true);
  109. }
  110. // virtual void TearDown() will be called after each test is run.
  111. // You should define it if there is cleanup work to do. Otherwise,
  112. // you don't have to provide it.
  113. //
  114. virtual void TearDown() { wasm_runtime_destroy(); }
  115. public:
  116. char global_heap_buf[512 * 1024];
  117. RuntimeInitArgs init_args;
  118. };
  119. TEST_F(AOTTest, aot_value_stack_push_pop)
  120. {
  121. AOTValueStack *stack;
  122. AOTValue *value1, *value2, *value3;
  123. AOTCompContext comp_ctx = { 0 };
  124. stack = (AOTValueStack *)wasm_runtime_malloc(sizeof(AOTValueStack));
  125. EXPECT_TRUE(stack != NULL);
  126. memset(stack, 0, sizeof(AOTValueStack));
  127. value1 = (AOTValue *)wasm_runtime_malloc(sizeof(AOTValue));
  128. EXPECT_TRUE(value1 != NULL);
  129. memset(value1, 0, sizeof(AOTValue));
  130. value1->type = VALUE_TYPE_I32;
  131. aot_value_stack_push(&comp_ctx, stack, value1);
  132. EXPECT_EQ(stack->value_list_head, value1);
  133. EXPECT_EQ(stack->value_list_end, value1);
  134. value2 = (AOTValue *)wasm_runtime_malloc(sizeof(AOTValue));
  135. EXPECT_TRUE(value2 != NULL);
  136. memset(value2, 0, sizeof(AOTValue));
  137. value2->type = VALUE_TYPE_I64;
  138. aot_value_stack_push(&comp_ctx, stack, value2);
  139. EXPECT_EQ(stack->value_list_head, value1);
  140. EXPECT_EQ(stack->value_list_end, value2);
  141. EXPECT_EQ(value2->prev, value1);
  142. value3 = aot_value_stack_pop(&comp_ctx, stack);
  143. EXPECT_EQ(value3, value2);
  144. EXPECT_EQ(stack->value_list_head, value1);
  145. EXPECT_EQ(stack->value_list_end, value1);
  146. EXPECT_TRUE(value3->prev == NULL);
  147. aot_value_stack_destroy(&comp_ctx, stack);
  148. wasm_runtime_free(value3);
  149. wasm_runtime_free(stack);
  150. }
  151. TEST_F(AOTTest, aot_block_stack_push_pop)
  152. {
  153. AOTBlockStack *stack;
  154. AOTBlock *block1, *block2, *block3;
  155. AOTCompContext comp_ctx = { 0 };
  156. stack = (AOTBlockStack *)wasm_runtime_malloc(sizeof(AOTBlockStack));
  157. EXPECT_TRUE(stack != NULL);
  158. memset(stack, 0, sizeof(AOTBlockStack));
  159. block1 = (AOTBlock *)wasm_runtime_malloc(sizeof(AOTBlock));
  160. EXPECT_TRUE(block1 != NULL);
  161. memset(block1, 0, sizeof(AOTBlock));
  162. block1->label_type = LABEL_TYPE_LOOP;
  163. aot_block_stack_push(stack, block1);
  164. EXPECT_EQ(stack->block_list_head, block1);
  165. EXPECT_EQ(stack->block_list_end, block1);
  166. block2 = (AOTBlock *)wasm_runtime_malloc(sizeof(AOTBlock));
  167. EXPECT_TRUE(block2 != NULL);
  168. memset(block2, 0, sizeof(AOTBlock));
  169. block2->label_type = LABEL_TYPE_IF;
  170. aot_block_stack_push(stack, block2);
  171. EXPECT_EQ(stack->block_list_head, block1);
  172. EXPECT_EQ(stack->block_list_end, block2);
  173. EXPECT_EQ(block2->prev, block1);
  174. block3 = aot_block_stack_pop(stack);
  175. EXPECT_EQ(block3, block2);
  176. EXPECT_EQ(stack->block_list_head, block1);
  177. EXPECT_EQ(stack->block_list_end, block1);
  178. EXPECT_TRUE(block3->prev == NULL);
  179. aot_block_stack_destroy(&comp_ctx, stack);
  180. wasm_runtime_free(block3);
  181. wasm_runtime_free(stack);
  182. }
  183. TEST_F(AOTTest, aot_intrinsic_fadd_f32)
  184. {
  185. float32 a = 1.0;
  186. float32 b = 1.0;
  187. EXPECT_EQ(aot_intrinsic_fadd_f32(a, b), (a + b));
  188. a = -1.0;
  189. b = -1.0;
  190. EXPECT_EQ(aot_intrinsic_fadd_f32(a, b), (a + b));
  191. }
  192. TEST_F(AOTTest, aot_intrinsic_fadd_f64)
  193. {
  194. float64 a = 1.0;
  195. float64 b = 1.0;
  196. EXPECT_EQ(aot_intrinsic_fadd_f64(a, b), (a + b));
  197. a = -1.0;
  198. b = -1.0;
  199. EXPECT_EQ(aot_intrinsic_fadd_f64(a, b), (a + b));
  200. }
  201. TEST_F(AOTTest, aot_intrinsic_fsub_f32)
  202. {
  203. float32 a = 1.0;
  204. float32 b = 1.0;
  205. EXPECT_EQ(aot_intrinsic_fsub_f32(a, b), (a - b));
  206. a = -1.0;
  207. b = -1.0;
  208. EXPECT_EQ(aot_intrinsic_fsub_f32(a, b), (a - b));
  209. }
  210. TEST_F(AOTTest, aot_intrinsic_fsub_f64)
  211. {
  212. float64 a = 1.0;
  213. float64 b = 1.0;
  214. EXPECT_EQ(aot_intrinsic_fsub_f64(a, b), (a - b));
  215. a = -1.0;
  216. b = -1.0;
  217. EXPECT_EQ(aot_intrinsic_fsub_f64(a, b), (a - b));
  218. }
  219. TEST_F(AOTTest, aot_intrinsic_fmul_f32)
  220. {
  221. float32 a = 1.0;
  222. float32 b = 1.0;
  223. EXPECT_EQ(aot_intrinsic_fmul_f32(a, b), (a * b));
  224. a = -1.0;
  225. b = -1.0;
  226. EXPECT_EQ(aot_intrinsic_fmul_f32(a, b), (a * b));
  227. }
  228. TEST_F(AOTTest, aot_intrinsic_fmul_f64)
  229. {
  230. float64 a = 1.0;
  231. float64 b = 1.0;
  232. EXPECT_EQ(aot_intrinsic_fmul_f64(a, b), (a * b));
  233. a = -1.0;
  234. b = -1.0;
  235. EXPECT_EQ(aot_intrinsic_fmul_f64(a, b), (a * b));
  236. }
  237. TEST_F(AOTTest, aot_intrinsic_fdiv_f32)
  238. {
  239. float32 a = 1.0;
  240. float32 b = 1.0;
  241. EXPECT_EQ(aot_intrinsic_fdiv_f32(a, b), (a / b));
  242. a = -1.0;
  243. b = -1.0;
  244. EXPECT_EQ(aot_intrinsic_fdiv_f32(a, b), (a / b));
  245. a = -1.0;
  246. b = 0.0;
  247. EXPECT_EQ(aot_intrinsic_fdiv_f32(a, b), (a / b));
  248. }
  249. TEST_F(AOTTest, aot_intrinsic_fdiv_f64)
  250. {
  251. float64 a = 1.0;
  252. float64 b = 1.0;
  253. EXPECT_EQ(aot_intrinsic_fdiv_f64(a, b), (a / b));
  254. a = -1.0;
  255. b = -1.0;
  256. EXPECT_EQ(aot_intrinsic_fdiv_f64(a, b), (a / b));
  257. a = -1.0;
  258. b = 0.0;
  259. EXPECT_EQ(aot_intrinsic_fdiv_f64(a, b), (a / b));
  260. }
  261. TEST_F(AOTTest, aot_intrinsic_fabs_f32)
  262. {
  263. float32 a = 1.0;
  264. EXPECT_EQ(aot_intrinsic_fabs_f32(a), fabs(a));
  265. a = -1.0;
  266. EXPECT_EQ(aot_intrinsic_fabs_f32(a), fabs(a));
  267. a = -1.5;
  268. EXPECT_EQ(aot_intrinsic_fabs_f32(a), fabs(a));
  269. }
  270. TEST_F(AOTTest, aot_intrinsic_fabs_f64)
  271. {
  272. float64 a = 1.0;
  273. EXPECT_EQ(aot_intrinsic_fabs_f64(a), fabs(a));
  274. a = -1.0;
  275. EXPECT_EQ(aot_intrinsic_fabs_f64(a), fabs(a));
  276. a = -1.5;
  277. EXPECT_EQ(aot_intrinsic_fabs_f64(a), fabs(a));
  278. }
  279. TEST_F(AOTTest, aot_intrinsic_ceil_f32)
  280. {
  281. float32 a = 1.0;
  282. EXPECT_EQ(aot_intrinsic_ceil_f32(a), ceilf(a));
  283. a = 1.1;
  284. EXPECT_EQ(aot_intrinsic_ceil_f32(a), 2);
  285. a = 1.9;
  286. EXPECT_EQ(aot_intrinsic_ceil_f32(a), 2);
  287. a = -1.9;
  288. EXPECT_EQ(aot_intrinsic_ceil_f32(a), -1);
  289. }
  290. TEST_F(AOTTest, aot_intrinsic_ceil_f64)
  291. {
  292. float64 a = 1.0;
  293. EXPECT_EQ(aot_intrinsic_ceil_f64(a), ceil(a));
  294. a = 1.1;
  295. EXPECT_EQ(aot_intrinsic_ceil_f64(a), 2);
  296. a = 1.9;
  297. EXPECT_EQ(aot_intrinsic_ceil_f64(a), 2);
  298. a = -1.9;
  299. EXPECT_EQ(aot_intrinsic_ceil_f64(a), -1);
  300. }
  301. TEST_F(AOTTest, aot_intrinsic_floor_f32)
  302. {
  303. float32 a = 1.0;
  304. EXPECT_EQ(aot_intrinsic_floor_f32(a), floorf(a));
  305. a = 1.1;
  306. EXPECT_EQ(aot_intrinsic_floor_f32(a), 1);
  307. a = 1.9;
  308. EXPECT_EQ(aot_intrinsic_floor_f32(a), 1);
  309. a = -1.9;
  310. EXPECT_EQ(aot_intrinsic_floor_f32(a), -2);
  311. }
  312. TEST_F(AOTTest, aot_intrinsic_floor_f64)
  313. {
  314. float64 a = 1.0;
  315. EXPECT_EQ(aot_intrinsic_floor_f64(a), floor(a));
  316. a = 1.1;
  317. EXPECT_EQ(aot_intrinsic_floor_f64(a), 1);
  318. a = 1.9;
  319. EXPECT_EQ(aot_intrinsic_floor_f64(a), 1);
  320. a = -1.9;
  321. EXPECT_EQ(aot_intrinsic_floor_f64(a), -2);
  322. }
  323. TEST_F(AOTTest, aot_intrinsic_trunc_f32)
  324. {
  325. float32 a = 1.0;
  326. EXPECT_EQ(aot_intrinsic_trunc_f32(a), trunc(a));
  327. a = 1.1;
  328. EXPECT_EQ(aot_intrinsic_trunc_f32(a), 1);
  329. a = 1.9;
  330. EXPECT_EQ(aot_intrinsic_trunc_f32(a), 1);
  331. a = -1.9;
  332. EXPECT_EQ(aot_intrinsic_trunc_f32(a), -1);
  333. }
  334. TEST_F(AOTTest, aot_intrinsic_trunc_f64)
  335. {
  336. float64 a = 1.0;
  337. EXPECT_EQ(aot_intrinsic_trunc_f64(a), trunc(a));
  338. a = 1.1;
  339. EXPECT_EQ(aot_intrinsic_trunc_f64(a), 1);
  340. a = 1.9;
  341. EXPECT_EQ(aot_intrinsic_trunc_f64(a), 1);
  342. a = -1.9;
  343. EXPECT_EQ(aot_intrinsic_trunc_f64(a), -1);
  344. }
  345. TEST_F(AOTTest, aot_intrinsic_rint_f32)
  346. {
  347. float32 a = 1.0;
  348. EXPECT_EQ(aot_intrinsic_rint_f32(a), rint(a));
  349. EXPECT_EQ(aot_intrinsic_rint_f32(a), 1);
  350. a = 1.1;
  351. EXPECT_EQ(aot_intrinsic_rint_f32(a), 1);
  352. a = 1.9;
  353. EXPECT_EQ(aot_intrinsic_rint_f32(a), 2);
  354. a = -1.9;
  355. EXPECT_EQ(aot_intrinsic_rint_f32(a), -2);
  356. }
  357. TEST_F(AOTTest, aot_intrinsic_rint_f64)
  358. {
  359. float64 a = 1.0;
  360. EXPECT_EQ(aot_intrinsic_rint_f64(a), rint(a));
  361. EXPECT_EQ(aot_intrinsic_rint_f64(a), 1);
  362. a = 1.1;
  363. EXPECT_EQ(aot_intrinsic_rint_f64(a), 1);
  364. a = 1.9;
  365. EXPECT_EQ(aot_intrinsic_rint_f64(a), 2);
  366. a = -1.9;
  367. EXPECT_EQ(aot_intrinsic_rint_f64(a), -2);
  368. }
  369. TEST_F(AOTTest, aot_intrinsic_sqrt_f32)
  370. {
  371. float32 a = 2.0;
  372. EXPECT_EQ(aot_intrinsic_sqrt_f32(a), sqrt(a));
  373. a = 2;
  374. EXPECT_EQ(aot_intrinsic_sqrt_f32(a), sqrt(a));
  375. }
  376. TEST_F(AOTTest, aot_intrinsic_sqrt_f64)
  377. {
  378. float64 a = 2.0;
  379. EXPECT_EQ(aot_intrinsic_sqrt_f64(a), sqrt(a));
  380. a = 2;
  381. EXPECT_EQ(aot_intrinsic_sqrt_f64(a), sqrt(a));
  382. }
  383. TEST_F(AOTTest, aot_intrinsic_copysign_f32)
  384. {
  385. float32 a = 20.0;
  386. float32 b = 2.0;
  387. EXPECT_EQ(aot_intrinsic_copysign_f32(a, b), fabs(a));
  388. b = 1.5;
  389. EXPECT_EQ(aot_intrinsic_copysign_f32(a, b), fabs(a));
  390. b = -2.0;
  391. EXPECT_EQ(aot_intrinsic_copysign_f32(a, b), -fabs(a));
  392. a = -20.0;
  393. b = -1.5;
  394. EXPECT_EQ(aot_intrinsic_copysign_f32(a, b), -fabs(a));
  395. }
  396. TEST_F(AOTTest, aot_intrinsic_copysign_f64)
  397. {
  398. float64 a = 20.0;
  399. float64 b = 2.0;
  400. EXPECT_EQ(aot_intrinsic_copysign_f64(a, b), fabs(a));
  401. b = 1.5;
  402. EXPECT_EQ(aot_intrinsic_copysign_f64(a, b), fabs(a));
  403. b = -2.0;
  404. EXPECT_EQ(aot_intrinsic_copysign_f64(a, b), -fabs(a));
  405. a = -20.0;
  406. b = -1.5;
  407. EXPECT_EQ(aot_intrinsic_copysign_f64(a, b), -fabs(a));
  408. }
  409. TEST_F(AOTTest, aot_intrinsic_fmin_f32)
  410. {
  411. float32 a = 1.2;
  412. float32 b = 2.5;
  413. EXPECT_EQ(aot_intrinsic_fmin_f32(a, b), a);
  414. a = -3;
  415. b = -1;
  416. EXPECT_EQ(aot_intrinsic_fmin_f32(a, b), a);
  417. b = 1;
  418. EXPECT_EQ(aot_intrinsic_fmin_f32('a', b), b);
  419. a = 3;
  420. EXPECT_EQ(aot_intrinsic_fmin_f32(a, 'b'), a);
  421. EXPECT_EQ(aot_intrinsic_fmin_f32('a', 'b'), 'a');
  422. EXPECT_EQ(aot_intrinsic_fmin_f32('b', 'c'), 'b');
  423. EXPECT_EQ(aot_intrinsic_fmin_f32('c', 'b'), 'b');
  424. EXPECT_EQ(aot_intrinsic_fmin_f32(true, 2.5), 1);
  425. EXPECT_EQ(aot_intrinsic_fmin_f32(1.0, false), 0);
  426. EXPECT_NE(aot_intrinsic_fmin_f32(sqrt(-1), 3), 3);
  427. EXPECT_NE(aot_intrinsic_fmin_f32(3, sqrt(-1)), 3);
  428. }
  429. TEST_F(AOTTest, aot_intrinsic_fmin_f64)
  430. {
  431. float64 a = 1.00000000;
  432. float64 b = 3.00000000;
  433. EXPECT_EQ(aot_intrinsic_fmin_f64(a, b), a);
  434. EXPECT_EQ(aot_intrinsic_fmin_f64(-a, b), -a);
  435. EXPECT_EQ(aot_intrinsic_fmin_f64(-a, -b), -b);
  436. EXPECT_EQ(aot_intrinsic_fmin_f64(a, -b), -b);
  437. EXPECT_EQ(aot_intrinsic_fmin_f64(a, a), a);
  438. a = 0.0000;
  439. EXPECT_EQ(aot_intrinsic_fmin_f64(-a, -a), -a);
  440. }
  441. TEST_F(AOTTest, aot_intrinsic_fmax_f32)
  442. {
  443. float32 a = 1.2;
  444. float32 b = 2.5;
  445. EXPECT_EQ(aot_intrinsic_fmax_f32(a, b), b);
  446. a = -3;
  447. b = -1;
  448. EXPECT_EQ(aot_intrinsic_fmax_f32(a, b), b);
  449. b = 1;
  450. EXPECT_EQ(aot_intrinsic_fmax_f32('a', b), 'a');
  451. a = 3;
  452. EXPECT_EQ(aot_intrinsic_fmax_f32(a, 'b'), 'b');
  453. EXPECT_EQ(aot_intrinsic_fmax_f32('a', 'b'), 'b');
  454. EXPECT_EQ(aot_intrinsic_fmax_f32(' ', 'b'), 'b');
  455. EXPECT_EQ(aot_intrinsic_fmax_f32('a', ' '), 'a');
  456. EXPECT_NE(aot_intrinsic_fmax_f32(sqrt(-1), 3), 3);
  457. EXPECT_NE(aot_intrinsic_fmax_f32(3, sqrt(-1)), 3);
  458. }
  459. TEST_F(AOTTest, aot_intrinsic_fmax_f64)
  460. {
  461. float64 a = 1.00000000;
  462. float64 b = 3.00000000;
  463. EXPECT_EQ(aot_intrinsic_fmax_f64(a, b), b);
  464. EXPECT_EQ(aot_intrinsic_fmax_f64(-a, b), b);
  465. EXPECT_EQ(aot_intrinsic_fmax_f64(-a, -b), -a);
  466. EXPECT_EQ(aot_intrinsic_fmax_f64(a, -b), a);
  467. EXPECT_EQ(aot_intrinsic_fmax_f64(a, a), a);
  468. a = 0.0000;
  469. EXPECT_EQ(aot_intrinsic_fmax_f64(-a, -a), -a);
  470. EXPECT_EQ(aot_intrinsic_fmax_f64(-0, -0), -0);
  471. }
  472. TEST_F(AOTTest, aot_intrinsic_clz_i32)
  473. {
  474. uint32 type = 0;
  475. uint32 data = 0;
  476. uint32 num = 0;
  477. EXPECT_EQ(aot_intrinsic_clz_i32(0), 32);
  478. for (uint32 i = 0; i < 0xFFFF; i++) {
  479. /* Generate random numbers [1,0xFFFFFFFF] */
  480. type = 1 + (rand() % (0xFFFFFFFF - 1 + 1));
  481. data = type;
  482. while (!(type & 0x80000000)) {
  483. num++;
  484. type <<= 1;
  485. }
  486. EXPECT_EQ(aot_intrinsic_clz_i32(data), num);
  487. num = 0;
  488. }
  489. EXPECT_EQ(aot_intrinsic_clz_i32(0xFFFFFFFF), 0);
  490. }
  491. TEST_F(AOTTest, aot_intrinsic_clz_i64)
  492. {
  493. uint64 type = 0;
  494. uint64 data = 0;
  495. uint64 num = 0;
  496. EXPECT_EQ(aot_intrinsic_clz_i64(0), 64);
  497. for (uint32 i = 0; i < 0xFFFFF; i++) {
  498. /* Generate random numbers [1,0xFFFFFFFFFFFFFFFF] */
  499. type = 1 + (rand() % (0xFFFFFFFFFFFFFFFF - 1 + 1));
  500. data = type;
  501. while (!(type & 0x8000000000000000LL)) {
  502. num++;
  503. type <<= 1;
  504. }
  505. EXPECT_EQ(aot_intrinsic_clz_i64(data), num);
  506. num = 0;
  507. }
  508. EXPECT_EQ(aot_intrinsic_clz_i64(0xFFFFFFFFFFFFFFFF), 0);
  509. }
  510. TEST_F(AOTTest, ast_intrinsic_ctz_i32)
  511. {
  512. uint32 type = 0;
  513. uint32 data = 0;
  514. uint32 num = 0;
  515. EXPECT_EQ(aot_intrinsic_ctz_i32(0), 32);
  516. for (uint32 i = 0; i < 0xFFFF; i++) {
  517. type = 1 + (rand() % (0xFFFFFFFF - 1 + 1));
  518. data = type;
  519. while (!(type & 1)) {
  520. num++;
  521. type >>= 1;
  522. }
  523. EXPECT_EQ(aot_intrinsic_ctz_i32(data), num);
  524. num = 0;
  525. }
  526. EXPECT_EQ(aot_intrinsic_ctz_i32(0xFFFFFFFF), 0);
  527. }
  528. TEST_F(AOTTest, ast_intrinsic_ctz_i64)
  529. {
  530. uint64 type = 0;
  531. uint64 data = 0;
  532. uint64 num = 0;
  533. EXPECT_EQ(aot_intrinsic_ctz_i64(0), 64);
  534. for (uint32 i = 0; i < 0xFFFFF; i++) {
  535. type = 1 + (rand() % (0xFFFFFFFFFFFFFFFF - 1 + 1));
  536. data = type;
  537. while (!(type & 1)) {
  538. num++;
  539. type >>= 1;
  540. }
  541. EXPECT_EQ(aot_intrinsic_ctz_i64(data), num);
  542. num = 0;
  543. }
  544. EXPECT_EQ(aot_intrinsic_ctz_i64(0xFFFFFFFFFFFFFFFF), 0);
  545. }
  546. TEST_F(AOTTest, aot_intrinsic_popcnt_i32)
  547. {
  548. uint32 data = 0;
  549. uint32 num = 0;
  550. uint32 temp = 0;
  551. EXPECT_EQ(aot_intrinsic_popcnt_i32(0), 0);
  552. for (uint32 i = 0; i < 0xFFFF; i++) {
  553. temp = 1 + (rand() % (0x100000000 - 1 + 1));
  554. data = temp;
  555. while (temp) {
  556. if (temp & 0x01)
  557. num++;
  558. temp >>= 1;
  559. }
  560. EXPECT_EQ(aot_intrinsic_popcnt_i32(data), num);
  561. num = 0;
  562. }
  563. EXPECT_EQ(aot_intrinsic_popcnt_i32(0xFFFFFFFF), 32);
  564. }
  565. TEST_F(AOTTest, aot_intrinsic_popcnt_i64)
  566. {
  567. uint64 data = 0;
  568. uint64 num = 0;
  569. uint64 temp = 0;
  570. EXPECT_EQ(aot_intrinsic_popcnt_i64(0x00), 0);
  571. for (uint32 i = 0; i < 0xFFFFF; i++) {
  572. temp = 1 + (rand() % (0xFFFFFFFFFFFFFFFFLL - 1 + 1));
  573. data = temp;
  574. while (temp) {
  575. if (temp & 0x01)
  576. num++;
  577. temp >>= 1;
  578. }
  579. EXPECT_EQ(aot_intrinsic_popcnt_i64(data), num);
  580. num = 0;
  581. }
  582. EXPECT_EQ(aot_intrinsic_popcnt_i64(0xFFFFFFFFFFFFFFFF), 64);
  583. }
  584. TEST_F(AOTTest, aot_intrinsic_i32_to_f32)
  585. {
  586. int32 idata = 0;
  587. EXPECT_EQ(aot_intrinsic_i32_to_f32(idata), (float32)idata);
  588. for (uint32 i = 0; i < 0xFFFF; i++) {
  589. idata = (int32)(1 + (rand() % (0xFFFFFFFF - 1 + 1)));
  590. EXPECT_EQ(aot_intrinsic_i32_to_f32(idata), (float32)idata);
  591. }
  592. idata = 0xFFFFFFFF;
  593. EXPECT_EQ(aot_intrinsic_i32_to_f32(idata), (float32)idata);
  594. }
  595. TEST_F(AOTTest, aot_intrinsic_u32_to_f32)
  596. {
  597. uint32 udata = 0;
  598. EXPECT_EQ(aot_intrinsic_u32_to_f32(udata), (float32)udata);
  599. for (uint32 i = 0; i < 0xFFFF; i++) {
  600. udata = (uint32)(1 + (rand() % (0xFFFFFFFF - 1 + 1)));
  601. EXPECT_EQ(aot_intrinsic_u32_to_f32(udata), (float32)udata);
  602. }
  603. udata = 0xFFFFFFFF;
  604. EXPECT_EQ(aot_intrinsic_u32_to_f32(udata), (float32)udata);
  605. }
  606. TEST_F(AOTTest, aot_intrinsic_i32_to_f64)
  607. {
  608. int32 idata = 0;
  609. EXPECT_EQ(aot_intrinsic_i32_to_f64(idata), (float64)idata);
  610. for (uint32 i = 0; i < 0xFFFF; i++) {
  611. idata = (int32)(1 + (rand() % (0xFFFFFFFF - 1 + 1)));
  612. EXPECT_EQ(aot_intrinsic_i32_to_f64(idata), (float64)idata);
  613. }
  614. idata = 0xFFFFFFFF;
  615. EXPECT_EQ(aot_intrinsic_i32_to_f64(idata), (float64)idata);
  616. }
  617. TEST_F(AOTTest, aot_intrinsic_u32_to_f64)
  618. {
  619. uint32 udata = 0;
  620. EXPECT_EQ(aot_intrinsic_u32_to_f64(udata), (float64)udata);
  621. for (uint32 i = 0; i < 0xFFFFF; i++) {
  622. udata = (uint32)(1 + (rand() % (0xFFFFFFFF - 1 + 1)));
  623. EXPECT_EQ(aot_intrinsic_u32_to_f64(udata), (float64)udata);
  624. }
  625. udata = 0xFFFFFFFF;
  626. EXPECT_EQ(aot_intrinsic_u32_to_f64(udata), (float64)udata);
  627. }
  628. TEST_F(AOTTest, aot_intrinsic_i64_to_f32)
  629. {
  630. int64 idata = 0LL;
  631. EXPECT_EQ(aot_intrinsic_i64_to_f32(idata), (float32)idata);
  632. for (uint32 i = 0; i < 0xFFFFF; i++) {
  633. idata = (int64)(1 + (rand() % (0xFFFFFFFF - 1 + 1)));
  634. EXPECT_EQ(aot_intrinsic_i64_to_f32(idata), (float32)idata);
  635. }
  636. idata = 0xFFFFFFFFFFFFFFFFLL;
  637. EXPECT_EQ(aot_intrinsic_i64_to_f32(idata), (float32)idata);
  638. }
  639. TEST_F(AOTTest, aot_intrinsic_u64_to_f32)
  640. {
  641. uint64 udata = 0LL;
  642. EXPECT_EQ(aot_intrinsic_u64_to_f32(udata), (float32)udata);
  643. for (uint32 i = 0; i < 0xFFFFF; i++) {
  644. udata = (uint64)(1 + (rand() % (0xFFFFFFFF - 1 + 1)));
  645. EXPECT_EQ(aot_intrinsic_u64_to_f32(udata), (float32)udata);
  646. }
  647. udata = 0xFFFFFFFFFFFFFFFFLL;
  648. EXPECT_EQ(aot_intrinsic_u64_to_f32(udata), (float32)udata);
  649. }
  650. TEST_F(AOTTest, aot_intrinsic_i64_to_f64)
  651. {
  652. int64 idata = 0LL;
  653. EXPECT_EQ(aot_intrinsic_i64_to_f64(idata), float64(idata));
  654. for (uint32_t i = 0; i < 0xFFFFF; i++) {
  655. idata = (int64)(1 + (rand() % (0xFFFFFFFFFFFFFFFLL - 1 + 1)));
  656. EXPECT_EQ(aot_intrinsic_i64_to_f64(idata), (float64)idata);
  657. }
  658. idata = 0xFFFFFFFFFFFFFFFFLL;
  659. EXPECT_EQ(aot_intrinsic_i64_to_f64(idata), (float64)idata);
  660. }
  661. TEST_F(AOTTest, aot_intrinsic_u64_to_f64)
  662. {
  663. uint64 udata = 0LL;
  664. EXPECT_EQ(aot_intrinsic_u64_to_f64(udata), float64(udata));
  665. for (uint32_t i = 0; i < 0xFFFFF; i++) {
  666. udata = (uint64)(1 + (rand() % (0xFFFFFFFFFFFFFFFLL - 1 + 1)));
  667. EXPECT_EQ(aot_intrinsic_u64_to_f64(udata), (float64)udata);
  668. }
  669. udata = 0xFFFFFFFFFFFFFFFFLL;
  670. EXPECT_EQ(aot_intrinsic_u64_to_f64(udata), (float64)udata);
  671. }
  672. TEST_F(AOTTest, aot_intrinsic_f32_to_i32)
  673. {
  674. float32 data = 0.0;
  675. EXPECT_EQ(aot_intrinsic_f32_to_i32(data), (int32)data);
  676. for (uint32 i = 0; i < 0xFFFF; i++) {
  677. data = (float32)((1 + (rand() % (100 - 1 + 1))) - 0.05);
  678. EXPECT_EQ(aot_intrinsic_f32_to_i32(data), (int32)data);
  679. }
  680. }
  681. TEST_F(AOTTest, aot_intrinsic_f32_to_u32)
  682. {
  683. float32 data = 0.0;
  684. EXPECT_EQ(aot_intrinsic_f32_to_u32(data), (uint32)data);
  685. for (uint32 i = 0; i < 0xFFFF; i++) {
  686. data = (float32)((1 + (rand() % (0xFFFFFFFF - 1 + 1))) - 0.05);
  687. EXPECT_EQ(aot_intrinsic_f32_to_u32(data), (uint32)data);
  688. }
  689. }
  690. TEST_F(AOTTest, aot_intrinsic_f32_to_i64)
  691. {
  692. float32 data = 0.0;
  693. EXPECT_EQ(aot_intrinsic_f32_to_i64(data), (int64)data);
  694. for (uint32 i = 0; i < 0xFFFF; i++) {
  695. data = (float32)((1 + (rand() % (0xFFFFFFFF - 1 + 1))) - 0.05);
  696. EXPECT_EQ(aot_intrinsic_f32_to_i64(data), (int64)data);
  697. }
  698. }
  699. TEST_F(AOTTest, aot_intrinsic_f32_to_u64)
  700. {
  701. float32 data = 0.0;
  702. EXPECT_EQ(aot_intrinsic_f32_to_u64(data), (uint64)data);
  703. for (uint32 i = 0; i < 0xFFFF; i++) {
  704. data = (float32)((1 + (rand() % (0xFFFFFFFF - 1 + 1))) - 0.05);
  705. EXPECT_EQ(aot_intrinsic_f32_to_u64(data), (uint64)data);
  706. }
  707. }
  708. TEST_F(AOTTest, aot_intrinsic_f64_to_i32)
  709. {
  710. float64 data = 0.0;
  711. EXPECT_EQ(aot_intrinsic_f64_to_i32(data), (int32)data);
  712. for (uint32 i = 0; i < 0xFFFFFF; i++) {
  713. data = (float64)((1 + (rand() % (0xFFFFFFFF - 1 + 1))) - 0.05);
  714. EXPECT_EQ(aot_intrinsic_f64_to_i32(data), (int32)data);
  715. }
  716. }
  717. TEST_F(AOTTest, aot_intrinsic_f64_to_u32)
  718. {
  719. float64 data = 0.0;
  720. EXPECT_EQ(aot_intrinsic_f64_to_u32(data), (uint32)data);
  721. for (uint32 i = 0; i < 0xFFFFFF; i++) {
  722. data = (float64)((1 + (rand() % (0xFFFFFFFF - 1 + 1))) - 0.05);
  723. EXPECT_EQ(aot_intrinsic_f64_to_u32(data), (uint32)data);
  724. }
  725. }
  726. TEST_F(AOTTest, aot_intrinsic_f64_to_i64)
  727. {
  728. float64 data = 0.0;
  729. EXPECT_EQ(aot_intrinsic_f64_to_i64(data), (int64)data);
  730. for (uint32 i = 0; i < 0xFFFFFF; i++) {
  731. data = (float64)((1 + (rand() % (0xFFFFFFFF - 1 + 1))) - 0.05);
  732. EXPECT_EQ(aot_intrinsic_f64_to_i64(data), (int64)data);
  733. }
  734. }
  735. TEST_F(AOTTest, aot_intrinsic_f64_to_u64)
  736. {
  737. float64 data = 0.0;
  738. EXPECT_EQ(aot_intrinsic_f64_to_u64(data), (uint64)data);
  739. for (uint32 i = 0; i < 0xFFFFFF; i++) {
  740. data = (float64)((1 + (rand() % (0xFFFFFFFF - 1 + 1))) - 0.05);
  741. EXPECT_EQ(aot_intrinsic_f64_to_u64(data), (uint64)data);
  742. }
  743. }
  744. TEST_F(AOTTest, aot_intrinsic_f32_to_f64)
  745. {
  746. float32 data = 0.0;
  747. EXPECT_EQ(aot_intrinsic_f32_to_f64(data), (float64)data);
  748. for (uint32 i = 0; i < 0xFFFF; i++) {
  749. data = (float32)((1 + (rand() % (0xFFFFFFFF - 1 + 1))) - 0.05);
  750. EXPECT_EQ(aot_intrinsic_f32_to_f64(data), (float64)data);
  751. }
  752. }
  753. TEST_F(AOTTest, aot_intrinsic_f64_to_f32)
  754. {
  755. float64 data = 0.0;
  756. EXPECT_EQ(aot_intrinsic_f64_to_f32(data), (float32)data);
  757. for (uint32 i = 0; i < 0xFFFFFF; i++) {
  758. data = (float64)((1 + (rand() % (0xFFFFFFFF - 1 + 1))) - 0.06);
  759. EXPECT_EQ(aot_intrinsic_f32_to_f64(data), (float32)data);
  760. }
  761. }
  762. TEST_F(AOTTest, aot_intrinsic_f32_cmp)
  763. {
  764. float32 lhs = 0.0;
  765. float32 rhs = 0.0;
  766. AOTFloatCond index = FLOAT_EQ;
  767. uint32 res = 0;
  768. for (uint32 i = 0; i < 0xFFFFFF; i++) {
  769. index = (AOTFloatCond)(1 + (rand() % (6 - 1 + 1)));
  770. lhs = (float32)((1 + (rand() % (0xFFFFFFFF - 1 + 1))) - 0.05);
  771. rhs = (float32)((1 + (rand() % (0xFFFFFFFF - 1 + 1))) - 0.05);
  772. /* cond : 0 */
  773. EXPECT_EQ(aot_intrinsic_f32_cmp(FLOAT_EQ, lhs, rhs),
  774. lhs == rhs ? 1 : 0);
  775. /* cond : 1-6 */
  776. switch (index) {
  777. case FLOAT_LT: // 2
  778. res = (lhs < rhs ? 1 : 0);
  779. break;
  780. case FLOAT_GT: // 3
  781. res = (lhs > rhs ? 1 : 0);
  782. break;
  783. case FLOAT_LE: // 4
  784. res = (lhs <= rhs ? 1 : 0);
  785. break;
  786. case FLOAT_GE: // 5
  787. res = (lhs >= rhs ? 1 : 0);
  788. break;
  789. case FLOAT_NE: // 1
  790. res = (isnan(lhs) || isnan(rhs) || lhs != rhs) ? 1 : 0;
  791. break;
  792. case FLOAT_UNO: // 6
  793. res = (isnan(lhs) || isnan(rhs)) ? 1 : 0;
  794. break;
  795. default:
  796. break;
  797. }
  798. EXPECT_EQ(aot_intrinsic_f32_cmp(index, lhs, rhs), res);
  799. index = FLOAT_EQ;
  800. /* cond : > 6 */
  801. EXPECT_EQ(aot_intrinsic_f32_cmp((AOTFloatCond)(i + 7), lhs, rhs), 0);
  802. }
  803. EXPECT_EQ(aot_intrinsic_f32_cmp(FLOAT_NE, true, false), 1);
  804. EXPECT_EQ(aot_intrinsic_f32_cmp(FLOAT_NE, true, true), 0);
  805. EXPECT_EQ(aot_intrinsic_f32_cmp(FLOAT_UNO, true, false), 0);
  806. EXPECT_EQ(aot_intrinsic_f32_cmp(FLOAT_UNO, true, true), 0);
  807. EXPECT_EQ(aot_intrinsic_f32_cmp(FLOAT_UNO, 'a', 'b'), 0);
  808. }
  809. TEST_F(AOTTest, aot_intrinsic_f64_cmp)
  810. {
  811. float64 lhs = 0.0;
  812. float64 rhs = 0.0;
  813. AOTFloatCond index = FLOAT_EQ;
  814. uint32 res = 0;
  815. for (uint32 i = 0; i < 0xFFFFFF; i++) {
  816. index = (AOTFloatCond)(1 + (rand() % (6 - 1 + 1)));
  817. lhs = (float32)((1 + (rand() % (0xFFFFFFFFFFFFFFFF - 1 + 1))) - 0.05);
  818. rhs = (float32)((1 + (rand() % (0xFFFFFFFFFFFFFFFF - 1 + 1))) - 0.05);
  819. /* cond : 0 */
  820. EXPECT_EQ(aot_intrinsic_f64_cmp(FLOAT_EQ, lhs, rhs),
  821. lhs == rhs ? 1 : 0);
  822. /* cond : 1-6 */
  823. switch (index) {
  824. case FLOAT_LT: // 2
  825. res = (lhs < rhs ? 1 : 0);
  826. break;
  827. case FLOAT_GT: // 3
  828. res = (lhs > rhs ? 1 : 0);
  829. break;
  830. case FLOAT_LE: // 4
  831. res = (lhs <= rhs ? 1 : 0);
  832. break;
  833. case FLOAT_GE: // 5
  834. res = (lhs >= rhs ? 1 : 0);
  835. break;
  836. case FLOAT_NE: // 1
  837. res = (isnan(lhs) || isnan(rhs) || lhs != rhs) ? 1 : 0;
  838. break;
  839. case FLOAT_UNO: // 6
  840. res = (isnan(lhs) || isnan(rhs)) ? 1 : 0;
  841. break;
  842. default:
  843. break;
  844. }
  845. EXPECT_EQ(aot_intrinsic_f64_cmp(index, lhs, rhs), res);
  846. index = FLOAT_EQ;
  847. /* cond : > 6 */
  848. EXPECT_EQ(aot_intrinsic_f64_cmp((AOTFloatCond)(i + 7), lhs, rhs), 0);
  849. }
  850. EXPECT_EQ(aot_intrinsic_f64_cmp(FLOAT_NE, true, false), 1);
  851. EXPECT_EQ(aot_intrinsic_f64_cmp(FLOAT_NE, true, true), 0);
  852. EXPECT_EQ(aot_intrinsic_f64_cmp(FLOAT_UNO, true, false), 0);
  853. EXPECT_EQ(aot_intrinsic_f64_cmp(FLOAT_UNO, true, true), 0);
  854. EXPECT_EQ(aot_intrinsic_f64_cmp(FLOAT_UNO, 'a', 'b'), 0);
  855. }
  856. TEST_F(AOTTest, aot_intrinsic_get_symbol)
  857. {
  858. const char *llvm_intrinsic_t = NULL;
  859. for (int i = 0; i < 2; i++) {
  860. if (i == 0)
  861. llvm_intrinsic_t = CONS(32);
  862. else
  863. llvm_intrinsic_t = CONS(64);
  864. EXPECT_EQ((const char *)aot_intrinsic_get_symbol(llvm_intrinsic_t),
  865. (const char *)NULL);
  866. }
  867. for (int i = 0; i < G_INTRINSIC_COUNT - 2; i++) {
  868. EXPECT_NE((const char *)aot_intrinsic_get_symbol(llvm_intrinsic_tmp[i]),
  869. (const char *)NULL);
  870. }
  871. }
  872. TEST_F(AOTTest, aot_intrinsic_check_capability)
  873. {
  874. AOTCompContext *comp_ctx = NULL;
  875. AOTCompContext scomp_ctx = { 0 };
  876. const char *llvm_intrinsic_t = "f64_cmp";
  877. bool res = false;
  878. uint64 flag = 0;
  879. uint64 group = 0;
  880. comp_ctx = &scomp_ctx;
  881. memset(comp_ctx->flags, 0, sizeof(comp_ctx->flags));
  882. /*
  883. EXPECT_FALSE(aot_intrinsic_check_capability(comp_ctx, (const char
  884. *)NULL)); EXPECT_FALSE(aot_intrinsic_check_capability((const
  885. AOTCompContext *)NULL, llvm_intrinsic_t));
  886. */
  887. EXPECT_FALSE(aot_intrinsic_check_capability(comp_ctx, llvm_intrinsic_t));
  888. for (int i = 0; i < G_INTRINSIC_COUNT; i++) {
  889. EXPECT_FALSE(
  890. aot_intrinsic_check_capability(comp_ctx, llvm_intrinsic_tmp[i]));
  891. }
  892. memset(comp_ctx->flags, 1, sizeof(comp_ctx->flags));
  893. EXPECT_FALSE(aot_intrinsic_check_capability(comp_ctx, llvm_intrinsic_t));
  894. for (int i = 0; i < G_INTRINSIC_COUNT; i++) {
  895. flag = g_intrinsic_flag[i];
  896. group = AOT_INTRINSIC_GET_GROUP_FROM_FLAG(flag);
  897. flag &= AOT_INTRINSIC_FLAG_MASK;
  898. res = aot_intrinsic_check_capability(comp_ctx, llvm_intrinsic_tmp[i]);
  899. if ((flag & 0x01) || (flag & 0x100) || (flag & 0x10000)
  900. || (flag & 0x1000000))
  901. EXPECT_TRUE(res);
  902. else
  903. EXPECT_FALSE(res);
  904. }
  905. }
  906. TEST_F(AOTTest, aot_intrinsic_fill_capability_flags)
  907. {
  908. // AOTCompContext *comp_ctx = NULL;
  909. AOTCompContext scomp_ctx = { 0 };
  910. // comp_ctx = &scomp_ctx;
  911. aot_intrinsic_fill_capability_flags(&scomp_ctx);
  912. AOTCompContext scomp_ctx_1{
  913. .target_cpu = (char *)"cortex-m7",
  914. };
  915. strncpy(scomp_ctx_1.target_arch, "thumb", strlen("thumb"));
  916. aot_intrinsic_fill_capability_flags(&scomp_ctx_1);
  917. AOTCompContext scomp_ctx_2{
  918. .target_cpu = (char *)"cortex-m4",
  919. };
  920. strncpy(scomp_ctx_2.target_arch, "thumb", strlen("thumb"));
  921. aot_intrinsic_fill_capability_flags(&scomp_ctx_2);
  922. AOTCompContext scomp_ctx_3{
  923. .target_cpu = (char *)"cortex-m4",
  924. };
  925. strncpy(scomp_ctx_3.target_arch, "riscv", strlen("riscv"));
  926. aot_intrinsic_fill_capability_flags(&scomp_ctx_3);
  927. AOTCompContext scomp_ctx_4{
  928. .target_cpu = (char *)"cortex-m4",
  929. };
  930. strncpy(scomp_ctx_4.target_arch, "intrinsic", strlen("intrinsic"));
  931. aot_intrinsic_fill_capability_flags(&scomp_ctx_4);
  932. }