Wow, It works!
When I compile 
```
asm{nop;nop;}
uint k1 = *cast(uint*)data;
asm{nop;nop;}
```
I've got next result:
```
nop
nop
mov	RAX,-050h[RBP]
mov	EAX,[RAX]
mov	-034h[RBP],EAX
nop
nop
```

When I use function call which "construct" uint from parts:
```
static uint get32bits(const (ubyte)* x) pure nothrow
{
     version(BigEndian)
     {
        return ((cast(uint) x[0]) << 24) | ((cast(uint) x[1]) << 16) | ((cast(uint) x[2]) << 8) | (cast(uint) x[3]);
     }
     else
     {
         return ((cast(uint) x[3]) << 24) | ((cast(uint) x[2]) << 16) | ((cast(uint) x[1]) << 8) | (cast(uint) x[0]); 
     }
}
asm{nop;nop;}
uint k1 = get32bits(data);
asm{nop;nop;}
```

I've got result:
```
nop
nop
mov	RAX,-058h[RBP]
mov	-040h[RBP],RAX
mov	RAX,-058h[RBP]
mov	EAX,[RAX]
mov	-034h[RBP],EAX
nop
nop
```

It's not four shift and four or, but it's two instructions more. Is it OK?