<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: evmar</title><link>https://news.ycombinator.com/user?id=evmar</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Wed, 20 May 2026 11:22:31 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=evmar" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by evmar in "The Third Hard Problem"]]></title><description><![CDATA[
<p>One nice tool for analyzing maps as a tree is as a dominator trees.  I wrote a bit about it here: <a href="https://neugierig.org/software/blog/2023/07/dominator.html" rel="nofollow">https://neugierig.org/software/blog/2023/07/dominator.html</a></p>
]]></description><pubDate>Sun, 17 May 2026 01:08:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=48165219</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=48165219</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48165219</guid></item><item><title><![CDATA[New comment by evmar in "Deterministic Fully-Static Whole-Binary Translation Without Heuristics"]]></title><description><![CDATA[
<p>The translator I made is only hobbyist quality, but I just have a big table that says “if you indirect jmp to address X then the associated block is at location Y”.<p>This is slower than a direct jmp (which doesn’t use the table) but also indirect jumps were slower in the original program to begin with and typically don’t occur in performance-critical loops.</p>
]]></description><pubDate>Wed, 13 May 2026 14:23:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=48122329</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=48122329</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48122329</guid></item><item><title><![CDATA[New comment by evmar in "Theseus, a Static Windows Emulator"]]></title><description><![CDATA[
<p>Do you have any notes or other artifacts from your recompiler? I’d love to learn more.</p>
]]></description><pubDate>Wed, 22 Apr 2026 20:14:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=47868693</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47868693</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47868693</guid></item><item><title><![CDATA[New comment by evmar in "Theseus, a Static Windows Emulator"]]></title><description><![CDATA[
<p>Yes, I agree that there is little harm in gathering too much code. I have tried out just scanning data memory for values that refer to addresses within the region marked as code and disassembling from those points, as well as scanning the instructions I traverse for any immediate values in the same range.</p>
]]></description><pubDate>Wed, 22 Apr 2026 20:13:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=47868683</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47868683</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47868683</guid></item><item><title><![CDATA[New comment by evmar in "Theseus, a Static Windows Emulator"]]></title><description><![CDATA[
<p>Slow progress is fine, it took me like two years to get where I got!  (Not that I was working on it full time or anything, but also there were just many false starts and I had no idea what I was doing...)</p>
]]></description><pubDate>Wed, 22 Apr 2026 15:49:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=47865348</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47865348</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47865348</guid></item><item><title><![CDATA[New comment by evmar in "Theseus, a Static Windows Emulator"]]></title><description><![CDATA[
<p>Looking through Wikipedia at least, it's not exactly clear to me.  They have separate pages for 'binary recompiler' and 'binary translation' that link to each other, and the latter is more about going between architectures (which is the main objective here).</p>
]]></description><pubDate>Tue, 21 Apr 2026 23:06:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=47855976</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47855976</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47855976</guid></item><item><title><![CDATA[New comment by evmar in "Theseus, a Static Windows Emulator"]]></title><description><![CDATA[
<p>[post author] I went down some similar paths in retrowin32, though 32-bit x86 is likely easier.<p>I was also surprised by how much goop there is between startup and main.  In retrowin32 I just implemented it all, though I wonder how much I could get away with not running it in the Theseus replace-some-parts model.<p>I mostly relied on my own x86 emulator, but I also implemented the thunking between 64-bit and 32-bit mode just to see how it was.  It definitely was some asm but once I wrapped my head around it it wasn't so bad, check out the 'trans64' and 'trans32' snippets in <a href="https://github.com/evmar/retrowin32/blob/ffd8665795ae6c6bdd7f68ec57d3898d7aaafb0c/win32/src/shims_raw.rs" rel="nofollow">https://github.com/evmar/retrowin32/blob/ffd8665795ae6c6bdd7...</a> for I believe all of it.  One reframing that helped me (after a few false starts) was to put as much code as possible in my high-level language and just use asm to bridge to it.</p>
]]></description><pubDate>Tue, 21 Apr 2026 22:58:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=47855859</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47855859</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47855859</guid></item><item><title><![CDATA[New comment by evmar in "Theseus, a Static Windows Emulator"]]></title><description><![CDATA[
<p>It depends on what results you’re expecting! Relative to an interpreter, even the simplest unoptimized translation of that code is already significantly more efficient code at runtime.<p>In the post there is a godbolt link showing a compiler inlining a simple add, but a real implementation of x86 add would be much more complex.<p>I have read other projects where the authors put some effort into getting exactly the machine code they wanted out.  For example, maybe you want the virtual regs.eax to actually exist in a machine register, and one way you might be able to convince a compiler to do that is by passing it around as a function parameter everywhere instead as a struct element. I have not investigated this myself.</p>
]]></description><pubDate>Tue, 21 Apr 2026 22:35:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=47855550</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47855550</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47855550</guid></item><item><title><![CDATA[New comment by evmar in "How to make Firefox builds 17% faster"]]></title><description><![CDATA[
<p>I see, I might be confused by the terminology.  "clobber" to me suggests intentionally trying to throw away cached results (clobbering what you have), but it sounds like you might just use it to mean builds where you don't have any existing build state already present.</p>
]]></description><pubDate>Tue, 14 Apr 2026 07:16:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=47762313</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47762313</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47762313</guid></item><item><title><![CDATA[New comment by evmar in "How to make Firefox builds 17% faster"]]></title><description><![CDATA[
<p>I’m not too familiar with Firefox builds.  Why are clobber builds common?  At first glance it seems weird to add a cache around your build system vs fixing your build system.</p>
]]></description><pubDate>Tue, 14 Apr 2026 01:01:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=47759960</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47759960</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47759960</guid></item><item><title><![CDATA[New comment by evmar in "Ninja is a small build system with a focus on speed"]]></title><description><![CDATA[
<p>To be honest, it's not clear to me why other systems are not faster.  Ninja is relatively straightforward but also not too clever.<p>Now that I think about it, I did write more about some of the performance stuff we did here: <a href="https://aosabook.org/en/posa/ninja.html" rel="nofollow">https://aosabook.org/en/posa/ninja.html</a>  Looking back over that, I guess we did do some lower-level optimization work.  I think a lot of it was just coming at it from a performance mindset.</p>
]]></description><pubDate>Tue, 31 Mar 2026 05:02:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=47582932</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47582932</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47582932</guid></item><item><title><![CDATA[New comment by evmar in "Ninja is a small build system with a focus on speed"]]></title><description><![CDATA[
<p>[ninja author] My first post about Ninja goes into this: <a href="https://neugierig.org/software/chromium/notes/2011/02/ninja.html" rel="nofollow">https://neugierig.org/software/chromium/notes/2011/02/ninja....</a></p>
]]></description><pubDate>Mon, 30 Mar 2026 18:04:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=47577649</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47577649</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47577649</guid></item><item><title><![CDATA[New comment by evmar in "Ninja is a small build system with a focus on speed"]]></title><description><![CDATA[
<p>[ninja author] I did some thinking about this problem and eventually revisited with what I think is a pretty neat solution.  I wrote about it here: <a href="https://neugierig.org/software/blog/2022/03/n2.html" rel="nofollow">https://neugierig.org/software/blog/2022/03/n2.html</a></p>
]]></description><pubDate>Mon, 30 Mar 2026 17:19:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=47577096</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47577096</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47577096</guid></item><item><title><![CDATA[New comment by evmar in "Gzip decompression in 250 lines of Rust"]]></title><description><![CDATA[
<p>I had a similar experience implementing simd instructions in my emulator, where I needed to break apart a 64-bit value into four eight-bit values, do an operation on each value, then pack it back together. My first implementation did it with all the bit shifts you’d expect, but my second one used two helpers to unpack into an array, map on the array to a second array, and pack the array again. The optimized output was basically the same.</p>
]]></description><pubDate>Fri, 27 Mar 2026 17:15:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=47545502</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47545502</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47545502</guid></item><item><title><![CDATA[New comment by evmar in "Wine 11 rewrites how Linux runs Windows games at kernel with massive speed gains"]]></title><description><![CDATA[
<p>Hey thanks!  I don't mean to hijack this great wine news with my own project, but since you asked, the top of the post has links to more.  I will fix the link.</p>
]]></description><pubDate>Tue, 24 Mar 2026 22:55:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=47510724</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47510724</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47510724</guid></item><item><title><![CDATA[New comment by evmar in "Wine 11 rewrites how Linux runs Windows games at kernel with massive speed gains"]]></title><description><![CDATA[
<p>I don't know the technical details, but the kernel docs say "It exists because implementation in user-space, using existing tools, cannot match Windows performance while offering accurate semantics."
<a href="https://docs.kernel.org/userspace-api/ntsync.html" rel="nofollow">https://docs.kernel.org/userspace-api/ntsync.html</a></p>
]]></description><pubDate>Tue, 24 Mar 2026 20:45:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=47508976</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47508976</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47508976</guid></item><item><title><![CDATA[New comment by evmar in "Wine 11 rewrites how Linux runs Windows games at kernel with massive speed gains"]]></title><description><![CDATA[
<p>If you're interested in technical notes on how the WoW64 thing works, I dug into Wine and implemented a similar thing in my (far inferior) emulator and wrote about it here, including some links to some Wine resources: <a href="https://neugierig.org/software/blog/2023/08/x86-x64-aarch64.html" rel="nofollow">https://neugierig.org/software/blog/2023/08/x86-x64-aarch64....</a></p>
]]></description><pubDate>Tue, 24 Mar 2026 20:41:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=47508906</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47508906</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47508906</guid></item><item><title><![CDATA[New comment by evmar in "We rewrote our Rust WASM parser in TypeScript and it got faster"]]></title><description><![CDATA[
<p>By the way, I did a deeper dive on the problem of serializing objects across the Rust/JS boundary, noticed the approach used by serde wasn’t great for performance, and explored improving it here: <a href="https://neugierig.org/software/blog/2024/04/rust-wasm-to-js.html" rel="nofollow">https://neugierig.org/software/blog/2024/04/rust-wasm-to-js....</a></p>
]]></description><pubDate>Fri, 20 Mar 2026 22:58:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=47461919</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47461919</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47461919</guid></item><item><title><![CDATA[New comment by evmar in "Tailscale Peer Relays is now generally available"]]></title><description><![CDATA[
<p>They wrote a blog post addressing this concern: <a href="https://tailscale.com/blog/free-plan" rel="nofollow">https://tailscale.com/blog/free-plan</a></p>
]]></description><pubDate>Wed, 18 Feb 2026 17:39:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=47063738</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47063738</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47063738</guid></item><item><title><![CDATA[New comment by evmar in "Ghidra by NSA"]]></title><description><![CDATA[
<p>Where can I learn more about the Windows decompilation community?  (This is an area I kind of work in, and I am interested in participating!)</p>
]]></description><pubDate>Tue, 17 Feb 2026 00:53:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=47042341</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47042341</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47042341</guid></item></channel></rss>