From e4a83c8063fa4699a5fbfd66f7b2cc40073cbb2f Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Fri, 17 Mar 2017 10:05:56 -0700 Subject: [PATCH] Break out differently purposed tests from abi.cton. - abi.cton is for testing the actual RISC-V ABI. - legalize-abi.cton is for testing the legalizer around ABI boundaries. - parse-encoding.cton is for testing the parser's handling of RISC-V encoding and register annotations. --- filetests/isa/riscv/abi.cton | 75 ------------------------- filetests/isa/riscv/legalize-abi.cton | 47 ++++++++++++++++ filetests/isa/riscv/parse-encoding.cton | 36 ++++++++++++ 3 files changed, 83 insertions(+), 75 deletions(-) create mode 100644 filetests/isa/riscv/legalize-abi.cton create mode 100644 filetests/isa/riscv/parse-encoding.cton diff --git a/filetests/isa/riscv/abi.cton b/filetests/isa/riscv/abi.cton index 50af69638f..d75813e220 100644 --- a/filetests/isa/riscv/abi.cton +++ b/filetests/isa/riscv/abi.cton @@ -31,78 +31,3 @@ function f(i32) { ebb0(v0: i32): return_reg v0 } - -function int_split_args(i64) -> i64 { -ebb0(v0: i64): - ; check: $ebb0($(v0l=$VX): i32, $(v0h=$VX): i32): - ; check: iconcat_lohi $v0l, $v0h - v1 = iadd_imm v0, 1 - ; check: $(v1l=$V), $(v1h=$VX) = isplit_lohi $v1 - ; check: return $v1l, $v1h - return v1 -} - -function int_ext(i8, i8 sext, i8 uext) -> i8 uext { -ebb0(v1: i8, v2: i8, v3: i8): - ; check: $ebb0($v1: i8, $(v2x=$VX): i32, $(v3x=$VX): i32): - ; check: ireduce.i8 $v2x - ; check: ireduce.i8 $v3x - ; check: $(v1x=$V) = uextend.i32 $v1 - ; check: return $v1x - return v1 -} - -function vector_split_args(i64x4) -> i64x4 { -ebb0(v0: i64x4): - ; check: $ebb0($(v0al=$VX): i32, $(v0ah=$VX): i32, $(v0bl=$VX): i32, $(v0bh=$VX): i32, $(v0cl=$VX): i32, $(v0ch=$VX): i32, $(v0dl=$VX): i32, $(v0dh=$VX): i32): - ; check: $(v0a=$V) = iconcat_lohi $v0al, $v0ah - ; check: $(v0b=$V) = iconcat_lohi $v0bl, $v0bh - ; check: $(v0ab=$V) = vconcat $v0a, $v0b - ; check: $(v0c=$V) = iconcat_lohi $v0cl, $v0ch - ; check: $(v0d=$V) = iconcat_lohi $v0dl, $v0dh - ; check: $(v0cd=$V) = vconcat $v0c, $v0d - ; check: $(v0abcd=$V) = vconcat $v0ab, $v0cd - v1 = iadd v0, v0 - ; check: $(v1ab=$V), $(v1cd=$VX) = vsplit - ; check: $(v1a=$V), $(v1b=$VX) = vsplit $v1ab - ; check: $(v1al=$V), $(v1ah=$VX) = isplit_lohi $v1a - ; check: $(v1bl=$V), $(v1bh=$VX) = isplit_lohi $v1b - ; check: $(v1c=$V), $(v1d=$VX) = vsplit $v1cd - ; check: $(v1cl=$V), $(v1ch=$VX) = isplit_lohi $v1c - ; check: $(v1dl=$V), $(v1dh=$VX) = isplit_lohi $v1d - ; check: return $v1al, $v1ah, $v1bl, $v1bh, $v1cl, $v1ch, $v1dl, $v1dh - return v1 -} - -function parse_encoding(i32 [%x5]) -> i32 [%x10] { - ; check: function parse_encoding(i32 [%x5]) -> i32 [%x10] { - - sig0 = signature(i32 [%x10]) -> i32 [%x10] - ; check: sig0 = signature(i32 [%x10]) -> i32 [%x10] - - sig1 = signature(i32 [%x10], i32 [%x11]) -> b1 [%x10] - ; check: sig1 = signature(i32 [%x10], i32 [%x11]) -> b1 [%x10] - - sig2 = signature(f32 [%f10], i32 [%x12], i32 [%x13]) -> f64 [%f10] - ; check: sig2 = signature(f32 [%f10], i32 [%x12], i32 [%x13]) -> f64 [%f10] - - ; Arguments on stack where not necessary - sig3 = signature(f64 [%f10], i32 [0], i32 [4]) -> f64 [%f10] - ; check: sig3 = signature(f64 [%f10], i32 [0], i32 [4]) -> f64 [%f10] - - ; Stack argument before register argument - sig4 = signature(f32 [72], i32 [%x10]) - ; check: sig4 = signature(f32 [72], i32 [%x10]) - - ; Return value on stack - sig5 = signature() -> f32 [0] - ; check: sig5 = signature() -> f32 [0] - - ; function + signature - fn15 = function bar(i32 [%x10]) -> b1 [%x10] - ; check: sig6 = signature(i32 [%x10]) -> b1 [%x10] - ; nextln: fn0 = sig6 bar - -ebb0(v0: i32): - return v0 -} diff --git a/filetests/isa/riscv/legalize-abi.cton b/filetests/isa/riscv/legalize-abi.cton new file mode 100644 index 0000000000..bf93596128 --- /dev/null +++ b/filetests/isa/riscv/legalize-abi.cton @@ -0,0 +1,47 @@ +; Test legalizer's handling of ABI boundaries. +test legalizer +isa riscv + +; regex: V=vx?\d+ + +function int_split_args(i64) -> i64 { +ebb0(v0: i64): + ; check: $ebb0($(v0l=$V): i32, $(v0h=$V): i32): + ; check: iconcat_lohi $v0l, $v0h + v1 = iadd_imm v0, 1 + ; check: $(v1l=$V), $(v1h=$V) = isplit_lohi $v1 + ; check: return $v1l, $v1h + return v1 +} + +function int_ext(i8, i8 sext, i8 uext) -> i8 uext { +ebb0(v1: i8, v2: i8, v3: i8): + ; check: $ebb0($v1: i8, $(v2x=$V): i32, $(v3x=$V): i32): + ; check: ireduce.i8 $v2x + ; check: ireduce.i8 $v3x + ; check: $(v1x=$V) = uextend.i32 $v1 + ; check: return $v1x + return v1 +} + +function vector_split_args(i64x4) -> i64x4 { +ebb0(v0: i64x4): + ; check: $ebb0($(v0al=$V): i32, $(v0ah=$V): i32, $(v0bl=$V): i32, $(v0bh=$V): i32, $(v0cl=$V): i32, $(v0ch=$V): i32, $(v0dl=$V): i32, $(v0dh=$V): i32): + ; check: $(v0a=$V) = iconcat_lohi $v0al, $v0ah + ; check: $(v0b=$V) = iconcat_lohi $v0bl, $v0bh + ; check: $(v0ab=$V) = vconcat $v0a, $v0b + ; check: $(v0c=$V) = iconcat_lohi $v0cl, $v0ch + ; check: $(v0d=$V) = iconcat_lohi $v0dl, $v0dh + ; check: $(v0cd=$V) = vconcat $v0c, $v0d + ; check: $(v0abcd=$V) = vconcat $v0ab, $v0cd + v1 = iadd v0, v0 + ; check: $(v1ab=$V), $(v1cd=$V) = vsplit + ; check: $(v1a=$V), $(v1b=$V) = vsplit $v1ab + ; check: $(v1al=$V), $(v1ah=$V) = isplit_lohi $v1a + ; check: $(v1bl=$V), $(v1bh=$V) = isplit_lohi $v1b + ; check: $(v1c=$V), $(v1d=$V) = vsplit $v1cd + ; check: $(v1cl=$V), $(v1ch=$V) = isplit_lohi $v1c + ; check: $(v1dl=$V), $(v1dh=$V) = isplit_lohi $v1d + ; check: return $v1al, $v1ah, $v1bl, $v1bh, $v1cl, $v1ch, $v1dl, $v1dh + return v1 +} diff --git a/filetests/isa/riscv/parse-encoding.cton b/filetests/isa/riscv/parse-encoding.cton new file mode 100644 index 0000000000..d3cc6eee4b --- /dev/null +++ b/filetests/isa/riscv/parse-encoding.cton @@ -0,0 +1,36 @@ +; Test the parser's support for encoding annotations. +test legalizer +isa riscv + +function parse_encoding(i32 [%x5]) -> i32 [%x10] { + ; check: function parse_encoding(i32 [%x5]) -> i32 [%x10] { + + sig0 = signature(i32 [%x10]) -> i32 [%x10] + ; check: sig0 = signature(i32 [%x10]) -> i32 [%x10] + + sig1 = signature(i32 [%x10], i32 [%x11]) -> b1 [%x10] + ; check: sig1 = signature(i32 [%x10], i32 [%x11]) -> b1 [%x10] + + sig2 = signature(f32 [%f10], i32 [%x12], i32 [%x13]) -> f64 [%f10] + ; check: sig2 = signature(f32 [%f10], i32 [%x12], i32 [%x13]) -> f64 [%f10] + + ; Arguments on stack where not necessary + sig3 = signature(f64 [%f10], i32 [0], i32 [4]) -> f64 [%f10] + ; check: sig3 = signature(f64 [%f10], i32 [0], i32 [4]) -> f64 [%f10] + + ; Stack argument before register argument + sig4 = signature(f32 [72], i32 [%x10]) + ; check: sig4 = signature(f32 [72], i32 [%x10]) + + ; Return value on stack + sig5 = signature() -> f32 [0] + ; check: sig5 = signature() -> f32 [0] + + ; function + signature + fn15 = function bar(i32 [%x10]) -> b1 [%x10] + ; check: sig6 = signature(i32 [%x10]) -> b1 [%x10] + ; nextln: fn0 = sig6 bar + +ebb0(v0: i32): + return v0 +}