Skip to content

Commit cf86617

Browse files
committed
Support modulo operator
1 parent d4d626b commit cf86617

File tree

4 files changed

+23
-2
lines changed

4 files changed

+23
-2
lines changed

src/cfront.c

+11
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ typedef enum {
4747
T_close_square, /* ] */
4848
T_asterisk, /* '*' */
4949
T_divide, /* / */
50+
T_mod, /* % */
5051
T_bit_or, /* | */
5152
T_bit_xor, /* ^ */
5253
T_log_and, /* && */
@@ -338,6 +339,10 @@ token_t get_next_token()
338339
skip_whitespace();
339340
return T_lt;
340341
}
342+
if (next_char == '%') {
343+
read_char(1);
344+
return T_mod;
345+
}
341346
if (next_char == '>') {
342347
read_char(0);
343348
if (next_char == '=') {
@@ -876,6 +881,7 @@ int get_operator_prio(opcode_t op)
876881
return 12;
877882
case OP_mul:
878883
case OP_div:
884+
case OP_mod:
879885
return 13;
880886
default:
881887
return 0;
@@ -893,6 +899,8 @@ opcode_t get_operator()
893899
op = OP_mul;
894900
else if (lex_accept(T_divide))
895901
op = OP_div;
902+
else if (lex_accept(T_mod))
903+
op = OP_mod;
896904
else if (lex_accept(T_lshift))
897905
op = OP_lshift;
898906
else if (lex_accept(T_rshift))
@@ -1371,6 +1379,9 @@ int eval_expression_imm(opcode_t op, int op1, int op2)
13711379
case OP_div:
13721380
res = op1 / op2;
13731381
break;
1382+
case OP_mod:
1383+
res = op1 % op2;
1384+
break;
13741385
case OP_lshift:
13751386
res = op1 << op2;
13761387
break;

src/codegen.c

+9
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ int get_code_length(ir_instr_t *ii)
121121
case OP_func_exit:
122122
return 16;
123123
case OP_exit:
124+
case OP_mod:
124125
return 12;
125126
case OP_load_data_address:
126127
case OP_jz:
@@ -367,6 +368,14 @@ void code_generate()
367368
if (dump_ir == 1)
368369
printf(" x%d /= x%d", dest_reg, OP_reg);
369370
break;
371+
case OP_mod:
372+
emit(__div(__AL, OP_reg + 1, OP_reg, dest_reg));
373+
emit(__mul(__AL, OP_reg, OP_reg, OP_reg + 1));
374+
emit(__sub_r(__AL, dest_reg, dest_reg, OP_reg));
375+
/* TODO: support print '%' */
376+
if (dump_ir == 1)
377+
printf(" x%d = x%d mod x%d", dest_reg, dest_reg, OP_reg);
378+
break;
370379
case OP_negate:
371380
emit(__rsb_i(__AL, dest_reg, 0, dest_reg));
372381
if (dump_ir == 1)

src/defs.h

+1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ typedef enum {
6868
OP_sub,
6969
OP_mul,
7070
OP_div, /* signed division */
71+
OP_mod, /* modulo */
7172
OP_lshift,
7273
OP_rshift,
7374
OP_log_and,

tests/driver.sh

+2-2
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ expr 55 "1 + (2 + (3 + (4 + (5 + (6 + (7 + (8 + (9 + 10))))))))"
6969
# expr 21 "+1+20"
7070
# expr 10 "-15+(+35-10)"
7171

72-
# expr 2 "5 % 3"
73-
# expr 6 "111 % 7"
72+
expr 2 "5 % 3"
73+
expr 6 "111 % 7"
7474

7575
expr 1 "10 > 5"
7676
expr 1 "3+3 > 5"

0 commit comments

Comments
 (0)