diff --git a/cc_core.c b/cc_core.c index e22f8f7..d821650 100644 --- a/cc_core.c +++ b/cc_core.c @@ -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"); diff --git a/test/test.answers b/test/test.answers index 1aa4ce0..673a1d7 100644 --- a/test/test.answers +++ b/test/test.answers @@ -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 diff --git a/test/test1000/proof.answer b/test/test1000/proof.answer index 6f7f2ac..6c6849e 100644 --- a/test/test1000/proof.answer +++ b/test/test1000/proof.answer @@ -1 +1 @@ -9ee96e67f254dab17c5a2aa697dfd609d1b07103e0a8b873ba3d7e22386a8c3c test/test1000/proof +ae6c9ee97d289c2575a969f78425db0fc9230b961bf239b63940fb31a1f5c204 test/test1000/proof