/* PCSX2 - PS2 Emulator for PCs * Copyright (C) 2002-2010 PCSX2 Dev Team * * PCSX2 is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. * * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with PCSX2. * If not, see . */ #ifndef _LNX_MEMZERO_H_ #define _LNX_MEMZERO_H_ // This header contains non-optimized implementation of memzero_ptr and memset8, etc template static __fi void memset32(T &obj) { // this function works on 32-bit aligned lengths of data only. // If the data length is not a factor of 32 bits, the C++ optimizing compiler will // probably just generate mysteriously broken code in Release builds. ;) pxAssume((sizeof(T) & 0x3) == 0); u32 *dest = (u32 *)&obj; for (int i = sizeof(T) >> 2; i; --i, ++dest) *dest = data; } template static __fi void memzero(T &obj) { memset(&obj, 0, sizeof(T)); } template static __fi void memset8(T &obj) { // Aligned sizes use the optimized 32 bit inline memset. Unaligned sizes use memset. if ((sizeof(T) & 0x3) != 0) memset(&obj, data, sizeof(T)); else { const u32 data32 = data + (data << 8) + (data << 16) + (data << 24); memset32(obj); } } // Code is only called in the init so no need to bother with ASM template static __fi void memset_8(void *dest) { memset(dest, data, bytes); } #endif