Port AvgRound & SqmulRoundSat to ISLE (AArch64) (#4639)
Ported the existing implementations of the following opcodes on AArch64 to ISLE: - `AvgRound` - Also introduced support for `i64x2` vectors, as per the docs. - `SqmulRoundSat` Copyright (c) 2022 Arm Limited
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
test compile precise-output
|
||||
set unwind_info=false
|
||||
target aarch64
|
||||
|
||||
function %average_rounding_i8x8(i8x8, i8x8) -> i8x8 {
|
||||
block0(v0: i8x8, v1: i8x8):
|
||||
v2 = avg_round v0, v1
|
||||
return v2
|
||||
}
|
||||
|
||||
; block0:
|
||||
; urhadd v0.8b, v0.8b, v1.8b
|
||||
; ret
|
||||
|
||||
function %average_rounding_i8x16(i8x16, i8x16) -> i8x16 {
|
||||
block0(v0: i8x16, v1: i8x16):
|
||||
v2 = avg_round v0, v1
|
||||
return v2
|
||||
}
|
||||
|
||||
; block0:
|
||||
; urhadd v0.16b, v0.16b, v1.16b
|
||||
; ret
|
||||
|
||||
function %average_rounding_i16x4(i16x4, i16x4) -> i16x4 {
|
||||
block0(v0: i16x4, v1: i16x4):
|
||||
v2 = avg_round v0, v1
|
||||
return v2
|
||||
}
|
||||
|
||||
; block0:
|
||||
; urhadd v0.4h, v0.4h, v1.4h
|
||||
; ret
|
||||
|
||||
function %average_rounding_i16x8(i16x8, i16x8) -> i16x8 {
|
||||
block0(v0: i16x8, v1: i16x8):
|
||||
v2 = avg_round v0, v1
|
||||
return v2
|
||||
}
|
||||
|
||||
; block0:
|
||||
; urhadd v0.8h, v0.8h, v1.8h
|
||||
; ret
|
||||
|
||||
function %average_rounding_i32x2(i32x2, i32x2) -> i32x2 {
|
||||
block0(v0: i32x2, v1: i32x2):
|
||||
v2 = avg_round v0, v1
|
||||
return v2
|
||||
}
|
||||
|
||||
; block0:
|
||||
; urhadd v0.2s, v0.2s, v1.2s
|
||||
; ret
|
||||
|
||||
function %average_rounding_i32x4(i32x4, i32x4) -> i32x4 {
|
||||
block0(v0: i32x4, v1: i32x4):
|
||||
v2 = avg_round v0, v1
|
||||
return v2
|
||||
}
|
||||
|
||||
; block0:
|
||||
; urhadd v0.4s, v0.4s, v1.4s
|
||||
; ret
|
||||
|
||||
function %average_rounding_i64x2(i64x2, i64x2) -> i64x2 {
|
||||
block0(v0: i64x2, v1: i64x2):
|
||||
v2 = avg_round v0, v1
|
||||
return v2
|
||||
}
|
||||
|
||||
; block0:
|
||||
; movz x6, #1
|
||||
; dup v6.2d, x6
|
||||
; orr v17.16b, v0.16b, v1.16b
|
||||
; and v19.16b, v17.16b, v6.16b
|
||||
; ushr v21.2d, v0.2d, #1
|
||||
; ushr v23.2d, v1.2d, #1
|
||||
; add v25.2d, v21.2d, v23.2d
|
||||
; add v0.2d, v19.2d, v25.2d
|
||||
; ret
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
; the interpreter does not currently support some of these instructions
|
||||
; such as `avg_round` on SIMD values.
|
||||
test run
|
||||
target aarch64
|
||||
target s390x
|
||||
@@ -172,6 +174,13 @@ block0(v0: f32x4):
|
||||
}
|
||||
; run: %fabs_f32x4([0x0.0 -0x1.0 0x2.0 -0x3.0]) == [0x0.0 0x1.0 0x2.0 0x3.0]
|
||||
|
||||
function %average_rounding_i8x16(i8x16, i8x16) -> i8x16 {
|
||||
block0(v0: i8x16, v1: i8x16):
|
||||
v2 = avg_round v0, v1
|
||||
return v2
|
||||
}
|
||||
; run: %average_rounding_i8x16([0 0 0 1 42 19 -1 0xff 5 0 0 0 1 42 19 -1], [0 1 2 4 42 18 -1 0 10 0 1 2 4 42 18 -1]) == [0 1 1 3 42 19 -1 0x80 8 0 1 1 3 42 19 -1]
|
||||
|
||||
function %average_rounding_i16x8(i16x8, i16x8) -> i16x8 {
|
||||
block0(v0: i16x8, v1: i16x8):
|
||||
v2 = avg_round v0, v1
|
||||
|
||||
51
cranelift/filetests/filetests/runtests/simd-avg-round.clif
Normal file
51
cranelift/filetests/filetests/runtests/simd-avg-round.clif
Normal file
@@ -0,0 +1,51 @@
|
||||
; the interpreter does not currently support SIMD `avg_round`.
|
||||
test run
|
||||
target aarch64
|
||||
; x86_64 and s390x do not currently support 64-bit vectors, or
|
||||
; `avg_round` on `i64x2` values.
|
||||
; x86_64 also does not currently support `avg_round.i32x4`.
|
||||
|
||||
function %average_rounding_i8x8(i8x8, i8x8) -> i8x8 {
|
||||
block0(v0: i8x8, v1: i8x8):
|
||||
v2 = avg_round v0, v1
|
||||
return v2
|
||||
}
|
||||
; run: %average_rounding_i8x8([0 0 0 1 42 19 -1 0xff], [0 1 2 4 42 18 -1 0]) == [0 1 1 3 42 19 -1 0x80]
|
||||
|
||||
function %average_rounding_i16x4(i16x4, i16x4) -> i16x4 {
|
||||
block0(v0: i16x4, v1: i16x4):
|
||||
v2 = avg_round v0, v1
|
||||
return v2
|
||||
}
|
||||
; run: %average_rounding_i16x4([0 0 0 1], [0 1 2 4]) == [0 1 1 3]
|
||||
; run: %average_rounding_i16x4([42 19 -1 0xffff], [42 18 -1 0]) == [42 19 -1 0x8000]
|
||||
|
||||
function %average_rounding_i32x2(i32x2, i32x2) -> i32x2 {
|
||||
block0(v0: i32x2, v1: i32x2):
|
||||
v2 = avg_round v0, v1
|
||||
return v2
|
||||
}
|
||||
; run: %average_rounding_i32x2([0 0], [0 1]) == [0 1]
|
||||
; run: %average_rounding_i32x2([0 1], [2 4]) == [1 3]
|
||||
; run: %average_rounding_i32x2([42 19], [42 18]) == [42 19]
|
||||
; run: %average_rounding_i32x2([-1 0xffffffff], [-1 0]) == [-1 0x80000000]
|
||||
; run: %average_rounding_i32x2([0xffffffff 0xfffffffd], [10 0xffffffff]) == [0x80000005 0xfffffffe]
|
||||
|
||||
function %average_rounding_i32x4(i32x4, i32x4) -> i32x4 {
|
||||
block0(v0: i32x4, v1: i32x4):
|
||||
v2 = avg_round v0, v1
|
||||
return v2
|
||||
}
|
||||
; run: %average_rounding_i32x4([0 0 0 0xffffffff], [0 1 2 0]) == [0 1 1 0x80000000]
|
||||
; run: %average_rounding_i32x4([1 42 19 -1], [4 42 18 -1]) == [3 42 19 -1]
|
||||
|
||||
function %average_rounding_i64x2(i64x2, i64x2) -> i64x2 {
|
||||
block0(v0: i64x2, v1: i64x2):
|
||||
v2 = avg_round v0, v1
|
||||
return v2
|
||||
}
|
||||
; run: %average_rounding_i64x2([0 0], [0 1]) == [0 1]
|
||||
; run: %average_rounding_i64x2([0 1], [2 4]) == [1 3]
|
||||
; run: %average_rounding_i64x2([42 19], [42 18]) == [42 19]
|
||||
; run: %average_rounding_i64x2([-1 0xffffffffffffffff], [-1 0]) == [-1 0x8000000000000000]
|
||||
; run: %average_rounding_i64x2([0xffffffffffffffff 0xfffffffffffffffd], [10 0xffffffffffffffff]) == [0x8000000000000005 0xfffffffffffffffe]
|
||||
Reference in New Issue
Block a user