On Monday, 24 March 2014 at 16:41:02 UTC, John Colvin wrote:
On Sunday, 23 March 2014 at 21:23:18 UTC, Andrei Alexandrescu wrote:
Here's a baseline: http://goo.gl/91vIGc. Destroy!

Andrei

On a bigendian machine with loose alignment requirements (1 byte), you can do this

Same again, but for little-endian, 18 instructions:

http://goo.gl/jlrweQ

uint front(char[] s)
{
  if(!(s[0] & 0b1000_0000)) return s[0]; //handle ASCII
  assert(s[0] & 0b0100_0000);
        
  if(s[0] & 0b0010_0000)
  {
    if(s[0] & 0b0001_0000)
    {
      assert(s.length >=4 && !(s[0] & 0b1000)
             && s[1] <= 0b1011_1111
             && s[2] <= 0b1011_1111
             && s[3] <= 0b1011_1111);
      return swapEndian(*(cast(dchar*)(s.ptr)));
    }
assert(s.length >= 3 && s[1] <= 0b1011_1111 && s[2] <= 0b1011_1111);
    return swapEndian(*(cast(dchar*)(s.ptr))) >> 8;
  }
        
  assert(s.length >= 2 && s[1] <= 0b1011_1111);
  return swapEndian(*(cast(wchar*)(s.ptr)));
}

Reply via email to