Diff
checker
텍스트
텍스트
이미지
문서
Excel
폴더
Legal
Enterprise
데스크톱
요금제
로그인
데스크톱 앱 다운로드
텍스트 비교
두 텍스트 파일의 차이점을 찾아보세요
도구
기록
실시간 편집
변경 없는 행 숨기기
줄바꿈 비활성화
레이아웃
나란히 보기
합쳐 보기
비교 단위
스마트
단어
글자
구문 강조
언어 선택
제외
텍스트 변환
첫 변경으로
수정
Diffchecker Desktop
가장 안전하게 Diffchecker를 사용하는 방법. 데스크톱 앱을 사용하면 비교 데이터가 외부로 전송되지 않습니다!
데스크톱 앱 받기
Untitled diff
생성일
2년 전
비교 결과 만료 없음
초기화
내보내기
공유
설명
2 삭제
행
총
삭제
글자
총
삭제
이 기능을 계속 사용하려면 업그레이드해 주세요
Diff
checker
Pro
요금제 보기
69 행
복사
35 추가
행
총
추가
글자
총
추가
이 기능을 계속 사용하려면 업그레이드해 주세요
Diff
checker
Pro
요금제 보기
89 행
복사
복사
복사됨
복사
복사됨
LEAF_ENTRY RhpByRefAssignRef
, _TEXT
LEAF_ENTRY RhpByRefAssignRef
Batch
, _TEXT
ALTERNATE_ENTRY RhpByRefAssignRef
AVLocation1
LOCAL_LABEL(RhpByRefAssignRefBatch_NextByref):
ALTERNATE_ENTRY RhpByRefAssignRef
Batch
AVLocation1
mov rcx, [rsi]
mov rcx, [rsi]
복사
복사됨
복사
복사됨
ALTERNATE_ENTRY RhpByRefAssignRef
AVLocation2
ALTERNATE_ENTRY RhpByRefAssignRef
Batch
AVLocation2
mov [rdi], rcx
mov [rdi], rcx
// Check whether the writes were even into the heap. If not there's no card update required.
// Check whether the writes were even into the heap. If not there's no card update required.
cmp rdi, [C_VAR(g_lowest_address)]
cmp rdi, [C_VAR(g_lowest_address)]
복사
복사됨
복사
복사됨
jb LOCAL_LABEL(RhpByRefAssignRef
_NoBarrierRequired
)
jb LOCAL_LABEL(RhpByRefAssignRef
Batch_NotInHeap
)
cmp rdi, [C_VAR(g_highest_address)]
cmp rdi, [C_VAR(g_highest_address)]
복사
복사됨
복사
복사됨
jae LOCAL_LABEL(RhpByRefAssignRef
_NoBarrierRequired
)
jae LOCAL_LABEL(RhpByRefAssignRef
Batch_NotInHeap
)
// Update the shadow copy of the heap with the same value just written to the same heap. (A no-op unless
// Update the shadow copy of the heap with the same value just written to the same heap. (A no-op unless
// we're in a debug build and write barrier checking has been enabled).
// we're in a debug build and write barrier checking has been enabled).
UPDATE_GC_SHADOW BASENAME, rcx, rdi
UPDATE_GC_SHADOW BASENAME, rcx, rdi
#ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
#ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
mov r11, [C_VAR(g_write_watch_table)]
mov r11, [C_VAR(g_write_watch_table)]
cmp r11, 0x0
cmp r11, 0x0
복사
복사됨
복사
복사됨
je LOCAL_LABEL(RhpByRefAssignRef
_CheckCardTable)
je LOCAL_LABEL(RhpByRefAssignRef
Batch
_CheckCardTable)
mov r10, rdi
mov r10, rdi
shr r10, 0xC // SoftwareWriteWatch::AddressToTableByteIndexShift
shr r10, 0xC // SoftwareWriteWatch::AddressToTableByteIndexShift
add r10, r11
add r10, r11
cmp byte ptr [r10], 0x0
cmp byte ptr [r10], 0x0
복사
복사됨
복사
복사됨
jne LOCAL_LABEL(RhpByRefAssignRef
_CheckCardTable)
jne LOCAL_LABEL(RhpByRefAssignRef
Batch
_CheckCardTable)
mov byte ptr [r10], 0xFF
mov byte ptr [r10], 0xFF
#endif
#endif
복사
복사됨
복사
복사됨
LOCAL_LABEL(RhpByRefAssignRef
_CheckCardTable):
LOCAL_LABEL(RhpByRefAssignRef
Batch
_CheckCardTable):
// If the reference is to an object that's not in an ephemeral generation we have no need to track it
// If the reference is to an object that's not in an ephemeral generation we have no need to track it
// (since the object won't be collected or moved by an ephemeral collection).
// (since the object won't be collected or moved by an ephemeral collection).
cmp rcx, [C_VAR(g_ephemeral_low)]
cmp rcx, [C_VAR(g_ephemeral_low)]
복사
복사됨
복사
복사됨
jb LOCAL_LABEL(RhpByRefAssignRef
_NoBarrierRequired)
jb LOCAL_LABEL(RhpByRefAssignRef
Batch
_NoBarrierRequired)
cmp rcx, [C_VAR(g_ephemeral_high)]
cmp rcx, [C_VAR(g_ephemeral_high)]
복사
복사됨
복사
복사됨
jae LOCAL_LABEL(RhpByRefAssignRef
_NoBarrierRequired)
jae LOCAL_LABEL(RhpByRefAssignRef
Batch
_NoBarrierRequired)
// move current rdi value into rcx, we need to keep rdi and eventually increment by 8
// move current rdi value into rcx, we need to keep rdi and eventually increment by 8
mov rcx, rdi
mov rcx, rdi
// We have a location on the GC heap being updated with a reference to an ephemeral object so we must
// We have a location on the GC heap being updated with a reference to an ephemeral object so we must
// track this write. The location address is translated into an offset in the card table bitmap. We set
// track this write. The location address is translated into an offset in the card table bitmap. We set
// an entire byte in the card table since it's quicker than messing around with bitmasks and we only write
// an entire byte in the card table since it's quicker than messing around with bitmasks and we only write
// the byte if it hasn't already been done since writes are expensive and impact scaling.
// the byte if it hasn't already been done since writes are expensive and impact scaling.
shr rcx, 0x0B
shr rcx, 0x0B
mov r10, [C_VAR(g_card_table)]
mov r10, [C_VAR(g_card_table)]
cmp byte ptr [rcx + r10], 0x0FF
cmp byte ptr [rcx + r10], 0x0FF
복사
복사됨
복사
복사됨
je LOCAL_LABEL(RhpByRefAssignRef
_NoBarrierRequired)
je LOCAL_LABEL(RhpByRefAssignRef
Batch
_NoBarrierRequired)
// We get here if it's necessary to update the card table.
// We get here if it's necessary to update the card table.
mov byte ptr [rcx + r10], 0xFF
mov byte ptr [rcx + r10], 0xFF
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
// Shift rcx by 0x0A more to get the card bundle byte (we shifted by 0x0B already)
// Shift rcx by 0x0A more to get the card bundle byte (we shifted by 0x0B already)
shr rcx, 0x0A
shr rcx, 0x0A
add rcx, [C_VAR(g_card_bundle_table)]
add rcx, [C_VAR(g_card_bundle_table)]
cmp byte ptr [rcx], 0xFF
cmp byte ptr [rcx], 0xFF
복사
복사됨
복사
복사됨
je LOCAL_LABEL(RhpByRefAssignRef
_NoBarrierRequired)
je LOCAL_LABEL(RhpByRefAssignRef
Batch
_NoBarrierRequired)
mov byte ptr [rcx], 0xFF
mov byte ptr [rcx], 0xFF
#endif
#endif
복사
복사됨
복사
복사됨
LOCAL_LABEL(RhpByRefAssignRef
_NoBarrierRequired):
LOCAL_LABEL(RhpByRefAssignRef
Batch_NotInHeap):
// At least one write is already done, increment the pointers
add rdi, 0x8
add rsi, 0x8
dec r8d
je LOCAL_LABEL(RhpByRefAssignRefBatch_NotInHeapExit)
// Now we can do the rest of the writes without checking the heap
LOCAL_LABEL(RhpByRefAssignRefBatch_NextByrefUnchecked):
mov rcx, [rsi]
mov [rdi], rcx
add rdi, 0x8
add rsi, 0x8
dec r8d
jne LOCAL_LABEL(RhpByRefAssignRefBatch_NextByrefUnchecked)
LOCAL_LABEL(RhpByRefAssignRefBatch_NotInHeapExit):
ret
LOCAL_LABEL(RhpByRefAssignRefBatch
_NoBarrierRequired):
// Increment the pointers before leaving
// Increment the pointers before leaving
add rdi, 0x8
add rdi, 0x8
add rsi, 0x8
add rsi, 0x8
복사
복사됨
복사
복사됨
dec r8d
jne LOCAL_LABEL(RhpByRefAssignRefBatch_NextByref)
ret
ret
복사
복사됨
복사
복사됨
LEAF_END RhpByRefAssignRef
, _TEXT
LEAF_END RhpByRefAssignRef
Batch
, _TEXT
저장된 비교 결과
원본
파일 열기
LEAF_ENTRY RhpByRefAssignRef, _TEXT ALTERNATE_ENTRY RhpByRefAssignRefAVLocation1 mov rcx, [rsi] ALTERNATE_ENTRY RhpByRefAssignRefAVLocation2 mov [rdi], rcx // Check whether the writes were even into the heap. If not there's no card update required. cmp rdi, [C_VAR(g_lowest_address)] jb LOCAL_LABEL(RhpByRefAssignRef_NoBarrierRequired) cmp rdi, [C_VAR(g_highest_address)] jae LOCAL_LABEL(RhpByRefAssignRef_NoBarrierRequired) // Update the shadow copy of the heap with the same value just written to the same heap. (A no-op unless // we're in a debug build and write barrier checking has been enabled). UPDATE_GC_SHADOW BASENAME, rcx, rdi #ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP mov r11, [C_VAR(g_write_watch_table)] cmp r11, 0x0 je LOCAL_LABEL(RhpByRefAssignRef_CheckCardTable) mov r10, rdi shr r10, 0xC // SoftwareWriteWatch::AddressToTableByteIndexShift add r10, r11 cmp byte ptr [r10], 0x0 jne LOCAL_LABEL(RhpByRefAssignRef_CheckCardTable) mov byte ptr [r10], 0xFF #endif LOCAL_LABEL(RhpByRefAssignRef_CheckCardTable): // If the reference is to an object that's not in an ephemeral generation we have no need to track it // (since the object won't be collected or moved by an ephemeral collection). cmp rcx, [C_VAR(g_ephemeral_low)] jb LOCAL_LABEL(RhpByRefAssignRef_NoBarrierRequired) cmp rcx, [C_VAR(g_ephemeral_high)] jae LOCAL_LABEL(RhpByRefAssignRef_NoBarrierRequired) // move current rdi value into rcx, we need to keep rdi and eventually increment by 8 mov rcx, rdi // We have a location on the GC heap being updated with a reference to an ephemeral object so we must // track this write. The location address is translated into an offset in the card table bitmap. We set // an entire byte in the card table since it's quicker than messing around with bitmasks and we only write // the byte if it hasn't already been done since writes are expensive and impact scaling. shr rcx, 0x0B mov r10, [C_VAR(g_card_table)] cmp byte ptr [rcx + r10], 0x0FF je LOCAL_LABEL(RhpByRefAssignRef_NoBarrierRequired) // We get here if it's necessary to update the card table. mov byte ptr [rcx + r10], 0xFF #ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES // Shift rcx by 0x0A more to get the card bundle byte (we shifted by 0x0B already) shr rcx, 0x0A add rcx, [C_VAR(g_card_bundle_table)] cmp byte ptr [rcx], 0xFF je LOCAL_LABEL(RhpByRefAssignRef_NoBarrierRequired) mov byte ptr [rcx], 0xFF #endif LOCAL_LABEL(RhpByRefAssignRef_NoBarrierRequired): // Increment the pointers before leaving add rdi, 0x8 add rsi, 0x8 ret LEAF_END RhpByRefAssignRef, _TEXT
수정본
파일 열기
LEAF_ENTRY RhpByRefAssignRefBatch, _TEXT LOCAL_LABEL(RhpByRefAssignRefBatch_NextByref): ALTERNATE_ENTRY RhpByRefAssignRefBatchAVLocation1 mov rcx, [rsi] ALTERNATE_ENTRY RhpByRefAssignRefBatchAVLocation2 mov [rdi], rcx // Check whether the writes were even into the heap. If not there's no card update required. cmp rdi, [C_VAR(g_lowest_address)] jb LOCAL_LABEL(RhpByRefAssignRefBatch_NotInHeap) cmp rdi, [C_VAR(g_highest_address)] jae LOCAL_LABEL(RhpByRefAssignRefBatch_NotInHeap) // Update the shadow copy of the heap with the same value just written to the same heap. (A no-op unless // we're in a debug build and write barrier checking has been enabled). UPDATE_GC_SHADOW BASENAME, rcx, rdi #ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP mov r11, [C_VAR(g_write_watch_table)] cmp r11, 0x0 je LOCAL_LABEL(RhpByRefAssignRefBatch_CheckCardTable) mov r10, rdi shr r10, 0xC // SoftwareWriteWatch::AddressToTableByteIndexShift add r10, r11 cmp byte ptr [r10], 0x0 jne LOCAL_LABEL(RhpByRefAssignRefBatch_CheckCardTable) mov byte ptr [r10], 0xFF #endif LOCAL_LABEL(RhpByRefAssignRefBatch_CheckCardTable): // If the reference is to an object that's not in an ephemeral generation we have no need to track it // (since the object won't be collected or moved by an ephemeral collection). cmp rcx, [C_VAR(g_ephemeral_low)] jb LOCAL_LABEL(RhpByRefAssignRefBatch_NoBarrierRequired) cmp rcx, [C_VAR(g_ephemeral_high)] jae LOCAL_LABEL(RhpByRefAssignRefBatch_NoBarrierRequired) // move current rdi value into rcx, we need to keep rdi and eventually increment by 8 mov rcx, rdi // We have a location on the GC heap being updated with a reference to an ephemeral object so we must // track this write. The location address is translated into an offset in the card table bitmap. We set // an entire byte in the card table since it's quicker than messing around with bitmasks and we only write // the byte if it hasn't already been done since writes are expensive and impact scaling. shr rcx, 0x0B mov r10, [C_VAR(g_card_table)] cmp byte ptr [rcx + r10], 0x0FF je LOCAL_LABEL(RhpByRefAssignRefBatch_NoBarrierRequired) // We get here if it's necessary to update the card table. mov byte ptr [rcx + r10], 0xFF #ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES // Shift rcx by 0x0A more to get the card bundle byte (we shifted by 0x0B already) shr rcx, 0x0A add rcx, [C_VAR(g_card_bundle_table)] cmp byte ptr [rcx], 0xFF je LOCAL_LABEL(RhpByRefAssignRefBatch_NoBarrierRequired) mov byte ptr [rcx], 0xFF #endif LOCAL_LABEL(RhpByRefAssignRefBatch_NotInHeap): // At least one write is already done, increment the pointers add rdi, 0x8 add rsi, 0x8 dec r8d je LOCAL_LABEL(RhpByRefAssignRefBatch_NotInHeapExit) // Now we can do the rest of the writes without checking the heap LOCAL_LABEL(RhpByRefAssignRefBatch_NextByrefUnchecked): mov rcx, [rsi] mov [rdi], rcx add rdi, 0x8 add rsi, 0x8 dec r8d jne LOCAL_LABEL(RhpByRefAssignRefBatch_NextByrefUnchecked) LOCAL_LABEL(RhpByRefAssignRefBatch_NotInHeapExit): ret LOCAL_LABEL(RhpByRefAssignRefBatch_NoBarrierRequired): // Increment the pointers before leaving add rdi, 0x8 add rsi, 0x8 dec r8d jne LOCAL_LABEL(RhpByRefAssignRefBatch_NextByref) ret LEAF_END RhpByRefAssignRefBatch, _TEXT
비교하기