diff options
author | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2010-04-17 07:01:18 +0000 |
---|---|---|
committer | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2010-04-17 07:01:18 +0000 |
commit | 59646439baa1b9cc6209b684e4ccf9aac908fdbc (patch) | |
tree | 55f0b7c0f82f9b0e32ba754dc129938ac1242cc9 /arm/PrintAsm.ml | |
parent | 9e9853b79e652036c2e5c7af01d8ac9add0b8962 (diff) | |
download | compcert-59646439baa1b9cc6209b684e4ccf9aac908fdbc.tar.gz compcert-59646439baa1b9cc6209b684e4ccf9aac908fdbc.zip |
Support __builtin_memcpy; use it for struct assignment
git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@1319 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'arm/PrintAsm.ml')
-rw-r--r-- | arm/PrintAsm.ml | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/arm/PrintAsm.ml b/arm/PrintAsm.ml index 77bacc3c..bb99bb5c 100644 --- a/arm/PrintAsm.ml +++ b/arm/PrintAsm.ml @@ -232,6 +232,35 @@ let print_builtin_function oc s = fprintf oc " stfs %a, [%a, #0]\n" freg FR0 ireg IR0; 2 | "__builtin_volatile_write_float64" -> fprintf oc " stfd %a, [%a, #0]\n" freg FR0 ireg IR0; 1 + (* Block copy *) + | "__builtin_memcpy" -> + let lbl1 = new_label() in + let lbl2 = new_label() in + fprintf oc " cmp %a, #0\n" ireg IR2; + fprintf oc " beq %a\n" label lbl1; + fprintf oc "%a: ldrb %a, [%a], #1\n" label lbl2 ireg IR3 ireg IR1; + fprintf oc " subs %a, %a, #1\n" ireg IR2 ireg IR2; + fprintf oc " strb %a, [%a], #1\n" ireg IR3 ireg IR0; + fprintf oc " bne %a\n" label lbl2; + fprintf oc "%a:\n" label lbl1 +(* + let lbl = new_label() in + fprintf oc " cmp %a, #0\n" ireg IR2; + fprintf oc "%a: ldrbne %a, [%a], #1\n" label lbl ireg IR3 ireg IR1; + fprintf oc " strbne %a, [%a], #1\n" ireg IR3 ireg IR0; + fprintf oc " subnes %a, %a, #1\n" ireg IR2 ireg IR2; + fprintf oc " bne %a\n" label lbl +*) + | "__builtin_memcpy_word" -> + let lbl1 = new_label() in + let lbl2 = new_label() in + fprintf oc " movs %a, %a, lsr #2\n" ireg IR2 ireg IR2; + fprintf oc " beq %a\n" label lbl1; + fprintf oc "%a: ldr %a, [%a], #4\n" label lbl2 ireg IR3 ireg IR1; + fprintf oc " subs %a, %a, #1\n" ireg IR2 ireg IR2; + fprintf oc " str %a, [%a], #4\n" ireg IR3 ireg IR0; + fprintf oc " bne %a\n" label lbl2; + fprintf oc "%a:\n" label lbl1 (* Catch-all *) | s -> invalid_arg ("unrecognized builtin function " ^ s) |