Add support for pre-increment and pre-decrement operators.

At the moment there is a limitation on only one unary operator,
so things like *++p wouldn't work but ++*p would work.
This commit is contained in:
Andrius Štikonas 2021-11-12 19:35:29 +00:00
parent ba51f3dcc8
commit ab49bcafa4
3 changed files with 49 additions and 7 deletions

View File

@ -1005,6 +1005,8 @@ void postfix_expr_array()
* - postfix-expr
* !postfix-expr
* sizeof ( type )
* ++postfix-expr
* --postfix-expr
*/
struct type* type_name();
void unary_expr_sizeof()
@ -1027,6 +1029,44 @@ void unary_expr_sizeof()
emit_out("\n");
}
void unary_expr_increment()
{
if((KNIGHT_POSIX == Architecture) || (KNIGHT_NATIVE == Architecture)) emit_out("LOADI R0 1\n");
else if(X86 == Architecture) emit_out("LOAD_IMMEDIATE_eax %1\n");
else if(AMD64 == Architecture) emit_out("LOAD_IMMEDIATE_rax %1\n");
else if(ARMV7L == Architecture) emit_out("!1 R0 LOADI8_ALWAYS\n");
else if(AARCH64 == Architecture) emit_out("SET_X0_TO_1\n");
else if(RISCV64 == Architecture) emit_out("RD_A0 !1 ADDI\n");
common_recursion(primary_expr);
if((KNIGHT_POSIX == Architecture) || (KNIGHT_NATIVE == Architecture)) emit_out("ADD R0 R0 R1\n");
else if(X86 == Architecture) emit_out("ADD_ebx_to_eax\n");
else if(AMD64 == Architecture) emit_out("ADD_rbx_to_rax\n");
else if(ARMV7L == Architecture) emit_out("'0' R0 R0 ADD R1 ARITH2_ALWAYS\n");
else if(AARCH64 == Architecture) emit_out("ADD_X0_X1_X0\n");
else if(RISCV64 == Architecture) emit_out("RD_A0 RS1_A1 RS2_A0 ADD\n");
}
void unary_expr_decrement()
{
if((KNIGHT_POSIX == Architecture) || (KNIGHT_NATIVE == Architecture)) emit_out("LOADI R0 -1\n");
else if(X86 == Architecture) emit_out("LOAD_IMMEDIATE_eax %-1\n");
else if(AMD64 == Architecture) emit_out("LOAD_IMMEDIATE_rax %-1\n");
else if(ARMV7L == Architecture) emit_out("!-1 R0 LOADI8_ALWAYS\n");
else if(AARCH64 == Architecture) emit_out("SET_X0_TO_MINUS_1\n");
else if(RISCV64 == Architecture) emit_out("RD_A0 !1 ADDI\n");
common_recursion(primary_expr);
if((KNIGHT_POSIX == Architecture) || (KNIGHT_NATIVE == Architecture)) emit_out("ADD R0 R0 R1\n");
else if(X86 == Architecture) emit_out("ADD_ebx_to_eax\n");
else if(AMD64 == Architecture) emit_out("ADD_rbx_to_rax\n");
else if(ARMV7L == Architecture) emit_out("'0' R0 R0 ADD R1 ARITH2_ALWAYS\n");
else if(AARCH64 == Architecture) emit_out("ADD_X0_X1_X0\n");
else if(RISCV64 == Architecture) emit_out("RD_A0 RS1_A1 RS2_A0 SUB\n");
}
void postfix_expr_stub()
{
require(NULL != global_token, "Unexpected EOF, improperly terminated primary expression\n");
@ -1294,6 +1334,8 @@ void primary_expr()
}
if(match("sizeof", global_token->s)) unary_expr_sizeof();
else if (match("++", global_token->s)) unary_expr_increment();
else if (match("--", global_token->s)) unary_expr_decrement();
else if('-' == global_token->s[0])
{
if(X86 == Architecture) emit_out("LOAD_IMMEDIATE_eax %0\n");

View File

@ -227,9 +227,9 @@ eb1f6aab09a1a4966f9f49a518d8aa03ca97aa7c46e443871d758a306671a85e test/results/t
a2cbfd5f76d3be8049c6737e3fa02f191caf29b6885db006fa23f86e6eacc186 test/results/test0106-knight-posix-binary
d75e450e2fcdf19df63f9d6a3fe5e032933e57b33f6f06b39a8ed2f3dc759f17 test/results/test0106-riscv64-binary
473cc504d6cba9eaf648abcf15c83a317ff3f4a7f08f5e8936e3b35b2cc4fbc6 test/results/test0106-x86-binary
7729e3279192002ce69af057534670779b30c7ae0feaef82e11d4c8b74278b94 test/results/test1000-aarch64-binary
be88d5e1b0c5584192beb7b7380e578925993a636a0e338a319f39b56407a192 test/results/test1000-amd64-binary
92f9f8134a2213d45919a562160d57f58de94870979af80ff7d52b47c196536f test/results/test1000-armv7l-binary
e47006b7829ddfc1a4f1aa545e8a09950e8053ff6841c5d5922a330c8849b384 test/results/test1000-knight-posix-binary
bbeb55c436f1c26e1cddfb0a47da350219f817017ba0139dbde56392522f4406 test/results/test1000-riscv64-binary
0891395cd28e6d0adb6feed07b0fce5b8c1245eeb2bf673aa488fe037daf349c test/results/test1000-x86-binary
1d29e1fbf41dfcadd1e26706e7dda9102091754b8a4cf933ad8bb5089bb07927 test/results/test1000-aarch64-binary
e2b6f5340d0fae25312e0e11e8ea5b7897feb42dfe89bcf0fdc2ee00a67441f7 test/results/test1000-amd64-binary
dd419f09779884c800b0976618d7990bd9fb5efc72dd2551e2acf258af77d94e test/results/test1000-armv7l-binary
f8d2ad16e144a1139149d43f12f02b3123543d29c83d12702be9ebeb10bf1cde test/results/test1000-knight-posix-binary
387c617a114c3fd1b80c6bee794b8c33ec85a8d7c75fd0f9c55ea07a3f6afbdb test/results/test1000-riscv64-binary
cf60a72943ba3e496247ae68b56cd4d5dbf7c18be13d78ced10b2a7e6376d5ee test/results/test1000-x86-binary

View File

@ -1 +1 @@
9ee96e67f254dab17c5a2aa697dfd609d1b07103e0a8b873ba3d7e22386a8c3c test/test1000/proof
ae6c9ee97d289c2575a969f78425db0fc9230b961bf239b63940fb31a1f5c204 test/test1000/proof