aboutsummaryrefslogtreecommitdiff
path: root/x86_64-gen.c
diff options
context:
space:
mode:
authorgrischka <grischka>2009-12-19 19:14:14 +0100
committergrischka <grischka>2009-12-19 22:16:19 +0100
commitdd3d4f7295f0729f36acf9be0d6027d1838b9a9b (patch)
treec6d297da0685aeba365856f7ffa47e1c154791e1 /x86_64-gen.c
parent1445fea5827a948996e1c7bea24df4c0df79f432 (diff)
downloadtinycc-dd3d4f7295f0729f36acf9be0d6027d1838b9a9b.tar.gz
tinycc-dd3d4f7295f0729f36acf9be0d6027d1838b9a9b.tar.bz2
x86-64: fix udiv, add cqto instruction
Diffstat (limited to 'x86_64-gen.c')
-rw-r--r--x86_64-gen.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/x86_64-gen.c b/x86_64-gen.c
index e22de5c..052bf87 100644
--- a/x86_64-gen.c
+++ b/x86_64-gen.c
@@ -1137,7 +1137,13 @@ void gen_opi(int op)
r = TREG_RAX;
} else {
if (op == TOK_UDIV || op == TOK_UMOD) {
- o(0xf7d231); /* xor %edx, %edx, div fr, %eax */
+ if ((vtop->type.t & VT_BTYPE) & VT_LLONG) {
+ o(0xd23148); /* xor %rdx, %rdx */
+ o(0x48 + REX_BASE(fr));
+ } else {
+ o(0xd231); /* xor %edx, %edx */
+ }
+ o(0xf7); /* div fr, %eax */
o(0xf0 + fr);
} else {
if ((vtop->type.t & VT_BTYPE) & VT_LLONG) {