@@ -517,7 +517,27 @@ dummy_func(void) {
517517 assert (d -> lhs_type != NULL && d -> rhs_type != NULL );
518518 bool lhs_known = sym_matches_type (left , d -> lhs_type );
519519 bool rhs_known = sym_matches_type (right , d -> rhs_type );
520- if (lhs_known && rhs_known ) {
520+ bool is_float_truediv = (
521+ (d -> oparg == NB_TRUE_DIVIDE || d -> oparg == NB_INPLACE_TRUE_DIVIDE ) &&
522+ d -> lhs_type == & PyFloat_Type &&
523+ d -> rhs_type == & PyFloat_Type &&
524+ d -> result_type == & PyFloat_Type &&
525+ d -> result_unique
526+ );
527+ if (is_float_truediv ) {
528+ if (!rhs_known ) {
529+ ADD_OP (_GUARD_TOS_FLOAT , 0 , 0 );
530+ sym_set_type (right , & PyFloat_Type );
531+ }
532+ if (!lhs_known ) {
533+ ADD_OP (_GUARD_NOS_FLOAT , 0 , 0 );
534+ sym_set_type (left , & PyFloat_Type );
535+ }
536+ if (lhs_known && rhs_known ) {
537+ ADD_OP (_NOP , 0 , 0 );
538+ }
539+ }
540+ else if (lhs_known && rhs_known ) {
521541 ADD_OP (_NOP , 0 , 0 );
522542 }
523543 else if (lhs_known ) {
@@ -533,7 +553,34 @@ dummy_func(void) {
533553
534554 op (_BINARY_OP_EXTEND , (descr /4 , left , right -- res , l , r )) {
535555 _PyBinaryOpSpecializationDescr * d = (_PyBinaryOpSpecializationDescr * )descr ;
536- if (d != NULL && d -> result_type != NULL ) {
556+ l = left ;
557+ r = right ;
558+ bool is_float_truediv = (
559+ d != NULL &&
560+ d -> guard == NULL &&
561+ (d -> oparg == NB_TRUE_DIVIDE || d -> oparg == NB_INPLACE_TRUE_DIVIDE ) &&
562+ d -> lhs_type == & PyFloat_Type &&
563+ d -> rhs_type == & PyFloat_Type &&
564+ d -> result_type == & PyFloat_Type &&
565+ d -> result_unique
566+ );
567+ if (is_float_truediv ) {
568+ if (PyJitRef_IsUnique (left )) {
569+ ADD_OP (_BINARY_OP_TRUEDIV_FLOAT_INPLACE , 0 , 0 );
570+ l = sym_new_null (ctx );
571+ r = right ;
572+ }
573+ else if (PyJitRef_IsUnique (right )) {
574+ ADD_OP (_BINARY_OP_TRUEDIV_FLOAT_INPLACE_RIGHT , 0 , 0 );
575+ l = left ;
576+ r = sym_new_null (ctx );
577+ }
578+ else {
579+ ADD_OP (_BINARY_OP_TRUEDIV_FLOAT , 0 , 0 );
580+ }
581+ res = PyJitRef_MakeUnique (sym_new_type (ctx , & PyFloat_Type ));
582+ }
583+ else if (d != NULL && d -> result_type != NULL ) {
537584 res = sym_new_type (ctx , d -> result_type );
538585 if (d -> result_unique ) {
539586 res = PyJitRef_MakeUnique (res );
@@ -542,8 +589,6 @@ dummy_func(void) {
542589 else {
543590 res = sym_new_not_null (ctx );
544591 }
545- l = left ;
546- r = right ;
547592 }
548593
549594 op (_BINARY_OP_INPLACE_ADD_UNICODE , (left , right -- res )) {
0 commit comments