Convert fadd..fmax_pseudo to ISLE (AArch64) (#4452)
Converted the existing implementations for the following Opcodes to ISLE on AArch64: - `fadd` - `fsub` - `fmul` - `fdiv` - `fmin` - `fmax` - `fmin_pseudo` - `fmax_pseudo` Copyright (c) 2022 Arm Limited
This commit is contained in:
@@ -102,3 +102,107 @@ block0(v0: f64, v1: f64):
|
||||
; nextln: dup v6.2d, v1.d[0]
|
||||
; nextln: fsub v0.2d, v4.2d, v6.2d
|
||||
; nextln: ret
|
||||
|
||||
function %f64x2_splat_mul(f64, f64) -> f64x2 {
|
||||
gv0 = dyn_scale_target_const.f64x2
|
||||
dt0 = f64x2*gv0
|
||||
|
||||
block0(v0: f64, v1: f64):
|
||||
v2 = splat.dt0 v0
|
||||
v3 = splat.dt0 v1
|
||||
v4 = fmul v2, v3
|
||||
v5 = extract_vector v4, 0
|
||||
return v5
|
||||
}
|
||||
|
||||
; check: dup v4.2d, v0.d[0]
|
||||
; nextln: dup v6.2d, v1.d[0]
|
||||
; nextln: fmul v0.2d, v4.2d, v6.2d
|
||||
; nextln: ret
|
||||
|
||||
function %f64x2_splat_div(f64, f64) -> f64x2 {
|
||||
gv0 = dyn_scale_target_const.f64x2
|
||||
dt0 = f64x2*gv0
|
||||
|
||||
block0(v0: f64, v1: f64):
|
||||
v2 = splat.dt0 v0
|
||||
v3 = splat.dt0 v1
|
||||
v4 = fdiv v2, v3
|
||||
v5 = extract_vector v4, 0
|
||||
return v5
|
||||
}
|
||||
|
||||
; check: dup v4.2d, v0.d[0]
|
||||
; nextln: dup v6.2d, v1.d[0]
|
||||
; nextln: fdiv v0.2d, v4.2d, v6.2d
|
||||
; nextln: ret
|
||||
|
||||
function %f64x2_splat_min(f64, f64) -> f64x2 {
|
||||
gv0 = dyn_scale_target_const.f64x2
|
||||
dt0 = f64x2*gv0
|
||||
|
||||
block0(v0: f64, v1: f64):
|
||||
v2 = splat.dt0 v0
|
||||
v3 = splat.dt0 v1
|
||||
v4 = fmin v2, v3
|
||||
v5 = extract_vector v4, 0
|
||||
return v5
|
||||
}
|
||||
|
||||
; check: dup v4.2d, v0.d[0]
|
||||
; nextln: dup v6.2d, v1.d[0]
|
||||
; nextln: fmin v0.2d, v4.2d, v6.2d
|
||||
; nextln: ret
|
||||
|
||||
function %f64x2_splat_max(f64, f64) -> f64x2 {
|
||||
gv0 = dyn_scale_target_const.f64x2
|
||||
dt0 = f64x2*gv0
|
||||
|
||||
block0(v0: f64, v1: f64):
|
||||
v2 = splat.dt0 v0
|
||||
v3 = splat.dt0 v1
|
||||
v4 = fmax v2, v3
|
||||
v5 = extract_vector v4, 0
|
||||
return v5
|
||||
}
|
||||
|
||||
; check: dup v4.2d, v0.d[0]
|
||||
; nextln: dup v6.2d, v1.d[0]
|
||||
; nextln: fmax v0.2d, v4.2d, v6.2d
|
||||
; nextln: ret
|
||||
|
||||
function %f64x2_splat_min_pseudo(f64, f64) -> f64x2 {
|
||||
gv0 = dyn_scale_target_const.f64x2
|
||||
dt0 = f64x2*gv0
|
||||
|
||||
block0(v0: f64, v1: f64):
|
||||
v2 = splat.dt0 v0
|
||||
v3 = splat.dt0 v1
|
||||
v4 = fmin_pseudo v2, v3
|
||||
v5 = extract_vector v4, 0
|
||||
return v5
|
||||
}
|
||||
|
||||
; check: dup v4.2d, v0.d[0]
|
||||
; nextln: dup v6.2d, v1.d[0]
|
||||
; nextln: fcmgt v0.2d, v4.2d, v6.2d
|
||||
; nextln: bsl v0.16b, v6.16b, v4.16b
|
||||
; nextln: ret
|
||||
|
||||
function %f64x2_splat_max_pseudo(f64, f64) -> f64x2 {
|
||||
gv0 = dyn_scale_target_const.f64x2
|
||||
dt0 = f64x2*gv0
|
||||
|
||||
block0(v0: f64, v1: f64):
|
||||
v2 = splat.dt0 v0
|
||||
v3 = splat.dt0 v1
|
||||
v4 = fmax_pseudo v2, v3
|
||||
v5 = extract_vector v4, 0
|
||||
return v5
|
||||
}
|
||||
|
||||
; check: dup v4.2d, v0.d[0]
|
||||
; nextln: dup v6.2d, v1.d[0]
|
||||
; nextln: fcmgt v0.2d, v6.2d, v4.2d
|
||||
; nextln: bsl v0.16b, v6.16b, v4.16b
|
||||
; nextln: ret
|
||||
|
||||
@@ -82,68 +82,68 @@ block0(v0: f64):
|
||||
; stp d10, d11, [sp, #-16]!
|
||||
; stp d8, d9, [sp, #-16]!
|
||||
; block0:
|
||||
; fadd d2, d0, d0
|
||||
; fadd d4, d0, d0
|
||||
; fadd d6, d0, d0
|
||||
; fadd d8, d0, d0
|
||||
; fadd d10, d0, d0
|
||||
; fadd d12, d0, d0
|
||||
; fadd d14, d0, d0
|
||||
; fadd d1, d0, d0
|
||||
; fadd d2, d0, d0
|
||||
; fadd d3, d0, d0
|
||||
; fadd d4, d0, d0
|
||||
; fadd d5, d0, d0
|
||||
; fadd d6, d0, d0
|
||||
; fadd d7, d0, d0
|
||||
; fadd d8, d0, d0
|
||||
; fadd d9, d0, d0
|
||||
; fadd d10, d0, d0
|
||||
; fadd d11, d0, d0
|
||||
; fadd d12, d0, d0
|
||||
; fadd d13, d0, d0
|
||||
; fadd d30, d0, d0
|
||||
; fadd d14, d0, d0
|
||||
; fadd d15, d0, d0
|
||||
; fadd d18, d0, d0
|
||||
; fadd d20, d0, d0
|
||||
; fadd d22, d0, d0
|
||||
; fadd d24, d0, d0
|
||||
; fadd d26, d0, d0
|
||||
; fadd d28, d0, d0
|
||||
; fadd d31, d0, d0
|
||||
; fadd d16, d0, d0
|
||||
; fadd d19, d0, d0
|
||||
; fadd d21, d0, d0
|
||||
; fadd d23, d0, d0
|
||||
; fadd d25, d0, d0
|
||||
; fadd d27, d0, d0
|
||||
; fadd d29, d0, d0
|
||||
; fadd d17, d0, d0
|
||||
; fadd d0, d0, d2
|
||||
; fadd d2, d4, d6
|
||||
; fadd d4, d8, d10
|
||||
; fadd d6, d12, d14
|
||||
; fadd d8, d1, d3
|
||||
; fadd d10, d5, d7
|
||||
; fadd d12, d9, d11
|
||||
; fadd d14, d13, d30
|
||||
; fadd d1, d15, d18
|
||||
; fadd d3, d20, d22
|
||||
; fadd d5, d24, d26
|
||||
; fadd d7, d28, d31
|
||||
; fadd d9, d16, d19
|
||||
; fadd d11, d21, d23
|
||||
; fadd d13, d25, d27
|
||||
; fadd d15, d29, d17
|
||||
; fadd d0, d0, d2
|
||||
; fadd d2, d4, d6
|
||||
; fadd d4, d8, d10
|
||||
; fadd d6, d12, d14
|
||||
; fadd d8, d1, d3
|
||||
; fadd d10, d5, d7
|
||||
; fadd d12, d9, d11
|
||||
; fadd d14, d13, d15
|
||||
; fadd d0, d0, d2
|
||||
; fadd d2, d4, d6
|
||||
; fadd d4, d8, d10
|
||||
; fadd d6, d12, d14
|
||||
; fadd d8, d0, d2
|
||||
; fadd d10, d4, d6
|
||||
; fadd d0, d8, d10
|
||||
; fadd d18, d0, d0
|
||||
; fadd d19, d0, d0
|
||||
; fadd d20, d0, d0
|
||||
; fadd d21, d0, d0
|
||||
; fadd d22, d0, d0
|
||||
; fadd d23, d0, d0
|
||||
; fadd d24, d0, d0
|
||||
; fadd d25, d0, d0
|
||||
; fadd d26, d0, d0
|
||||
; fadd d27, d0, d0
|
||||
; fadd d28, d0, d0
|
||||
; fadd d29, d0, d0
|
||||
; fadd d30, d0, d0
|
||||
; fadd d31, d0, d0
|
||||
; fadd d0, d0, d1
|
||||
; fadd d1, d2, d3
|
||||
; fadd d2, d4, d5
|
||||
; fadd d3, d6, d7
|
||||
; fadd d4, d8, d9
|
||||
; fadd d5, d10, d11
|
||||
; fadd d6, d12, d13
|
||||
; fadd d7, d14, d15
|
||||
; fadd d8, d16, d17
|
||||
; fadd d9, d18, d19
|
||||
; fadd d10, d20, d21
|
||||
; fadd d11, d22, d23
|
||||
; fadd d12, d24, d25
|
||||
; fadd d13, d26, d27
|
||||
; fadd d14, d28, d29
|
||||
; fadd d15, d30, d31
|
||||
; fadd d0, d0, d1
|
||||
; fadd d1, d2, d3
|
||||
; fadd d2, d4, d5
|
||||
; fadd d3, d6, d7
|
||||
; fadd d4, d8, d9
|
||||
; fadd d5, d10, d11
|
||||
; fadd d6, d12, d13
|
||||
; fadd d7, d14, d15
|
||||
; fadd d0, d0, d1
|
||||
; fadd d1, d2, d3
|
||||
; fadd d2, d4, d5
|
||||
; fadd d3, d6, d7
|
||||
; fadd d0, d0, d1
|
||||
; fadd d1, d2, d3
|
||||
; fadd d0, d0, d1
|
||||
; ldp d8, d9, [sp], #16
|
||||
; ldp d10, d11, [sp], #16
|
||||
; ldp d12, d13, [sp], #16
|
||||
|
||||
@@ -195,3 +195,159 @@ block0(v0: f64, v1: f64):
|
||||
return v5
|
||||
}
|
||||
; run: %f64x2_splat_sub(0x1.0, 0x3.0) == [-0x2.0 -0x2.0]
|
||||
|
||||
function %f32x4_splat_mul(f32, f32) -> f32x4 {
|
||||
gv0 = dyn_scale_target_const.f32x4
|
||||
dt0 = f32x4*gv0
|
||||
|
||||
block0(v0: f32, v1: f32):
|
||||
v2 = splat.dt0 v0
|
||||
v3 = splat.dt0 v1
|
||||
v4 = fmul v2, v3
|
||||
v5 = extract_vector v4, 0
|
||||
return v5
|
||||
}
|
||||
; run: %f32x4_splat_mul(0x2.0, 0x3.0) == [0x6.0 0x6.0 0x6.0 0x6.0]
|
||||
|
||||
function %f64x2_splat_mul(f64, f64) -> f64x2 {
|
||||
gv0 = dyn_scale_target_const.f64x2
|
||||
dt0 = f64x2*gv0
|
||||
|
||||
block0(v0: f64, v1: f64):
|
||||
v2 = splat.dt0 v0
|
||||
v3 = splat.dt0 v1
|
||||
v4 = fmul v2, v3
|
||||
v5 = extract_vector v4, 0
|
||||
return v5
|
||||
}
|
||||
; run: %f64x2_splat_sub(-0x2.0, 0x3.0) == [-0x6.0 -0x6.0]
|
||||
|
||||
function %f32x4_splat_div(f32, f32) -> f32x4 {
|
||||
gv0 = dyn_scale_target_const.f32x4
|
||||
dt0 = f32x4*gv0
|
||||
|
||||
block0(v0: f32, v1: f32):
|
||||
v2 = splat.dt0 v0
|
||||
v3 = splat.dt0 v1
|
||||
v4 = fdiv v2, v3
|
||||
v5 = extract_vector v4, 0
|
||||
return v5
|
||||
}
|
||||
; run: %f32x4_splat_div(0x6.6, 0x2.2) == [0x3.0 0x3.0 0x3.0 0x3.0]
|
||||
|
||||
function %f64x2_splat_div(f64, f64) -> f64x2 {
|
||||
gv0 = dyn_scale_target_const.f64x2
|
||||
dt0 = f64x2*gv0
|
||||
|
||||
block0(v0: f64, v1: f64):
|
||||
v2 = splat.dt0 v0
|
||||
v3 = splat.dt0 v1
|
||||
v4 = fdiv v2, v3
|
||||
v5 = extract_vector v4, 0
|
||||
return v5
|
||||
}
|
||||
; run: %f64x2_splat_div(-0x6.6, 0x2.2) == [-0x3.0 -0x3.0]
|
||||
|
||||
function %f32x4_splat_min(f32, f32) -> f32x4 {
|
||||
gv0 = dyn_scale_target_const.f32x4
|
||||
dt0 = f32x4*gv0
|
||||
|
||||
block0(v0: f32, v1: f32):
|
||||
v2 = splat.dt0 v0
|
||||
v3 = splat.dt0 v1
|
||||
v4 = fmin v2, v3
|
||||
v5 = extract_vector v4, 0
|
||||
return v5
|
||||
}
|
||||
; run: %f32x4_splat_min(0x6.6, 0x2.2) == [0x2.2 0x2.2 0x2.2 0x2.2]
|
||||
|
||||
function %f64x2_splat_min(f64, f64) -> f64x2 {
|
||||
gv0 = dyn_scale_target_const.f64x2
|
||||
dt0 = f64x2*gv0
|
||||
|
||||
block0(v0: f64, v1: f64):
|
||||
v2 = splat.dt0 v0
|
||||
v3 = splat.dt0 v1
|
||||
v4 = fmin v2, v3
|
||||
v5 = extract_vector v4, 0
|
||||
return v5
|
||||
}
|
||||
; run: %f64x2_splat_min(-0x6.6, 0x2.2) == [-0x6.6 -0x6.6]
|
||||
|
||||
function %f32x4_splat_max(f32, f32) -> f32x4 {
|
||||
gv0 = dyn_scale_target_const.f32x4
|
||||
dt0 = f32x4*gv0
|
||||
|
||||
block0(v0: f32, v1: f32):
|
||||
v2 = splat.dt0 v0
|
||||
v3 = splat.dt0 v1
|
||||
v4 = fmax v2, v3
|
||||
v5 = extract_vector v4, 0
|
||||
return v5
|
||||
}
|
||||
; run: %f32x4_splat_max(0x6.6, 0x2.2) == [0x6.6 0x6.6 0x6.6 0x6.6]
|
||||
|
||||
function %f64x2_splat_max(f64, f64) -> f64x2 {
|
||||
gv0 = dyn_scale_target_const.f64x2
|
||||
dt0 = f64x2*gv0
|
||||
|
||||
block0(v0: f64, v1: f64):
|
||||
v2 = splat.dt0 v0
|
||||
v3 = splat.dt0 v1
|
||||
v4 = fmax v2, v3
|
||||
v5 = extract_vector v4, 0
|
||||
return v5
|
||||
}
|
||||
; run: %f64x2_splat_max(-0x6.6, 0x2.2) == [0x2.2 0x2.2]
|
||||
|
||||
function %f32x4_splat_min_pseudo(f32, f32) -> f32x4 {
|
||||
gv0 = dyn_scale_target_const.f32x4
|
||||
dt0 = f32x4*gv0
|
||||
|
||||
block0(v0: f32, v1: f32):
|
||||
v2 = splat.dt0 v0
|
||||
v3 = splat.dt0 v1
|
||||
v4 = fmin_pseudo v2, v3
|
||||
v5 = extract_vector v4, 0
|
||||
return v5
|
||||
}
|
||||
; run: %f32x4_splat_min_pseudo(0x6.6, 0x2.2) == [0x2.2 0x2.2 0x2.2 0x2.2]
|
||||
|
||||
function %f64x2_splat_min_pseudo(f64, f64) -> f64x2 {
|
||||
gv0 = dyn_scale_target_const.f64x2
|
||||
dt0 = f64x2*gv0
|
||||
|
||||
block0(v0: f64, v1: f64):
|
||||
v2 = splat.dt0 v0
|
||||
v3 = splat.dt0 v1
|
||||
v4 = fmin_pseudo v2, v3
|
||||
v5 = extract_vector v4, 0
|
||||
return v5
|
||||
}
|
||||
; run: %f64x2_splat_min_pseudo(-0x6.6, 0x2.2) == [-0x6.6 -0x6.6]
|
||||
|
||||
function %f32x4_splat_max_pseudo(f32, f32) -> f32x4 {
|
||||
gv0 = dyn_scale_target_const.f32x4
|
||||
dt0 = f32x4*gv0
|
||||
|
||||
block0(v0: f32, v1: f32):
|
||||
v2 = splat.dt0 v0
|
||||
v3 = splat.dt0 v1
|
||||
v4 = fmax_pseudo v2, v3
|
||||
v5 = extract_vector v4, 0
|
||||
return v5
|
||||
}
|
||||
; run: %f32x4_splat_max_pseudo(0x6.6, 0x2.2) == [0x6.6 0x6.6 0x6.6 0x6.6]
|
||||
|
||||
function %f64x2_splat_max_pseudo(f64, f64) -> f64x2 {
|
||||
gv0 = dyn_scale_target_const.f64x2
|
||||
dt0 = f64x2*gv0
|
||||
|
||||
block0(v0: f64, v1: f64):
|
||||
v2 = splat.dt0 v0
|
||||
v3 = splat.dt0 v1
|
||||
v4 = fmax_pseudo v2, v3
|
||||
v5 = extract_vector v4, 0
|
||||
return v5
|
||||
}
|
||||
; run: %f64x2_splat_max_pseudo(-0x6.6, 0x2.2) == [0x2.2 0x2.2]
|
||||
|
||||
Reference in New Issue
Block a user