int main()
{
struct st {
int aa:16;
int bb:16;
} s;
s.aa = 1;
s.bb = 2;
return 0;
}
objdump -d:
elf64-x86-64
Disassembly of section .text:
0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 81 ec 10 00 00 00 sub $0x10,%rsp
b: b8 01 00 00 00 mov $0x1,%eax
10: 48 89 c1 mov %rax,%rcx
13: 81 e1 ff ff 00 00 and $0xffff,%ecx
19: 8b 55 fc mov -0x4(%rbp),%edx
1c: 81 e2 00 00 ff ff and $0xffff0000,%edx
22: 09 d1 or %edx,%ecx
24: 89 4d fc mov %ecx,-0x4(%rbp)
27: b8 02 00 00 00 mov $0x2,%eax
2c: 48 89 c1 mov %rax,%rcx
2f: 81 e1 ff ff 00 00 and $0xffff,%ecx
35: c1 e1 10 shl $0x10,%ecx
38: 8b 55 fc mov -0x4(%rbp),%edx
3b: 81 e2 ff ff 00 00 and $0xffff,%edx
41: 09 d1 or %edx,%ecx
43: 89 4d fc mov %ecx,-0x4(%rbp)
46: b8 00 00 00 00 mov $0x0,%eax
4b: e9 00 00 00 00 jmpq 50 <main+0x50>
50: c9 leaveq
51: c3 retq
After the patch
Disassembly of section .text:
0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 81 ec 10 00 00 00 sub $0x10,%rsp
b: 8b 45 fc mov -0x4(%rbp),%eax
e: 81 e0 00 00 ff ff and $0xffff0000,%eax
14: 83 c8 01 or $0x1,%eax
17: 89 45 fc mov %eax,-0x4(%rbp)
1a: 8b 45 fc mov -0x4(%rbp),%eax
1d: 81 e0 ff ff 00 00 and $0xffff,%eax
23: 81 c8 00 00 02 00 or $0x20000,%eax
29: 89 45 fc mov %eax,-0x4(%rbp)
2c: b8 00 00 00 00 mov $0x0,%eax
31: e9 00 00 00 00 jmpq 36 <main+0x36>
36: c9 leaveq
37: c3 retq
This commit is contained in:
parent
a94ed43094
commit
e5e7f488e2
1 changed files with 10 additions and 17 deletions
27
tccgen.c
27
tccgen.c
|
|
@ -1019,6 +1019,7 @@ ST_FUNC void lexpand_nr(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef TCC_TARGET_X86_64
|
||||||
/* build a long long from two ints */
|
/* build a long long from two ints */
|
||||||
static void lbuild(int t)
|
static void lbuild(int t)
|
||||||
{
|
{
|
||||||
|
|
@ -1027,6 +1028,7 @@ static void lbuild(int t)
|
||||||
vtop[-1].type.t = t;
|
vtop[-1].type.t = t;
|
||||||
vpop();
|
vpop();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* rotate n first stack elements to the bottom
|
/* rotate n first stack elements to the bottom
|
||||||
I1 ... In -> I2 ... In I1 [top is right]
|
I1 ... In -> I2 ... In I1 [top is right]
|
||||||
|
|
@ -1088,8 +1090,8 @@ static void gv_dup(void)
|
||||||
{
|
{
|
||||||
int rc, t, r, r1;
|
int rc, t, r, r1;
|
||||||
SValue sv;
|
SValue sv;
|
||||||
|
|
||||||
t = vtop->type.t;
|
t = vtop->type.t;
|
||||||
|
#ifndef TCC_TARGET_X86_64
|
||||||
if ((t & VT_BTYPE) == VT_LLONG) {
|
if ((t & VT_BTYPE) == VT_LLONG) {
|
||||||
lexpand();
|
lexpand();
|
||||||
gv_dup();
|
gv_dup();
|
||||||
|
|
@ -1099,15 +1101,14 @@ static void gv_dup(void)
|
||||||
vrotb(4);
|
vrotb(4);
|
||||||
/* stack: H L L1 H1 */
|
/* stack: H L L1 H1 */
|
||||||
lbuild(t);
|
lbuild(t);
|
||||||
vrotb(3);
|
vrott(3);
|
||||||
vrotb(3);
|
|
||||||
vswap();
|
vswap();
|
||||||
lbuild(t);
|
lbuild(t);
|
||||||
vswap();
|
vswap();
|
||||||
} else {
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
/* duplicate value */
|
/* duplicate value */
|
||||||
rc = RC_INT;
|
|
||||||
sv.type.t = VT_INT;
|
|
||||||
if (is_float(t)) {
|
if (is_float(t)) {
|
||||||
rc = RC_FLOAT;
|
rc = RC_FLOAT;
|
||||||
#ifdef TCC_TARGET_X86_64
|
#ifdef TCC_TARGET_X86_64
|
||||||
|
|
@ -1115,8 +1116,9 @@ static void gv_dup(void)
|
||||||
rc = RC_ST0;
|
rc = RC_ST0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
sv.type.t = t;
|
}else
|
||||||
}
|
rc = RC_INT;
|
||||||
|
sv.type.t = t;
|
||||||
r = gv(rc);
|
r = gv(rc);
|
||||||
r1 = get_reg(rc);
|
r1 = get_reg(rc);
|
||||||
sv.r = r;
|
sv.r = r;
|
||||||
|
|
@ -2549,11 +2551,6 @@ ST_FUNC void vstore(void)
|
||||||
/* remove bit field info to avoid loops */
|
/* remove bit field info to avoid loops */
|
||||||
vtop[-1].type.t = ft & ~(VT_BITFIELD | (-1 << VT_STRUCT_SHIFT));
|
vtop[-1].type.t = ft & ~(VT_BITFIELD | (-1 << VT_STRUCT_SHIFT));
|
||||||
|
|
||||||
/* duplicate source into other register */
|
|
||||||
gv_dup();
|
|
||||||
vswap();
|
|
||||||
vrott(3);
|
|
||||||
|
|
||||||
if((ft & VT_BTYPE) == VT_BOOL) {
|
if((ft & VT_BTYPE) == VT_BOOL) {
|
||||||
gen_cast(&vtop[-1].type);
|
gen_cast(&vtop[-1].type);
|
||||||
vtop[-1].type.t = (vtop[-1].type.t & ~VT_BTYPE) | (VT_BYTE | VT_UNSIGNED);
|
vtop[-1].type.t = (vtop[-1].type.t & ~VT_BTYPE) | (VT_BYTE | VT_UNSIGNED);
|
||||||
|
|
@ -2585,10 +2582,6 @@ ST_FUNC void vstore(void)
|
||||||
gen_op('|');
|
gen_op('|');
|
||||||
/* store result */
|
/* store result */
|
||||||
vstore();
|
vstore();
|
||||||
|
|
||||||
/* pop off shifted source from "duplicate source..." above */
|
|
||||||
vpop();
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
#ifdef CONFIG_TCC_BCHECK
|
#ifdef CONFIG_TCC_BCHECK
|
||||||
/* bound check case */
|
/* bound check case */
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue