mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
GH-135379: Support limited scalar replacement for replicated uops in the JIT code generator. (GH-135563)
* Use it to support efficient specializations of COPY and SWAP in the JIT.
This commit is contained in:
parent
a9e66a7c50
commit
8dd8b5c2f0
9 changed files with 313 additions and 198 deletions
347
Include/internal/pycore_uop_ids.h
generated
347
Include/internal/pycore_uop_ids.h
generated
|
@ -86,86 +86,89 @@ extern "C" {
|
||||||
#define _CONTAINS_OP_DICT 362
|
#define _CONTAINS_OP_DICT 362
|
||||||
#define _CONTAINS_OP_SET 363
|
#define _CONTAINS_OP_SET 363
|
||||||
#define _CONVERT_VALUE CONVERT_VALUE
|
#define _CONVERT_VALUE CONVERT_VALUE
|
||||||
#define _COPY COPY
|
#define _COPY 364
|
||||||
|
#define _COPY_1 365
|
||||||
|
#define _COPY_2 366
|
||||||
|
#define _COPY_3 367
|
||||||
#define _COPY_FREE_VARS COPY_FREE_VARS
|
#define _COPY_FREE_VARS COPY_FREE_VARS
|
||||||
#define _CREATE_INIT_FRAME 364
|
#define _CREATE_INIT_FRAME 368
|
||||||
#define _DELETE_ATTR DELETE_ATTR
|
#define _DELETE_ATTR DELETE_ATTR
|
||||||
#define _DELETE_DEREF DELETE_DEREF
|
#define _DELETE_DEREF DELETE_DEREF
|
||||||
#define _DELETE_FAST DELETE_FAST
|
#define _DELETE_FAST DELETE_FAST
|
||||||
#define _DELETE_GLOBAL DELETE_GLOBAL
|
#define _DELETE_GLOBAL DELETE_GLOBAL
|
||||||
#define _DELETE_NAME DELETE_NAME
|
#define _DELETE_NAME DELETE_NAME
|
||||||
#define _DELETE_SUBSCR DELETE_SUBSCR
|
#define _DELETE_SUBSCR DELETE_SUBSCR
|
||||||
#define _DEOPT 365
|
#define _DEOPT 369
|
||||||
#define _DICT_MERGE DICT_MERGE
|
#define _DICT_MERGE DICT_MERGE
|
||||||
#define _DICT_UPDATE DICT_UPDATE
|
#define _DICT_UPDATE DICT_UPDATE
|
||||||
#define _DO_CALL 366
|
#define _DO_CALL 370
|
||||||
#define _DO_CALL_FUNCTION_EX 367
|
#define _DO_CALL_FUNCTION_EX 371
|
||||||
#define _DO_CALL_KW 368
|
#define _DO_CALL_KW 372
|
||||||
#define _END_FOR END_FOR
|
#define _END_FOR END_FOR
|
||||||
#define _END_SEND END_SEND
|
#define _END_SEND END_SEND
|
||||||
#define _ERROR_POP_N 369
|
#define _ERROR_POP_N 373
|
||||||
#define _EXIT_INIT_CHECK EXIT_INIT_CHECK
|
#define _EXIT_INIT_CHECK EXIT_INIT_CHECK
|
||||||
#define _EXPAND_METHOD 370
|
#define _EXPAND_METHOD 374
|
||||||
#define _EXPAND_METHOD_KW 371
|
#define _EXPAND_METHOD_KW 375
|
||||||
#define _FATAL_ERROR 372
|
#define _FATAL_ERROR 376
|
||||||
#define _FORMAT_SIMPLE FORMAT_SIMPLE
|
#define _FORMAT_SIMPLE FORMAT_SIMPLE
|
||||||
#define _FORMAT_WITH_SPEC FORMAT_WITH_SPEC
|
#define _FORMAT_WITH_SPEC FORMAT_WITH_SPEC
|
||||||
#define _FOR_ITER 373
|
#define _FOR_ITER 377
|
||||||
#define _FOR_ITER_GEN_FRAME 374
|
#define _FOR_ITER_GEN_FRAME 378
|
||||||
#define _FOR_ITER_TIER_TWO 375
|
#define _FOR_ITER_TIER_TWO 379
|
||||||
#define _GET_AITER GET_AITER
|
#define _GET_AITER GET_AITER
|
||||||
#define _GET_ANEXT GET_ANEXT
|
#define _GET_ANEXT GET_ANEXT
|
||||||
#define _GET_AWAITABLE GET_AWAITABLE
|
#define _GET_AWAITABLE GET_AWAITABLE
|
||||||
#define _GET_ITER GET_ITER
|
#define _GET_ITER GET_ITER
|
||||||
#define _GET_LEN GET_LEN
|
#define _GET_LEN GET_LEN
|
||||||
#define _GET_YIELD_FROM_ITER GET_YIELD_FROM_ITER
|
#define _GET_YIELD_FROM_ITER GET_YIELD_FROM_ITER
|
||||||
#define _GUARD_BINARY_OP_EXTEND 376
|
#define _GUARD_BINARY_OP_EXTEND 380
|
||||||
#define _GUARD_CALLABLE_ISINSTANCE 377
|
#define _GUARD_CALLABLE_ISINSTANCE 381
|
||||||
#define _GUARD_CALLABLE_LEN 378
|
#define _GUARD_CALLABLE_LEN 382
|
||||||
#define _GUARD_CALLABLE_LIST_APPEND 379
|
#define _GUARD_CALLABLE_LIST_APPEND 383
|
||||||
#define _GUARD_CALLABLE_STR_1 380
|
#define _GUARD_CALLABLE_STR_1 384
|
||||||
#define _GUARD_CALLABLE_TUPLE_1 381
|
#define _GUARD_CALLABLE_TUPLE_1 385
|
||||||
#define _GUARD_CALLABLE_TYPE_1 382
|
#define _GUARD_CALLABLE_TYPE_1 386
|
||||||
#define _GUARD_DORV_NO_DICT 383
|
#define _GUARD_DORV_NO_DICT 387
|
||||||
#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 384
|
#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 388
|
||||||
#define _GUARD_GLOBALS_VERSION 385
|
#define _GUARD_GLOBALS_VERSION 389
|
||||||
#define _GUARD_IS_FALSE_POP 386
|
#define _GUARD_IS_FALSE_POP 390
|
||||||
#define _GUARD_IS_NONE_POP 387
|
#define _GUARD_IS_NONE_POP 391
|
||||||
#define _GUARD_IS_NOT_NONE_POP 388
|
#define _GUARD_IS_NOT_NONE_POP 392
|
||||||
#define _GUARD_IS_TRUE_POP 389
|
#define _GUARD_IS_TRUE_POP 393
|
||||||
#define _GUARD_KEYS_VERSION 390
|
#define _GUARD_KEYS_VERSION 394
|
||||||
#define _GUARD_NOS_DICT 391
|
#define _GUARD_NOS_DICT 395
|
||||||
#define _GUARD_NOS_FLOAT 392
|
#define _GUARD_NOS_FLOAT 396
|
||||||
#define _GUARD_NOS_INT 393
|
#define _GUARD_NOS_INT 397
|
||||||
#define _GUARD_NOS_LIST 394
|
#define _GUARD_NOS_LIST 398
|
||||||
#define _GUARD_NOS_NOT_NULL 395
|
#define _GUARD_NOS_NOT_NULL 399
|
||||||
#define _GUARD_NOS_NULL 396
|
#define _GUARD_NOS_NULL 400
|
||||||
#define _GUARD_NOS_TUPLE 397
|
#define _GUARD_NOS_TUPLE 401
|
||||||
#define _GUARD_NOS_UNICODE 398
|
#define _GUARD_NOS_UNICODE 402
|
||||||
#define _GUARD_NOT_EXHAUSTED_LIST 399
|
#define _GUARD_NOT_EXHAUSTED_LIST 403
|
||||||
#define _GUARD_NOT_EXHAUSTED_RANGE 400
|
#define _GUARD_NOT_EXHAUSTED_RANGE 404
|
||||||
#define _GUARD_NOT_EXHAUSTED_TUPLE 401
|
#define _GUARD_NOT_EXHAUSTED_TUPLE 405
|
||||||
#define _GUARD_THIRD_NULL 402
|
#define _GUARD_THIRD_NULL 406
|
||||||
#define _GUARD_TOS_ANY_SET 403
|
#define _GUARD_TOS_ANY_SET 407
|
||||||
#define _GUARD_TOS_DICT 404
|
#define _GUARD_TOS_DICT 408
|
||||||
#define _GUARD_TOS_FLOAT 405
|
#define _GUARD_TOS_FLOAT 409
|
||||||
#define _GUARD_TOS_INT 406
|
#define _GUARD_TOS_INT 410
|
||||||
#define _GUARD_TOS_LIST 407
|
#define _GUARD_TOS_LIST 411
|
||||||
#define _GUARD_TOS_SLICE 408
|
#define _GUARD_TOS_SLICE 412
|
||||||
#define _GUARD_TOS_TUPLE 409
|
#define _GUARD_TOS_TUPLE 413
|
||||||
#define _GUARD_TOS_UNICODE 410
|
#define _GUARD_TOS_UNICODE 414
|
||||||
#define _GUARD_TYPE_VERSION 411
|
#define _GUARD_TYPE_VERSION 415
|
||||||
#define _GUARD_TYPE_VERSION_AND_LOCK 412
|
#define _GUARD_TYPE_VERSION_AND_LOCK 416
|
||||||
#define _IMPORT_FROM IMPORT_FROM
|
#define _IMPORT_FROM IMPORT_FROM
|
||||||
#define _IMPORT_NAME IMPORT_NAME
|
#define _IMPORT_NAME IMPORT_NAME
|
||||||
#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 413
|
#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 417
|
||||||
#define _INIT_CALL_PY_EXACT_ARGS 414
|
#define _INIT_CALL_PY_EXACT_ARGS 418
|
||||||
#define _INIT_CALL_PY_EXACT_ARGS_0 415
|
#define _INIT_CALL_PY_EXACT_ARGS_0 419
|
||||||
#define _INIT_CALL_PY_EXACT_ARGS_1 416
|
#define _INIT_CALL_PY_EXACT_ARGS_1 420
|
||||||
#define _INIT_CALL_PY_EXACT_ARGS_2 417
|
#define _INIT_CALL_PY_EXACT_ARGS_2 421
|
||||||
#define _INIT_CALL_PY_EXACT_ARGS_3 418
|
#define _INIT_CALL_PY_EXACT_ARGS_3 422
|
||||||
#define _INIT_CALL_PY_EXACT_ARGS_4 419
|
#define _INIT_CALL_PY_EXACT_ARGS_4 423
|
||||||
#define _INSERT_NULL 420
|
#define _INSERT_NULL 424
|
||||||
#define _INSTRUMENTED_FOR_ITER INSTRUMENTED_FOR_ITER
|
#define _INSTRUMENTED_FOR_ITER INSTRUMENTED_FOR_ITER
|
||||||
#define _INSTRUMENTED_INSTRUCTION INSTRUMENTED_INSTRUCTION
|
#define _INSTRUMENTED_INSTRUCTION INSTRUMENTED_INSTRUCTION
|
||||||
#define _INSTRUMENTED_JUMP_FORWARD INSTRUMENTED_JUMP_FORWARD
|
#define _INSTRUMENTED_JUMP_FORWARD INSTRUMENTED_JUMP_FORWARD
|
||||||
|
@ -175,171 +178,173 @@ extern "C" {
|
||||||
#define _INSTRUMENTED_POP_JUMP_IF_NONE INSTRUMENTED_POP_JUMP_IF_NONE
|
#define _INSTRUMENTED_POP_JUMP_IF_NONE INSTRUMENTED_POP_JUMP_IF_NONE
|
||||||
#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE INSTRUMENTED_POP_JUMP_IF_NOT_NONE
|
#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE INSTRUMENTED_POP_JUMP_IF_NOT_NONE
|
||||||
#define _INSTRUMENTED_POP_JUMP_IF_TRUE INSTRUMENTED_POP_JUMP_IF_TRUE
|
#define _INSTRUMENTED_POP_JUMP_IF_TRUE INSTRUMENTED_POP_JUMP_IF_TRUE
|
||||||
#define _IS_NONE 421
|
#define _IS_NONE 425
|
||||||
#define _IS_OP IS_OP
|
#define _IS_OP IS_OP
|
||||||
#define _ITER_CHECK_LIST 422
|
#define _ITER_CHECK_LIST 426
|
||||||
#define _ITER_CHECK_RANGE 423
|
#define _ITER_CHECK_RANGE 427
|
||||||
#define _ITER_CHECK_TUPLE 424
|
#define _ITER_CHECK_TUPLE 428
|
||||||
#define _ITER_JUMP_LIST 425
|
#define _ITER_JUMP_LIST 429
|
||||||
#define _ITER_JUMP_RANGE 426
|
#define _ITER_JUMP_RANGE 430
|
||||||
#define _ITER_JUMP_TUPLE 427
|
#define _ITER_JUMP_TUPLE 431
|
||||||
#define _ITER_NEXT_LIST 428
|
#define _ITER_NEXT_LIST 432
|
||||||
#define _ITER_NEXT_LIST_TIER_TWO 429
|
#define _ITER_NEXT_LIST_TIER_TWO 433
|
||||||
#define _ITER_NEXT_RANGE 430
|
#define _ITER_NEXT_RANGE 434
|
||||||
#define _ITER_NEXT_TUPLE 431
|
#define _ITER_NEXT_TUPLE 435
|
||||||
#define _JUMP_TO_TOP 432
|
#define _JUMP_TO_TOP 436
|
||||||
#define _LIST_APPEND LIST_APPEND
|
#define _LIST_APPEND LIST_APPEND
|
||||||
#define _LIST_EXTEND LIST_EXTEND
|
#define _LIST_EXTEND LIST_EXTEND
|
||||||
#define _LOAD_ATTR 433
|
#define _LOAD_ATTR 437
|
||||||
#define _LOAD_ATTR_CLASS 434
|
#define _LOAD_ATTR_CLASS 438
|
||||||
#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN
|
#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN
|
||||||
#define _LOAD_ATTR_INSTANCE_VALUE 435
|
#define _LOAD_ATTR_INSTANCE_VALUE 439
|
||||||
#define _LOAD_ATTR_METHOD_LAZY_DICT 436
|
#define _LOAD_ATTR_METHOD_LAZY_DICT 440
|
||||||
#define _LOAD_ATTR_METHOD_NO_DICT 437
|
#define _LOAD_ATTR_METHOD_NO_DICT 441
|
||||||
#define _LOAD_ATTR_METHOD_WITH_VALUES 438
|
#define _LOAD_ATTR_METHOD_WITH_VALUES 442
|
||||||
#define _LOAD_ATTR_MODULE 439
|
#define _LOAD_ATTR_MODULE 443
|
||||||
#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 440
|
#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 444
|
||||||
#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 441
|
#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 445
|
||||||
#define _LOAD_ATTR_PROPERTY_FRAME 442
|
#define _LOAD_ATTR_PROPERTY_FRAME 446
|
||||||
#define _LOAD_ATTR_SLOT 443
|
#define _LOAD_ATTR_SLOT 447
|
||||||
#define _LOAD_ATTR_WITH_HINT 444
|
#define _LOAD_ATTR_WITH_HINT 448
|
||||||
#define _LOAD_BUILD_CLASS LOAD_BUILD_CLASS
|
#define _LOAD_BUILD_CLASS LOAD_BUILD_CLASS
|
||||||
#define _LOAD_BYTECODE 445
|
#define _LOAD_BYTECODE 449
|
||||||
#define _LOAD_COMMON_CONSTANT LOAD_COMMON_CONSTANT
|
#define _LOAD_COMMON_CONSTANT LOAD_COMMON_CONSTANT
|
||||||
#define _LOAD_CONST LOAD_CONST
|
#define _LOAD_CONST LOAD_CONST
|
||||||
#define _LOAD_CONST_INLINE 446
|
#define _LOAD_CONST_INLINE 450
|
||||||
#define _LOAD_CONST_INLINE_BORROW 447
|
#define _LOAD_CONST_INLINE_BORROW 451
|
||||||
#define _LOAD_CONST_UNDER_INLINE 448
|
#define _LOAD_CONST_UNDER_INLINE 452
|
||||||
#define _LOAD_CONST_UNDER_INLINE_BORROW 449
|
#define _LOAD_CONST_UNDER_INLINE_BORROW 453
|
||||||
#define _LOAD_DEREF LOAD_DEREF
|
#define _LOAD_DEREF LOAD_DEREF
|
||||||
#define _LOAD_FAST 450
|
#define _LOAD_FAST 454
|
||||||
#define _LOAD_FAST_0 451
|
#define _LOAD_FAST_0 455
|
||||||
#define _LOAD_FAST_1 452
|
#define _LOAD_FAST_1 456
|
||||||
#define _LOAD_FAST_2 453
|
#define _LOAD_FAST_2 457
|
||||||
#define _LOAD_FAST_3 454
|
#define _LOAD_FAST_3 458
|
||||||
#define _LOAD_FAST_4 455
|
#define _LOAD_FAST_4 459
|
||||||
#define _LOAD_FAST_5 456
|
#define _LOAD_FAST_5 460
|
||||||
#define _LOAD_FAST_6 457
|
#define _LOAD_FAST_6 461
|
||||||
#define _LOAD_FAST_7 458
|
#define _LOAD_FAST_7 462
|
||||||
#define _LOAD_FAST_AND_CLEAR LOAD_FAST_AND_CLEAR
|
#define _LOAD_FAST_AND_CLEAR LOAD_FAST_AND_CLEAR
|
||||||
#define _LOAD_FAST_BORROW 459
|
#define _LOAD_FAST_BORROW 463
|
||||||
#define _LOAD_FAST_BORROW_0 460
|
#define _LOAD_FAST_BORROW_0 464
|
||||||
#define _LOAD_FAST_BORROW_1 461
|
#define _LOAD_FAST_BORROW_1 465
|
||||||
#define _LOAD_FAST_BORROW_2 462
|
#define _LOAD_FAST_BORROW_2 466
|
||||||
#define _LOAD_FAST_BORROW_3 463
|
#define _LOAD_FAST_BORROW_3 467
|
||||||
#define _LOAD_FAST_BORROW_4 464
|
#define _LOAD_FAST_BORROW_4 468
|
||||||
#define _LOAD_FAST_BORROW_5 465
|
#define _LOAD_FAST_BORROW_5 469
|
||||||
#define _LOAD_FAST_BORROW_6 466
|
#define _LOAD_FAST_BORROW_6 470
|
||||||
#define _LOAD_FAST_BORROW_7 467
|
#define _LOAD_FAST_BORROW_7 471
|
||||||
#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW LOAD_FAST_BORROW_LOAD_FAST_BORROW
|
#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW LOAD_FAST_BORROW_LOAD_FAST_BORROW
|
||||||
#define _LOAD_FAST_CHECK LOAD_FAST_CHECK
|
#define _LOAD_FAST_CHECK LOAD_FAST_CHECK
|
||||||
#define _LOAD_FAST_LOAD_FAST LOAD_FAST_LOAD_FAST
|
#define _LOAD_FAST_LOAD_FAST LOAD_FAST_LOAD_FAST
|
||||||
#define _LOAD_FROM_DICT_OR_DEREF LOAD_FROM_DICT_OR_DEREF
|
#define _LOAD_FROM_DICT_OR_DEREF LOAD_FROM_DICT_OR_DEREF
|
||||||
#define _LOAD_FROM_DICT_OR_GLOBALS LOAD_FROM_DICT_OR_GLOBALS
|
#define _LOAD_FROM_DICT_OR_GLOBALS LOAD_FROM_DICT_OR_GLOBALS
|
||||||
#define _LOAD_GLOBAL 468
|
#define _LOAD_GLOBAL 472
|
||||||
#define _LOAD_GLOBAL_BUILTINS 469
|
#define _LOAD_GLOBAL_BUILTINS 473
|
||||||
#define _LOAD_GLOBAL_MODULE 470
|
#define _LOAD_GLOBAL_MODULE 474
|
||||||
#define _LOAD_LOCALS LOAD_LOCALS
|
#define _LOAD_LOCALS LOAD_LOCALS
|
||||||
#define _LOAD_NAME LOAD_NAME
|
#define _LOAD_NAME LOAD_NAME
|
||||||
#define _LOAD_SMALL_INT 471
|
#define _LOAD_SMALL_INT 475
|
||||||
#define _LOAD_SMALL_INT_0 472
|
#define _LOAD_SMALL_INT_0 476
|
||||||
#define _LOAD_SMALL_INT_1 473
|
#define _LOAD_SMALL_INT_1 477
|
||||||
#define _LOAD_SMALL_INT_2 474
|
#define _LOAD_SMALL_INT_2 478
|
||||||
#define _LOAD_SMALL_INT_3 475
|
#define _LOAD_SMALL_INT_3 479
|
||||||
#define _LOAD_SPECIAL 476
|
#define _LOAD_SPECIAL 480
|
||||||
#define _LOAD_SUPER_ATTR_ATTR LOAD_SUPER_ATTR_ATTR
|
#define _LOAD_SUPER_ATTR_ATTR LOAD_SUPER_ATTR_ATTR
|
||||||
#define _LOAD_SUPER_ATTR_METHOD LOAD_SUPER_ATTR_METHOD
|
#define _LOAD_SUPER_ATTR_METHOD LOAD_SUPER_ATTR_METHOD
|
||||||
#define _MAKE_CALLARGS_A_TUPLE 477
|
#define _MAKE_CALLARGS_A_TUPLE 481
|
||||||
#define _MAKE_CELL MAKE_CELL
|
#define _MAKE_CELL MAKE_CELL
|
||||||
#define _MAKE_FUNCTION MAKE_FUNCTION
|
#define _MAKE_FUNCTION MAKE_FUNCTION
|
||||||
#define _MAKE_WARM 478
|
#define _MAKE_WARM 482
|
||||||
#define _MAP_ADD MAP_ADD
|
#define _MAP_ADD MAP_ADD
|
||||||
#define _MATCH_CLASS MATCH_CLASS
|
#define _MATCH_CLASS MATCH_CLASS
|
||||||
#define _MATCH_KEYS MATCH_KEYS
|
#define _MATCH_KEYS MATCH_KEYS
|
||||||
#define _MATCH_MAPPING MATCH_MAPPING
|
#define _MATCH_MAPPING MATCH_MAPPING
|
||||||
#define _MATCH_SEQUENCE MATCH_SEQUENCE
|
#define _MATCH_SEQUENCE MATCH_SEQUENCE
|
||||||
#define _MAYBE_EXPAND_METHOD 479
|
#define _MAYBE_EXPAND_METHOD 483
|
||||||
#define _MAYBE_EXPAND_METHOD_KW 480
|
#define _MAYBE_EXPAND_METHOD_KW 484
|
||||||
#define _MONITOR_CALL 481
|
#define _MONITOR_CALL 485
|
||||||
#define _MONITOR_CALL_KW 482
|
#define _MONITOR_CALL_KW 486
|
||||||
#define _MONITOR_JUMP_BACKWARD 483
|
#define _MONITOR_JUMP_BACKWARD 487
|
||||||
#define _MONITOR_RESUME 484
|
#define _MONITOR_RESUME 488
|
||||||
#define _NOP NOP
|
#define _NOP NOP
|
||||||
#define _POP_CALL 485
|
#define _POP_CALL 489
|
||||||
#define _POP_CALL_LOAD_CONST_INLINE_BORROW 486
|
#define _POP_CALL_LOAD_CONST_INLINE_BORROW 490
|
||||||
#define _POP_CALL_ONE 487
|
#define _POP_CALL_ONE 491
|
||||||
#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW 488
|
#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW 492
|
||||||
#define _POP_CALL_TWO 489
|
#define _POP_CALL_TWO 493
|
||||||
#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW 490
|
#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW 494
|
||||||
#define _POP_EXCEPT POP_EXCEPT
|
#define _POP_EXCEPT POP_EXCEPT
|
||||||
#define _POP_ITER POP_ITER
|
#define _POP_ITER POP_ITER
|
||||||
#define _POP_JUMP_IF_FALSE 491
|
#define _POP_JUMP_IF_FALSE 495
|
||||||
#define _POP_JUMP_IF_TRUE 492
|
#define _POP_JUMP_IF_TRUE 496
|
||||||
#define _POP_TOP POP_TOP
|
#define _POP_TOP POP_TOP
|
||||||
#define _POP_TOP_LOAD_CONST_INLINE 493
|
#define _POP_TOP_LOAD_CONST_INLINE 497
|
||||||
#define _POP_TOP_LOAD_CONST_INLINE_BORROW 494
|
#define _POP_TOP_LOAD_CONST_INLINE_BORROW 498
|
||||||
#define _POP_TWO 495
|
#define _POP_TWO 499
|
||||||
#define _POP_TWO_LOAD_CONST_INLINE_BORROW 496
|
#define _POP_TWO_LOAD_CONST_INLINE_BORROW 500
|
||||||
#define _PUSH_EXC_INFO PUSH_EXC_INFO
|
#define _PUSH_EXC_INFO PUSH_EXC_INFO
|
||||||
#define _PUSH_FRAME 497
|
#define _PUSH_FRAME 501
|
||||||
#define _PUSH_NULL PUSH_NULL
|
#define _PUSH_NULL PUSH_NULL
|
||||||
#define _PUSH_NULL_CONDITIONAL 498
|
#define _PUSH_NULL_CONDITIONAL 502
|
||||||
#define _PY_FRAME_GENERAL 499
|
#define _PY_FRAME_GENERAL 503
|
||||||
#define _PY_FRAME_KW 500
|
#define _PY_FRAME_KW 504
|
||||||
#define _QUICKEN_RESUME 501
|
#define _QUICKEN_RESUME 505
|
||||||
#define _REPLACE_WITH_TRUE 502
|
#define _REPLACE_WITH_TRUE 506
|
||||||
#define _RESUME_CHECK RESUME_CHECK
|
#define _RESUME_CHECK RESUME_CHECK
|
||||||
#define _RETURN_GENERATOR RETURN_GENERATOR
|
#define _RETURN_GENERATOR RETURN_GENERATOR
|
||||||
#define _RETURN_VALUE RETURN_VALUE
|
#define _RETURN_VALUE RETURN_VALUE
|
||||||
#define _SAVE_RETURN_OFFSET 503
|
#define _SAVE_RETURN_OFFSET 507
|
||||||
#define _SEND 504
|
#define _SEND 508
|
||||||
#define _SEND_GEN_FRAME 505
|
#define _SEND_GEN_FRAME 509
|
||||||
#define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS
|
#define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS
|
||||||
#define _SET_ADD SET_ADD
|
#define _SET_ADD SET_ADD
|
||||||
#define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE
|
#define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE
|
||||||
#define _SET_UPDATE SET_UPDATE
|
#define _SET_UPDATE SET_UPDATE
|
||||||
#define _START_EXECUTOR 506
|
#define _START_EXECUTOR 510
|
||||||
#define _STORE_ATTR 507
|
#define _STORE_ATTR 511
|
||||||
#define _STORE_ATTR_INSTANCE_VALUE 508
|
#define _STORE_ATTR_INSTANCE_VALUE 512
|
||||||
#define _STORE_ATTR_SLOT 509
|
#define _STORE_ATTR_SLOT 513
|
||||||
#define _STORE_ATTR_WITH_HINT 510
|
#define _STORE_ATTR_WITH_HINT 514
|
||||||
#define _STORE_DEREF STORE_DEREF
|
#define _STORE_DEREF STORE_DEREF
|
||||||
#define _STORE_FAST 511
|
#define _STORE_FAST 515
|
||||||
#define _STORE_FAST_0 512
|
#define _STORE_FAST_0 516
|
||||||
#define _STORE_FAST_1 513
|
#define _STORE_FAST_1 517
|
||||||
#define _STORE_FAST_2 514
|
#define _STORE_FAST_2 518
|
||||||
#define _STORE_FAST_3 515
|
#define _STORE_FAST_3 519
|
||||||
#define _STORE_FAST_4 516
|
#define _STORE_FAST_4 520
|
||||||
#define _STORE_FAST_5 517
|
#define _STORE_FAST_5 521
|
||||||
#define _STORE_FAST_6 518
|
#define _STORE_FAST_6 522
|
||||||
#define _STORE_FAST_7 519
|
#define _STORE_FAST_7 523
|
||||||
#define _STORE_FAST_LOAD_FAST STORE_FAST_LOAD_FAST
|
#define _STORE_FAST_LOAD_FAST STORE_FAST_LOAD_FAST
|
||||||
#define _STORE_FAST_STORE_FAST STORE_FAST_STORE_FAST
|
#define _STORE_FAST_STORE_FAST STORE_FAST_STORE_FAST
|
||||||
#define _STORE_GLOBAL STORE_GLOBAL
|
#define _STORE_GLOBAL STORE_GLOBAL
|
||||||
#define _STORE_NAME STORE_NAME
|
#define _STORE_NAME STORE_NAME
|
||||||
#define _STORE_SLICE 520
|
#define _STORE_SLICE 524
|
||||||
#define _STORE_SUBSCR 521
|
#define _STORE_SUBSCR 525
|
||||||
#define _STORE_SUBSCR_DICT 522
|
#define _STORE_SUBSCR_DICT 526
|
||||||
#define _STORE_SUBSCR_LIST_INT 523
|
#define _STORE_SUBSCR_LIST_INT 527
|
||||||
#define _SWAP SWAP
|
#define _SWAP 528
|
||||||
#define _TIER2_RESUME_CHECK 524
|
#define _SWAP_2 529
|
||||||
#define _TO_BOOL 525
|
#define _SWAP_3 530
|
||||||
|
#define _TIER2_RESUME_CHECK 531
|
||||||
|
#define _TO_BOOL 532
|
||||||
#define _TO_BOOL_BOOL TO_BOOL_BOOL
|
#define _TO_BOOL_BOOL TO_BOOL_BOOL
|
||||||
#define _TO_BOOL_INT TO_BOOL_INT
|
#define _TO_BOOL_INT TO_BOOL_INT
|
||||||
#define _TO_BOOL_LIST 526
|
#define _TO_BOOL_LIST 533
|
||||||
#define _TO_BOOL_NONE TO_BOOL_NONE
|
#define _TO_BOOL_NONE TO_BOOL_NONE
|
||||||
#define _TO_BOOL_STR 527
|
#define _TO_BOOL_STR 534
|
||||||
#define _UNARY_INVERT UNARY_INVERT
|
#define _UNARY_INVERT UNARY_INVERT
|
||||||
#define _UNARY_NEGATIVE UNARY_NEGATIVE
|
#define _UNARY_NEGATIVE UNARY_NEGATIVE
|
||||||
#define _UNARY_NOT UNARY_NOT
|
#define _UNARY_NOT UNARY_NOT
|
||||||
#define _UNPACK_EX UNPACK_EX
|
#define _UNPACK_EX UNPACK_EX
|
||||||
#define _UNPACK_SEQUENCE 528
|
#define _UNPACK_SEQUENCE 535
|
||||||
#define _UNPACK_SEQUENCE_LIST 529
|
#define _UNPACK_SEQUENCE_LIST 536
|
||||||
#define _UNPACK_SEQUENCE_TUPLE 530
|
#define _UNPACK_SEQUENCE_TUPLE 537
|
||||||
#define _UNPACK_SEQUENCE_TWO_TUPLE 531
|
#define _UNPACK_SEQUENCE_TWO_TUPLE 538
|
||||||
#define _WITH_EXCEPT_START WITH_EXCEPT_START
|
#define _WITH_EXCEPT_START WITH_EXCEPT_START
|
||||||
#define _YIELD_VALUE YIELD_VALUE
|
#define _YIELD_VALUE YIELD_VALUE
|
||||||
#define MAX_UOP_ID 531
|
#define MAX_UOP_ID 538
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
37
Include/internal/pycore_uop_metadata.h
generated
37
Include/internal/pycore_uop_metadata.h
generated
|
@ -12,7 +12,8 @@ extern "C" {
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "pycore_uop_ids.h"
|
#include "pycore_uop_ids.h"
|
||||||
extern const uint16_t _PyUop_Flags[MAX_UOP_ID+1];
|
extern const uint16_t _PyUop_Flags[MAX_UOP_ID+1];
|
||||||
extern const uint8_t _PyUop_Replication[MAX_UOP_ID+1];
|
typedef struct _rep_range { uint8_t start; uint8_t stop; } ReplicationRange;
|
||||||
|
extern const ReplicationRange _PyUop_Replication[MAX_UOP_ID+1];
|
||||||
extern const char * const _PyOpcode_uop_name[MAX_UOP_ID+1];
|
extern const char * const _PyOpcode_uop_name[MAX_UOP_ID+1];
|
||||||
|
|
||||||
extern int _PyUop_num_popped(int opcode, int oparg);
|
extern int _PyUop_num_popped(int opcode, int oparg);
|
||||||
|
@ -288,8 +289,13 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
|
||||||
[_CONVERT_VALUE] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
|
[_CONVERT_VALUE] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
|
||||||
[_FORMAT_SIMPLE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
|
[_FORMAT_SIMPLE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
|
||||||
[_FORMAT_WITH_SPEC] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
|
[_FORMAT_WITH_SPEC] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
|
||||||
|
[_COPY_1] = HAS_PURE_FLAG,
|
||||||
|
[_COPY_2] = HAS_PURE_FLAG,
|
||||||
|
[_COPY_3] = HAS_PURE_FLAG,
|
||||||
[_COPY] = HAS_ARG_FLAG | HAS_PURE_FLAG,
|
[_COPY] = HAS_ARG_FLAG | HAS_PURE_FLAG,
|
||||||
[_BINARY_OP] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG,
|
[_BINARY_OP] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG,
|
||||||
|
[_SWAP_2] = HAS_PURE_FLAG,
|
||||||
|
[_SWAP_3] = HAS_PURE_FLAG,
|
||||||
[_SWAP] = HAS_ARG_FLAG | HAS_PURE_FLAG,
|
[_SWAP] = HAS_ARG_FLAG | HAS_PURE_FLAG,
|
||||||
[_GUARD_IS_TRUE_POP] = HAS_EXIT_FLAG,
|
[_GUARD_IS_TRUE_POP] = HAS_EXIT_FLAG,
|
||||||
[_GUARD_IS_FALSE_POP] = HAS_EXIT_FLAG,
|
[_GUARD_IS_FALSE_POP] = HAS_EXIT_FLAG,
|
||||||
|
@ -323,12 +329,14 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
|
||||||
[_TIER2_RESUME_CHECK] = HAS_DEOPT_FLAG,
|
[_TIER2_RESUME_CHECK] = HAS_DEOPT_FLAG,
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint8_t _PyUop_Replication[MAX_UOP_ID+1] = {
|
const ReplicationRange _PyUop_Replication[MAX_UOP_ID+1] = {
|
||||||
[_LOAD_FAST] = 8,
|
[_LOAD_FAST] = { 0, 8 },
|
||||||
[_LOAD_FAST_BORROW] = 8,
|
[_LOAD_FAST_BORROW] = { 0, 8 },
|
||||||
[_LOAD_SMALL_INT] = 4,
|
[_LOAD_SMALL_INT] = { 0, 4 },
|
||||||
[_STORE_FAST] = 8,
|
[_STORE_FAST] = { 0, 8 },
|
||||||
[_INIT_CALL_PY_EXACT_ARGS] = 5,
|
[_INIT_CALL_PY_EXACT_ARGS] = { 0, 5 },
|
||||||
|
[_COPY] = { 1, 4 },
|
||||||
|
[_SWAP] = { 2, 4 },
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {
|
const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {
|
||||||
|
@ -408,6 +416,9 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {
|
||||||
[_CONTAINS_OP_SET] = "_CONTAINS_OP_SET",
|
[_CONTAINS_OP_SET] = "_CONTAINS_OP_SET",
|
||||||
[_CONVERT_VALUE] = "_CONVERT_VALUE",
|
[_CONVERT_VALUE] = "_CONVERT_VALUE",
|
||||||
[_COPY] = "_COPY",
|
[_COPY] = "_COPY",
|
||||||
|
[_COPY_1] = "_COPY_1",
|
||||||
|
[_COPY_2] = "_COPY_2",
|
||||||
|
[_COPY_3] = "_COPY_3",
|
||||||
[_COPY_FREE_VARS] = "_COPY_FREE_VARS",
|
[_COPY_FREE_VARS] = "_COPY_FREE_VARS",
|
||||||
[_CREATE_INIT_FRAME] = "_CREATE_INIT_FRAME",
|
[_CREATE_INIT_FRAME] = "_CREATE_INIT_FRAME",
|
||||||
[_DELETE_ATTR] = "_DELETE_ATTR",
|
[_DELETE_ATTR] = "_DELETE_ATTR",
|
||||||
|
@ -617,6 +628,8 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {
|
||||||
[_STORE_SUBSCR_DICT] = "_STORE_SUBSCR_DICT",
|
[_STORE_SUBSCR_DICT] = "_STORE_SUBSCR_DICT",
|
||||||
[_STORE_SUBSCR_LIST_INT] = "_STORE_SUBSCR_LIST_INT",
|
[_STORE_SUBSCR_LIST_INT] = "_STORE_SUBSCR_LIST_INT",
|
||||||
[_SWAP] = "_SWAP",
|
[_SWAP] = "_SWAP",
|
||||||
|
[_SWAP_2] = "_SWAP_2",
|
||||||
|
[_SWAP_3] = "_SWAP_3",
|
||||||
[_TIER2_RESUME_CHECK] = "_TIER2_RESUME_CHECK",
|
[_TIER2_RESUME_CHECK] = "_TIER2_RESUME_CHECK",
|
||||||
[_TO_BOOL] = "_TO_BOOL",
|
[_TO_BOOL] = "_TO_BOOL",
|
||||||
[_TO_BOOL_BOOL] = "_TO_BOOL_BOOL",
|
[_TO_BOOL_BOOL] = "_TO_BOOL_BOOL",
|
||||||
|
@ -1176,10 +1189,20 @@ int _PyUop_num_popped(int opcode, int oparg)
|
||||||
return 1;
|
return 1;
|
||||||
case _FORMAT_WITH_SPEC:
|
case _FORMAT_WITH_SPEC:
|
||||||
return 2;
|
return 2;
|
||||||
|
case _COPY_1:
|
||||||
|
return 0;
|
||||||
|
case _COPY_2:
|
||||||
|
return 0;
|
||||||
|
case _COPY_3:
|
||||||
|
return 0;
|
||||||
case _COPY:
|
case _COPY:
|
||||||
return 0;
|
return 0;
|
||||||
case _BINARY_OP:
|
case _BINARY_OP:
|
||||||
return 2;
|
return 2;
|
||||||
|
case _SWAP_2:
|
||||||
|
return 0;
|
||||||
|
case _SWAP_3:
|
||||||
|
return 0;
|
||||||
case _SWAP:
|
case _SWAP:
|
||||||
return 0;
|
return 0;
|
||||||
case _GUARD_IS_TRUE_POP:
|
case _GUARD_IS_TRUE_POP:
|
||||||
|
|
|
@ -4946,8 +4946,7 @@ dummy_func(
|
||||||
res = PyStackRef_FromPyObjectSteal(res_o);
|
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||||
}
|
}
|
||||||
|
|
||||||
pure inst(COPY, (bottom, unused[oparg-1] -- bottom, unused[oparg-1], top)) {
|
pure replicate(1:4) inst(COPY, (bottom, unused[oparg-1] -- bottom, unused[oparg-1], top)) {
|
||||||
assert(oparg > 0);
|
|
||||||
top = PyStackRef_DUP(bottom);
|
top = PyStackRef_DUP(bottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4980,12 +4979,11 @@ dummy_func(
|
||||||
|
|
||||||
macro(BINARY_OP) = _SPECIALIZE_BINARY_OP + unused/4 + _BINARY_OP;
|
macro(BINARY_OP) = _SPECIALIZE_BINARY_OP + unused/4 + _BINARY_OP;
|
||||||
|
|
||||||
pure inst(SWAP, (bottom, unused[oparg-2], top --
|
pure replicate(2:4) inst(SWAP, (bottom, unused[oparg-2], top --
|
||||||
bottom, unused[oparg-2], top)) {
|
bottom, unused[oparg-2], top)) {
|
||||||
_PyStackRef temp = bottom;
|
_PyStackRef temp = bottom;
|
||||||
bottom = top;
|
bottom = top;
|
||||||
top = temp;
|
top = temp;
|
||||||
assert(oparg >= 2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inst(INSTRUMENTED_LINE, ( -- )) {
|
inst(INSTRUMENTED_LINE, ( -- )) {
|
||||||
|
|
61
Python/executor_cases.c.h
generated
61
Python/executor_cases.c.h
generated
|
@ -6763,12 +6763,44 @@
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case _COPY_1: {
|
||||||
|
_PyStackRef bottom;
|
||||||
|
_PyStackRef top;
|
||||||
|
bottom = stack_pointer[-1];
|
||||||
|
top = PyStackRef_DUP(bottom);
|
||||||
|
stack_pointer[0] = top;
|
||||||
|
stack_pointer += 1;
|
||||||
|
assert(WITHIN_STACK_BOUNDS());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case _COPY_2: {
|
||||||
|
_PyStackRef bottom;
|
||||||
|
_PyStackRef top;
|
||||||
|
bottom = stack_pointer[-2];
|
||||||
|
top = PyStackRef_DUP(bottom);
|
||||||
|
stack_pointer[0] = top;
|
||||||
|
stack_pointer += 1;
|
||||||
|
assert(WITHIN_STACK_BOUNDS());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case _COPY_3: {
|
||||||
|
_PyStackRef bottom;
|
||||||
|
_PyStackRef top;
|
||||||
|
bottom = stack_pointer[-3];
|
||||||
|
top = PyStackRef_DUP(bottom);
|
||||||
|
stack_pointer[0] = top;
|
||||||
|
stack_pointer += 1;
|
||||||
|
assert(WITHIN_STACK_BOUNDS());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case _COPY: {
|
case _COPY: {
|
||||||
_PyStackRef bottom;
|
_PyStackRef bottom;
|
||||||
_PyStackRef top;
|
_PyStackRef top;
|
||||||
oparg = CURRENT_OPARG();
|
oparg = CURRENT_OPARG();
|
||||||
bottom = stack_pointer[-1 - (oparg-1)];
|
bottom = stack_pointer[-1 - (oparg-1)];
|
||||||
assert(oparg > 0);
|
|
||||||
top = PyStackRef_DUP(bottom);
|
top = PyStackRef_DUP(bottom);
|
||||||
stack_pointer[0] = top;
|
stack_pointer[0] = top;
|
||||||
stack_pointer += 1;
|
stack_pointer += 1;
|
||||||
|
@ -6808,6 +6840,32 @@
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case _SWAP_2: {
|
||||||
|
_PyStackRef top;
|
||||||
|
_PyStackRef bottom;
|
||||||
|
top = stack_pointer[-1];
|
||||||
|
bottom = stack_pointer[-2];
|
||||||
|
_PyStackRef temp = bottom;
|
||||||
|
bottom = top;
|
||||||
|
top = temp;
|
||||||
|
stack_pointer[-2] = bottom;
|
||||||
|
stack_pointer[-1] = top;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case _SWAP_3: {
|
||||||
|
_PyStackRef top;
|
||||||
|
_PyStackRef bottom;
|
||||||
|
top = stack_pointer[-1];
|
||||||
|
bottom = stack_pointer[-3];
|
||||||
|
_PyStackRef temp = bottom;
|
||||||
|
bottom = top;
|
||||||
|
top = temp;
|
||||||
|
stack_pointer[-3] = bottom;
|
||||||
|
stack_pointer[-1] = top;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case _SWAP: {
|
case _SWAP: {
|
||||||
_PyStackRef top;
|
_PyStackRef top;
|
||||||
_PyStackRef bottom;
|
_PyStackRef bottom;
|
||||||
|
@ -6817,7 +6875,6 @@
|
||||||
_PyStackRef temp = bottom;
|
_PyStackRef temp = bottom;
|
||||||
bottom = top;
|
bottom = top;
|
||||||
top = temp;
|
top = temp;
|
||||||
assert(oparg >= 2);
|
|
||||||
stack_pointer[-2 - (oparg-2)] = bottom;
|
stack_pointer[-2 - (oparg-2)] = bottom;
|
||||||
stack_pointer[-1] = top;
|
stack_pointer[-1] = top;
|
||||||
break;
|
break;
|
||||||
|
|
2
Python/generated_cases.c.h
generated
2
Python/generated_cases.c.h
generated
|
@ -5228,7 +5228,6 @@
|
||||||
_PyStackRef bottom;
|
_PyStackRef bottom;
|
||||||
_PyStackRef top;
|
_PyStackRef top;
|
||||||
bottom = stack_pointer[-1 - (oparg-1)];
|
bottom = stack_pointer[-1 - (oparg-1)];
|
||||||
assert(oparg > 0);
|
|
||||||
top = PyStackRef_DUP(bottom);
|
top = PyStackRef_DUP(bottom);
|
||||||
stack_pointer[0] = top;
|
stack_pointer[0] = top;
|
||||||
stack_pointer += 1;
|
stack_pointer += 1;
|
||||||
|
@ -11568,7 +11567,6 @@
|
||||||
_PyStackRef temp = bottom;
|
_PyStackRef temp = bottom;
|
||||||
bottom = top;
|
bottom = top;
|
||||||
top = temp;
|
top = temp;
|
||||||
assert(oparg >= 2);
|
|
||||||
stack_pointer[-2 - (oparg-2)] = bottom;
|
stack_pointer[-2 - (oparg-2)] = bottom;
|
||||||
stack_pointer[-1] = top;
|
stack_pointer[-1] = top;
|
||||||
DISPATCH();
|
DISPATCH();
|
||||||
|
|
|
@ -1292,8 +1292,8 @@ uop_optimize(
|
||||||
for (int pc = 0; pc < length; pc++) {
|
for (int pc = 0; pc < length; pc++) {
|
||||||
int opcode = buffer[pc].opcode;
|
int opcode = buffer[pc].opcode;
|
||||||
int oparg = buffer[pc].oparg;
|
int oparg = buffer[pc].oparg;
|
||||||
if (oparg < _PyUop_Replication[opcode]) {
|
if (oparg < _PyUop_Replication[opcode].stop && oparg >= _PyUop_Replication[opcode].start) {
|
||||||
buffer[pc].opcode = opcode + oparg + 1;
|
buffer[pc].opcode = opcode + oparg + 1 - _PyUop_Replication[opcode].start;
|
||||||
assert(strncmp(_PyOpcode_uop_name[buffer[pc].opcode], _PyOpcode_uop_name[opcode], strlen(_PyOpcode_uop_name[opcode])) == 0);
|
assert(strncmp(_PyOpcode_uop_name[buffer[pc].opcode], _PyOpcode_uop_name[opcode], strlen(_PyOpcode_uop_name[opcode])) == 0);
|
||||||
}
|
}
|
||||||
else if (is_terminator(&buffer[pc])) {
|
else if (is_terminator(&buffer[pc])) {
|
||||||
|
|
|
@ -180,7 +180,7 @@ class Uop:
|
||||||
properties: Properties
|
properties: Properties
|
||||||
_size: int = -1
|
_size: int = -1
|
||||||
implicitly_created: bool = False
|
implicitly_created: bool = False
|
||||||
replicated = 0
|
replicated = range(0)
|
||||||
replicates: "Uop | None" = None
|
replicates: "Uop | None" = None
|
||||||
# Size of the instruction(s), only set for uops containing the INSTRUCTION_SIZE macro
|
# Size of the instruction(s), only set for uops containing the INSTRUCTION_SIZE macro
|
||||||
instruction_size: int | None = None
|
instruction_size: int | None = None
|
||||||
|
@ -868,6 +868,28 @@ def compute_properties(op: parser.CodeDef) -> Properties:
|
||||||
needs_prev=variable_used(op, "prev_instr"),
|
needs_prev=variable_used(op, "prev_instr"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def expand(items: list[StackItem], oparg: int) -> list[StackItem]:
|
||||||
|
# Only replace array item with scalar if no more than one item is an array
|
||||||
|
index = -1
|
||||||
|
for i, item in enumerate(items):
|
||||||
|
if "oparg" in item.size:
|
||||||
|
if index >= 0:
|
||||||
|
return items
|
||||||
|
index = i
|
||||||
|
if index < 0:
|
||||||
|
return items
|
||||||
|
try:
|
||||||
|
count = int(eval(items[index].size.replace("oparg", str(oparg))))
|
||||||
|
except ValueError:
|
||||||
|
return items
|
||||||
|
return items[:index] + [
|
||||||
|
StackItem(items[index].name + f"_{i}", "", items[index].peek, items[index].used) for i in range(count)
|
||||||
|
] + items[index+1:]
|
||||||
|
|
||||||
|
def scalarize_stack(stack: StackEffect, oparg: int) -> StackEffect:
|
||||||
|
stack.inputs = expand(stack.inputs, oparg)
|
||||||
|
stack.outputs = expand(stack.outputs, oparg)
|
||||||
|
return stack
|
||||||
|
|
||||||
def make_uop(
|
def make_uop(
|
||||||
name: str,
|
name: str,
|
||||||
|
@ -887,20 +909,26 @@ def make_uop(
|
||||||
)
|
)
|
||||||
for anno in op.annotations:
|
for anno in op.annotations:
|
||||||
if anno.startswith("replicate"):
|
if anno.startswith("replicate"):
|
||||||
result.replicated = int(anno[10:-1])
|
text = anno[10:-1]
|
||||||
|
start, stop = text.split(":")
|
||||||
|
result.replicated = range(int(start), int(stop))
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
return result
|
return result
|
||||||
for oparg in range(result.replicated):
|
for oparg in result.replicated:
|
||||||
name_x = name + "_" + str(oparg)
|
name_x = name + "_" + str(oparg)
|
||||||
properties = compute_properties(op)
|
properties = compute_properties(op)
|
||||||
properties.oparg = False
|
properties.oparg = False
|
||||||
properties.const_oparg = oparg
|
stack = analyze_stack(op)
|
||||||
|
if not variable_used(op, "oparg"):
|
||||||
|
stack = scalarize_stack(stack, oparg)
|
||||||
|
else:
|
||||||
|
properties.const_oparg = oparg
|
||||||
rep = Uop(
|
rep = Uop(
|
||||||
name=name_x,
|
name=name_x,
|
||||||
context=op.context,
|
context=op.context,
|
||||||
annotations=op.annotations,
|
annotations=op.annotations,
|
||||||
stack=analyze_stack(op),
|
stack=stack,
|
||||||
caches=analyze_caches(inputs),
|
caches=analyze_caches(inputs),
|
||||||
local_stores=find_variable_stores(op),
|
local_stores=find_variable_stores(op),
|
||||||
body=op.block,
|
body=op.block,
|
||||||
|
|
|
@ -379,9 +379,13 @@ class Parser(PLexer):
|
||||||
while anno := self.expect(lx.ANNOTATION):
|
while anno := self.expect(lx.ANNOTATION):
|
||||||
if anno.text == "replicate":
|
if anno.text == "replicate":
|
||||||
self.require(lx.LPAREN)
|
self.require(lx.LPAREN)
|
||||||
times = self.require(lx.NUMBER)
|
stop = self.require(lx.NUMBER)
|
||||||
|
start_text = "0"
|
||||||
|
if self.expect(lx.COLON):
|
||||||
|
start_text = stop.text
|
||||||
|
stop = self.require(lx.NUMBER)
|
||||||
self.require(lx.RPAREN)
|
self.require(lx.RPAREN)
|
||||||
annotations.append(f"replicate({times.text})")
|
annotations.append(f"replicate({start_text}:{stop.text})")
|
||||||
else:
|
else:
|
||||||
annotations.append(anno.text)
|
annotations.append(anno.text)
|
||||||
tkn = self.expect(lx.INST)
|
tkn = self.expect(lx.INST)
|
||||||
|
|
|
@ -24,7 +24,8 @@ DEFAULT_OUTPUT = ROOT / "Include/internal/pycore_uop_metadata.h"
|
||||||
|
|
||||||
def generate_names_and_flags(analysis: Analysis, out: CWriter) -> None:
|
def generate_names_and_flags(analysis: Analysis, out: CWriter) -> None:
|
||||||
out.emit("extern const uint16_t _PyUop_Flags[MAX_UOP_ID+1];\n")
|
out.emit("extern const uint16_t _PyUop_Flags[MAX_UOP_ID+1];\n")
|
||||||
out.emit("extern const uint8_t _PyUop_Replication[MAX_UOP_ID+1];\n")
|
out.emit("typedef struct _rep_range { uint8_t start; uint8_t stop; } ReplicationRange;\n")
|
||||||
|
out.emit("extern const ReplicationRange _PyUop_Replication[MAX_UOP_ID+1];\n")
|
||||||
out.emit("extern const char * const _PyOpcode_uop_name[MAX_UOP_ID+1];\n\n")
|
out.emit("extern const char * const _PyOpcode_uop_name[MAX_UOP_ID+1];\n\n")
|
||||||
out.emit("extern int _PyUop_num_popped(int opcode, int oparg);\n\n")
|
out.emit("extern int _PyUop_num_popped(int opcode, int oparg);\n\n")
|
||||||
out.emit("#ifdef NEED_OPCODE_METADATA\n")
|
out.emit("#ifdef NEED_OPCODE_METADATA\n")
|
||||||
|
@ -34,10 +35,11 @@ def generate_names_and_flags(analysis: Analysis, out: CWriter) -> None:
|
||||||
out.emit(f"[{uop.name}] = {cflags(uop.properties)},\n")
|
out.emit(f"[{uop.name}] = {cflags(uop.properties)},\n")
|
||||||
|
|
||||||
out.emit("};\n\n")
|
out.emit("};\n\n")
|
||||||
out.emit("const uint8_t _PyUop_Replication[MAX_UOP_ID+1] = {\n")
|
out.emit("const ReplicationRange _PyUop_Replication[MAX_UOP_ID+1] = {\n")
|
||||||
for uop in analysis.uops.values():
|
for uop in analysis.uops.values():
|
||||||
if uop.replicated:
|
if uop.replicated:
|
||||||
out.emit(f"[{uop.name}] = {uop.replicated},\n")
|
assert(uop.replicated.step == 1)
|
||||||
|
out.emit(f"[{uop.name}] = {{ {uop.replicated.start}, {uop.replicated.stop} }},\n")
|
||||||
|
|
||||||
out.emit("};\n\n")
|
out.emit("};\n\n")
|
||||||
out.emit("const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {\n")
|
out.emit("const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {\n")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue