From 1ea7fbeaab845a14b4df803b791e0fc81f61ff9d Mon Sep 17 00:00:00 2001 From: xleroy Date: Thu, 21 Aug 2014 14:09:09 +0000 Subject: Use VFD regs to implement 64-bit mem-mem copies in builtin_memcpy_false. git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@2616 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e --- arm/PrintAsm.ml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'arm/PrintAsm.ml') diff --git a/arm/PrintAsm.ml b/arm/PrintAsm.ml index 5c2833f..dfe6bfc 100644 --- a/arm/PrintAsm.ml +++ b/arm/PrintAsm.ml @@ -368,16 +368,21 @@ let print_annot_val oc txt args res = | [IR src], [IR dst] -> if dst = src then 0 else (fprintf oc " mov %a, %a\n" ireg dst ireg src; 1) | [FR src], [FR dst] -> - if dst = src then 0 else (fprintf oc " fcpyd %a, %a\n" freg dst freg src; 1) + if dst = src then 0 else (fprintf oc " vmov.f64 %a, %a\n" freg dst freg src; 1) | _, _ -> assert false (* Handling of memcpy *) -(* The ARM has strict alignment constraints. *) +(* The ARM has strict alignment constraints for 2 and 4 byte accesses. + 8-byte accesses must be 4-aligned. *) let print_builtin_memcpy_small oc sz al src dst = let rec copy ofs sz ninstr = - if sz >= 4 && al >= 4 then begin + if sz >= 8 && al >= 4 && !Clflags.option_ffpu then begin + fprintf oc " vldr %a, [%a, #%d]\n" freg FR7 ireg src ofs; + fprintf oc " vstr %a, [%a, #%d]\n" freg FR7 ireg dst ofs; + copy (ofs + 8) (sz - 8) (ninstr + 2) + end else if sz >= 4 && al >= 4 then begin fprintf oc " ldr %a, [%a, #%d]\n" ireg IR14 ireg src ofs; fprintf oc " str %a, [%a, #%d]\n" ireg IR14 ireg dst ofs; copy (ofs + 4) (sz - 4) (ninstr + 2) -- cgit v1.2.3