diff options
author | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2010-09-02 12:42:19 +0000 |
---|---|---|
committer | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2010-09-02 12:42:19 +0000 |
commit | 265fa07b34a813ba9d8249ddad82d71e6002c10d (patch) | |
tree | 45831b1793c7920b10969fc7cf6316c202d78e91 /powerpc/PrintAsm.ml | |
parent | 94470fb6a652cb993982269fcb7a0e8319b54488 (diff) | |
download | compcert-265fa07b34a813ba9d8249ddad82d71e6002c10d.tar.gz compcert-265fa07b34a813ba9d8249ddad82d71e6002c10d.zip |
Merge of the reuse-temps branch:
- Reload temporaries are marked as destroyed (set to Vundef) across
operations in the semantics of LTL, LTLin, Linear and Mach,
allowing Asmgen to reuse them.
- Added IA32 port.
- Cleaned up float conversions and axiomatization of floats.
git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@1499 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'powerpc/PrintAsm.ml')
-rw-r--r-- | powerpc/PrintAsm.ml | 62 |
1 files changed, 11 insertions, 51 deletions
diff --git a/powerpc/PrintAsm.ml b/powerpc/PrintAsm.ml index 9df9cc0a..ef50795a 100644 --- a/powerpc/PrintAsm.ml +++ b/powerpc/PrintAsm.ml @@ -263,14 +263,15 @@ let rec log2 n = (* Built-ins. They come in two flavors: - inlined by the compiler: take their arguments in arbitrary - registers; preserve all registers except GPR12 and FPR13 + registers; preserve all registers except the temporaries + (GPR0, GPR11, GPR12, FPR0, FPR12, FPR13); - inlined while printing asm code; take their arguments in locations dictated by the calling conventions; preserve callee-save regs only. *) let print_builtin_inlined oc name args res = fprintf oc "%s begin builtin %s\n" comment name; - (* Can use as temporaries: GPR12, FPR13 *) + (* Can use as temporaries: GPR0, GPR11, GPR12, FPR0, FPR12, FPR13 *) begin match name, args, res with (* Volatile reads *) | "__builtin_volatile_read_int8unsigned", [IR addr], IR res -> @@ -524,32 +525,18 @@ let print_instruction oc labels = function fprintf oc " lwz %a, 4(%a)\n" ireg r1 ireg GPR1; fprintf oc " addi %a, %a, 8\n" ireg GPR1 ireg GPR1; fprintf oc "%s end pseudoinstr fcti\n" comment - | Pfctiu(r1, r2) -> - let lbl1 = new_label() in - let lbl2 = new_label() in - let lbl3 = new_label() in - fprintf oc "%s begin pseudoinstr %a = fctiu(%a)\n" comment ireg r1 freg r2; - fprintf oc " addis %a, 0, %a\n" ireg GPR12 label_high lbl1; - fprintf oc " lfd %a, %a(%a)\n" freg FPR13 label_low lbl1 ireg GPR12; - fprintf oc " fcmpu %a, %a, %a\n" creg 7 freg r2 freg FPR13; - fprintf oc " cror 30, 29, 30\n"; - fprintf oc " beq %a, %a\n" creg 7 label lbl2; - fprintf oc " fctiwz %a, %a\n" freg FPR13 freg r2; - fprintf oc " stfdu %a, -8(%a)\n" freg FPR13 ireg GPR1; - fprintf oc " lwz %a, 4(%a)\n" ireg r1 ireg GPR1; - fprintf oc " b %a\n" label lbl3; - fprintf oc "%a: fsub %a, %a, %a\n" label lbl2 freg FPR13 freg r2 freg FPR13; - fprintf oc " fctiwz %a, %a\n" freg FPR13 freg FPR13; - fprintf oc " stfdu %a, -8(%a)\n" freg FPR13 ireg GPR1; - fprintf oc " lwz %a, 4(%a)\n" ireg r1 ireg GPR1; - fprintf oc " addis %a, %a, 0x8000\n" ireg r1 ireg r1; - fprintf oc "%a: addi %a, %a, 8\n" label lbl3 ireg GPR1 ireg GPR1; - float_literals := (lbl1, 0x41e0_0000_0000_0000L) :: !float_literals; - fprintf oc "%s end pseudoinstr fctiu\n" comment | Pfdiv(r1, r2, r3) -> fprintf oc " fdiv %a, %a, %a\n" freg r1 freg r2 freg r3 | Pfmadd(r1, r2, r3, r4) -> fprintf oc " fmadd %a, %a, %a, %a\n" freg r1 freg r2 freg r3 freg r4 + | Pfmake(rd, r1, r2) -> + fprintf oc "%s begin pseudoinstr %a = fmake(%a, %a)\n" + comment freg rd ireg r1 ireg r2; + fprintf oc " stwu %a, -8(%a)\n" ireg r1 ireg GPR1; + fprintf oc " stw %a, 4(%a)\n" ireg r2 ireg GPR1; + fprintf oc " lfd %a, 0(%a)\n" freg rd ireg GPR1; + fprintf oc " addi %a, %a, 8\n" ireg GPR1 ireg GPR1; + fprintf oc "%s end pseudoinstr fmake\n" comment | Pfmr(r1, r2) -> fprintf oc " fmr %a, %a\n" freg r1 freg r2 | Pfmsub(r1, r2, r3, r4) -> @@ -562,33 +549,6 @@ let print_instruction oc labels = function fprintf oc " frsp %a, %a\n" freg r1 freg r2 | Pfsub(r1, r2, r3) -> fprintf oc " fsub %a, %a, %a\n" freg r1 freg r2 freg r3 - | Pictf(r1, r2) -> - let lbl = new_label() in - fprintf oc "%s begin pseudoinstr %a = ictf(%a)\n" comment freg r1 ireg r2; - fprintf oc " addis %a, 0, 0x4330\n" ireg GPR12; - fprintf oc " stwu %a, -8(%a)\n" ireg GPR12 ireg GPR1; - fprintf oc " addis %a, %a, 0x8000\n" ireg GPR12 ireg r2; - fprintf oc " stw %a, 4(%a)\n" ireg GPR12 ireg GPR1; - fprintf oc " addis %a, 0, %a\n" ireg GPR12 label_high lbl; - fprintf oc " lfd %a, %a(%a)\n" freg FPR13 label_low lbl ireg GPR12; - fprintf oc " lfd %a, 0(%a)\n" freg r1 ireg GPR1; - fprintf oc " addi %a, %a, 8\n" ireg GPR1 ireg GPR1; - fprintf oc " fsub %a, %a, %a\n" freg r1 freg r1 freg FPR13; - float_literals := (lbl, 0x4330_0000_8000_0000L) :: !float_literals; - fprintf oc "%s end pseudoinstr ictf\n" comment - | Piuctf(r1, r2) -> - let lbl = new_label() in - fprintf oc "%s begin pseudoinstr %a = iuctf(%a)\n" comment freg r1 ireg r2; - fprintf oc " addis %a, 0, 0x4330\n" ireg GPR12; - fprintf oc " stwu %a, -8(%a)\n" ireg GPR12 ireg GPR1; - fprintf oc " stw %a, 4(%a)\n" ireg r2 ireg GPR1; - fprintf oc " addis %a, 0, %a\n" ireg GPR12 label_high lbl; - fprintf oc " lfd %a, %a(%a)\n" freg FPR13 label_low lbl ireg GPR12; - fprintf oc " lfd %a, 0(%a)\n" freg r1 ireg GPR1; - fprintf oc " addi %a, %a, 8\n" ireg GPR1 ireg GPR1; - fprintf oc " fsub %a, %a, %a\n" freg r1 freg r1 freg FPR13; - float_literals := (lbl, 0x4330_0000_0000_0000L) :: !float_literals; - fprintf oc "%s end pseudoinstr ictf\n" comment | Plbz(r1, c, r2) -> fprintf oc " lbz %a, %a(%a)\n" ireg r1 constant c ireg r2 | Plbzx(r1, r2, r3) -> |