aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCyril SIX <cyril.six@kalray.eu>2018-11-30 17:31:11 +0100
committerCyril SIX <cyril.six@kalray.eu>2018-11-30 17:31:11 +0100
commit79a2dac7e5317e515ce9610db1d48d0fc9ff0708 (patch)
treefe280055b9f4697ae9f1f61398d43b041b229fc7
parent30e8e1618e59bdb585b1fb36cddce41eefe12364 (diff)
downloadcompcert-kvx-79a2dac7e5317e515ce9610db1d48d0fc9ff0708.tar.gz
compcert-kvx-79a2dac7e5317e515ce9610db1d48d0fc9ff0708.zip
Finished implementation of va_arg + testing done
-rw-r--r--mppa_k1c/Asmexpand.ml12
-rw-r--r--runtime/Makefile2
-rw-r--r--runtime/mppa_k1c/vararg.S72
-rw-r--r--test/mppa/instr/Makefile2
-rw-r--r--test/mppa/interop/Makefile6
5 files changed, 85 insertions, 9 deletions
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)