11
11
import com .plasstech .lang .c .codegen .Cdq ;
12
12
import com .plasstech .lang .c .codegen .Cmp ;
13
13
import com .plasstech .lang .c .codegen .CondCode ;
14
+ import com .plasstech .lang .c .codegen .Div ;
14
15
import com .plasstech .lang .c .codegen .Idiv ;
15
16
import com .plasstech .lang .c .codegen .Imm ;
16
17
import com .plasstech .lang .c .codegen .Instruction ;
17
18
import com .plasstech .lang .c .codegen .Jmp ;
18
19
import com .plasstech .lang .c .codegen .JmpCC ;
19
20
import com .plasstech .lang .c .codegen .Label ;
20
21
import com .plasstech .lang .c .codegen .Mov ;
22
+ import com .plasstech .lang .c .codegen .MovZeroExtend ;
21
23
import com .plasstech .lang .c .codegen .Movsx ;
22
24
import com .plasstech .lang .c .codegen .Operand ;
23
25
import com .plasstech .lang .c .codegen .Pseudo ;
@@ -94,6 +96,7 @@ public List<Instruction> visit(TackyUnary op) {
94
96
@ Override
95
97
public List <Instruction > visit (TackyBinary op ) {
96
98
List <Instruction > instructions = new ArrayList <>();
99
+
97
100
Operand left = toOperand (op .left ());
98
101
Operand right = toOperand (op .right ());
99
102
Operand dst = toOperand (op .dst ());
@@ -105,16 +108,30 @@ public List<Instruction> visit(TackyBinary op) {
105
108
case PERCENT :
106
109
// mov (left, register(ax))
107
110
instructions .add (new Mov (leftType , left , RegisterOperand .RAX ));
108
- // cdq
109
- instructions .add (new Cdq (leftType ));
110
- // idiv(right)
111
- instructions .add (new Idiv (leftType , right ));
112
- if (operator == TokenType .SLASH ) {
113
- // mov(reg(ax), dst)
114
- instructions .add (new Mov (leftType , RegisterOperand .RAX , dst ));
111
+ if (op .left ().type ().signed ()) {
112
+ // cdq
113
+ instructions .add (new Cdq (leftType ));
114
+ // idiv(right)
115
+ instructions .add (new Idiv (leftType , right ));
116
+ if (operator == TokenType .SLASH ) {
117
+ // mov(reg(ax), dst)
118
+ instructions .add (new Mov (leftType , RegisterOperand .RAX , dst ));
119
+ } else {
120
+ // mov(reg(dx), dst) for modulo
121
+ instructions .add (new Mov (leftType , RegisterOperand .RDX , dst ));
122
+ }
115
123
} else {
116
- // mov(reg(dx), dst) for modulo
117
- instructions .add (new Mov (leftType , RegisterOperand .RDX , dst ));
124
+ // page 288
125
+ // mov (left, register(ax))
126
+ // div(right)
127
+ instructions .add (new Div (leftType , right ));
128
+ if (operator == TokenType .SLASH ) {
129
+ // mov(reg(ax), dst)
130
+ instructions .add (new Mov (leftType , RegisterOperand .RAX , dst ));
131
+ } else {
132
+ // mov(reg(dx), dst) for modulo
133
+ instructions .add (new Mov (leftType , RegisterOperand .RDX , dst ));
134
+ }
118
135
}
119
136
break ;
120
137
@@ -127,7 +144,9 @@ public List<Instruction> visit(TackyBinary op) {
127
144
// Page 86
128
145
instructions .add (new Cmp (leftType , right , left ));
129
146
instructions .add (new Mov (dstType , ZERO , dst ));
130
- instructions .add (new SetCC (CondCode .from (operator ), dst ));
147
+ // page 288 adds signed
148
+ boolean signed = op .left ().type ().signed ();
149
+ instructions .add (new SetCC (CondCode .from (operator , signed ), dst ));
131
150
break ;
132
151
133
152
case PLUS :
@@ -273,4 +292,10 @@ public List<Instruction> visit(TackyTruncate op) {
273
292
return ImmutableList
274
293
.of (new Mov (AssemblyType .Longword , toOperand (op .src ()), toOperand (op .dst ())));
275
294
}
295
+
296
+ @ Override
297
+ public List <Instruction > visit (TackyZeroExtend op ) {
298
+ // page 288ff
299
+ return ImmutableList .of (new MovZeroExtend (toOperand (op .src ()), toOperand (op .dst ())));
300
+ }
276
301
}
0 commit comments