Description of the paste cleanup that accidentally got checked in during commit 944 because hg import -f has side effects.

  http://landley.net/hg/toybox/rev/944

(Yes, that commit description is actively ironic. Scroll down to patch.c.)

Minor tweaks to the first loop: if -d isn't set then TT.delim will be NULL, and as long as that's the value we're playing with anyway the optimizer tends to do better if it can load that into a register and perform several operations on it, rather than load/mask/test an otherwise unrelated integer. So yank the test and instead start the loop with p = TT.delim ? TT.delim : "\t"; (In theory gcc offers an "x ? : y;" syntax where the blank between ? : substitutes in the result of the test again, so I _could_ say p = TT.delim ? : "\t";. In practice, c99 never picked that one up so I feel uncomfortable using it.)

I was on the fence about moving the assignment from the else case into the if, but did it anyway, so:

-    if (*p == '\\') {
-    } else *buf = *p;

becomes:

+  if ((*buf = *p) == '\\') {
+  }

This means we can load *p into a register once and then perform both the assignment and the test from that register. The initial write only goes into L1 cache and if it gets overwritten a couple lines later we only have one write to main memory. In general modern processors have a better time eliding writes than predicting branches. A lot of stuff like:

  if (x) y = 1;
  else y = 2;

Is going to get rewritten by the optimizer into:

  y = 2;
  if (x) y = 1;

So the "if (x)" can become a conditional assignment instruction instead of a branch instruction. (This avoids bubbles in the instruction pipeline due to branch mispredicts, and/or wasted work from speculative execution on mispredicted branches eating your battery power and then being discarded.)

I was on the fence because this is phrasing easier for the computer to do, and less repetitive (only one mention of *p instead of 2), but slightly less easy to read.

Turned the p++ on its own line into a ++p in the stridx.

Changed the error message to say "bad -d" instead of "bad delimiter" so it's one less word to translate to other languages.

Moved the "// Sequential" comment from on the same line to the line before. I know it uses more vertical screen space and I ordinarily try to conserve that, but mixing comment and code on the same line is something I only really do describing data values. (Describing structure members, table entries, or magic constants when a symbol name is not conveniently available in a header.) This comment is more "what does this block of code do", and that I prefer to put on its own line.

This loop is what loopfiles() is for. That handles the aliasing of "-" with stdin and everything.

(No, I'm probably not done cleaning up paste, this was just my initial pass that got accidentally checked in.)

Rob
_______________________________________________
Toybox mailing list
Toybox@lists.landley.net
http://lists.landley.net/listinfo.cgi/toybox-landley.net

Reply via email to