검증 코드 문제 있으면 알려주세요.
int main()
{
i8u src0_[MEM_SIZE * 2];
i8u src1_[MEM_SIZE * 2];
i8u src2_[MEM_SIZE * 2];
i8u src3_[MEM_SIZE * 2];
int* src0 = (int*)(src0_ + SRC_OFFSET);
int* src1 = (int*)(src1_ + SRC_OFFSET);
int* src2 = (int*)(src2_ + SRC_OFFSET);
int* src3 = (int*)(src3_ + SRC_OFFSET);
int* tgt0 = (int*)(src0_ + TGT_OFFSET);
int* tgt1 = (int*)(src1_ + TGT_OFFSET);
int* tgt2 = (int*)(src2_ + TGT_OFFSET);
int* tgt3 = (int*)(src3_ + TGT_OFFSET);
i64u set_, end_, min_;
i64u set0, end0, min0;
i64u set1, end1, min1;
i64u set2, end2, min2;
i64u t0, t1, t2;
t0 = t1 = t2 = 0;
min_ = min0 = min1 = min2 = (i64u)-1LL;
int try_count = LOOP_COUNT;
int err1, err2, err3;
err1 = err2 = err3 = 0;
while (try_count--)
{
for (int i = 0; i < MEM_SIZE * 2; ++i) src0_[i] = i;
for (int i = 0; i < MEM_SIZE * 2; ++i) src1_[i] = i;
for (int i = 0; i < MEM_SIZE * 2; ++i) src2_[i] = i;
for (int i = 0; i < MEM_SIZE * 2; ++i) src3_[i] = i;
memmove(tgt0, src0, MEM_SIZE);
memmove_tsutsu(tgt1, src1, MEM_SIZE);
memmove_codesafer(tgt2, src2, MEM_SIZE);
memmove(tgt3, src3, MEM_SIZE);
if (memcmp(src0_, src1_, sizeof(src1_)) != 0)
{
err1++;
}
if (memcmp(src0_, src2_, sizeof(src2_)) != 0)
{
err2++;
}
if (memcmp(src0_, src3_, sizeof(src3_)) != 0)
{
err3++;
}
}
printf("error count: "
" memmove: %d "
" tsutsu: %d "
" codesafer: %d "
, err3
, err1
, err2);
getchar();
return 0;
}
결과
x86:
error count:
memmove: 0
tsutsu: 0
codesafer: 0
x64:
error count:
memmove: 0
tsutsu: 1000
codesafer: 1000
오 이분 허접들의 결함을 잘 찾아 내셨네요.
근데 쯔쯔꺼는 #define WORD_SIZE sizeof(int) 로 시작하는 걸로 봐서 애초에 걍 32비트 용으로 짜여진것으로 보임. 따로 64비트의 경우 long long 의 경우로 바꿔 주니까 64비트에서 잘되네.
ㄴ짜여진->짜인
case 4 ~ case 7 을 만들질 않았는데 당연히 64비트는 안돌징~ 어차피 당장 테스트 해 볼 수 없어서 손도 안댐.