X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=mymemory.cc;h=cda63dcc4bd7d20928bf16a089afaa318a0186b0;hb=448991da4be411c39be8ce3a56615a8eae2811d3;hp=e82f8d2ef997f31f0d2d38871c74dd6cf17a8cbd;hpb=92661595546bc783908d3795fd53265988565e02;p=c11tester.git diff --git a/mymemory.cc b/mymemory.cc index e82f8d2e..cda63dcc 100644 --- a/mymemory.cc +++ b/mymemory.cc @@ -137,31 +137,32 @@ void init_memory_ops() } void * memcpy(void * dst, const void * src, size_t n) { - if (false && model && !inside_model) { + if (model && !inside_model) { + //model_print("memcpy intercepted\n"); thread_id_t tid = thread_current_id(); if (((uintptr_t)src&7) == 0 && ((uintptr_t)dst&7) == 0 && (n&7) == 0) { for (uint i = 0; i < (n>>3); i++) { - raceCheckRead64(tid, (void *)(((char *)src) + i)); + raceCheckRead64(tid, (void *)(((uint64_t *)src) + i)); ((volatile uint64_t *)dst)[i] = ((uint64_t *)src)[i]; - raceCheckWrite64(tid, (void *)(((char *)src) + i)); + raceCheckWrite64(tid, (void *)(((uint64_t *)dst) + i)); } } else if (((uintptr_t)src&3) == 0 && ((uintptr_t)dst&3) == 0 && (n&3) == 0) { for (uint i = 0; i < (n>>2); i++) { - raceCheckRead32(tid, (void *)(((char *)src) + i)); + raceCheckRead32(tid, (void *)(((uint32_t *)src) + i)); ((volatile uint32_t *)dst)[i] = ((uint32_t *)src)[i]; - raceCheckWrite32(tid, (void *)(((char *)src) + i)); + raceCheckWrite32(tid, (void *)(((uint32_t *)dst) + i)); } } else if (((uintptr_t)src&1) == 0 && ((uintptr_t)dst&1) == 0 && (n&1) == 0) { for (uint i = 0; i < (n>>1); i++) { - raceCheckRead16(tid, (void *)(((char *)src) + i)); + raceCheckRead16(tid, (void *)(((uint16_t *)src) + i)); ((volatile uint16_t *)dst)[i] = ((uint16_t *)src)[i]; - raceCheckWrite16(tid, (void *)(((char *)src) + i)); + raceCheckWrite16(tid, (void *)(((uint16_t *)dst) + i)); } } else { for(uint i=0;i>3); i++) { + uint16_t cs2 = cs << 8 | cs; + uint64_t cs3 = cs2 << 16 | cs2; + uint64_t cs4 = cs3 << 32 | cs3; + ((volatile uint64_t *)dst)[i] = cs4; + raceCheckWrite64(tid, (void *)(((uint64_t *)dst) + i)); + } + } else if (((uintptr_t)dst&3) == 0 && (n&3) == 0) { + for (uint i = 0; i < (n>>2); i++) { + uint16_t cs2 = cs << 8 | cs; + uint32_t cs3 = cs2 << 16 | cs2; + ((volatile uint32_t *)dst)[i] = cs3; + raceCheckWrite32(tid, (void *)(((uint32_t *)dst) + i)); + } + } else if (((uintptr_t)dst&1) == 0 && (n&1) == 0) { + for (uint i = 0; i < (n>>1); i++) { + uint16_t cs2 = cs << 8 | cs; + ((volatile uint16_t *)dst)[i] = cs2; + raceCheckWrite16(tid, (void *)(((uint16_t *)dst) + i)); + } + } else { + for (uint i=0;i