From: <m97...@us...> - 2012-04-28 12:35:33
|
Revision: 12486 http://openmsx.svn.sourceforge.net/openmsx/?rev=12486&view=rev Author: m9710797 Date: 2012-04-28 12:35:27 +0000 (Sat, 28 Apr 2012) Log Message: ----------- [5/14] fix inline asm: BitmapConverter.cc Modified Paths: -------------- openmsx/trunk/src/video/BitmapConverter.cc Modified: openmsx/trunk/src/video/BitmapConverter.cc =================================================================== --- openmsx/trunk/src/video/BitmapConverter.cc 2012-04-28 12:35:12 UTC (rev 12485) +++ openmsx/trunk/src/video/BitmapConverter.cc 2012-04-28 12:35:27 UTC (rev 12486) @@ -121,6 +121,7 @@ #ifdef __arm__ if (sizeof(Pixel) == 2) { // only 16bpp + unsigned dummy; asm volatile ( "0:\n\t" "ldmia %[vram]!, {r3,r4}\n\t" @@ -144,12 +145,13 @@ "stmia %[out]!, {r3,r4,r5,r6,r8,r9,r10,r12}\n\t" "bne 0b\n\t" - : [vram] "=r" (vramPtr0) - , [out] "=r" (pixelPtr) - : "[vram]" (vramPtr0) - , "[out]" (pixelPtr) + : [vram] "=r" (vramPtr0) + , [out] "=r" (pixelPtr) + , [count] "=r" (dummy) + : "[vram]" (vramPtr0) + , "[out]" (pixelPtr) + , "[count]" (16) , [pal] "r" (dPalette) - , [count] "r" (16) , [m255] "r" (255) : "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r12" ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aw...@us...> - 2013-01-18 20:51:44
|
Revision: 13139 http://openmsx.svn.sourceforge.net/openmsx/?rev=13139&view=rev Author: awulms Date: 2013-01-18 20:51:38 +0000 (Fri, 18 Jan 2013) Log Message: ----------- Fix crash on ARMv6 with 16bpp rendermode for screen 5, when vdpreg18 is on non-even X position PS: the fix also reduces chance on crashes on other 32-bit architectures that might have trouble with writing 32-bit words on a non-32-bit aligned address Modified Paths: -------------- openmsx/trunk/src/video/BitmapConverter.cc Modified: openmsx/trunk/src/video/BitmapConverter.cc =================================================================== --- openmsx/trunk/src/video/BitmapConverter.cc 2013-01-17 20:59:16 UTC (rev 13138) +++ openmsx/trunk/src/video/BitmapConverter.cc 2013-01-18 20:51:38 UTC (rev 13139) @@ -118,8 +118,9 @@ } #ifdef __arm__ - if (sizeof(Pixel) == 2) { - // only 16bpp + if ((sizeof(Pixel) == 2) && (((int)pixelPtr & 3) == 0)) { + // only 16bpp and only when aligned on 64-bit word boundary + // otherwise the stmia gives a segfault on ARMv6 unsigned dummy; asm volatile ( "0:\n\t" @@ -158,6 +159,62 @@ } #endif + if ((sizeof(Pixel) == 2) && (((int)pixelPtr & 1) == 1)) { + // Its 16 bit destination but currently not aligned on a word boundary + // First write one pixel to get aligned + // Then write double pixels in a loop with 4 double pixels (is 8 single pixels) per iteration + // Finally write the last pixel unaligned + auto in = reinterpret_cast<const unsigned*>(vramPtr0); + unsigned data = in[0]; + if (OPENMSX_BIGENDIAN) { + pixelPtr[0] = palette16[(data >> 28) & 0x0F]; + data <<=4; + } else { + pixelPtr[0] = palette16[(data >> 0) & 0x0F]; + data >>=4; + } + + pixelPtr += 1; // Move to next pixel, which is on word boundary + auto out = reinterpret_cast<DPixel*>(pixelPtr); + for (unsigned i = 0; i < 256 / 8; ++i) { + // 8 pixels per iteration + if (OPENMSX_BIGENDIAN) { + out[4 * i + 0] = dPalette[(data >> 24) & 0xFF]; + out[4 * i + 1] = dPalette[(data >> 16) & 0xFF]; + out[4 * i + 2] = dPalette[(data >> 8) & 0xFF]; + if (i == (256-8) / 8) { + // Last pixel in last iteration must be written individually + pixelPtr[254] = palette16[(data >> 0) & 0x0F]; + } else { + // Last double-pixel must be composed of + // remaing 4 bits in (previous) data + // and first 4 bits from (next) data + unsigned prevData = data; + data = in[i+1]; + out[4 * i + 3] = dPalette[(prevData & 0xF0) | ((data >> 28) & 0x0F)]; + data <<= 4; + } + } else { + out[4 * i + 0] = dPalette[(data >> 0) & 0xFF]; + out[4 * i + 1] = dPalette[(data >> 8) & 0xFF]; + out[4 * i + 2] = dPalette[(data >> 16) & 0xFF]; + if (i != (256-8) / 8) { + // Last pixel in last iteration must be written individually + pixelPtr[254] = palette16[(data >> 24) & 0x0F]; + } else { + // Last double-pixel must be composed of + // remaing 4 bits in (previous) data + // and first 4 bits from (next) data + unsigned prevData = data; + data = in[i+1]; + out[4 * i + 3] = dPalette[((prevData >> 24) & 0x0F) | ((data & 0x0F)<<4)]; + data >>=4; + } + } + } + return; + } + auto out = reinterpret_cast<DPixel*>(pixelPtr); auto in = reinterpret_cast<const unsigned*>(vramPtr0); for (unsigned i = 0; i < 256 / 8; ++i) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <m97...@us...> - 2013-01-18 21:09:17
|
Revision: 13140 http://openmsx.svn.sourceforge.net/openmsx/?rev=13140&view=rev Author: m9710797 Date: 2013-01-18 21:09:06 +0000 (Fri, 18 Jan 2013) Log Message: ----------- Fix compilation on x86_64 Modified Paths: -------------- openmsx/trunk/src/video/BitmapConverter.cc Modified: openmsx/trunk/src/video/BitmapConverter.cc =================================================================== --- openmsx/trunk/src/video/BitmapConverter.cc 2013-01-18 20:51:38 UTC (rev 13139) +++ openmsx/trunk/src/video/BitmapConverter.cc 2013-01-18 21:09:06 UTC (rev 13140) @@ -159,7 +159,7 @@ } #endif - if ((sizeof(Pixel) == 2) && (((int)pixelPtr & 1) == 1)) { + if ((sizeof(Pixel) == 2) && ((long(pixelPtr) & 1) == 1)) { // Its 16 bit destination but currently not aligned on a word boundary // First write one pixel to get aligned // Then write double pixels in a loop with 4 double pixels (is 8 single pixels) per iteration This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |