Skip to content

Commit 55de520

Browse files
committed
W27a python#4: emitPrimitiveCompare → C body + delegation stub
PRIMITIVE_COMPARE_OP (Static Python) opcode handler. Per W27a Step A scope. C body: hir_builder_emit_primitive_compare_c (~50 lines). Inlines the PRIM_OP_* → HIR_PCMP_* mapping switch directly. Reuses PHX_PRIM_OP_* defines from python#3 (emitPrimitiveBinaryOp). C primitives used: hir_c_create_primitive_compare + hir_builder_temps_alloc_stack (both existing). C++ HIRBuilder::emitPrimitiveCompare → 3-line delegation stub. Verification: cmake --build target jit/phoenix_jit clean (BUILD_EXIT=0).
1 parent 418c949 commit 55de520

2 files changed

Lines changed: 53 additions & 47 deletions

File tree

‎Python/jit/hir/builder.cpp‎

Lines changed: 4 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -4089,56 +4089,13 @@ void HIRBuilder::emitPrimitiveBinaryOp(
40894089
hir_builder_emit_primitive_binary_op_c(&tc, this, bc_instr.oparg());
40904090
}
40914091

4092+
extern "C" void hir_builder_emit_primitive_compare_c(
4093+
void *tc, void *builder, int oparg);
4094+
40924095
void HIRBuilder::emitPrimitiveCompare(
40934096
TranslationContext& tc,
40944097
const jit::BytecodeInstruction& bc_instr) {
4095-
PhxPtrArray& stack = tc.frame.stack;
4096-
Register* right = static_cast<Register*>(phx_ptr_arr_pop(&stack));
4097-
Register* left = static_cast<Register*>(phx_ptr_arr_pop(&stack));
4098-
Register* result = temps_.AllocateStack();
4099-
PrimitiveCompareOp op;
4100-
switch (bc_instr.oparg()) {
4101-
case PRIM_OP_EQ_INT:
4102-
case PRIM_OP_EQ_DBL:
4103-
op = PrimitiveCompareOp::kEqual;
4104-
break;
4105-
case PRIM_OP_NE_INT:
4106-
case PRIM_OP_NE_DBL:
4107-
op = PrimitiveCompareOp::kNotEqual;
4108-
break;
4109-
case PRIM_OP_LT_INT:
4110-
op = PrimitiveCompareOp::kLessThan;
4111-
break;
4112-
case PRIM_OP_LE_INT:
4113-
op = PrimitiveCompareOp::kLessThanEqual;
4114-
break;
4115-
case PRIM_OP_GT_INT:
4116-
op = PrimitiveCompareOp::kGreaterThan;
4117-
break;
4118-
case PRIM_OP_GE_INT:
4119-
op = PrimitiveCompareOp::kGreaterThanEqual;
4120-
break;
4121-
case PRIM_OP_LT_UN_INT:
4122-
case PRIM_OP_LT_DBL:
4123-
op = PrimitiveCompareOp::kLessThanUnsigned;
4124-
break;
4125-
case PRIM_OP_LE_UN_INT:
4126-
case PRIM_OP_LE_DBL:
4127-
op = PrimitiveCompareOp::kLessThanEqualUnsigned;
4128-
break;
4129-
case PRIM_OP_GT_UN_INT:
4130-
case PRIM_OP_GT_DBL:
4131-
op = PrimitiveCompareOp::kGreaterThanUnsigned;
4132-
break;
4133-
case PRIM_OP_GE_UN_INT:
4134-
case PRIM_OP_GE_DBL:
4135-
op = PrimitiveCompareOp::kGreaterThanEqualUnsigned;
4136-
break;
4137-
default:
4138-
JIT_ABORT("unsupported comparison");
4139-
}
4140-
tc.emitPrimitiveCompare(result, op, left, right);
4141-
phx_ptr_arr_push(&stack, result);
4098+
hir_builder_emit_primitive_compare_c(&tc, this, bc_instr.oparg());
41424099
}
41434100

41444101
void HIRBuilder::emitPrimitiveUnaryOp(

‎Python/jit/hir/builder_emit_c.c‎

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3807,4 +3807,53 @@ void hir_builder_emit_primitive_binary_op_c(
38073807
phx_ptr_arr_push(&tc->frame.stack, result);
38083808
}
38093809

3810+
/* W27a #4: emitPrimitiveCompare (PRIMITIVE_COMPARE_OP opcode, Static Python).
3811+
* Mirrors C++ HIRBuilder::emitPrimitiveCompare @ builder.cpp:4097.
3812+
*
3813+
* PHX_PRIM_OP_* compare values from classloader.h (already #defined above).
3814+
* HIR_PCMP_* constants from hir_instr_c.h. */
3815+
void hir_builder_emit_primitive_compare_c(
3816+
PhxTranslationContext *tc,
3817+
void *builder,
3818+
int oparg) {
3819+
void *right = phx_ptr_arr_pop(&tc->frame.stack);
3820+
void *left = phx_ptr_arr_pop(&tc->frame.stack);
3821+
void *result = hir_builder_temps_alloc_stack(builder);
3822+
3823+
int32_t op;
3824+
switch (oparg) {
3825+
case PHX_PRIM_OP_EQ_INT:
3826+
case PHX_PRIM_OP_EQ_DBL:
3827+
op = HIR_PCMP_Equal; break;
3828+
case PHX_PRIM_OP_NE_INT:
3829+
case PHX_PRIM_OP_NE_DBL:
3830+
op = HIR_PCMP_NotEqual; break;
3831+
case PHX_PRIM_OP_LT_INT:
3832+
op = HIR_PCMP_LessThan; break;
3833+
case PHX_PRIM_OP_LE_INT:
3834+
op = HIR_PCMP_LessThanEqual; break;
3835+
case PHX_PRIM_OP_GT_INT:
3836+
op = HIR_PCMP_GreaterThan; break;
3837+
case PHX_PRIM_OP_GE_INT:
3838+
op = HIR_PCMP_GreaterThanEqual; break;
3839+
case PHX_PRIM_OP_LT_UN_INT:
3840+
case PHX_PRIM_OP_LT_DBL:
3841+
op = HIR_PCMP_LessThanUnsigned; break;
3842+
case PHX_PRIM_OP_LE_UN_INT:
3843+
case PHX_PRIM_OP_LE_DBL:
3844+
op = HIR_PCMP_LessThanEqualUnsigned; break;
3845+
case PHX_PRIM_OP_GT_UN_INT:
3846+
case PHX_PRIM_OP_GT_DBL:
3847+
op = HIR_PCMP_GreaterThanUnsigned; break;
3848+
case PHX_PRIM_OP_GE_UN_INT:
3849+
case PHX_PRIM_OP_GE_DBL:
3850+
op = HIR_PCMP_GreaterThanEqualUnsigned; break;
3851+
default:
3852+
JIT_CHECK_C(0, "unsupported comparison %d", oparg);
3853+
return; /* unreachable */
3854+
}
3855+
phx_tc_emit(tc, hir_c_create_primitive_compare(result, op, left, right));
3856+
phx_ptr_arr_push(&tc->frame.stack, result);
3857+
}
3858+
38103859

0 commit comments

Comments
 (0)