From 39936d81cbd6f3b204ef03c1915ab8e2b8bbaa0e Mon Sep 17 00:00:00 2001 From: deesix Date: Sat, 1 Feb 2020 21:23:49 +0100 Subject: [PATCH] aarch64: primary, postfix and unary expressions --- cc_core.c | 25 +++++++++++++++++++++++++ test/test.answers | 8 ++++---- test/test100/proof.answer | 2 +- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/cc_core.c b/cc_core.c index e909159..6a497bc 100644 --- a/cc_core.c +++ b/cc_core.c @@ -416,6 +416,7 @@ void primary_expr_string() else if(X86 == Architecture) emit_out("LOAD_IMMEDIATE_eax &STRING_"); else if(AMD64 == Architecture) emit_out("LOAD_IMMEDIATE_rax &STRING_"); else if(ARMV7L == Architecture) emit_out("!0 R0 LOAD32 R15 MEMORY\n~0 JUMP_ALWAYS\n&STRING_"); + else if(AARCH64 == Architecture) emit_out("LOAD_W0_AHEAD\nSKIP_32_DATA\n&STRING_"); uniqueID_out(function->s, number_string); /* The target */ @@ -433,6 +434,7 @@ void primary_expr_char() else if(X86 == Architecture) emit_out("LOAD_IMMEDIATE_eax %"); else if(AMD64 == Architecture) emit_out("LOAD_IMMEDIATE_rax %"); else if(ARMV7L == Architecture) emit_out("!"); + else if(AARCH64 == Architecture) emit_out("LOAD_W0_AHEAD\nSKIP_32_DATA\n%"); emit_out(numerate_number(escape_lookup(global_token->s + 1))); if(ARMV7L == Architecture) emit_out(" R0 LOADI8_ALWAYS"); emit_out("\n"); @@ -471,6 +473,11 @@ void primary_expr_number() emit_out("!0 R0 LOAD32 R15 MEMORY\n~0 JUMP_ALWAYS\n%"); emit_out(global_token->s); } + else if(AARCH64 == Architecture) + { + emit_out("LOAD_W0_AHEAD\nSKIP_32_DATA\n%"); + emit_out(global_token->s); + } emit_out("\n"); global_token = global_token->next; } @@ -661,6 +668,12 @@ void postfix_expr_arrow() emit_out(numerate_number(i->offset)); emit_out("\n'0' R0 R0 ADD R1 ARITH2_ALWAYS\n"); } + else if(AARCH64 == Architecture) + { + emit_out("LOAD_W1_AHEAD\nSKIP_32_DATA\n%"); + emit_out(numerate_number(i->offset)); + emit_out("\nADD_X0_X1_X0\n"); + } } if((!match("=", global_token->s) && (register_size >= i->size))) @@ -669,6 +682,7 @@ void postfix_expr_arrow() else if(X86 == Architecture) emit_out("LOAD_INTEGER\n"); else if(AMD64 == Architecture) emit_out("LOAD_INTEGER\n"); else if(ARMV7L == Architecture) emit_out("!0 R0 LOAD32 R0 MEMORY\n"); + else if(AARCH64 == Architecture) emit_out("DEREF_X0\n"); } } @@ -684,6 +698,7 @@ void postfix_expr_array() else if(X86 == Architecture) assign = "LOAD_INTEGER\n"; else if(AMD64 == Architecture) assign = "LOAD_INTEGER\n"; else if(ARMV7L == Architecture) assign = "!0 R0 LOAD32 R0 MEMORY\n"; + else if(AARCH64 == Architecture) assign = "DEREF_X0\n"; /* Add support for Ints */ if(match("char*", current_target->name)) @@ -692,6 +707,7 @@ void postfix_expr_array() else if(X86 == Architecture) assign = "LOAD_BYTE\n"; else if(AMD64 == Architecture) assign = "LOAD_BYTE\n"; else if(ARMV7L == Architecture) assign = "!0 R0 LOAD8 R0 MEMORY\n"; + else if(AARCH64 == Architecture) assign = "DEREF_X0_BYTE\n"; } else { @@ -699,9 +715,11 @@ void postfix_expr_array() else if(X86 == Architecture) emit_out("SAL_eax_Immediate8 !"); else if(AMD64 == Architecture) emit_out("SAL_rax_Immediate8 !"); else if(ARMV7L == Architecture) emit_out("'0' R0 R0 '"); + else if(AARCH64 == Architecture) emit_out("LOAD_W2_AHEAD\nSKIP_32_DATA\n%"); emit_out(numerate_number(ceil_log2(current_target->indirect->size))); if(ARMV7L == Architecture) emit_out("' MOVE_ALWAYS"); + else if(AARCH64 == Architecture) emit_out("\nLSHIFT_X0_X0_X2"); emit_out("\n"); } @@ -709,6 +727,7 @@ void postfix_expr_array() 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"); require_match("ERROR in postfix_expr\nMissing ]\n", "]"); @@ -740,6 +759,7 @@ void unary_expr_sizeof() else if(X86 == Architecture) emit_out("LOAD_IMMEDIATE_eax %"); else if(AMD64 == Architecture) emit_out("LOAD_IMMEDIATE_rax %"); else if(ARMV7L == Architecture) emit_out("!"); + else if(AARCH64 == Architecture) emit_out("LOAD_W0_AHEAD\nSKIP_32_DATA\n%"); emit_out(numerate_number(a->size)); if(ARMV7L == Architecture) emit_out(" R0 LOADI8_ALWAYS"); emit_out("\n"); @@ -963,6 +983,7 @@ void primary_expr() if(X86 == Architecture) emit_out("LOAD_IMMEDIATE_eax %0\n"); else if(AMD64 == Architecture) emit_out("LOAD_IMMEDIATE_rax %0\n"); else if(ARMV7L == Architecture) emit_out("!0 R0 LOADI8_ALWAYS\n"); + else if(AARCH64 == Architecture) emit_out("SET_X0_TO_0\n"); common_recursion(primary_expr); @@ -970,12 +991,14 @@ void primary_expr() else if(X86 == Architecture) emit_out("SUBTRACT_eax_from_ebx_into_ebx\nMOVE_ebx_to_eax\n"); else if(AMD64 == Architecture) emit_out("SUBTRACT_rax_from_rbx_into_rbx\nMOVE_rbx_to_rax\n"); else if(ARMV7L == Architecture) emit_out("'0' R0 R0 SUB R1 ARITH2_ALWAYS\n"); + else if(AARCH64 == Architecture) emit_out("SUB_X0_X1_X0\n"); } else if('!' == global_token->s[0]) { 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"); common_recursion(postfix_expr); @@ -983,6 +1006,7 @@ void primary_expr() else if(X86 == Architecture) emit_out("XOR_ebx_eax_into_eax\n"); else if(AMD64 == Architecture) emit_out("XOR_rbx_rax_into_rax\n"); else if(ARMV7L == Architecture) emit_out("'0' R0 R0 XOR R1 ARITH2_ALWAYS\n"); + else if(AARCH64 == Architecture) emit_out("XOR_X0_X1_X0\n"); } else if('~' == global_token->s[0]) { @@ -992,6 +1016,7 @@ void primary_expr() else if(X86 == Architecture) emit_out("NOT_eax\n"); else if(AMD64 == Architecture) emit_out("NOT_rax\n"); else if(ARMV7L == Architecture) emit_out("'0' R0 R0 MVN_ALWAYS\n"); + else if(AARCH64 == Architecture) emit_out("MVN_X0\n"); } else if(global_token->s[0] == '(') { diff --git a/test/test.answers b/test/test.answers index b6901a7..a145d24 100644 --- a/test/test.answers +++ b/test/test.answers @@ -53,10 +53,10 @@ a0ae067746e7a2b01d33950da1cf640e12c3a70a045ab331ea2025af59dec9af test/results/t e01b615db5df31392bd1054c45141dcff936b11dfb1cad270edc0aa67653f5a1 test/results/test10-knight-native-binary c1b5a2a3cd46c5e95e5540e871c2a916e028684ca80f51c001ef489342e27625 test/results/test10-knight-posix-binary b3e13d54aab689137628fb9c4487bfd8288f9bd18bef8fe756577c8d2dce1f1f test/results/test10-x86-binary -5c1eeade7c883561757bea18d020b92ac18ee11d22580512e89bdccc8f322c81 test/results/test100-amd64-binary -4d9097d3f11b0afcb39dfdadf65afe0b82820d7dcf7584391bbdf642bfeab624 test/results/test100-armv7l-binary -5c33800bacfa0dd5984782264c85edb34b42a3f902a267e2199b923990e834a1 test/results/test100-knight-posix-binary -44ccbb6a5e8c3e41ee4925f571649b8a2c8929e462a5fd856e417ec01d86adff test/results/test100-x86-binary +5cc5c8b56b02f9e2942152e7f06c47fda8ca787217a8276de8c59fa91db763d0 test/results/test100-amd64-binary +82ec5d9255f325c30549ef21c9f8d6a14d8055805051dfbc0aceb6edbec5d3a9 test/results/test100-armv7l-binary +e8c1e8d431338e58f84909e3cd80ee0509df7e0ce0d6a7623211538f494ba928 test/results/test100-knight-posix-binary +87e3a0cb7bcd7e1031ea6f56a337fd0043a40bd707ea1d822f00d2383a3c49c6 test/results/test100-x86-binary 34e6d535e30ef8826a4ad1a4d08b76cfa370c54595599ad3be784b64c9cd8ec5 test/results/test11-amd64-binary 893695e6f300a0fe055fad935a56abd549bba70d1d39c535a680f41bbb73f117 test/results/test11-armv7l-binary 7115c4a552eb4b2c1a868ac3dca43be7d040c8e89b7b66851d0522d298429af9 test/results/test11-knight-native-binary diff --git a/test/test100/proof.answer b/test/test100/proof.answer index ec83ed6..beb3ee2 100644 --- a/test/test100/proof.answer +++ b/test/test100/proof.answer @@ -1 +1 @@ -2db4350e7180243dcf427d3e91ace78e375851db9ffb43ea2f29f5f2eb812c81 test/test100/proof +449988fc1b8927d959e7ace25aa1420c44e4b44418fe1805ece868cd8ecb2aa4 test/test100/proof