| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
struct S { unsigned int i : 6, j : 11, k : 15; } b;
void plus2 (unsigned int x) {
b.j += x;
}
to:
plus2:
mov %EAX, DWORD PTR [b]
mov %ECX, %EAX
and %ECX, 131008
mov %EDX, DWORD PTR [%ESP + 4]
shl %EDX, 6
add %EDX, %ECX
and %EDX, 131008
and %EAX, -131009
or %EDX, %EAX
mov DWORD PTR [b], %EDX
ret
instead of:
plus2:
mov %EAX, DWORD PTR [b]
mov %ECX, %EAX
shr %ECX, 6
and %ECX, 2047
add %ECX, DWORD PTR [%ESP + 4]
shl %ECX, 6
and %ECX, 131008
and %EAX, -131009
or %ECX, %EAX
mov DWORD PTR [b], %ECX
ret
llvm-svn: 23385
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
struct S { unsigned int i : 6, j : 11, k : 15; } b;
void plus3 (unsigned int x) { b.k += x; }
To:
plus3:
mov %EAX, DWORD PTR [%ESP + 4]
shl %EAX, 17
add DWORD PTR [b], %EAX
ret
instead of:
plus3:
mov %EAX, DWORD PTR [%ESP + 4]
shl %EAX, 17
mov %ECX, DWORD PTR [b]
add %EAX, %ECX
and %EAX, -131072
and %ECX, 131071
or %ECX, %EAX
mov DWORD PTR [b], %ECX
ret
llvm-svn: 23384
|
| |
|
|
| |
llvm-svn: 23383
|
| |
|
|
| |
llvm-svn: 23382
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
struct S { unsigned int i : 6, j : 11, k : 15; } b;
void plus3 (unsigned int x) {
b.k += x;
}
to:
_plus3:
lis r2, ha16(L_b$non_lazy_ptr)
lwz r2, lo16(L_b$non_lazy_ptr)(r2)
lwz r3, 0(r2)
rlwinm r4, r3, 0, 0, 14
add r4, r4, r3
rlwimi r4, r3, 0, 15, 31
stw r4, 0(r2)
blr
instead of:
_plus3:
lis r2, ha16(L_b$non_lazy_ptr)
lwz r2, lo16(L_b$non_lazy_ptr)(r2)
lwz r4, 0(r2)
srwi r5, r4, 17
add r3, r5, r3
slwi r3, r3, 17
rlwimi r3, r4, 0, 15, 31
stw r3, 0(r2)
blr
llvm-svn: 23381
|
| |
|
|
| |
llvm-svn: 23380
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
struct S { unsigned int i : 6, j : 11, k : 15; } b;
void plus1 (unsigned int x) {
b.i += x;
}
as:
_plus1:
lis r2, ha16(L_b$non_lazy_ptr)
lwz r2, lo16(L_b$non_lazy_ptr)(r2)
lwz r4, 0(r2)
add r3, r4, r3
rlwimi r3, r4, 0, 0, 25
stw r3, 0(r2)
blr
instead of:
_plus1:
lis r2, ha16(L_b$non_lazy_ptr)
lwz r2, lo16(L_b$non_lazy_ptr)(r2)
lwz r4, 0(r2)
rlwinm r5, r4, 0, 26, 31
add r3, r5, r3
rlwimi r3, r4, 0, 0, 25
stw r3, 0(r2)
blr
llvm-svn: 23379
|
| |
|
|
| |
llvm-svn: 23378
|
| |
|
|
| |
llvm-svn: 23377
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
struct {
unsigned int bit0:1;
unsigned int ubyte:31;
} sdata;
void foo() {
sdata.ubyte++;
}
into this:
foo:
add DWORD PTR [sdata], 2
ret
instead of this:
foo:
mov %EAX, DWORD PTR [sdata]
mov %ECX, %EAX
add %ECX, 2
and %ECX, -2
and %EAX, 1
or %EAX, %ECX
mov DWORD PTR [sdata], %EAX
ret
llvm-svn: 23376
|
| |
|
|
| |
llvm-svn: 23375
|
| |
|
|
| |
llvm-svn: 23374
|
| |
|
|
| |
llvm-svn: 23373
|
| |
|
|
| |
llvm-svn: 23371
|
| |
|
|
| |
llvm-svn: 23370
|
| |
|
|
|
|
|
| |
xforms. Run type inference on result patterns, so we always have fully typed
results (and to catch errors in .td files).
llvm-svn: 23369
|
| |
|
|
| |
llvm-svn: 23368
|
| |
|
|
|
|
| |
returned.
llvm-svn: 23367
|
| |
|
|
| |
llvm-svn: 23366
|
| |
|
|
| |
llvm-svn: 23365
|
| |
|
|
| |
llvm-svn: 23364
|
| |
|
|
| |
llvm-svn: 23363
|
| |
|
|
|
|
| |
predicates since they will have already matched at this point.
llvm-svn: 23362
|
| |
|
|
|
|
|
| |
functions to preserve the Record for the xform instead of making it into a
function name.
llvm-svn: 23361
|
| |
|
|
| |
llvm-svn: 23360
|
| |
|
|
| |
llvm-svn: 23359
|
| |
|
|
| |
llvm-svn: 23358
|
| |
|
|
| |
llvm-svn: 23357
|
| |
|
|
| |
llvm-svn: 23356
|
| |
|
|
|
|
| |
lists: only don't parse them if they are entirely missing (sparcv9).
llvm-svn: 23355
|
| |
|
|
| |
llvm-svn: 23354
|
| |
|
|
|
|
| |
verifying information about the operands.
llvm-svn: 23353
|
| |
|
|
|
|
|
| |
specified. The various *imm operands defined by PPC are really all i32,
even though the actual immediate is restricted to a smaller value in it.
llvm-svn: 23352
|
| |
|
|
| |
llvm-svn: 23351
|
| |
|
|
| |
llvm-svn: 23350
|
| |
|
|
| |
llvm-svn: 23349
|
| |
|
|
| |
llvm-svn: 23348
|
| |
|
|
| |
llvm-svn: 23347
|
| |
|
|
| |
llvm-svn: 23346
|
| |
|
|
| |
llvm-svn: 23345
|
| |
|
|
| |
llvm-svn: 23344
|
| |
|
|
|
|
| |
'set's.
llvm-svn: 23343
|
| |
|
|
| |
llvm-svn: 23342
|
| |
|
|
| |
llvm-svn: 23341
|
| |
|
|
|
|
| |
methods.
llvm-svn: 23340
|
| |
|
|
|
|
| |
can use/define class methods
llvm-svn: 23339
|
| |
|
|
| |
llvm-svn: 23338
|
| |
|
|
| |
llvm-svn: 23337
|
| |
|
|
|
|
| |
methods. Use it to simplify some code.
llvm-svn: 23336
|