@@ -108,6 +108,7 @@ static Vector<int32_t> int32Operands()
108108 42 ,
109109 -42 ,
110110 64 ,
111+ static_cast <int32_t >(0x80000000U ),
111112 std::numeric_limits<int32_t >::max (),
112113 std::numeric_limits<int32_t >::min (),
113114 };
@@ -155,6 +156,7 @@ static Vector<int64_t> int64Operands()
155156 42 ,
156157 -42 ,
157158 64 ,
159+ static_cast <int64_t >(0x8000000000000000ULL ),
158160 std::numeric_limits<int32_t >::max (),
159161 std::numeric_limits<int32_t >::min (),
160162 std::numeric_limits<int64_t >::max (),
@@ -377,6 +379,128 @@ void testBranchTruncateDoubleToInt32(double val, int32_t expected)
377379 }), expected);
378380}
379381
382+ static void testBranch32 ()
383+ {
384+ auto compare = [](CCallHelpers::RelationalCondition cond, int32_t v1, int32_t v2) -> int {
385+ switch (cond) {
386+ case CCallHelpers::LessThan:
387+ return !!(static_cast <int32_t >(v1) < static_cast <int32_t >(v2));
388+ case CCallHelpers::LessThanOrEqual:
389+ return !!(static_cast <int32_t >(v1) <= static_cast <int32_t >(v2));
390+ case CCallHelpers::GreaterThan:
391+ return !!(static_cast <int32_t >(v1) > static_cast <int32_t >(v2));
392+ case CCallHelpers::GreaterThanOrEqual:
393+ return !!(static_cast <int32_t >(v1) >= static_cast <int32_t >(v2));
394+ case CCallHelpers::Below:
395+ return !!(static_cast <uint32_t >(v1) < static_cast <uint32_t >(v2));
396+ case CCallHelpers::BelowOrEqual:
397+ return !!(static_cast <uint32_t >(v1) <= static_cast <uint32_t >(v2));
398+ case CCallHelpers::Above:
399+ return !!(static_cast <uint32_t >(v1) > static_cast <uint32_t >(v2));
400+ case CCallHelpers::AboveOrEqual:
401+ return !!(static_cast <uint32_t >(v1) >= static_cast <uint32_t >(v2));
402+ case CCallHelpers::Equal:
403+ return !!(static_cast <uint32_t >(v1) == static_cast <uint32_t >(v2));
404+ case CCallHelpers::NotEqual:
405+ return !!(static_cast <uint32_t >(v1) != static_cast <uint32_t >(v2));
406+ }
407+ return 0 ;
408+ };
409+
410+ for (auto value : int32Operands ()) {
411+ for (auto value2 : int32Operands ()) {
412+ auto tryTest = [&](CCallHelpers::RelationalCondition cond) {
413+ auto test = compile ([=](CCallHelpers& jit) {
414+ emitFunctionPrologue (jit);
415+
416+ auto branch = jit.branch32 (cond, GPRInfo::argumentGPR0, CCallHelpers::TrustedImm32 (value2));
417+ jit.move (CCallHelpers::TrustedImm32 (0 ), GPRInfo::returnValueGPR);
418+ auto done = jit.jump ();
419+ branch.link (&jit);
420+ jit.move (CCallHelpers::TrustedImm32 (1 ), GPRInfo::returnValueGPR);
421+ done.link (&jit);
422+
423+ emitFunctionEpilogue (jit);
424+ jit.ret ();
425+ });
426+ CHECK_EQ (invoke<int >(test, value), compare (cond, value, value2));
427+ };
428+ tryTest (CCallHelpers::LessThan);
429+ tryTest (CCallHelpers::LessThanOrEqual);
430+ tryTest (CCallHelpers::GreaterThan);
431+ tryTest (CCallHelpers::GreaterThanOrEqual);
432+ tryTest (CCallHelpers::Below);
433+ tryTest (CCallHelpers::BelowOrEqual);
434+ tryTest (CCallHelpers::Above);
435+ tryTest (CCallHelpers::AboveOrEqual);
436+ tryTest (CCallHelpers::Equal);
437+ tryTest (CCallHelpers::NotEqual);
438+ }
439+ }
440+ }
441+
442+ #if CPU(X86_64) || CPU(ARM64)
443+ static void testBranch64 ()
444+ {
445+ auto compare = [](CCallHelpers::RelationalCondition cond, int64_t v1, int64_t v2) -> int {
446+ switch (cond) {
447+ case CCallHelpers::LessThan:
448+ return !!(static_cast <int64_t >(v1) < static_cast <int64_t >(v2));
449+ case CCallHelpers::LessThanOrEqual:
450+ return !!(static_cast <int64_t >(v1) <= static_cast <int64_t >(v2));
451+ case CCallHelpers::GreaterThan:
452+ return !!(static_cast <int64_t >(v1) > static_cast <int64_t >(v2));
453+ case CCallHelpers::GreaterThanOrEqual:
454+ return !!(static_cast <int64_t >(v1) >= static_cast <int64_t >(v2));
455+ case CCallHelpers::Below:
456+ return !!(static_cast <uint64_t >(v1) < static_cast <uint64_t >(v2));
457+ case CCallHelpers::BelowOrEqual:
458+ return !!(static_cast <uint64_t >(v1) <= static_cast <uint64_t >(v2));
459+ case CCallHelpers::Above:
460+ return !!(static_cast <uint64_t >(v1) > static_cast <uint64_t >(v2));
461+ case CCallHelpers::AboveOrEqual:
462+ return !!(static_cast <uint64_t >(v1) >= static_cast <uint64_t >(v2));
463+ case CCallHelpers::Equal:
464+ return !!(static_cast <uint64_t >(v1) == static_cast <uint64_t >(v2));
465+ case CCallHelpers::NotEqual:
466+ return !!(static_cast <uint64_t >(v1) != static_cast <uint64_t >(v2));
467+ }
468+ return 0 ;
469+ };
470+
471+ for (auto value : int64Operands ()) {
472+ for (auto value2 : int64Operands ()) {
473+ auto tryTest = [&](CCallHelpers::RelationalCondition cond) {
474+ auto test = compile ([=](CCallHelpers& jit) {
475+ emitFunctionPrologue (jit);
476+
477+ auto branch = jit.branch64 (cond, GPRInfo::argumentGPR0, CCallHelpers::TrustedImm64 (value2));
478+ jit.move (CCallHelpers::TrustedImm32 (0 ), GPRInfo::returnValueGPR);
479+ auto done = jit.jump ();
480+ branch.link (&jit);
481+ jit.move (CCallHelpers::TrustedImm32 (1 ), GPRInfo::returnValueGPR);
482+ done.link (&jit);
483+
484+ emitFunctionEpilogue (jit);
485+ jit.ret ();
486+ });
487+ CHECK_EQ (invoke<int >(test, value), compare (cond, value, value2));
488+ };
489+ tryTest (CCallHelpers::LessThan);
490+ tryTest (CCallHelpers::LessThanOrEqual);
491+ tryTest (CCallHelpers::GreaterThan);
492+ tryTest (CCallHelpers::GreaterThanOrEqual);
493+ tryTest (CCallHelpers::Below);
494+ tryTest (CCallHelpers::BelowOrEqual);
495+ tryTest (CCallHelpers::Above);
496+ tryTest (CCallHelpers::AboveOrEqual);
497+ tryTest (CCallHelpers::Equal);
498+ tryTest (CCallHelpers::NotEqual);
499+ }
500+ }
501+ }
502+ #endif
503+
380504void testBranchTest8 ()
381505{
382506 for (auto value : int32Operands ()) {
@@ -6113,6 +6237,8 @@ void run(const char* filter) WTF_IGNORES_THREAD_SAFETY_ANALYSIS
61136237 RUN (testLoadStorePair32 ());
61146238 RUN (testSub32ArgImm ());
61156239
6240+ RUN (testBranch32 ());
6241+
61166242 RUN (testBranchTest8 ());
61176243 RUN (testBranchTest16 ());
61186244
@@ -6126,6 +6252,7 @@ void run(const char* filter) WTF_IGNORES_THREAD_SAFETY_ANALYSIS
61266252#endif
61276253
61286254#if CPU(X86_64) || CPU(ARM64)
6255+ RUN (testBranch64 ());
61296256 RUN (testClearBit64 ());
61306257 RUN (testClearBits64WithMask ());
61316258 RUN (testClearBits64WithMaskTernary ());
0 commit comments