From 79a2dac7e5317e515ce9610db1d48d0fc9ff0708 Mon Sep 17 00:00:00 2001 From: Cyril SIX Date: Fri, 30 Nov 2018 17:31:11 +0100 Subject: Finished implementation of va_arg + testing done --- mppa_k1c/Asmexpand.ml | 12 +++++--- runtime/Makefile | 2 +- runtime/mppa_k1c/vararg.S | 72 ++++++++++++++++++++++++++++++++++++++++++++++ test/mppa/instr/Makefile | 2 +- test/mppa/interop/Makefile | 6 ++-- 5 files changed, 85 insertions(+), 9 deletions(-) create mode 100644 runtime/mppa_k1c/vararg.S diff --git a/mppa_k1c/Asmexpand.ml b/mppa_k1c/Asmexpand.ml index 07b15a63..3209163f 100644 --- a/mppa_k1c/Asmexpand.ml +++ b/mppa_k1c/Asmexpand.ml @@ -330,8 +330,11 @@ let rec args_size sz = function let arguments_size sg = args_size 0 sg.sig_args +let _nbregargs_ = 12 +let _alignment_ = 8 + let save_arguments first_reg base_ofs = let open Asmblock in - for i = first_reg to 7 do + for i = first_reg to (_nbregargs_ - 1) do expand_storeind_ptr int_param_regs.(i) GPR12 @@ -442,12 +445,13 @@ let expand_instruction instr = emit (Pmv (Asmblock.GPR14, Asmblock.GPR12)); if sg.sig_cc.cc_vararg then begin let n = arguments_size sg in - let extra_sz = if n >= 8 then 0 else align 16 ((8 - n) * wordsize) in + let extra_sz = if n >= _nbregargs_ then 0 else (* align _alignment_ *) ((_nbregargs_ - n) * wordsize) in let full_sz = Z.add sz (Z.of_uint extra_sz) in expand_addptrofs Asmblock.GPR12 Asmblock.GPR12 (Ptrofs.repr (Z.neg full_sz)); expand_storeind_ptr Asmblock.GPR14 Asmblock.GPR12 ofs; let va_ofs = - Z.add full_sz (Z.of_sint ((n - 8) * wordsize)) in + sz in + (*Z.add full_sz (Z.of_sint ((n - _nbregargs_) * wordsize)) in *) vararg_start_ofs := Some va_ofs; save_arguments n va_ofs end else begin @@ -460,7 +464,7 @@ let expand_instruction instr = let extra_sz = if sg.sig_cc.cc_vararg then begin let n = arguments_size sg in - if n >= 8 then 0 else align 16 ((8 - n) * wordsize) + if n >= _nbregargs_ then 0 else (* align _alignment_ *) ((_nbregargs_ - n) * wordsize) end else 0 in expand_addptrofs Asmblock.GPR12 Asmblock.GPR12 (Ptrofs.repr (Z.add sz (Z.of_uint extra_sz))) diff --git a/runtime/Makefile b/runtime/Makefile index 30c1fc83..66ec6fec 100644 --- a/runtime/Makefile +++ b/runtime/Makefile @@ -23,7 +23,7 @@ OBJS=i64_dtou.o i64_utod.o i64_utof.o vararg.o else ifeq ($(ARCH),powerpc64) OBJS=i64_dtou.o i64_stof.o i64_utod.o i64_utof.o vararg.o else ifeq ($(ARCH),mppa_k1c) -OBJS=i64_umod.o i64_udiv.o i64_udivmod.o i64_sdiv.o i64_smod.o +OBJS=i64_umod.o i64_udiv.o i64_udivmod.o i64_sdiv.o i64_smod.o vararg.o DOMAKE:=$(shell (cd mppa_k1c && make)) else OBJS=i64_dtos.o i64_dtou.o i64_sar.o i64_sdiv.o i64_shl.o \ diff --git a/runtime/mppa_k1c/vararg.S b/runtime/mppa_k1c/vararg.S new file mode 100644 index 00000000..41c2b39e --- /dev/null +++ b/runtime/mppa_k1c/vararg.S @@ -0,0 +1,72 @@ + +// typedef void * va_list; +// unsigned int __compcert_va_int32(va_list * ap); +// unsigned long long __compcert_va_int64(va_list * ap); + + .text + .balign 2 + .globl __compcert_va_int32 +__compcert_va_int32: +# Prologue + addd $r14 = $r12, 0 +;; + addd $r12 = $r12, -16 +;; + sd 0[$r12] = $r14 +;; + get $r16 = $ra +;; + sd 8[$r12] = $r16 +;; +# Body + ld $r32 = 0[$r0] # $r32 <- *ap +;; + addd $r32 = $r32, 8 # $r32 <- $r32 + WORDSIZE +;; + sd 0[$r0] = $r32 # *ap <- $r32 +;; + lws $r0 = -8[$r32] # retvalue <- 32-bits at *ap - WORDSIZE +;; +# Prologue + ld $r16 = 8[$r12] +;; + set $ra = $r16 +;; + addd $r12 = $r12, 16 +;; + ret +;; + + .text + .balign 2 + .globl __compcert_va_int64 +__compcert_va_int64: +# Prologue + addd $r14 = $r12, 0 +;; + addd $r12 = $r12, -16 +;; + sd 0[$r12] = $r14 +;; + get $r16 = $ra +;; + sd 8[$r12] = $r16 +;; +# Body + ld $r32 = 0[$r0] # $r32 <- *ap +;; + addd $r32 = $r32, 8 # $r32 <- $r32 + WORDSIZE +;; + sd 0[$r0] = $r32 # *ap <- $r32 +;; + ld $r0 = -8[$r32] # retvalue <- 64-bits at *ap - WORDSIZE +;; +# Prologue + ld $r16 = 8[$r12] +;; + set $ra = $r16 +;; + addd $r12 = $r12, 16 +;; + ret +;; diff --git a/test/mppa/instr/Makefile b/test/mppa/instr/Makefile index 27449e88..9d1fbb5f 100644 --- a/test/mppa/instr/Makefile +++ b/test/mppa/instr/Makefile @@ -3,7 +3,7 @@ CC ?= gcc CCOMP ?= ccomp CFLAGS ?= -O2 SIMU ?= k1-mppa -TIMEOUT ?= --signal=SIGTERM 20s +TIMEOUT ?= --signal=SIGTERM 60s DIR=./ SRCDIR=$(DIR) diff --git a/test/mppa/interop/Makefile b/test/mppa/interop/Makefile index f4dc259e..78271a4e 100644 --- a/test/mppa/interop/Makefile +++ b/test/mppa/interop/Makefile @@ -3,7 +3,7 @@ CC ?= gcc CCOMP ?= ccomp CFLAGS ?= -O2 -Wno-varargs SIMU ?= k1-mppa -TIMEOUT ?= --signal=SIGTERM 40s +TIMEOUT ?= --signal=SIGTERM 80s DIR=./ SRCDIR=$(DIR) @@ -212,7 +212,7 @@ $(BINDIR)/%.gcc.bin: $(OBJDIR)/%.gcc.o $(OBJDIR)/$(COMMON).gcc.o $(K1CCPATH) $(BINDIR)/%.gcc.rev.bin: $(OBJDIR)/%.gcc.o $(OBJDIR)/$(COMMON).ccomp.o $(K1CCPATH) @mkdir -p $(@D) - $(K1CC) $(CFLAGS) $(wordlist 1,2,$^) -o $@ + $(CCOMP) $(CFLAGS) $(wordlist 1,2,$^) -o $@ $(BINDIR)/%.ccomp.bin: $(OBJDIR)/%.ccomp.o $(OBJDIR)/$(COMMON).gcc.o $(CCOMPPATH) @mkdir -p $(@D) @@ -230,7 +230,7 @@ $(BINDIR)/%.gcc.vaarg.bin: $(OBJDIR)/%.gcc.o $(OBJDIR)/$(VAARG_COMMON).gcc.o $(K $(BINDIR)/%.gcc.rev.vaarg.bin: $(OBJDIR)/%.gcc.o $(OBJDIR)/$(VAARG_COMMON).ccomp.o $(K1CCPATH) @mkdir -p $(@D) - $(K1CC) $(CFLAGS) $(wordlist 1,2,$^) -o $@ + $(CCOMP) $(CFLAGS) $(wordlist 1,2,$^) -o $@ $(BINDIR)/%.ccomp.vaarg.bin: $(OBJDIR)/%.ccomp.o $(OBJDIR)/$(VAARG_COMMON).gcc.o $(CCOMPPATH) @mkdir -p $(@D) -- cgit