s390x: Add z14 support

* Add support for processor features (including auto-detection).

* Move base architecture set requirement back to z14.

* Add z15 feature sets and re-enable z15-specific code generation
  when required features are available.
This commit is contained in:
Ulrich Weigand
2021-06-16 14:58:21 +02:00
parent 5140fd251a
commit def54fb1fa
15 changed files with 895 additions and 117 deletions

View File

@@ -0,0 +1,44 @@
test compile
target s390x arch13
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; POPCNT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
function %popcnt_i64(i64) -> i64 {
block0(v0: i64):
v1 = popcnt v0
return v1
}
; check: popcnt %r2, %r2, 8
; nextln: br %r14
function %popcnt_i32(i32) -> i32 {
block0(v0: i32):
v1 = popcnt v0
return v1
}
; check: llgfr %r2, %r2
; nextln: popcnt %r2, %r2, 8
; nextln: br %r14
function %popcnt_i16(i16) -> i16 {
block0(v0: i16):
v1 = popcnt v0
return v1
}
; check: llghr %r2, %r2
; nextln: popcnt %r2, %r2, 8
; nextln: br %r14
function %popcnt_i8(i8) -> i8 {
block0(v0: i8):
v1 = popcnt v0
return v1
}
; check: popcnt %r2, %r2
; nextln: br %r14

View File

@@ -210,7 +210,14 @@ block0(v0: i64):
return v1
}
; check: popcnt %r2, %r2, 8
; check: popcnt %r2, %r2
; nextln: sllg %r3, %r2, 32
; nextln: agr %r2, %r3
; nextln: sllg %r3, %r2, 16
; nextln: agr %r2, %r3
; nextln: sllg %r3, %r2, 8
; nextln: agr %r2, %r3
; nextln: srlg %r2, %r2, 56
; nextln: br %r14
function %popcnt_i32(i32) -> i32 {
@@ -219,8 +226,12 @@ block0(v0: i32):
return v1
}
; check: llgfr %r2, %r2
; nextln: popcnt %r2, %r2, 8
; check: popcnt %r2, %r2
; nextln: sllk %r3, %r2, 16
; nextln: ar %r2, %r3
; nextln: sllk %r3, %r2, 8
; nextln: ar %r2, %r3
; nextln: srlk %r2, %r2, 24
; nextln: br %r14
function %popcnt_i16(i16) -> i16 {
@@ -229,8 +240,10 @@ block0(v0: i16):
return v1
}
; check: llghr %r2, %r2
; nextln: popcnt %r2, %r2, 8
; check: popcnt %r2, %r2
; nextln: sllk %r3, %r2, 8
; nextln: ar %r2, %r3
; nextln: srlk %r2, %r2, 8
; nextln: br %r14
function %popcnt_i8(i8) -> i8 {

View File

@@ -0,0 +1,212 @@
test compile
target s390x arch13
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BAND_NOT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
function %band_not_i64(i64, i64) -> i64 {
block0(v0: i64, v1: i64):
v2 = band_not.i64 v0, v1
return v2
}
; check: nngrk %r2, %r2, %r3
; nextln: br %r14
function %band_not_i32(i32, i32) -> i32 {
block0(v0: i32, v1: i32):
v2 = band_not.i32 v0, v1
return v2
}
; check: nnrk %r2, %r2, %r3
; nextln: br %r14
function %band_not_i16(i16, i16) -> i16 {
block0(v0: i16, v1: i16):
v2 = band_not.i16 v0, v1
return v2
}
; check: nnrk %r2, %r2, %r3
; nextln: br %r14
function %band_not_i8(i8, i8) -> i8 {
block0(v0: i8, v1: i8):
v2 = band_not.i8 v0, v1
return v2
}
; check: nnrk %r2, %r2, %r3
; nextln: br %r14
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BOR_NOT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
function %bor_not_i64(i64, i64) -> i64 {
block0(v0: i64, v1: i64):
v2 = bor_not.i64 v0, v1
return v2
}
; check: nogrk %r2, %r2, %r3
; nextln: br %r14
function %bor_not_i32(i32, i32) -> i32 {
block0(v0: i32, v1: i32):
v2 = bor_not.i32 v0, v1
return v2
}
; check: nork %r2, %r2, %r3
; nextln: br %r14
function %bor_not_i16(i16, i16) -> i16 {
block0(v0: i16, v1: i16):
v2 = bor_not.i16 v0, v1
return v2
}
; check: nork %r2, %r2, %r3
; nextln: br %r14
function %bor_not_i8(i8, i8) -> i8 {
block0(v0: i8, v1: i8):
v2 = bor_not.i8 v0, v1
return v2
}
; check: nork %r2, %r2, %r3
; nextln: br %r14
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BXOR_NOT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
function %bxor_not_i64(i64, i64) -> i64 {
block0(v0: i64, v1: i64):
v2 = bxor_not.i64 v0, v1
return v2
}
; check: nxgrk %r2, %r2, %r3
; nextln: br %r14
function %bxor_not_i32(i32, i32) -> i32 {
block0(v0: i32, v1: i32):
v2 = bxor_not.i32 v0, v1
return v2
}
; check: nxrk %r2, %r2, %r3
; nextln: br %r14
function %bxor_not_i16(i16, i16) -> i16 {
block0(v0: i16, v1: i16):
v2 = bxor_not.i16 v0, v1
return v2
}
; check: nxrk %r2, %r2, %r3
; nextln: br %r14
function %bxor_not_i8(i8, i8) -> i8 {
block0(v0: i8, v1: i8):
v2 = bxor_not.i8 v0, v1
return v2
}
; check: nxrk %r2, %r2, %r3
; nextln: br %r14
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BNOT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
function %bnot_i64(i64) -> i64 {
block0(v0: i64):
v1 = bnot.i64 v0
return v1
}
; check: nogrk %r2, %r2, %r2
; nextln: br %r14
function %bnot_i32(i32) -> i32 {
block0(v0: i32):
v1 = bnot.i32 v0
return v1
}
; check: nork %r2, %r2, %r2
; nextln: br %r14
function %bnot_i16(i16) -> i16 {
block0(v0: i16):
v1 = bnot.i16 v0
return v1
}
; check: nork %r2, %r2, %r2
; nextln: br %r14
function %bnot_i8(i8) -> i8 {
block0(v0: i8):
v1 = bnot.i8 v0
return v1
}
; check: nork %r2, %r2, %r2
; nextln: br %r14
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BITSELECT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
function %bitselect_i64(i64, i64, i64) -> i64 {
block0(v0: i64, v1: i64, v2: i64):
v3 = bitselect.i64 v0, v1, v2
return v3
}
; check: ngr %r3, %r2
; nextln: nngrk %r2, %r4, %r2
; nextln: ogr %r2, %r3
; nextln: br %r14
function %bitselect_i32(i32, i32, i32) -> i32 {
block0(v0: i32, v1: i32, v2: i32):
v3 = bitselect.i32 v0, v1, v2
return v3
}
; check: nr %r3, %r2
; nextln: nnrk %r2, %r4, %r2
; nextln: or %r2, %r3
; nextln: br %r14
function %bitselect_i16(i16, i16, i16) -> i16 {
block0(v0: i16, v1: i16, v2: i16):
v3 = bitselect.i16 v0, v1, v2
return v3
}
; check: nr %r3, %r2
; nextln: nnrk %r2, %r4, %r2
; nextln: or %r2, %r3
; nextln: br %r14
function %bitselect_i8(i8, i8, i8) -> i8 {
block0(v0: i8, v1: i8, v2: i8):
v3 = bitselect.i8 v0, v1, v2
return v3
}
; check: nr %r3, %r2
; nextln: nnrk %r2, %r4, %r2
; nextln: or %r2, %r3
; nextln: br %r14

View File

@@ -290,7 +290,9 @@ block0(v0: i64, v1: i64):
return v2
}
; check: nngrk %r2, %r2, %r3
; check: ngr %r2, %r3
; nextln: xilf %r2, 4294967295
; nextln: xihf %r2, 4294967295
; nextln: br %r14
function %band_not_i32(i32, i32) -> i32 {
@@ -299,7 +301,8 @@ block0(v0: i32, v1: i32):
return v2
}
; check: nnrk %r2, %r2, %r3
; check: nr %r2, %r3
; nextln: xilf %r2, 4294967295
; nextln: br %r14
function %band_not_i16(i16, i16) -> i16 {
@@ -308,7 +311,8 @@ block0(v0: i16, v1: i16):
return v2
}
; check: nnrk %r2, %r2, %r3
; check: nr %r2, %r3
; nextln: xilf %r2, 4294967295
; nextln: br %r14
function %band_not_i8(i8, i8) -> i8 {
@@ -317,7 +321,8 @@ block0(v0: i8, v1: i8):
return v2
}
; check: nnrk %r2, %r2, %r3
; check: nr %r2, %r3
; nextln: xilf %r2, 4294967295
; nextln: br %r14
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -330,7 +335,9 @@ block0(v0: i64, v1: i64):
return v2
}
; check: nogrk %r2, %r2, %r3
; check: ogr %r2, %r3
; nextln: xilf %r2, 4294967295
; nextln: xihf %r2, 4294967295
; nextln: br %r14
function %bor_not_i32(i32, i32) -> i32 {
@@ -339,7 +346,8 @@ block0(v0: i32, v1: i32):
return v2
}
; check: nork %r2, %r2, %r3
; check: or %r2, %r3
; nextln: xilf %r2, 4294967295
; nextln: br %r14
function %bor_not_i16(i16, i16) -> i16 {
@@ -348,7 +356,8 @@ block0(v0: i16, v1: i16):
return v2
}
; check: nork %r2, %r2, %r3
; check: or %r2, %r3
; nextln: xilf %r2, 4294967295
; nextln: br %r14
function %bor_not_i8(i8, i8) -> i8 {
@@ -357,7 +366,8 @@ block0(v0: i8, v1: i8):
return v2
}
; check: nork %r2, %r2, %r3
; check: or %r2, %r3
; nextln: xilf %r2, 4294967295
; nextln: br %r14
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -370,7 +380,9 @@ block0(v0: i64, v1: i64):
return v2
}
; check: nxgrk %r2, %r2, %r3
; check: xgr %r2, %r3
; nextln: xilf %r2, 4294967295
; nextln: xihf %r2, 4294967295
; nextln: br %r14
function %bxor_not_i32(i32, i32) -> i32 {
@@ -379,7 +391,8 @@ block0(v0: i32, v1: i32):
return v2
}
; check: nxrk %r2, %r2, %r3
; check: xr %r2, %r3
; nextln: xilf %r2, 4294967295
; nextln: br %r14
function %bxor_not_i16(i16, i16) -> i16 {
@@ -388,7 +401,8 @@ block0(v0: i16, v1: i16):
return v2
}
; check: nxrk %r2, %r2, %r3
; check: xr %r2, %r3
; nextln: xilf %r2, 4294967295
; nextln: br %r14
function %bxor_not_i8(i8, i8) -> i8 {
@@ -397,7 +411,8 @@ block0(v0: i8, v1: i8):
return v2
}
; check: nxrk %r2, %r2, %r3
; check: xr %r2, %r3
; nextln: xilf %r2, 4294967295
; nextln: br %r14
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -410,7 +425,8 @@ block0(v0: i64):
return v1
}
; check: nogrk %r2, %r2, %r2
; check: xilf %r2, 4294967295
; nextln: xihf %r2, 4294967295
; nextln: br %r14
function %bnot_i32(i32) -> i32 {
@@ -419,7 +435,7 @@ block0(v0: i32):
return v1
}
; check: nork %r2, %r2, %r2
; check: xilf %r2, 4294967295
; nextln: br %r14
function %bnot_i16(i16) -> i16 {
@@ -428,7 +444,7 @@ block0(v0: i16):
return v1
}
; check: nork %r2, %r2, %r2
; check: xilf %r2, 4294967295
; nextln: br %r14
function %bnot_i8(i8) -> i8 {
@@ -437,7 +453,7 @@ block0(v0: i8):
return v1
}
; check: nork %r2, %r2, %r2
; check: xilf %r2, 4294967295
; nextln: br %r14
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -451,7 +467,9 @@ block0(v0: i64, v1: i64, v2: i64):
}
; check: ngr %r3, %r2
; nextln: nngrk %r2, %r4, %r2
; nextln: ngrk %r2, %r4, %r2
; nextln: xilf %r2, 4294967295
; nextln: xihf %r2, 4294967295
; nextln: ogr %r2, %r3
; nextln: br %r14
@@ -462,7 +480,8 @@ block0(v0: i32, v1: i32, v2: i32):
}
; check: nr %r3, %r2
; nextln: nnrk %r2, %r4, %r2
; nextln: nrk %r2, %r4, %r2
; nextln: xilf %r2, 4294967295
; nextln: or %r2, %r3
; nextln: br %r14
@@ -473,7 +492,8 @@ block0(v0: i16, v1: i16, v2: i16):
}
; check: nr %r3, %r2
; nextln: nnrk %r2, %r4, %r2
; nextln: nrk %r2, %r4, %r2
; nextln: xilf %r2, 4294967295
; nextln: or %r2, %r3
; nextln: br %r14
@@ -484,7 +504,8 @@ block0(v0: i8, v1: i8, v2: i8):
}
; check: nr %r3, %r2
; nextln: nnrk %r2, %r4, %r2
; nextln: nrk %r2, %r4, %r2
; nextln: xilf %r2, 4294967295
; nextln: or %r2, %r3
; nextln: br %r14

View File

@@ -0,0 +1,39 @@
test compile
target s390x arch13
function %load_f64_little(i64) -> f64 {
block0(v0: i64):
v1 = load.f64 little v0
return v1
}
; check: vlebrg %f0, 0(%r2), 0
; nextln: br %r14
function %load_f32_little(i64) -> f32 {
block0(v0: i64):
v1 = load.f32 little v0
return v1
}
; check: vlebrf %f0, 0(%r2), 0
; nextln: br %r14
function %store_f64_little(f64, i64) {
block0(v0: f64, v1: i64):
store.f64 little v0, v1
return
}
; check: vstebrg %f0, 0(%r2), 0
; nextln: br %r14
function %store_f32_little(f32, i64) {
block0(v0: f32, v1: i64):
store.f32 little v0, v1
return
}
; check: vstebrf %f0, 0(%r2), 0
; nextln: br %r14

View File

@@ -0,0 +1,81 @@
test compile
target s390x
function %load_f64(i64) -> f64 {
block0(v0: i64):
v1 = load.f64 v0
return v1
}
; check: ld %f0, 0(%r2)
; nextln: br %r14
function %load_f32(i64) -> f32 {
block0(v0: i64):
v1 = load.f32 v0
return v1
}
; check: le %f0, 0(%r2)
; nextln: br %r14
function %load_f64_little(i64) -> f64 {
block0(v0: i64):
v1 = load.f64 little v0
return v1
}
; check: lrvg %r2, 0(%r2)
; nextln: ldgr %f0, %r2
; nextln: br %r14
function %load_f32_little(i64) -> f32 {
block0(v0: i64):
v1 = load.f32 little v0
return v1
}
; check: lrv %r2, 0(%r2)
; nextln: sllg %r2, %r2, 32
; nextln: ldgr %f0, %r2
; nextln: br %r14
function %store_f64(f64, i64) {
block0(v0: f64, v1: i64):
store.f64 v0, v1
return
}
; check: std %f0, 0(%r2)
; nextln: br %r14
function %store_f32(f32, i64) {
block0(v0: f32, v1: i64):
store.f32 v0, v1
return
}
; check: ste %f0, 0(%r2)
; nextln: br %r14
function %store_f64_little(f64, i64) {
block0(v0: f64, v1: i64):
store.f64 little v0, v1
return
}
; check: lgdr %r3, %f0
; nextln: strvg %r3, 0(%r2)
; nextln: br %r14
function %store_f32_little(f32, i64) {
block0(v0: f32, v1: i64):
store.f32 little v0, v1
return
}
; check: lgdr %r3, %f0
; nextln: srlg %r3, %r3, 32
; nextln: strv %r3, 0(%r2)
; nextln: br %r14