Diff
checker
텍스트
텍스트
이미지
문서
Excel
폴더
Legal
Enterprise
데스크톱
요금제
로그인
데스크톱 앱 다운로드
텍스트 비교
두 텍스트 파일의 차이점을 찾아보세요
도구
기록
실시간 편집
변경 없는 행 숨기기
줄바꿈 비활성화
레이아웃
나란히 보기
합쳐 보기
비교 단위
스마트
단어
글자
구문 강조
언어 선택
제외
텍스트 변환
첫 변경으로
수정
Diffchecker Desktop
가장 안전하게 Diffchecker를 사용하는 방법. 데스크톱 앱을 사용하면 비교 데이터가 외부로 전송되지 않습니다!
데스크톱 앱 받기
Untitled diff
생성일
2년 전
비교 결과 만료 없음
초기화
내보내기
공유
설명
2 삭제
행
총
삭제
글자
총
삭제
이 기능을 계속 사용하려면 업그레이드해 주세요
Diff
checker
Pro
요금제 보기
69 행
복사
36 추가
행
총
추가
글자
총
추가
이 기능을 계속 사용하려면 업그레이드해 주세요
Diff
checker
Pro
요금제 보기
90 행
복사
복사
복사됨
복사
복사됨
LEAF_ENTRY RhpByRefAssignRef
, _TEXT
LEAF_ENTRY RhpByRefAssignRef
Batch
, _TEXT
ALTERNATE_ENTRY RhpByRefAssignRef
AVLocation1
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, [g_lowest_address]
cmp rdi, [g_lowest_address]
복사
복사됨
복사
복사됨
jb RhpByRefAssignRef
_NoBarrierRequired
jb RhpByRefAssignRef
Batch_NotInHeap
cmp rdi, [g_highest_address]
cmp rdi, [g_highest_address]
복사
복사됨
복사
복사됨
jae RhpByRefAssignRef
_NoBarrierRequired
jae 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, [g_write_watch_table]
mov r11, [g_write_watch_table]
cmp r11, 0
cmp r11, 0
복사
복사됨
복사
복사됨
je RhpByRefAssignRef
_CheckCardTable
je RhpByRefAssignRef
Batch
_CheckCardTable
mov r10, rdi
mov r10, rdi
shr r10, 0Ch ;; SoftwareWriteWatch::AddressToTableByteIndexShift
shr r10, 0Ch ;; SoftwareWriteWatch::AddressToTableByteIndexShift
add r10, r11
add r10, r11
cmp byte ptr [r10], 0
cmp byte ptr [r10], 0
복사
복사됨
복사
복사됨
jne RhpByRefAssignRef
_CheckCardTable
jne RhpByRefAssignRef
Batch
_CheckCardTable
mov byte ptr [r10], 0FFh
mov byte ptr [r10], 0FFh
endif
endif
복사
복사됨
복사
복사됨
RhpByRefAssignRef
_CheckCardTable:
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, [g_ephemeral_low]
cmp rcx, [g_ephemeral_low]
복사
복사됨
복사
복사됨
jb RhpByRefAssignRef
_NoBarrierRequired
jb RhpByRefAssignRef
Batch
_NoBarrierRequired
cmp rcx, [g_ephemeral_high]
cmp rcx, [g_ephemeral_high]
복사
복사됨
복사
복사됨
jae RhpByRefAssignRef
_NoBarrierRequired
jae 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, 0Bh
shr rcx, 0Bh
mov r10, [g_card_table]
mov r10, [g_card_table]
cmp byte ptr [rcx + r10], 0FFh
cmp byte ptr [rcx + r10], 0FFh
복사
복사됨
복사
복사됨
je RhpByRefAssignRef
_NoBarrierRequired
je 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], 0FFh
mov byte ptr [rcx + r10], 0FFh
ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
;; Shift rcx by 0Ah more to get the card bundle byte (we shifted by 0Bh already)
;; Shift rcx by 0Ah more to get the card bundle byte (we shifted by 0Bh already)
shr rcx, 0Ah
shr rcx, 0Ah
add rcx, [g_card_bundle_table]
add rcx, [g_card_bundle_table]
cmp byte ptr [rcx], 0FFh
cmp byte ptr [rcx], 0FFh
복사
복사됨
복사
복사됨
je RhpByRefAssignRef
_NoBarrierRequired
je RhpByRefAssignRef
Batch
_NoBarrierRequired
mov byte ptr [rcx], 0FFh
mov byte ptr [rcx], 0FFh
endif
endif
복사
복사됨
복사
복사됨
RhpByRefAssignRefBatch_NotInHeap:
;; At least one write is already done, increment the pointers
add rdi, 8h
add rsi, 8h
dec r8d
je RhpByRefAssignRefBatch_NotInHeapExit
;; Now we can do the rest of the writes without checking the heap
RhpByRefAssignRefBatch_NextByrefUnchecked:
mov rcx, [rsi]
mov [rdi], rcx
add rdi, 8h
add rsi, 8h
dec r8d
jne RhpByRefAssignRefBatch_NextByrefUnchecked
RhpByRefAssignRefBatch_NotInHeapExit:
ret
복사
복사됨
복사
복사됨
RhpByRefAssignRef
_NoBarrierRequired:
RhpByRefAssignRef
Batch
_NoBarrierRequired:
;; Increment the pointers before leaving
;; Increment the pointers before leaving
add rdi, 8h
add rdi, 8h
add rsi, 8h
add rsi, 8h
복사
복사됨
복사
복사됨
dec r8d
jne 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, [g_lowest_address] jb RhpByRefAssignRef_NoBarrierRequired cmp rdi, [g_highest_address] jae 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, [g_write_watch_table] cmp r11, 0 je RhpByRefAssignRef_CheckCardTable mov r10, rdi shr r10, 0Ch ;; SoftwareWriteWatch::AddressToTableByteIndexShift add r10, r11 cmp byte ptr [r10], 0 jne RhpByRefAssignRef_CheckCardTable mov byte ptr [r10], 0FFh endif 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, [g_ephemeral_low] jb RhpByRefAssignRef_NoBarrierRequired cmp rcx, [g_ephemeral_high] jae 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, 0Bh mov r10, [g_card_table] cmp byte ptr [rcx + r10], 0FFh je RhpByRefAssignRef_NoBarrierRequired ;; We get here if it's necessary to update the card table. mov byte ptr [rcx + r10], 0FFh ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES ;; Shift rcx by 0Ah more to get the card bundle byte (we shifted by 0Bh already) shr rcx, 0Ah add rcx, [g_card_bundle_table] cmp byte ptr [rcx], 0FFh je RhpByRefAssignRef_NoBarrierRequired mov byte ptr [rcx], 0FFh endif RhpByRefAssignRef_NoBarrierRequired: ;; Increment the pointers before leaving add rdi, 8h add rsi, 8h ret LEAF_END RhpByRefAssignRef, _TEXT
수정본
파일 열기
LEAF_ENTRY RhpByRefAssignRefBatch, _TEXT 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, [g_lowest_address] jb RhpByRefAssignRefBatch_NotInHeap cmp rdi, [g_highest_address] jae 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, [g_write_watch_table] cmp r11, 0 je RhpByRefAssignRefBatch_CheckCardTable mov r10, rdi shr r10, 0Ch ;; SoftwareWriteWatch::AddressToTableByteIndexShift add r10, r11 cmp byte ptr [r10], 0 jne RhpByRefAssignRefBatch_CheckCardTable mov byte ptr [r10], 0FFh endif 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, [g_ephemeral_low] jb RhpByRefAssignRefBatch_NoBarrierRequired cmp rcx, [g_ephemeral_high] jae 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, 0Bh mov r10, [g_card_table] cmp byte ptr [rcx + r10], 0FFh je RhpByRefAssignRefBatch_NoBarrierRequired ;; We get here if it's necessary to update the card table. mov byte ptr [rcx + r10], 0FFh ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES ;; Shift rcx by 0Ah more to get the card bundle byte (we shifted by 0Bh already) shr rcx, 0Ah add rcx, [g_card_bundle_table] cmp byte ptr [rcx], 0FFh je RhpByRefAssignRefBatch_NoBarrierRequired mov byte ptr [rcx], 0FFh endif RhpByRefAssignRefBatch_NotInHeap: ;; At least one write is already done, increment the pointers add rdi, 8h add rsi, 8h dec r8d je RhpByRefAssignRefBatch_NotInHeapExit ;; Now we can do the rest of the writes without checking the heap RhpByRefAssignRefBatch_NextByrefUnchecked: mov rcx, [rsi] mov [rdi], rcx add rdi, 8h add rsi, 8h dec r8d jne RhpByRefAssignRefBatch_NextByrefUnchecked RhpByRefAssignRefBatch_NotInHeapExit: ret RhpByRefAssignRefBatch_NoBarrierRequired: ;; Increment the pointers before leaving add rdi, 8h add rsi, 8h dec r8d jne RhpByRefAssignRefBatch_NextByref ret LEAF_END RhpByRefAssignRefBatch, _TEXT
비교하기