mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-13 10:32:06 +00:00
add generation of unnecessary push/pop around calls
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35241 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
cfe0798a9e
commit
aceaf5d26e
@ -989,3 +989,45 @@ _foo:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
//===---------------------------------------------------------------------===//
|
//===---------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
We use push/pop of stack space around calls in situations where we don't have to.
|
||||||
|
Call to f below produces:
|
||||||
|
subl $16, %esp <<<<<
|
||||||
|
movl %eax, (%esp)
|
||||||
|
call L_f$stub
|
||||||
|
addl $16, %esp <<<<<
|
||||||
|
The stack push/pop can be moved into the prolog/epilog. It does this because it's
|
||||||
|
building the frame pointer, but this should not be sufficient, only the use of alloca
|
||||||
|
should cause it to do this.
|
||||||
|
(There are other issues shown by this code, but this is one.)
|
||||||
|
|
||||||
|
typedef struct _range_t {
|
||||||
|
float fbias;
|
||||||
|
float fscale;
|
||||||
|
int ibias;
|
||||||
|
int iscale;
|
||||||
|
int ishift;
|
||||||
|
unsigned char lut[];
|
||||||
|
} range_t;
|
||||||
|
|
||||||
|
struct _decode_t {
|
||||||
|
int type:4;
|
||||||
|
int unit:4;
|
||||||
|
int alpha:8;
|
||||||
|
int N:8;
|
||||||
|
int bpc:8;
|
||||||
|
int bpp:16;
|
||||||
|
int skip:8;
|
||||||
|
int swap:8;
|
||||||
|
const range_t*const*range;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct _decode_t decode_t;
|
||||||
|
|
||||||
|
extern int f(const decode_t* decode);
|
||||||
|
|
||||||
|
int decode_byte (const decode_t* decode) {
|
||||||
|
if (decode->swap != 0)
|
||||||
|
return f(decode);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user