Chris Lattner e40e2d4ec3 Refactor this code a bit and make it more general. This now compiles:
struct S { unsigned int i : 6, j : 11, k : 15; } b;
void plus2 (unsigned int x) { b.j += x; }

To:

_plus2:
        lis r2, ha16(L_b$non_lazy_ptr)
        lwz r2, lo16(L_b$non_lazy_ptr)(r2)
        lwz r4, 0(r2)
        slwi r3, r3, 6
        add r3, r4, r3
        rlwimi r3, r4, 0, 26, 14
        stw r3, 0(r2)
        blr


instead of:

_plus2:
        lis r2, ha16(L_b$non_lazy_ptr)
        lwz r2, lo16(L_b$non_lazy_ptr)(r2)
        lwz r4, 0(r2)
        rlwinm r5, r4, 26, 21, 31
        add r3, r5, r3
        rlwimi r4, r3, 6, 15, 25
        stw r4, 0(r2)
        blr

by eliminating an 'and'.

I'm pretty sure this is as small as we can go :)

llvm-svn: 23386
2005-09-18 07:22:02 +00:00
..
2005-04-21 23:48:37 +00:00
2005-04-21 23:48:37 +00:00
2005-05-08 18:45:26 +00:00
2005-04-21 23:48:37 +00:00
2005-04-21 23:48:37 +00:00
2005-05-06 06:48:21 +00:00
2005-04-21 23:48:37 +00:00
2005-04-21 23:48:37 +00:00
2005-04-21 23:48:37 +00:00
2005-04-21 23:48:37 +00:00
2005-04-21 23:48:37 +00:00
2005-04-21 23:48:37 +00:00
2005-04-23 21:38:35 +00:00
2005-04-21 23:48:37 +00:00
2005-04-21 23:48:37 +00:00